File manager - Edit - /home/wwwroot/camplus.hk/master.camplus.hk/public_html/assets/custom/survey-editor/survey.ko.js
Back
/*! * surveyjs - Survey JavaScript library v1.0.93 * Copyright (c) 2015-2019 Devsoft Baltic OÜ - http://surveyjs.io/ * License: MIT (http://www.opensource.org/licenses/mit-license.php) */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("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_6__) { 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 = 149); /******/ }) /************************************************************************/ /******/ ([ /* 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__(4); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return JsonObjectProperty; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return CustomPropertiesCollection; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return JsonMetadataClass; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return JsonMetadata; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return JsonError; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return JsonUnknownPropertyError; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return JsonMissingTypeErrorBase; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return JsonMissingTypeError; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return JsonIncorrectTypeError; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return JsonRequiredPropertyError; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return JsonObject; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Serializer; }); var JsonObjectProperty = /** @class */ (function () { function JsonObjectProperty(name, isRequired) { if (isRequired === void 0) { isRequired = false; } this.name = name; this.typeValue = null; this.choicesValue = null; this.baseValue = null; this.isRequiredValue = false; this.readOnlyValue = null; this.visibleValue = null; this.isLocalizableValue = null; this.choicesfunc = null; this.dependedProperties = null; this.isSerializable = true; this.isLightSerializable = true; this.isDynamicChoices = false; this.className = null; this.alternativeName = null; this.classNamePart = null; this.baseClassName = null; this.defaultValueValue = null; this.serializationProperty = null; this.layout = null; this.onGetValue = null; this.onSetValue = null; this.visibleIf = null; this.isArray = false; this.isRequiredValue = isRequired; } Object.defineProperty(JsonObjectProperty.prototype, "type", { get: function () { return this.typeValue ? this.typeValue : "string"; }, set: function (value) { if (value === "itemvalues") value = "itemvalue[]"; this.typeValue = value; if (this.typeValue.indexOf("[]") === this.typeValue.length - 2) { this.isArray = true; this.className = this.typeValue.substr(0, this.typeValue.length - 2); } }, enumerable: true, configurable: true }); Object.defineProperty(JsonObjectProperty.prototype, "isRequired", { get: function () { return this.isRequiredValue; }, set: function (val) { this.isRequiredValue = val; }, enumerable: true, configurable: true }); Object.defineProperty(JsonObjectProperty.prototype, "hasToUseGetValue", { get: function () { return this.onGetValue || this.serializationProperty; }, enumerable: true, configurable: true }); Object.defineProperty(JsonObjectProperty.prototype, "defaultValue", { get: function () { var result = this.defaultValueValue; if (!!JsonObjectProperty.getItemValuesDefaultValue && JsonObject.metaData.isDescendantOf(this.className, "itemvalue")) { result = JsonObjectProperty.getItemValuesDefaultValue(this.defaultValueValue || []); } return result; }, set: function (newValue) { this.defaultValueValue = newValue; }, enumerable: true, configurable: true }); JsonObjectProperty.prototype.isDefaultValue = function (value) { if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(this.defaultValue)) return this.defaultValue == value; return ((value === false && this.type == "boolean") || value === "" || __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(value)); }; JsonObjectProperty.prototype.getValue = function (obj) { if (this.onGetValue) return this.onGetValue(obj); if (this.serializationProperty) 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", { /** * Depricated, please use getChoices */ get: function () { return this.getChoices(null); }, enumerable: true, configurable: true }); Object.defineProperty(JsonObjectProperty.prototype, "hasChoices", { get: function () { return !!this.choicesValue || !!this.choicesfunc; }, enumerable: true, configurable: true }); JsonObjectProperty.prototype.getChoices = function (obj, choicesCallback) { if (choicesCallback === void 0) { choicesCallback = null; } if (this.choicesValue != null) return this.choicesValue; if (this.choicesfunc != null) return this.choicesfunc(obj, choicesCallback); return null; }; JsonObjectProperty.prototype.setChoices = function (value, valueFunc) { this.choicesValue = value; this.choicesfunc = valueFunc; }; JsonObjectProperty.prototype.getBaseValue = function () { if (!this.baseValue) return ""; if (typeof this.baseValue == "function") return this.baseValue(); return this.baseValue; }; JsonObjectProperty.prototype.setBaseValue = function (val) { this.baseValue = val; }; Object.defineProperty(JsonObjectProperty.prototype, "readOnly", { get: function () { return this.readOnlyValue != null ? this.readOnlyValue : false; }, set: function (val) { this.readOnlyValue = val; }, enumerable: true, configurable: true }); JsonObjectProperty.prototype.isVisible = function (layout, obj) { if (obj === void 0) { obj = null; } var isLayout = !this.layout || this.layout == layout; if (!this.visible || !isLayout) return false; if (!!this.visibleIf && !!obj) return this.visibleIf(obj); return true; }; Object.defineProperty(JsonObjectProperty.prototype, "visible", { get: function () { return this.visibleValue != null ? this.visibleValue : true; }, set: function (val) { this.visibleValue = val; }, enumerable: true, configurable: true }); Object.defineProperty(JsonObjectProperty.prototype, "isLocalizable", { get: function () { return this.isLocalizableValue != null ? this.isLocalizableValue : false; }, set: function (val) { this.isLocalizableValue = val; }, enumerable: true, configurable: true }); JsonObjectProperty.prototype.mergeWith = function (prop) { var valuesNames = JsonObjectProperty.mergableValues; for (var i = 0; i < valuesNames.length; i++) { this.mergeValue(prop, valuesNames[i]); } }; JsonObjectProperty.prototype.addDependedProperty = function (name) { if (!this.dependedProperties) { this.dependedProperties = []; } if (this.dependedProperties.indexOf(name) < 0) { this.dependedProperties.push(name); } }; JsonObjectProperty.prototype.getDependedProperties = function () { return !!this.dependedProperties ? this.dependedProperties : []; }; JsonObjectProperty.prototype.mergeValue = function (prop, valueName) { if (this[valueName] == null && prop[valueName] != null) { this[valueName] = prop[valueName]; } }; JsonObjectProperty.mergableValues = [ "typeValue", "choicesValue", "baseValue", "readOnlyValue", "visibleValue", "isSerializable", "isLightSerializable", "isDynamicChoices", "isLocalizableValue", "className", "alternativeName", "layout", "classNamePart", "baseClassName", "defaultValue", "serializationProperty", "onGetValue", "onSetValue", "dependedProperties", "visibleIf" ]; 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 (this.parentName) { this.parentName = this.parentName.toLowerCase(); CustomPropertiesCollection.addClass(name, this.parentName); } this.properties = new Array(); for (var i = 0; i < properties.length; i++) { var prop = this.createProperty(properties[i]); if (prop) { this.properties.push(prop); } } } JsonMetadataClass.prototype.find = function (name) { for (var i = 0; i < this.properties.length; i++) { if (this.properties[i].name == name) return this.properties[i]; } return null; }; JsonMetadataClass.prototype.createProperty = function (propInfo) { var propertyName = typeof propInfo === "string" ? propInfo : propInfo.name; if (!propertyName) return; var propertyType = null; var typeIndex = propertyName.indexOf(JsonMetadataClass.typeSymbol); if (typeIndex > -1) { propertyType = propertyName.substring(typeIndex + 1); propertyName = propertyName.substring(0, typeIndex); } var isRequired = this.getIsPropertyNameRequired(propertyName); propertyName = this.getPropertyName(propertyName); var prop = new JsonObjectProperty(propertyName, isRequired); if (propertyType) { prop.type = propertyType; } if (typeof propInfo === "object") { if (propInfo.type) { prop.type = propInfo.type; } if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.default)) { prop.defaultValue = propInfo.default; } if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.isSerializable)) { prop.isSerializable = propInfo.isSerializable; } if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.isLightSerializable)) { prop.isLightSerializable = propInfo.isLightSerializable; } if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.isDynamicChoices)) { prop.isDynamicChoices = propInfo.isDynamicChoices; } if (propInfo.visible === false) { prop.visible = false; } if (!!propInfo.visibleIf) { prop.visibleIf = propInfo.visibleIf; } if (propInfo.choices) { var choicesFunc = typeof propInfo.choices === "function" ? propInfo.choices : null; var choicesValue = typeof propInfo.choices !== "function" ? propInfo.choices : null; prop.setChoices(choicesValue, choicesFunc); } if (!!propInfo.baseValue) { prop.setBaseValue(propInfo.baseValue); } if (propInfo.onGetValue) { prop.onGetValue = propInfo.onGetValue; } if (propInfo.onSetValue) { prop.onSetValue = propInfo.onSetValue; } if (propInfo.isLocalizable) { propInfo.serializationProperty = "loc" + propInfo.name; } if (propInfo.serializationProperty) { prop.serializationProperty = propInfo.serializationProperty; var s; if (prop.serializationProperty && prop.serializationProperty.indexOf("loc") == 0) { prop.isLocalizable = true; } } if (propInfo.isLocalizable) { prop.isLocalizable = propInfo.isLocalizable; } if (propInfo.className) { prop.className = propInfo.className; } if (propInfo.baseClassName) { prop.baseClassName = propInfo.baseClassName; } if (propInfo.classNamePart) { prop.classNamePart = propInfo.classNamePart; } if (propInfo.alternativeName) { prop.alternativeName = propInfo.alternativeName; } if (propInfo.layout) { prop.layout = propInfo.layout; } if (propInfo.dependsOn) { this.addDependsOnProperties(prop, propInfo.dependsOn); } } return prop; }; JsonMetadataClass.prototype.addDependsOnProperties = function (prop, dependsOn) { if (Array.isArray(dependsOn)) { for (var i = 0; i < dependsOn.length; i++) { this.addDependsOnProperty(prop, dependsOn[i]); } } else { this.addDependsOnProperty(prop, dependsOn); } }; JsonMetadataClass.prototype.addDependsOnProperty = function (prop, dependsOn) { var property = this.find(dependsOn); if (!property) { property = Serializer.findProperty(this.parentName, dependsOn); } if (!property) return; property.addDependedProperty(prop.name); }; JsonMetadataClass.prototype.getIsPropertyNameRequired = function (propertyName) { return (propertyName.length > 0 && propertyName[0] == JsonMetadataClass.requiredSymbol); }; JsonMetadataClass.prototype.getPropertyName = function (propertyName) { if (!this.getIsPropertyNameRequired(propertyName)) return propertyName; propertyName = propertyName.slice(1); return propertyName; }; JsonMetadataClass.requiredSymbol = "!"; JsonMetadataClass.typeSymbol = ":"; return JsonMetadataClass; }()); var JsonMetadata = /** @class */ (function () { function JsonMetadata() { this.classes = {}; this.alternativeNames = {}; this.childrenClasses = {}; this.classProperties = {}; } JsonMetadata.prototype.addClass = function (name, properties, creator, parentName) { if (creator === void 0) { creator = null; } if (parentName === void 0) { parentName = null; } name = name.toLowerCase(); var metaDataClass = new JsonMetadataClass(name, properties, creator, parentName); this.classes[name] = metaDataClass; if (parentName) { parentName = parentName.toLowerCase(); var children = this.childrenClasses[parentName]; if (!children) { this.childrenClasses[parentName] = []; } this.childrenClasses[parentName].push(metaDataClass); } return metaDataClass; }; JsonMetadata.prototype.removeClass = function (name) { var metaClass = this.findClass(name); if (!metaClass) return; delete this.classes[metaClass.name]; if (!!metaClass.parentName) { var index = this.childrenClasses[metaClass.parentName].indexOf(metaClass); if (index > -1) { this.childrenClasses[metaClass.parentName].splice(index, 1); } } }; JsonMetadata.prototype.overrideClassCreatore = function (name, creator) { this.overrideClassCreator(name, creator); }; JsonMetadata.prototype.overrideClassCreator = function (name, creator) { name = name.toLowerCase(); var metaDataClass = this.findClass(name); if (metaDataClass) { metaDataClass.creator = creator; } }; JsonMetadata.prototype.getProperties = function (className) { var metaClass = this.findClass(className); if (!metaClass) return []; var properties = this.classProperties[metaClass.name]; if (!properties) { 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(); this.lightSerializing = false; } Object.defineProperty(JsonObject, "metaData", { get: function () { return JsonObject.metaDataValue; }, enumerable: true, configurable: true }); JsonObject.prototype.toJsonObject = function (obj, storeDefaults) { if (storeDefaults === void 0) { storeDefaults = false; } return this.toJsonObjectCore(obj, null, storeDefaults); }; JsonObject.prototype.toObject = function (jsonObj, obj) { if (!jsonObj) return; var properties = null; var objType = undefined; var needAddErrors = true; if (obj.getType) { objType = obj.getType(); properties = JsonObject.metaData.getProperties(objType); needAddErrors = !!objType && !JsonObject.metaData.isDescendantOf(objType, "itemvalue"); } if (!properties) return; if (obj.startLoadingFromJson) { obj.startLoadingFromJson(); } properties = this.addDynamicProperties(obj, jsonObj, properties); for (var key in jsonObj) { if (key === JsonObject.typePropertyName) continue; if (key === JsonObject.positionPropertyName) { obj[key] = jsonObj[key]; continue; } var property = this.findProperty(properties, key); if (!property) { if (needAddErrors) { this.addNewError(new JsonUnknownPropertyError(key.toString(), objType), jsonObj); } continue; } this.valueToObj(jsonObj[key], obj, property); } if (obj.endLoadingFromJson) { obj.endLoadingFromJson(); } }; JsonObject.prototype.toJsonObjectCore = function (obj, property, storeDefaults) { if (storeDefaults === void 0) { storeDefaults = false; } if (!obj || !obj.getType) return obj; if (typeof obj.getData === "function") return obj.getData(); var result = {}; if (property != null && !property.className) { result[JsonObject.typePropertyName] = property.getObjType(obj.getType()); } this.propertiesToJson(obj, JsonObject.metaData.getProperties(obj.getType()), result, storeDefaults); this.propertiesToJson(obj, this.getDynamicProperties(obj), result, storeDefaults); return result; }; JsonObject.prototype.getDynamicProperties = function (obj) { if (obj.getDynamicProperties && obj.getDynamicType) { var names = obj.getDynamicProperties(); return JsonObject.metaData.findProperties(obj.getDynamicType(), names); } return []; }; JsonObject.prototype.addDynamicProperties = function (obj, jsonObj, properties) { if (!obj.getDynamicPropertyName) return properties; var dynamicPropName = obj.getDynamicPropertyName(); if (!dynamicPropName) return properties; if (jsonObj[dynamicPropName]) { obj[dynamicPropName] = jsonObj[dynamicPropName]; } var dynamicProperties = this.getDynamicProperties(obj); var res = []; for (var i = 0; i < properties.length; i++) { res.push(properties[i]); } for (var i = 0; i < dynamicProperties.length; i++) { res.push(dynamicProperties[i]); } return res; }; JsonObject.prototype.propertiesToJson = function (obj, properties, json, storeDefaults) { if (storeDefaults === void 0) { storeDefaults = false; } for (var i = 0; i < properties.length; i++) { this.valueToJson(obj, json, properties[i], storeDefaults); } }; JsonObject.prototype.valueToJson = function (obj, result, property, storeDefaults) { if (storeDefaults === void 0) { storeDefaults = false; } if (property.isSerializable === false || (property.isLightSerializable === false && this.lightSerializing)) return; var value = property.getValue(obj); if (!storeDefaults && property.isDefaultValue(value)) return; if (this.isValueArray(value)) { var arrValue = []; for (var i = 0; i < value.length; i++) { arrValue.push(this.toJsonObjectCore(value[i], property, storeDefaults)); } value = arrValue.length > 0 ? arrValue : null; } else { value = this.toJsonObjectCore(value, property, storeDefaults); } var hasValue = typeof obj["getPropertyValue"] === "function" && obj["getPropertyValue"](property.name, null) !== null; if ((storeDefaults && hasValue) || !property.isDefaultValue(value)) { result[property.name] = value; } }; JsonObject.prototype.valueToObj = function (value, obj, property) { if (value == null) return; this.removePos(property, value); if (property != null && property.hasToUseSetValue) { property.setValue(obj, value, this); return; } if (this.isValueArray(value)) { this.valueToArray(value, obj, property.name, property); return; } var newObj = this.createNewObj(value, property); if (newObj.newObj) { this.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; }()); var Serializer = JsonObject.metaData; /***/ }), /* 2 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__localization_english__ = __webpack_require__(41); /* 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 import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(1); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionFactory; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return ElementFactory; }); //TODO replace completely with ElementFactory var QuestionFactory = /** @class */ (function () { function QuestionFactory() { this.creatorHash = {}; } Object.defineProperty(QuestionFactory, "DefaultChoices", { get: function () { return [ __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("choices_Item") + "1", __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("choices_Item") + "2", __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("choices_Item") + "3" ]; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionFactory, "DefaultColums", { get: function () { var colName = __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("matrix_column") + " "; return [colName + "1", colName + "2", colName + "3"]; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionFactory, "DefaultRows", { get: function () { var rowName = __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("matrix_row") + " "; return [rowName + "1", rowName + "2"]; }, enumerable: true, configurable: true }); QuestionFactory.prototype.registerQuestion = function (questionType, questionCreator) { this.creatorHash[questionType] = questionCreator; }; QuestionFactory.prototype.unregisterElement = function (elementType) { delete this.creatorHash[elementType]; }; QuestionFactory.prototype.clear = function () { this.creatorHash = {}; }; QuestionFactory.prototype.getAllTypes = function () { var result = new Array(); for (var key in this.creatorHash) { result.push(key); } return result.sort(); }; QuestionFactory.prototype.createQuestion = function (questionType, name) { var creator = this.creatorHash[questionType]; if (creator == null) return null; return creator(name); }; QuestionFactory.Instance = new QuestionFactory(); return QuestionFactory; }()); var ElementFactory = /** @class */ (function () { function ElementFactory() { this.creatorHash = {}; } ElementFactory.prototype.registerElement = function (elementType, elementCreator) { this.creatorHash[elementType] = elementCreator; }; ElementFactory.prototype.clear = function () { this.creatorHash = {}; }; ElementFactory.prototype.unregisterElement = function (elementType, removeFromSerializer) { if (removeFromSerializer === void 0) { removeFromSerializer = false; } delete this.creatorHash[elementType]; QuestionFactory.Instance.unregisterElement(elementType); if (removeFromSerializer) { __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].removeClass(elementType); } }; ElementFactory.prototype.getAllTypes = function () { var result = QuestionFactory.Instance.getAllTypes(); for (var key in this.creatorHash) { result.push(key); } return result.sort(); }; ElementFactory.prototype.createElement = function (elementType, name) { var creator = this.creatorHash[elementType]; if (creator == null) return QuestionFactory.Instance.createQuestion(elementType, name); return creator(name); }; ElementFactory.Instance = new ElementFactory(); return ElementFactory; }()); /***/ }), /* 4 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Helpers; }); var Helpers = /** @class */ (function () { function Helpers() { } /** * A static methods that returns true if a value underfined, null, empty string or empty array. * @param value */ Helpers.isValueEmpty = function (value) { if (Array.isArray(value) && value.length === 0) return true; if (!!value && typeof value === "object" && value.constructor === Object) { for (var key in value) { if (!Helpers.isValueEmpty(value[key])) return false; } return true; } if (!!value && (typeof value === "string" || value instanceof String)) { value = value.trim(); } return !value && value !== 0 && value !== false; }; Helpers.isArrayContainsEqual = function (x, y) { if (!Array.isArray(x) || !Array.isArray(y)) return false; if (x.length !== y.length) return false; for (var i = 0; i < x.length; i++) { var j = 0; for (; j < y.length; j++) { if (Helpers.isTwoValueEquals(x[i], y[j])) break; } if (j === y.length) return false; } return true; }; Helpers.isArraysEqual = function (x, y, ignoreOrder) { if (ignoreOrder === void 0) { ignoreOrder = false; } if (!Array.isArray(x) || !Array.isArray(y)) return false; if (x.length !== y.length) return false; if (ignoreOrder) { var xSorted = []; var ySorted = []; for (var i = 0; i < x.length; i++) { xSorted.push(x[i]); ySorted.push(y[i]); } xSorted.sort(); ySorted.sort(); x = xSorted; y = ySorted; } for (var i = 0; i < x.length; i++) { if (!Helpers.isTwoValueEquals(x[i], y[i])) return false; } return true; }; Helpers.isTwoValueEquals = function (x, y, ignoreOrder) { if (ignoreOrder === void 0) { ignoreOrder = false; } if (x === y) return true; if (Array.isArray(x) && x.length === 0 && typeof y === "undefined") return true; if (Array.isArray(y) && y.length === 0 && typeof x === "undefined") return true; if ((x === undefined || x === null) && y === "undefined") return true; if ((y === undefined || y === null) && x === "undefined") return true; if ((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 (!!x.toJSON && !!y.toJSON) { return this.isTwoValueEquals(x.toJSON(), y.toJSON()); } if (Array.isArray(x) && Array.isArray(y)) return Helpers.isArraysEqual(x, y, ignoreOrder); for (var p in x) { if (!x.hasOwnProperty(p)) continue; if (!y.hasOwnProperty(p)) return false; if (x[p] === y[p]) continue; if (typeof x[p] !== "object") return false; if (!this.isTwoValueEquals(x[p], y[p])) return false; } for (p in y) { if (y.hasOwnProperty(p) && !x.hasOwnProperty(p)) return false; } return true; }; Helpers.randomizeArray = function (array) { for (var i = array.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = array[i]; array[i] = array[j]; array[j] = temp; } return array; }; Helpers.getUnbindValue = function (value) { if (!!value && value instanceof Object) { //do not return the same object instance!!! return JSON.parse(JSON.stringify(value)); /* if (value instanceof Date) { let res = new Date(); res.setTime(value.getTime()); return res; } if (value instanceof Array) { let res = []; for (let i = 0, len = value.length; i < len; i++) { res[i] = Helpers.getUnbindValue(value[i]); } return res; } let res = {}; for (var attr in value) { if (value.hasOwnProperty(attr)) { (<any>res)[attr] = Helpers.getUnbindValue(value[attr]); } } return res; */ } 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; }); }; } /***/ }), /* 5 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__localizablestring__ = __webpack_require__(17); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__settings__ = __webpack_require__(9); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", 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__, "a", 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__["c" /* CustomPropertiesCollection */].createProperties(this); } Object.defineProperty(Base, "commentPrefix", { get: function () { return __WEBPACK_IMPORTED_MODULE_4__settings__["a" /* settings */].commentPrefix; }, set: function (val) { __WEBPACK_IMPORTED_MODULE_4__settings__["a" /* settings */].commentPrefix = val; }, enumerable: true, configurable: true }); /** * A static methods that returns true if a value underfined, null, empty string or empty array. * @param value */ Base.prototype.isValueEmpty = function (value) { return __WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].isValueEmpty(value); }; Base.prototype.IsPropertyEmpty = function (value) { return value !== "" && this.isValueEmpty(value); }; /** * Returns the type of the object as a string as it represents in the json. It should be in lowcase. */ Base.prototype.getType = function () { return "base"; }; /** * Returns the element template name without prefix. Typically it equals to getType(). * @see getType */ Base.prototype.getTemplate = function () { return this.getType(); }; Object.defineProperty(Base.prototype, "isLoadingFromJson", { /** * Returns true if the object is loading from Json at the current moment. */ get: function () { return this.isLoadingFromJsonValue; }, enumerable: true, configurable: true }); Base.prototype.startLoadingFromJson = function () { this.isLoadingFromJsonValue = true; }; Base.prototype.endLoadingFromJson = function () { this.isLoadingFromJsonValue = false; }; /** * Deserialized the current object into JSON */ 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.geValueFromHash = function () { return this.propertyHash["value"]; }; Base.prototype.setPropertyValueCore = function (propertiesHash, name, val) { if (this.setPropertyValueCoreHandler) this.setPropertyValueCoreHandler(propertiesHash, name, val); else propertiesHash[name] = val; }; Base.prototype.iteratePropertiesHash = function (func) { var _this = this; var keys = []; for (var key in this.propertyHash) { keys.push(key); } keys.forEach(function (key) { return func(_this.propertyHash, key); }); }; /** * set property value * @param name property name * @param val new property value */ Base.prototype.setPropertyValue = function (name, val) { var oldValue = this.getPropertyValue(name); if (oldValue && Array.isArray(oldValue)) { if (this.isTwoValueEquals(oldValue, val)) return; var arrayInfo = this.arraysInfo[name]; this.setArray(oldValue, val, arrayInfo ? arrayInfo.isItemValues : false, arrayInfo ? arrayInfo.onPush : null); this.propertyValueChanged(name, oldValue, oldValue); } else { this.setPropertyValueCore(this.propertyHash, name, val); if (!this.isTwoValueEquals(oldValue, val)) { this.propertyValueChanged(name, oldValue, val); } } }; Base.prototype.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.unshift = function (value) { var result = Object.getPrototypeOf(newArray).unshift.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); }; return Base; }()); var SurveyError = /** @class */ (function () { function SurveyError(text, errorOwner) { if (text === void 0) { text = null; } if (errorOwner === void 0) { errorOwner = null; } this.text = text; this.errorOwner = errorOwner; } Object.defineProperty(SurveyError.prototype, "locText", { get: function () { if (!this.locTextValue) { this.locTextValue = new __WEBPACK_IMPORTED_MODULE_1__localizablestring__["a" /* LocalizableString */](this.errorOwner, true); this.locTextValue.text = this.getText(); } return this.locTextValue; }, enumerable: true, configurable: true }); SurveyError.prototype.getText = function () { var res = this.text; if (!res) res = this.getDefaultText(); if (!!this.errorOwner) { res = this.errorOwner.getErrorCustomText(res, this); } return res; }; SurveyError.prototype.getErrorType = function () { return "base"; }; SurveyError.prototype.getDefaultText = function () { return ""; }; return SurveyError; }()); var SurveyElement = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyElement, _super); function SurveyElement(name) { var _this = _super.call(this) || this; _this.selectedElementInDesignValue = _this; _this.name = name; _this.createNewArray("errors"); var self = _this; _this.registerFunctionOnPropertyValueChanged("isReadOnly", function () { self.onReadOnlyChanged(); }); return _this; } SurveyElement.ScrollElementToTop = function (elementId) { if (!elementId) return false; var el = document.getElementById(elementId); if (!el || !el.scrollIntoView) return false; var elemTop = el.getBoundingClientRect().top; if (elemTop < 0) el.scrollIntoView(); return elemTop < 0; }; SurveyElement.GetFirstNonTextElement = function (elements) { if (!elements || !elements.length) return; for (var i = 0; i < elements.length; i++) { if (elements[i].nodeName != "#text" && elements[i].nodeName != "#comment") return elements[i]; } return null; }; SurveyElement.FocusElement = function (elementId) { if (!elementId) return false; var el = document.getElementById(elementId); if (el) { el.focus(); return true; } return false; }; SurveyElement.prototype.setSurveyImpl = function (value) { this.surveyImplValue = value; if (!this.surveyImplValue) return; this.surveyDataValue = this.surveyImplValue.geSurveyData(); this.surveyValue = this.surveyImplValue.getSurvey(); this.textProcessorValue = this.surveyImplValue.getTextProcessor(); this.onSetData(); }; Object.defineProperty(SurveyElement.prototype, "surveyImpl", { get: function () { return this.surveyImplValue; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyElement.prototype, "data", { get: function () { return this.surveyDataValue; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyElement.prototype, "survey", { /** * Returns the survey object. */ get: function () { if (!!this.surveyValue) return this.surveyValue; if (!!this.surveyImplValue) { this.surveyValue = this.surveyImplValue.getSurvey(); } return this.surveyValue; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyElement.prototype, "isDesignMode", { /** * Returns true if the question in design mode right now. */ get: function () { return !!this.survey && this.survey.isDesignMode; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyElement.prototype, "areInvisibleElementsShowing", { get: function () { return !!this.survey && this.survey.areInvisibleElementsShowing; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyElement.prototype, "isVisible", { get: function () { return true; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyElement.prototype, "isReadOnly", { get: function () { return false; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyElement.prototype, "readOnly", { /** * Set it to true to make an element question/panel/page readonly. * @see enableIf * @see isReadOnly */ get: function () { return this.getPropertyValue("readOnly", false); }, set: function (val) { if (this.readOnly == val) return; this.setPropertyValue("readOnly", val); if (!this.isLoadingFromJson) { this.setPropertyValue("isReadOnly", this.isReadOnly); } }, enumerable: true, configurable: true }); SurveyElement.prototype.onReadOnlyChanged = function () { if (!!this.readOnlyChangedCallback) { this.readOnlyChangedCallback(); } }; Object.defineProperty(SurveyElement.prototype, "isLoadingFromJson", { get: function () { if (this.isLoadingFromJsonValue) return true; return this.survey ? this.survey.isLoadingFromJson : false; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyElement.prototype, "name", { 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; }()); /***/ }), /* 6 */ /***/ (function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE_6__; /***/ }), /* 7 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout__ = __webpack_require__(6); /* 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__(5); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__helpers__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__kobase__ = __webpack_require__(18); /* 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; _this._koValue = __WEBPACK_IMPORTED_MODULE_1_knockout__["observableArray"](); var isSynchronizing = false; _this._koValue.subscribe(function (newValue) { if (!isSynchronizing) { _this.question.value = newValue; } }); Object.defineProperty(_this.question, "koValue", { get: function () { if (!__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(_this._koValue(), _this.getKoValue())) { try { isSynchronizing = true; _this._koValue(_this.getKoValue()); } finally { isSynchronizing = false; } } return _this._koValue; }, enumerable: true, configurable: true }); 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 () { return self.question.cssMainRoot; }); question.registerFunctionOnPropertyValueChanged("visibleIndex", function () { self.onVisibleIndexChanged(); }); _this.koDummy = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](0); _this.question["koQuestionAfterRender"] = function (el, con) { self.koQuestionAfterRender(el, con); }; return _this; } QuestionImplementor.prototype.getKoValue = function () { return this.question.value; }; QuestionImplementor.prototype.updateQuestion = function () { this.updateKoDummy(); }; 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.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 _this = this; 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); __WEBPACK_IMPORTED_MODULE_1_knockout__["utils"].domNodeDisposal.addDisposeCallback(el, function () { _this.question.customWidget.willUnmount(_this.question, el); }); } }; return QuestionImplementor; }(__WEBPACK_IMPORTED_MODULE_4__kobase__["a" /* ImplementorBase */])); /***/ }), /* 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__helpers__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__base__ = __webpack_require__(5); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(2); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(11); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__validator__ = __webpack_require__(32); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__textPreProcessor__ = __webpack_require__(22); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__conditions__ = __webpack_require__(10); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__defaultCss_cssstandard__ = __webpack_require__(13); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__questionCustomWidgets__ = __webpack_require__(28); /* 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.isValueChangedInSurvey = false; //ILocalizableOwner _this.locOwner = null; _this.id = Question.getQuestionId(); _this.onCreating(); var self = _this; _this.createNewArray("validators", function (validator) { validator.errorOwner = self; }); var locTitleValue = _this.createLocalizableString("title", _this, true); locTitleValue.onRenderedHtmlCallback = function (text) { return self.fullTitle; }; _this.createLocalizableString("description", _this, true); var locCommentText = _this.createLocalizableString("commentText", _this, true); locCommentText.onGetTextCallback = function (text) { return !!text ? text : __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("otherItemText"); }; _this.createLocalizableString("requiredErrorText", _this); _this.registerFunctionOnPropertyValueChanged("width", function () { if (!!self.parent) { self.parent.elementWidthChanged(self); } }); _this.registerFunctionOnPropertiesValueChanged(["indent", "rightIndent"], function () { self.onIndentChanged(); }); 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", val); this.onValueNameChanged(oldValueName); }, enumerable: true, configurable: true }); Question.prototype.onValueNameChanged = function (oldValue) { if (!this.survey) return; this.survey.questionRenamed(this, this.name, !!oldValue ? oldValue : this.name); this.initDataFromSurvey(); }; Question.prototype.onNameChanged = function (oldValue) { if (!this.survey) return; this.survey.questionRenamed(this, oldValue, this.valueName ? this.valueName : oldValue); }; Object.defineProperty(Question.prototype, "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, "isFlowLayout", { get: function () { return this.getLayoutType() === "flow"; }, enumerable: true, configurable: true }); Question.prototype.getLayoutType = function () { if (!!this.parent) return this.parent.getChildrenLayoutType(); return "row"; }; Question.prototype.isLayoutTypeSupported = function (layoutType) { return layoutType !== "flow"; }; Object.defineProperty(Question.prototype, "visible", { /** * Use it to get/set the question visibility. * @see visibleIf */ get: function () { return this.getPropertyValue("visible", true); }, set: function (val) { if (val == this.visible) return; this.setPropertyValue("visible", val); this.onVisibleChanged(); if (this.survey) { this.survey.questionVisibilityChanged(this, this.visible); } }, enumerable: true, configurable: true }); Question.prototype.onVisibleChanged = function () { this.setPropertyValue("isVisible", this.isVisible); if (!this.isVisible && this.errors && this.errors.length > 0) { this.errors = []; } }; Object.defineProperty(Question.prototype, "useDisplayValuesInTitle", { /** * Use it to choose how other question values will be rendered in title if referenced in {}. */ get: function () { return this.getPropertyValue("useDisplayValuesInTitle", true); }, set: function (val) { this.setPropertyValue("useDisplayValuesInTitle", val); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "visibleIf", { /** * An expression that returns true or false. If it returns true the Question becomes visible and if it returns false the Question becomes invisible. The library runs the expression on survey start and on changing a question value. If the property is empty then visible property is used. * @see visible */ get: function () { return this.getPropertyValue("visibleIf", ""); }, set: function (val) { this.setPropertyValue("visibleIf", val); this.runConditions(); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "isVisible", { /** * Returns true if the question is visible or survey is in design mode right now. */ get: function () { return this.visible || this.areInvisibleElementsShowing; }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "visibleIndex", { /** * Returns the visible index of the question in the survey. It can be from 0 to all visible questions count - 1 */ get: function () { return this.getPropertyValue("visibleIndex", -1); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "isAllowTitleLeft", { /** * Returns true if the question may have a title located on the left */ get: function () { return true; }, enumerable: true, configurable: true }); /** * Returns the type of the object as a string as it represents in the json. */ Question.prototype.getType = function () { return "question"; }; Question.prototype.runConditions = function () { if (this.data && !this.isLoadingFromJson && !this.isDesignMode) { this.runCondition(this.getDataFilteredValues(), this.getDataFilteredProperties()); this.locStrsChanged(); } }; Question.prototype.setSurveyImpl = function (value) { _super.prototype.setSurveyImpl.call(this, value); if (this.survey && this.survey.isDesignMode && !this.isDesignMode) { this.onVisibleChanged(); } this.runConditions(); }; Question.prototype.getDataFilteredValues = function () { return !!this.data ? this.data.getFilteredValues() : null; }; Question.prototype.getDataFilteredProperties = function () { return !!this.data ? this.data.getFilteredProperties() : null; }; Object.defineProperty(Question.prototype, "parent", { /** * A parent element. It can be panel or page. */ get: function () { return this.getPropertyValue("parent", null); }, set: function (val) { this.setPropertyValue("parent", val); this.onParentChanged(); }, enumerable: true, configurable: true }); Question.prototype.onParentChanged = function () { }; Object.defineProperty(Question.prototype, "hasTitle", { /** * Returns false if the question doesn't have a title property, for example: QuestionHtmlModel, or titleLocation property equals to "hidden" * @see titleLocation */ get: function () { return this.getTitleLocation() !== "hidden"; }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "titleLocation", { /** * Set this property different from "default" to set the specific question title location for this panel/page. * @see SurveyModel.questionTitleLocation */ get: function () { return this.getPropertyValue("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 () { if (this.isFlowLayout) return "hidden"; var location = this.getTitleLocationCore(); if (location === "left" && !this.isAllowTitleLeft) location = "top"; return location; }; Question.prototype.getTitleLocationCore = function () { if (this.titleLocation !== "default") return this.titleLocation; if (!!this.parent) return this.parent.getQuestionTitleLocation(); if (!!this.survey) return this.survey.questionTitleLocation; return "top"; }; Object.defineProperty(Question.prototype, "hasTitleOnLeft", { get: function () { return this.hasTitle && this.getTitleLocation() === "left"; }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "hasTitleOnTop", { get: function () { return this.hasTitle && this.getTitleLocation() === "top"; }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "hasTitleOnBottom", { get: function () { return this.hasTitle && this.getTitleLocation() === "bottom"; }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "hasTitleOnLeftTop", { get: function () { if (!this.hasTitle) return false; var location = this.getTitleLocation(); return location === "left" || location === "top"; }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "errorLocation", { get: function () { return this.survey ? this.survey.questionErrorLocation : "top"; }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "hasInput", { /** * Returns false if the question doesn't have an input element, for example: QuestionHtmlModel */ get: function () { return true; }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "inputId", { get: function () { return this.id + "i"; }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "title", { /** * Question title. Use survey questionTitleTemplate property to change the title question is rendered. If it is empty, then question name property is used. * @see SurveyModel.questionTitleTemplate */ get: function () { return this.getLocalizableStringText("title", this.name); }, set: function (val) { this.setLocalizableStringText("title", val); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "locTitle", { get: function () { return this.getLocalizableString("title"); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "description", { /** * Question description. It renders under question title by using smaller font. Unlike the title, description can be empty. * @see title */ get: function () { return this.getLocalizableStringText("description"); }, set: function (val) { this.setLocalizableStringText("description", val); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "locDescription", { get: function () { return this.getLocalizableString("description"); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "requiredErrorText", { /** * The custom text that will be shown on required error. Use this property, if you do not want to show the default text. */ get: function () { return this.getLocalizableStringText("requiredErrorText"); }, set: function (val) { this.setLocalizableStringText("requiredErrorText", val); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "locRequiredErrorText", { get: function () { return this.getLocalizableString("requiredErrorText"); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "commentText", { /** * Use it to get or set the comment value. */ get: function () { return this.getLocalizableStringText("commentText", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("otherItemText")); }, set: function (val) { this.setLocalizableStringText("commentText", val); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "locCommentText", { get: function () { return this.getLocalizableString("commentText"); }, enumerable: true, configurable: true }); 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_10__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_7__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 = " " + requireText; return this.processedTitle + requireText; }; 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 }); Object.defineProperty(Question.prototype, "cssMainRoot", { get: function () { var classes = this.cssClasses; var res = this.isFlowLayout && !this.isDesignMode ? classes.flowRoot : classes.mainRoot; if (!this.isFlowLayout && this.getTitleLocation() == "left") { res += " " + classes.titleLeftRoot; } if (this.errors.length > 0) { res += " " + classes.hasError; } return res; }, enumerable: true, configurable: true }); Question.prototype.getRootCss = function (classes) { return classes.question.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_9__defaultCss_cssstandard__["b" /* surveyCss */].getCss(); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "width", { /** * Use it to set the specific width to the question like css style (%, px, em etc). */ get: function () { return this.getPropertyValue("width", ""); }, set: function (val) { this.setPropertyValue("width", val); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "renderWidth", { /** * The rendered width of the question. */ get: function () { return this.getPropertyValue("renderWidth", ""); }, set: function (val) { this.setPropertyValue("renderWidth", val); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "indent", { /** * Set it different from 0 to increase the left padding. */ get: function () { return this.getPropertyValue("indent", 0); }, set: function (val) { this.setPropertyValue("indent", val); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "rightIndent", { /** * Set it different from 0 to increase the right padding. */ get: function () { return this.getPropertyValue("rightIndent", 0); }, set: function (val) { this.setPropertyValue("rightIndent", val); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "paddingLeft", { get: function () { return this.getPropertyValue("paddintLeft", ""); }, set: function (val) { this.setPropertyValue("paddintLeft", val); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "paddingRight", { get: function () { return this.getPropertyValue("paddingRight", ""); }, set: function (val) { this.setPropertyValue("paddingRight", val); }, enumerable: true, configurable: true }); Question.prototype.onIndentChanged = function () { this.paddingLeft = this.getIndentSize(this.indent); this.paddingRight = this.getIndentSize(this.rightIndent); }; Question.prototype.getIndentSize = function (indent) { if (indent < 1) return ""; return indent * this.cssClasses.indent + "px"; }; /** * Move the focus to the input of this question. * @param onError set this parameter to true, to focus the input with the first error, other wise the first input will be focused. */ Question.prototype.focus = function (onError) { if (onError === void 0) { onError = false; } __WEBPACK_IMPORTED_MODULE_3__base__["c" /* SurveyElement */].ScrollElementToTop(this.id); var id = !onError ? this.getFirstInputElementId() : this.getFirstErrorInputElementId(); if (__WEBPACK_IMPORTED_MODULE_3__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, "requiredIf", { /** * An expression that returns true or false. If it returns true the Question becomes required and an end-user has to answer it. * If it returns false the Question then an end-user may not answer it the Question maybe empty. * The library runs the expression on survey start and on changing a question value. If the property is empty then isRequired property is used. * @see isRequired */ get: function () { return this.getPropertyValue("requiredIf", ""); }, set: function (val) { this.setPropertyValue("requiredIf", val); this.runConditions(); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "hasComment", { /** * Set it to true, to add a comment for the question. */ get: function () { return this.getPropertyValue("hasComment", false); }, set: function (val) { if (!this.supportComment()) return; this.setPropertyValue("hasComment", val); if (this.hasComment) this.hasOther = false; }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "id", { /** * The unique identificator. It is generated automatically. */ get: function () { return this.getPropertyValue("id"); }, set: function (val) { this.setPropertyValue("id", val); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "hasOther", { get: function () { return this.getPropertyValue("hasOther", false); }, set: function (val) { if (!this.supportOther() || this.hasOther == val) return; this.setPropertyValue("hasOther", val); if (this.hasOther) this.hasComment = false; this.hasOtherChanged(); }, enumerable: true, configurable: true }); Question.prototype.hasOtherChanged = function () { }; Object.defineProperty(Question.prototype, "isReadOnly", { /** * Retuns true if readOnly property is true or survey is in display mode or parent panel/page is readOnly. * @see SurveyModel.model * @see readOnly */ get: function () { var isParentReadOnly = !!this.parent && this.parent.isReadOnly; var isSurveyReadOnly = !!this.survey && this.survey.isDisplayMode; return this.readOnly || isParentReadOnly || isSurveyReadOnly; }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "enableIf", { /** * An expression that returns true or false. If it returns false the Question becomes read only and an end-user will not able to answer on the qustion. The library runs the expression on survey start and on changing a question value. If the property is empty then readOnly property is used. * @see readOnly * @see isReadOnly */ get: function () { return this.getPropertyValue("enableIf", ""); }, set: function (val) { this.setPropertyValue("enableIf", val); this.runConditions(); }, enumerable: true, configurable: true }); /** * Run visibleIf and enableIf expressions. If visibleIf or/and enabledIf are not empty, then the results of performing the expression (true or false) set to the visible/readOnly properties. * @param values Typically survey results * @see visible * @see visibleIf * @see readOnly * @see enableIf */ Question.prototype.runCondition = function (values, properties) { if (this.isDesignMode) return; if (!this.areInvisibleElementsShowing) { this.runVisibleIfCondition(values, properties); } this.runEnableIfCondition(values, properties); this.runRequiredIfCondition(values, properties); }; Question.prototype.runVisibleIfCondition = function (values, properties) { if (!this.visibleIf) return; if (!this.conditionRunner) this.conditionRunner = new __WEBPACK_IMPORTED_MODULE_8__conditions__["b" /* 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_8__conditions__["b" /* ConditionRunner */](this.enableIf); this.conditionEnabelRunner.expression = this.enableIf; this.readOnly = !this.conditionEnabelRunner.run(values, properties); }; Question.prototype.runRequiredIfCondition = function (values, properties) { if (!this.requiredIf) return; if (!this.conditionRequiredRunner) this.conditionRequiredRunner = new __WEBPACK_IMPORTED_MODULE_8__conditions__["b" /* ConditionRunner */](this.requiredIf); this.conditionRequiredRunner.expression = this.requiredIf; this.isRequired = this.conditionRequiredRunner.run(values, properties); }; Object.defineProperty(Question.prototype, "no", { /** * The property returns the question number. If question is invisible then it returns empty string. * If visibleIndex is 1, then no is 2, or 'B' if survey.questionStartIndex is 'A'. * @see SurveyModel.questionStartIndex */ get: function () { if (this.visibleIndex < 0) return ""; var startIndex = 1; var isNumeric = true; var str = ""; if (this.survey && this.survey.questionStartIndex) { str = this.survey.questionStartIndex; if (parseInt(str)) startIndex = parseInt(str); else if (str.length == 1) isNumeric = false; } if (isNumeric) return (this.visibleIndex + startIndex).toString(); return String.fromCharCode(str.charCodeAt(0) + this.visibleIndex); }, enumerable: true, configurable: true }); Question.prototype.onSurveyLoad = function () { this.fireCallback(this.surveyLoadCallback); this.updateValueWithDefaults(); this.updateDisplayValue(); }; Question.prototype.onSetData = function () { _super.prototype.onSetData.call(this); this.initDataFromSurvey(); this.onSurveyValueChanged(this.value); this.updateValueWithDefaults(); }; Question.prototype.initDataFromSurvey = function () { if (!!this.data) { this.updateValueFromSurvey(this.data.getValue(this.getValueName())); this.updateCommentFromSurvey(this.data.getComment(this.getValueName())); } }; Object.defineProperty(Question.prototype, "questionValue", { get: function () { return this.getPropertyValue("value"); }, set: function (val) { this.setPropertyValue("value", val); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "questionComment", { get: function () { return this.getPropertyValue("comment"); }, set: function (val) { this.setPropertyValue("comment", val); this.fireCallback(this.commentChangedCallback); }, enumerable: true, configurable: true }); Object.defineProperty(Question.prototype, "value", { /** * Get/Set the question value. * @see SurveyMode.setValue * @see SurveyMode.getValue */ get: function () { return this.getValueCore(); }, set: function (newValue) { this.setNewValue(newValue); }, enumerable: true, configurable: true }); Question.prototype.clearValue = function () { this.value = null; this.comment = null; }; Question.prototype.createValueCopy = function () { return __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].getUnbindValue(this.value); }; Question.prototype.canClearValueAsInvisible = function () { if (this.isVisible && this.isParentVisible) return false; if (!!this.page && this.page.isStarted) return false; if (!this.survey || !this.valueName) return true; return !this.survey.hasVisibleQuestionByValueName(this.valueName); }; Object.defineProperty(Question.prototype, "isParentVisible", { get: function () { var parent = this.parent; while (parent) { if (!parent.isVisible) return false; parent = parent.parent; } return true; }, enumerable: true, configurable: true }); Question.prototype.clearValueIfInvisible = function () { if (this.canClearValueAsInvisible()) { this.clearValue(); } }; Object.defineProperty(Question.prototype, "displayValue", { get: function () { this.updateDisplayValue(); return this.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 }); /** * Returns question answer data as a plain object: with question title, name, value and displayValue. * For complex questions (like matrix, etc.) isNode flag is set to true and data contains array of nested objects (rows) * set options.includeEmpty to false if you want to skip empty answers */ Question.prototype.getPlainData = function (options) { var _this = this; if (options === void 0) { options = { includeEmpty: true }; } if (options.includeEmpty || !this.isEmpty()) { var questionPlainData = { name: this.name, title: this.title, value: this.value, displayValue: this.displayValue, isNode: false, getString: function (val) { return typeof val === "object" ? JSON.stringify(val) : val; } }; (options.calculations || []).forEach(function (calculation) { questionPlainData[calculation.propertyName] = _this[calculation.propertyName]; }); return questionPlainData; } return undefined; }; Object.defineProperty(Question.prototype, "correctAnswer", { /** * The correct answer on the question. Set this value if you are doing a quiz. * @see SurveyModel.correctAnswers * @see SurveyModel.inCorrectAnswers */ get: function () { return this.getPropertyValue("correctAnswer"); }, set: function (val) { this.setPropertyValue("correctAnswer", val); }, enumerable: true, configurable: true }); 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; if (this.isEmpty() && this.isDefaultValueEmpty()) return; this.setDefaultValue(); }; Question.prototype.getQuestionFromArray = function (name, index) { return null; }; Question.prototype.getDefaultValue = function () { return this.defaultValue; }; Question.prototype.isDefaultValueEmpty = function () { return this.isValueEmpty(this.defaultValue); }; Question.prototype.setDefaultValue = function () { this.value = this.defaultValue; }; Object.defineProperty(Question.prototype, "comment", { /** * The question comment value. */ get: function () { return this.getComment(); }, set: function (newValue) { if (!!newValue) { newValue = newValue.toString().trim(); } if (this.comment == newValue) return; this.setComment(newValue); }, enumerable: true, configurable: true }); Question.prototype.getComment = function () { return this.questionComment; }; Question.prototype.setComment = function (newValue) { this.setNewComment(newValue); }; /** * Returns true if the question value is empty */ Question.prototype.isEmpty = function () { return this.isValueEmpty(this.value); }; Object.defineProperty(Question.prototype, "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_2__jsonobject__["b" /* JsonObject */]().toJsonObject(this); json["type"] = this.getType(); return json; }; /** * Returns true if there is a validation error(s) in the question. * @param fireCallback set it to true to show an error in UI. */ Question.prototype.hasErrors = function (fireCallback) { 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); }; /** * Remove a particular error from the question error list. * @param error */ Question.prototype.removeError = function (error) { var errors = this.errors; var index = errors.indexOf(error); if (index !== -1) errors.splice(index, 1); }; Question.prototype.checkForErrors = function () { var qErrors = new Array(); if (this.isVisible && !this.isReadOnly) { this.collectErrors(qErrors); } return qErrors; }; Question.prototype.collectErrors = function (qErrors) { this.onCheckForErrors(qErrors); if (qErrors.length == 0) { var errors = this.runValidators(); if (errors.length > 0) { //validators may change the question value. qErrors.length = 0; for (var i = 0; i < errors.length; i++) { qErrors.push(errors[i]); } } } if (this.survey && qErrors.length == 0) { var error = this.fireSurveyValidation(); if (error) { qErrors.push(error); } } }; Question.prototype.fireSurveyValidation = function () { if (this.validateValueCallback) return this.validateValueCallback(); return this.survey ? this.survey.validateQuestion(this) : null; }; Question.prototype.onCheckForErrors = function (errors) { if (this.hasRequiredError()) { errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["d" /* AnswerRequiredError */](this.requiredErrorText, this)); } }; Question.prototype.hasRequiredError = function () { return this.isRequired && this.isEmpty(); }; Question.prototype.runValidators = function () { return new __WEBPACK_IMPORTED_MODULE_6__validator__["a" /* ValidatorRunner */]().run(this); }; Question.prototype.setNewValue = function (newValue) { this.setNewValueInData(newValue); this.onValueChanged(); }; Question.prototype.setNewValueInData = function (newValue) { newValue = this.valueToData(newValue); if (!this.isValueChangedInSurvey) { this.setValueCore(newValue); } }; Question.prototype.getValueCore = function () { return this.questionValue; }; Question.prototype.setValueCore = function (newValue) { this.setQuestionValue(newValue); if (this.data != null) { this.data.setValue(this.getValueName(), newValue); } }; Question.prototype.valueFromData = function (val) { return val; }; Question.prototype.valueToData = function (val) { return val; }; Question.prototype.onValueChanged = function () { }; Question.prototype.setNewComment = function (newValue) { this.questionComment = newValue; if (this.data != null) { this.data.setComment(this.getValueName(), newValue); } }; //IQuestion Question.prototype.updateValueFromSurvey = function (newValue) { newValue = __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].getUnbindValue(newValue); this.setQuestionValue(this.valueFromData(newValue)); }; Question.prototype.updateCommentFromSurvey = function (newValue) { this.questionComment = newValue; }; Question.prototype.setQuestionValue = function (newValue) { this.questionValue = newValue; this.fireCallback(this.valueChangedCallback); }; Question.prototype.onSurveyValueChanged = function (newValue) { if (this.isLoadingFromJson) return; this.updateDisplayValue(); }; Question.prototype.setVisibleIndex = function (val) { if (!this.isVisible || !this.hasTitle) { val = -1; } this.setPropertyValue("visibleIndex", val); return val < 0 ? 0 : 1; }; Question.prototype.removeElement = function (element) { return false; }; Question.prototype.supportGoNextPageAutomatic = function () { return false; }; /** * Call this function to remove values from the current question, that end-user will not be able to enter. * For example the value that doesn't exists in a radigroup/dropdown/checkbox choices or matrix rows/columns. */ Question.prototype.clearIncorrectValues = function () { }; /** * Call this function to clear all errors in the question */ Question.prototype.clearErrors = function () { this.errors = []; }; Question.prototype.clearUnusedValues = function () { }; Question.prototype.onAnyValueChanged = function (name) { }; /** * Returns the current survey locale * @see SurveyModel.locale */ Question.prototype.getLocale = function () { return this.survey ? this.survey.getLocale() : this.locOwner ? this.locOwner.getLocale() : ""; }; Question.prototype.getMarkdownHtml = function (text) { return this.survey ? this.survey.getSurveyMarkdownHtml(this, text) : this.locOwner ? this.locOwner.getMarkdownHtml(text) : null; }; Question.prototype.getProcessedText = function (text) { if (this.textProcessor) return this.textProcessor.processText(text, this.useDisplayValuesInTitle); if (this.locOwner) return this.locOwner.getProcessedText(text); return text; }; //ISurveyErrorOwner Question.prototype.getErrorCustomText = function (text, error) { if (!!this.survey) return this.survey.getErrorCustomText(text, error); return text; }; //IValidatorOwner Question.prototype.getValidatorTitle = function () { return null; }; Object.defineProperty(Question.prototype, "validatedValue", { get: function () { return this.value; }, set: function (val) { this.value = val; }, enumerable: true, configurable: true }); Question.prototype.getAllValues = function () { return !!this.data ? this.data.getAllValues() : null; }; Question.TextPreprocessorValuesMap = { title: "processedTitle", require: "requiredText" }; Question.questionCounter = 100; return Question; }(__WEBPACK_IMPORTED_MODULE_3__base__["c" /* SurveyElement */])); __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addClass("question", [ "!name", { name: "visible:boolean", default: true }, { name: "useDisplayValuesInTitle:boolean", default: true, layout: "row" }, "visibleIf:condition", { name: "width" }, { name: "startWithNewLine:boolean", default: true, layout: "row" }, { name: "indent:number", default: 0, choices: [0, 1, 2, 3], layout: "row" }, { name: "page", isSerializable: false, choices: function (obj) { var survey = obj ? obj.survey : null; return survey ? survey.pages.map(function (p) { return { value: p.name, text: p.title }; }) : []; } }, { name: "title:text", serializationProperty: "locTitle", layout: "row" }, { name: "description:text", serializationProperty: "locDescription", layout: "row" }, "valueName", "enableIf:condition", "defaultValue:value", "correctAnswer:value", "isRequired:boolean", "requiredIf:condition", { name: "requiredErrorText:text", serializationProperty: "locRequiredErrorText" }, "readOnly:boolean", { name: "validators:validators", baseClassName: "surveyvalidator", classNamePart: "validator" }, { name: "titleLocation", default: "default", choices: ["default", "top", "bottom", "left", "hidden"], layout: "row" } ]); __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addAlterNativeClassName("question", "questionbase"); /***/ }), /* 9 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return settings; }); /** * Global survey settings */ var settings = { /** * The prefix that uses to store the question comment, as {questionName} + {commentPrefix}. * The default */ commentPrefix: "-Comment", /** * Encode parameter on calling restfull web API */ webserviceEncodeParameters: true, /** * SurveyJS web service API url */ surveyServiceUrl: "https://dxsurveyapi.azurewebsites.net/api/Survey", /** * separator that can allow to set value and text of ItemValue object in one string as: "value|text" */ itemValueSeparator: "|", /** * default locale name for localizable strings that uses during serialization, {"default": "My text", "de": "Mein Text"} */ defaultLocaleName: "default", /** * Default row name for matrix (single choice) */ matrixDefaultRowName: "default", /** * Default cell type for dropdown and dynamic matrices */ matrixDefaultCellType: "dropdown", /** * Total value postfix for dropdown and dynamic matrices. The total value stores as: {matrixName} + {postfix} */ matrixTotalValuePostFix: "-total", /** * Maximum row count in dynamic matrix */ matrixMaximumRowCount: 1000, /** * Maximum panel count in dynamic panel */ panelMaximumPanelCount: 100, /** * Maximum rate value count in rating question */ ratingMaximumRateValueCount: 20 }; /***/ }), /* 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__conditionProcessValue__ = __webpack_require__(16); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__conditionsParser__ = __webpack_require__(38); /* unused harmony export ExpressionRunnerBase */ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return ConditionRunner; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ExpressionRunner; }); var ExpressionRunnerBase = /** @class */ (function () { function ExpressionRunnerBase(expression) { this.processValue = new __WEBPACK_IMPORTED_MODULE_1__conditionProcessValue__["a" /* ProcessValue */](); this.parser = new __WEBPACK_IMPORTED_MODULE_2__conditionsParser__["a" /* ConditionsParser */](); this.expression = expression; } Object.defineProperty(ExpressionRunnerBase.prototype, "expression", { get: function () { return this.expressionValue; }, set: function (value) { if (this.expression === value) return; this.expressionValue = value; this.operand = this.parser.parseExpression(value); }, enumerable: true, configurable: true }); ExpressionRunnerBase.prototype.getVariables = function () { if (!this.operand) return []; var variables = []; this.operand.setVariables(variables); return variables; }; ExpressionRunnerBase.prototype.hasFunction = function () { if (this.canRun()) { return this.operand.hasFunction(); } return false; }; ExpressionRunnerBase.prototype.canRun = function () { return !!this.operand; }; ExpressionRunnerBase.prototype.runCore = 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.evaluate(this.processValue); }; return ExpressionRunnerBase; }()); var ConditionRunner = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](ConditionRunner, _super); function ConditionRunner() { return _super !== null && _super.apply(this, arguments) || this; } ConditionRunner.prototype.run = function (values, properties) { if (properties === void 0) { properties = null; } return this.runCore(values, properties) == true; }; return ConditionRunner; }(ExpressionRunnerBase)); var ExpressionRunner = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](ExpressionRunner, _super); function ExpressionRunner() { return _super !== null && _super.apply(this, arguments) || this; } ExpressionRunner.prototype.run = function (values, properties) { if (properties === void 0) { properties = null; } return this.runCore(values, properties); }; return ExpressionRunner; }(ExpressionRunnerBase)); /***/ }), /* 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__surveyStrings__ = __webpack_require__(2); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(5); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return AnswerRequiredError; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return OneAnswerRequiredError; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return RequreNumericError; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return ExceedSizeError; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return WebRequestError; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return WebRequestEmptyError; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return OtherEmptyError; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return UploadingFileError; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return RequiredInAllRowsError; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return MinRowCountError; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return KeyDuplicationError; }); /* 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, errorOwner) { if (text === void 0) { text = null; } if (errorOwner === void 0) { errorOwner = null; } var _this = _super.call(this, text, errorOwner) || this; _this.text = text; return _this; } AnswerRequiredError.prototype.getErrorType = function () { return "required"; }; AnswerRequiredError.prototype.getDefaultText = function () { return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("requiredError"); }; return AnswerRequiredError; }(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */])); var OneAnswerRequiredError = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](OneAnswerRequiredError, _super); function OneAnswerRequiredError(text, errorOwner) { if (text === void 0) { text = null; } if (errorOwner === void 0) { errorOwner = null; } var _this = _super.call(this, text, errorOwner) || this; _this.text = text; return _this; } OneAnswerRequiredError.prototype.getErrorType = function () { return "requireoneanswer"; }; OneAnswerRequiredError.prototype.getDefaultText = function () { return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("requiredErrorInPanel"); }; return OneAnswerRequiredError; }(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */])); var RequreNumericError = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](RequreNumericError, _super); function RequreNumericError(text, errorOwner) { if (text === void 0) { text = null; } if (errorOwner === void 0) { errorOwner = null; } var _this = _super.call(this, text, errorOwner) || this; _this.text = text; return _this; } RequreNumericError.prototype.getErrorType = function () { return "requirenumeric"; }; RequreNumericError.prototype.getDefaultText = function () { return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("numericError"); }; return RequreNumericError; }(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */])); var ExceedSizeError = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](ExceedSizeError, _super); function ExceedSizeError(maxSize, errorOwner) { if (errorOwner === void 0) { errorOwner = null; } var _this = _super.call(this, null, errorOwner) || this; _this.maxSize = maxSize; _this.locText.text = _this.getText(); return _this; } ExceedSizeError.prototype.getErrorType = function () { return "exceedsize"; }; ExceedSizeError.prototype.getDefaultText = function () { return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */] .getString("exceedMaxSize")["format"](this.getTextSize()); }; ExceedSizeError.prototype.getTextSize = function () { var sizes = ["Bytes", "KB", "MB", "GB", "TB"]; var fixed = [0, 0, 2, 3, 3]; if (this.maxSize === 0) { return "0 Byte"; } var i = Math.floor(Math.log(this.maxSize) / Math.log(1024)); var value = this.maxSize / Math.pow(1024, i); return value.toFixed(fixed[i]) + " " + sizes[i]; }; return ExceedSizeError; }(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */])); var WebRequestError = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](WebRequestError, _super); function WebRequestError(status, response, errorOwner) { if (errorOwner === void 0) { errorOwner = null; } var _this = _super.call(this, null, errorOwner) || this; _this.status = status; _this.response = response; return _this; } WebRequestError.prototype.getErrorType = function () { return "webrequest"; }; WebRequestError.prototype.getDefaultText = function () { return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */] .getString("urlRequestError")["format"](this.status, this.response); }; return WebRequestError; }(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */])); var WebRequestEmptyError = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](WebRequestEmptyError, _super); function WebRequestEmptyError(text, errorOwner) { if (errorOwner === void 0) { errorOwner = null; } var _this = _super.call(this, text, errorOwner) || this; _this.text = text; return _this; } WebRequestEmptyError.prototype.getErrorType = function () { return "webrequestempty"; }; WebRequestEmptyError.prototype.getDefaultText = function () { return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("urlGetChoicesError"); }; return WebRequestEmptyError; }(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */])); var OtherEmptyError = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](OtherEmptyError, _super); function OtherEmptyError(text, errorOwner) { if (errorOwner === void 0) { errorOwner = null; } var _this = _super.call(this, text, errorOwner) || this; _this.text = text; return _this; } OtherEmptyError.prototype.getErrorType = function () { return "otherempty"; }; OtherEmptyError.prototype.getDefaultText = function () { return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("otherRequiredError"); }; return OtherEmptyError; }(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */])); var UploadingFileError = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](UploadingFileError, _super); function UploadingFileError(text, errorOwner) { if (errorOwner === void 0) { errorOwner = null; } var _this = _super.call(this, text, errorOwner) || this; _this.text = text; return _this; } UploadingFileError.prototype.getErrorType = function () { return "uploadingfile"; }; UploadingFileError.prototype.getDefaultText = function () { return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("uploadingFile"); }; return UploadingFileError; }(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */])); var RequiredInAllRowsError = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](RequiredInAllRowsError, _super); function RequiredInAllRowsError(text, errorOwner) { if (errorOwner === void 0) { errorOwner = null; } var _this = _super.call(this, text, errorOwner) || this; _this.text = text; return _this; } RequiredInAllRowsError.prototype.getErrorType = function () { return "requiredinallrowserror"; }; RequiredInAllRowsError.prototype.getDefaultText = function () { return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("requiredInAllRowsError"); }; return RequiredInAllRowsError; }(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */])); var MinRowCountError = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](MinRowCountError, _super); function MinRowCountError(minRowCount, errorOwner) { if (errorOwner === void 0) { errorOwner = null; } var _this = _super.call(this, null, errorOwner) || this; _this.minRowCount = minRowCount; return _this; } MinRowCountError.prototype.getErrorType = function () { return "minrowcounterror"; }; MinRowCountError.prototype.getDefaultText = function () { return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */] .getString("minRowCountError")["format"](this.minRowCount); }; return MinRowCountError; }(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */])); var KeyDuplicationError = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](KeyDuplicationError, _super); function KeyDuplicationError(text, errorOwner) { if (errorOwner === void 0) { errorOwner = null; } var _this = _super.call(this, text, errorOwner) || this; _this.text = text; return _this; } KeyDuplicationError.prototype.getErrorType = function () { return "keyduplicationerror"; }; KeyDuplicationError.prototype.getDefaultText = function () { return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("keyDuplicationError"); }; return KeyDuplicationError; }(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */])); var CustomError = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](CustomError, _super); function CustomError(text, errorOwner) { if (errorOwner === void 0) { errorOwner = null; } var _this = _super.call(this, text, errorOwner) || this; _this.text = text; return _this; } CustomError.prototype.getErrorType = function () { return "custom"; }; return CustomError; }(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */])); /***/ }), /* 12 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__localizablestring__ = __webpack_require__(17); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__helpers__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditions__ = __webpack_require__(10); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__base__ = __webpack_require__(5); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__settings__ = __webpack_require__(9); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ItemValue; }); /** * Array of ItemValue is used in checkox, dropdown and radiogroup choices, matrix columns and rows. * It has two main properties: value and text. If text is empty, value is used for displaying. * The text property is localizable and support markdown. */ var ItemValue = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](ItemValue, _super); function ItemValue(value, text, typeName) { if (text === void 0) { text = null; } if (typeName === void 0) { typeName = "itemvalue"; } var _this = _super.call(this) || this; _this.typeName = typeName; _this.visibleIfValue = ""; _this.isVisibleValue = true; _this.locTextValue = new __WEBPACK_IMPORTED_MODULE_1__localizablestring__["a" /* LocalizableString */](null, true); _this.locTextValue.onGetTextCallback = function (txt) { return txt ? txt : !_this.isValueItemEmpty ? _this.value.toString() : null; }; if (text) _this.locText.text = text; if (!!value && typeof value === "object") { _this.setData(value); } else { _this.value = value; } _this.onCreating(); return _this; } Object.defineProperty(ItemValue, "Separator", { get: function () { return __WEBPACK_IMPORTED_MODULE_6__settings__["a" /* settings */].itemValueSeparator; }, set: function (val) { __WEBPACK_IMPORTED_MODULE_6__settings__["a" /* settings */].itemValueSeparator = val; }, enumerable: true, configurable: true }); ItemValue.createArray = function (locOwner) { var items = []; ItemValue.setupArray(items, locOwner); return items; }; ItemValue.setupArray = function (items, locOwner) { items.push = function (value) { var result = Array.prototype.push.call(this, value); value.locOwner = locOwner; return result; }; items.unshift = function (value) { var result = Array.prototype.unshift.call(this, value); value.locOwner = locOwner; return result; }; items.splice = function (start, deleteCount) { var 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__["a" /* Serializer */].createClass(value.getType()); } else { item = new ItemValue(null); } item.setData(value); items.push(item); } }; ItemValue.getData = function (items) { var result = new Array(); for (var i = 0; i < items.length; i++) { result.push(items[i].getData()); } return result; }; ItemValue.getItemByValue = function (items, val) { for (var i = 0; i < items.length; i++) { if (__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(items[i].value, val)) return items[i]; } return null; }; ItemValue.getTextOrHtmlByValue = function (items, val) { var item = ItemValue.getItemByValue(items, val); return item !== null ? item.locText.textOrHtml : ""; }; ItemValue.locStrsChanged = function (items) { for (var i = 0; i < items.length; i++) { items[i].locText.strChanged(); } }; ItemValue.runConditionsForItems = function (items, filteredItems, runner, values, properties) { 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 ? this.typeName : "itemvalue"; }; Object.defineProperty(ItemValue.prototype, "locText", { get: function () { return this.locTextValue; }, enumerable: true, configurable: true }); ItemValue.prototype.setLocText = function (locText) { this.locTextValue = locText; }; Object.defineProperty(ItemValue.prototype, "locOwner", { get: function () { return this.locText.owner; }, set: function (value) { this.locText.owner = value; }, enumerable: true, configurable: true }); Object.defineProperty(ItemValue.prototype, "value", { get: function () { return this.itemValue; }, set: function (newValue) { this.itemValue = newValue; if (!this.itemValue) return; var str = this.itemValue.toString(); var index = str.indexOf(__WEBPACK_IMPORTED_MODULE_6__settings__["a" /* settings */].itemValueSeparator); if (index > -1) { this.itemValue = str.slice(0, index); this.text = str.slice(index + 1); } else if (!this.hasText) { this.locText.onChanged(); } }, enumerable: true, configurable: true }); Object.defineProperty(ItemValue.prototype, "hasText", { get: function () { return this.locText.pureText ? true : false; }, enumerable: true, configurable: true }); Object.defineProperty(ItemValue.prototype, "text", { get: function () { return this.locText.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__["a" /* Serializer */].getProperties(this.getType()); if (!properties || properties.length == 0) { properties = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].getProperties("itemvalue"); } var jsoObj = new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */](); for (var i = 0; i < properties.length; i++) { jsoObj.valueToJson(this, res, properties[i]); } return res; }; ItemValue.prototype.setData = function (value) { if (__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isValueEmpty(value)) return; if (typeof value.value !== "undefined") { var json = value; if (typeof value.toJSON === "function") { json = value.toJSON(); } new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */]().toObject(json, this); } else { this.value = value; } }; Object.defineProperty(ItemValue.prototype, "visibleIf", { get: function () { return this.visibleIfValue; }, set: function (val) { this.visibleIfValue = val; }, enumerable: true, configurable: true }); Object.defineProperty(ItemValue.prototype, "isVisible", { get: function () { return this.isVisibleValue; }, enumerable: true, configurable: true }); ItemValue.prototype.setIsVisible = function (val) { this.isVisibleValue = val; }; Object.defineProperty(ItemValue.prototype, "isEnabled", { get: function () { return this.getPropertyValue("isEnabled", true); }, enumerable: true, configurable: true }); ItemValue.prototype.setIsEnabled = function (val) { this.setPropertyValue("isEnabled", val); }; ItemValue.prototype.getConditionRunner = function (isVisible) { if (isVisible) return this.getVisibleConditionRunner(); return this.getEnableConditionRunner(); }; ItemValue.prototype.getVisibleConditionRunner = function () { if (!this.visibleIf) return null; if (!this.visibleConditionRunner) this.visibleConditionRunner = new __WEBPACK_IMPORTED_MODULE_4__conditions__["b" /* ConditionRunner */](this.visibleIf); this.visibleConditionRunner.expression = this.visibleIf; return this.visibleConditionRunner; }; ItemValue.prototype.getEnableConditionRunner = function () { if (!this.enableIf) return null; if (!this.enableConditionRunner) this.enableConditionRunner = new __WEBPACK_IMPORTED_MODULE_4__conditions__["b" /* ConditionRunner */](this.enableIf); this.enableConditionRunner.expression = this.enableIf; return this.enableConditionRunner; }; Object.defineProperty(ItemValue.prototype, "isValueItemEmpty", { get: function () { return !this.itemValue && this.itemValue !== 0 && this.itemValue !== false; }, enumerable: true, configurable: true }); return ItemValue; }(__WEBPACK_IMPORTED_MODULE_5__base__["b" /* Base */])); __WEBPACK_IMPORTED_MODULE_5__base__["b" /* Base */].createItemValue = function (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__["b" /* Base */].itemValueLocStrChanged = function (arr) { ItemValue.locStrsChanged(arr); }; __WEBPACK_IMPORTED_MODULE_2__jsonobject__["d" /* JsonObjectProperty */].getItemValuesDefaultValue = function (val) { var res = new Array(); ItemValue.setData(res, val || []); return res; }; __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addClass("itemvalue", [ "value", { name: "text", serializationProperty: "locText" }, { name: "visibleIf:condition", visible: false }, { name: "enableIf:condition", visible: false } ], function (value) { return new ItemValue(value); }); /***/ }), /* 13 */ /***/ (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", bodyEmpty: "sv_body sv_body_empty", 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", flowRoot: "sv_q_flow sv_qstn", titleLeftRoot: "sv_qstn_left", title: "sv_q_title", number: "sv_q_num", 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: "", locationTop: "sv_qstn_error_top", locationBottom: "sv_qstn_error_bottom" }, 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", column: "sv_q_select_column" }, comment: "", dropdown: { root: "", control: "sv_q_dropdown_control", selectWrapper: "sv_select_wrapper", other: "sv_q_dd_other" }, html: { root: "" }, matrix: { root: "sv_q_matrix", label: "sv_q_m_label", cellText: "sv_q_m_cell_text", cellTextSelected: "sv_q_m_cell_selected", cellLabel: "sv_q_m_cell_label" }, matrixdropdown: { root: "sv_q_matrix_dropdown" }, matrixdynamic: { root: "sv_q_matrix_dynamic", button: "sv_matrix_dynamic_button", buttonAdd: "", buttonRemove: "", iconAdd: "", iconRemove: "" }, paneldynamic: { root: "sv_panel_dynamic", title: "sv_p_title", button: "", 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", column: "sv_q_select_column" }, 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; /***/ }), /* 14 */ /***/ (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__(7); /* 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)); /***/ }), /* 15 */ /***/ (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__(6); /* 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__(23); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__base__ = __webpack_require__(5); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__kopage__ = __webpack_require__(24); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__defaultCss_cssstandard__ = __webpack_require__(13); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__templateText__ = __webpack_require__(36); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__questionCustomWidgets__ = __webpack_require__(28); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__localizablestring__ = __webpack_require__(17); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__itemvalue__ = __webpack_require__(12); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__kobase__ = __webpack_require__(18); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Survey; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return registerTemplateEngine; }); __WEBPACK_IMPORTED_MODULE_7__questionCustomWidgets__["a" /* CustomWidgetCollection */].Instance.onCustomWidgetAdded.add(function (customWidget) { if (customWidget.widgetJson.isDefaultRender) return; if (!customWidget.htmlTemplate) customWidget.htmlTemplate = "<div>'htmlTemplate' attribute is missed.</div>"; 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__["a" /* Event */](); _this.isFirstRender = true; _this.mouseDownPage = null; 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.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); // (<any>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; 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.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.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.doTimer = function () { _super.prototype.doTimer.call(this); 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__["renderTemplate"]("survey-content", this, { afterRender: this.koEventAfterRender }, 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); Object.defineProperty(self, "koHasHtml", { get: function () { self.koReRender(); return self.hasHtml; } }); 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"; var registerTemplateEngine = function (ko, platform) { ko.surveyTemplateEngine = function () { }; ko.surveyTemplateEngine.prototype = new ko.nativeTemplateEngine(); ko.surveyTemplateEngine.prototype.makeTemplateSource = function (template, templateDocument) { if (typeof template === "string") { templateDocument = templateDocument || document; var templateElementRoot = templateDocument.getElementById("survey-content-" + platform); if (!templateElementRoot) { templateElementRoot = document.createElement("div"); templateElementRoot.id = "survey-content-" + __WEBPACK_IMPORTED_MODULE_2__survey__["a" /* SurveyModel */].platform; templateElementRoot.style.display = "none"; templateElementRoot.innerHTML = __WEBPACK_IMPORTED_MODULE_6__templateText__["b" /* koTemplate */]; document.body.appendChild(templateElementRoot); } var elem; for (var i = 0; i < templateElementRoot.children.length; i++) { if (templateElementRoot.children[i].id === template) { elem = templateElementRoot.children[i]; break; } } if (!elem) { elem = templateDocument.getElementById(template); } if (!elem) { throw new Error("Cannot find template with ID " + template); } return new ko.templateSources.domElement(elem); } else if (template.nodeType === 1 || template.nodeType === 8) { return new ko.templateSources.anonymousTemplate(template); } else { throw new Error("Unknown template type: " + template); } }; // (<any>ko).surveyTemplateEngine.prototype.renderTemplateSource = function (templateSource: any, bindingContext: any, options: any, templateDocument: any) { // var useNodesIfAvailable = !((<any>ko.utils).ieVersion < 9), // templateNodesFunc = useNodesIfAvailable ? templateSource["nodes"] : null, // templateNodes = templateNodesFunc ? templateSource["nodes"]() : null; // if (templateNodes) { // return (<any>ko.utils).makeArray(templateNodes.cloneNode(true).childNodes); // } else { // var templateText = templateSource["text"](); // return (<any>ko.utils).parseHtmlFragment(templateText, templateDocument); // } // }; var surveyTemplateEngineInstance = new ko.surveyTemplateEngine(); ko.setTemplateEngine(surveyTemplateEngineInstance); }; /***/ }), /* 16 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(4); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ProcessValue; }); var ProcessValue = /** @class */ (function () { function ProcessValue() { this.values = null; this.properties = null; } ProcessValue.prototype.getFirstName = function (text, obj) { if (obj === void 0) { obj = null; } if (!text) return text; var res = ""; if (!!obj) { res = this.getFirstPropertyName(text, obj); if (!!res) return res; } for (var i = 0; i < text.length; i++) { var ch = text[i]; if (ch == "." || ch == "[") break; res += ch; } return res; }; ProcessValue.prototype.hasValue = function (text, values) { if (values === void 0) { values = null; } if (!values) values = this.values; var res = this.getValueCore(text, values); return res.hasValue; }; ProcessValue.prototype.setValue = function (obj, text, value) { if (!text) return; var nonNestedObj = this.getNonNestedObject(obj, text); if (!nonNestedObj) return; obj = nonNestedObj.value; text = nonNestedObj.text; if (!!obj && !!text) { obj[text] = value; } }; ProcessValue.prototype.getValue = function (text, values) { if (values === void 0) { values = null; } if (!values) values = this.values; var res = this.getValueCore(text, values); return res.value; }; ProcessValue.prototype.getValueCore = function (text, values) { var res = { hasValue: false, value: null }; var curValue = values; if (!curValue) return res; if (text && text.lastIndexOf(".length") > -1 && text.lastIndexOf(".length") === text.length - ".length".length) { res.value = 0; res.hasValue = true; } var nonNestedObj = this.getNonNestedObject(curValue, text); if (!nonNestedObj) return res; res.value = !!nonNestedObj.text ? this.getObjectValue(nonNestedObj.value, nonNestedObj.text) : nonNestedObj.value; res.hasValue = !__WEBPACK_IMPORTED_MODULE_0__helpers__["a" /* Helpers */].isValueEmpty(res.value); return res; }; ProcessValue.prototype.getNonNestedObject = function (obj, text) { var curName = this.getFirstPropertyName(text, obj); while (text != curName && !!obj) { var isArray = text[0] == "["; if (!isArray) { if (!curName && text == this.getFirstName(text)) return { value: obj, text: text }; obj = this.getObjectValue(obj, curName); if (!obj) return null; text = text.substr(curName.length); } else { var objInArray = this.getObjInArray(obj, text); if (!objInArray) return null; obj = objInArray.value; text = objInArray.text; } if (!!text && text[0] == ".") { text = text.substr(1); } curName = this.getFirstPropertyName(text, obj); } return { value: obj, text: text }; }; ProcessValue.prototype.getObjInArray = function (curValue, text) { if (!Array.isArray(curValue)) return null; var index = 1; var str = ""; while (index < text.length && text[index] != "]") { str += text[index]; index++; } text = index < text.length ? text.substr(index + 1) : ""; index = this.getIntValue(str); if (index < 0 || index >= curValue.length) return null; return { value: curValue[index], text: text }; }; ProcessValue.prototype.getFirstPropertyName = function (name, obj) { if (!name) return name; if (obj.hasOwnProperty(name)) return name; name = name.toLowerCase(); var A = name[0]; var a = A.toUpperCase(); for (var key in obj) { var first = key[0]; if (first === a || first === A) { var keyName = key.toLowerCase(); if (keyName == name) return key; if (name.length <= keyName.length) continue; var ch = name[keyName.length]; if (ch != "." && ch != "[") continue; if (keyName == name.substr(0, keyName.length)) return key; } } return ""; }; ProcessValue.prototype.getObjectValue = function (obj, name) { if (!name) return null; return obj[name]; }; ProcessValue.prototype.getIntValue = function (str) { if (str == "0" || ((str | 0) > 0 && str % 1 == 0)) return Number(str); return -1; }; return ProcessValue; }()); /***/ }), /* 17 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__surveyStrings__ = __webpack_require__(2); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__settings__ = __webpack_require__(9); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return LocalizableString; }); /** * The class represents the string that supports multi-languages and markdown. * It uses in all objects where support for multi-languages and markdown is required. */ var LocalizableString = /** @class */ (function () { function LocalizableString(owner, useMarkdown) { if (useMarkdown === void 0) { useMarkdown = false; } this.owner = owner; this.useMarkdown = useMarkdown; this.values = {}; this.htmlValues = {}; this.renderedText = null; this.calculatedText = null; this.onGetTextCallback = null; this.onCreating(); } Object.defineProperty(LocalizableString, "defaultLocale", { get: function () { return __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName; }, set: function (val) { __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName = val; }, enumerable: true, configurable: true }); Object.defineProperty(LocalizableString.prototype, "locale", { get: function () { return this.owner ? this.owner.getLocale() : ""; }, enumerable: true, configurable: true }); LocalizableString.prototype.strChanged = function () { if (this.renderedText === null) return; this.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 = __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName; var res = this.values[loc]; if (!res && loc == __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName) { res = this.values[__WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].defaultLocale]; } if (!res && loc !== __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName) { res = this.values[__WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName]; } if (!res) res = ""; return res; }, enumerable: true, configurable: true }); Object.defineProperty(LocalizableString.prototype, "hasHtml", { get: function () { return this.hasHtmlValue(); }, enumerable: true, configurable: true }); Object.defineProperty(LocalizableString.prototype, "html", { get: function () { if (!this.hasHtml) return ""; return this.getHtmlValue(); }, enumerable: true, configurable: true }); Object.defineProperty(LocalizableString.prototype, "isEmpty", { get: function () { return 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 = __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName; var res = this.values[loc]; return res ? res : ""; }; LocalizableString.prototype.setLocaleText = function (loc, value) { if (value == this.getLocaleText(loc)) return; if (value && loc && loc != __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName && !this.values[loc] && value == this.getLocaleText(__WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName)) return; if (!loc) loc = __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName; delete this.htmlValues[loc]; if (!value) { if (this.values[loc]) delete this.values[loc]; } else { if (typeof value === "string") { if (loc != __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName && value == this.getLocaleText(__WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName)) { this.setLocaleText(loc, null); } else { this.values[loc] = value; if (loc == __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName) { 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] != __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName; }; LocalizableString.prototype.getJson = function () { var keys = Object.keys(this.values); if (keys.length == 0) return null; if (keys.length == 1 && keys[0] == __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName) return this.values[keys[0]]; return this.values; }; LocalizableString.prototype.setJson = function (value) { 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 = __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName; this.htmlValues[loc] = this.owner.getMarkdownHtml(text); return this.htmlValues[loc] ? true : false; }; LocalizableString.prototype.getHtmlValue = function () { var loc = this.locale; if (!loc) loc = __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName; return this.htmlValues[loc]; }; LocalizableString.prototype.deleteValuesEqualsToDefault = function (defaultValue) { var keys = Object.keys(this.values); for (var i = 0; i < keys.length; i++) { if (keys[i] == __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName) continue; if (this.values[keys[i]] == defaultValue) delete this.values[keys[i]]; } }; return LocalizableString; }()); /***/ }), /* 18 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_knockout__ = __webpack_require__(6); /* 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; }()); /***/ }), /* 19 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(5); /* 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__(13); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__error__ = __webpack_require__(11); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__settings__ = __webpack_require__(9); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return DragDropInfo; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return QuestionRowModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return PanelModelBase; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return PanelModel; }); var DragDropInfo = /** @class */ (function () { function DragDropInfo(source, target, nestedPanelDepth) { if (nestedPanelDepth === void 0) { nestedPanelDepth = -1; } this.source = source; this.target = target; this.nestedPanelDepth = nestedPanelDepth; } return DragDropInfo; }()); var QuestionRowModel = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionRowModel, _super); function QuestionRowModel(panel) { var _this = _super.call(this) || this; _this.panel = panel; _this.visible = panel.areInvisibleElementsShowing; _this.createNewArray("elements"); return _this; } Object.defineProperty(QuestionRowModel.prototype, "elements", { get: function () { return this.getPropertyValue("elements"); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionRowModel.prototype, "visible", { get: function () { return this.getPropertyValue("visible", true); }, set: function (val) { this.setPropertyValue("visible", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionRowModel.prototype, "visibleElements", { get: function () { return this.elements.filter(function (e) { return e.isVisible; }); }, enumerable: true, configurable: true }); QuestionRowModel.prototype.updateVisible = function () { this.visible = this.calcVisible(); this.setWidth(); }; QuestionRowModel.prototype.addElement = function (q) { this.elements.push(q); this.updateVisible(); }; Object.defineProperty(QuestionRowModel.prototype, "index", { get: function () { return this.panel.rows.indexOf(this); }, enumerable: true, configurable: true }); QuestionRowModel.prototype.setWidth = function () { var visCount = this.visibleElements.length; if (visCount == 0) return; var counter = 0; for (var i = 0; i < this.elements.length; i++) { if (this.elements[i].isVisible) { var q = this.elements[i]; q.renderWidth = q.width ? q.width : (100 / visCount).toFixed(6) + "%"; q.rightIndent = counter < visCount - 1 ? 1 : 0; counter++; } else { this.elements[i].renderWidth = ""; } } }; QuestionRowModel.prototype.calcVisible = function () { return this.visibleElements.length > 0; }; return QuestionRowModel; }(__WEBPACK_IMPORTED_MODULE_2__base__["b" /* Base */])); /** * A base class for a Panel and Page objects. */ var PanelModelBase = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](PanelModelBase, _super); function PanelModelBase(name) { if (name === void 0) { name = ""; } var _this = _super.call(this, name) || this; _this.name = name; _this.isQuestionsReady = false; _this.questionsValue = new Array(); _this.conditionVersion = -1; _this.createNewArray("rows"); _this.elementsValue = _this.createNewArray("elements", _this.onAddElement.bind(_this), _this.onRemoveElement.bind(_this)); _this.registerFunctionOnPropertyValueChanged("questionTitleLocation", _this.onVisibleChanged.bind(_this)); _this.id = PanelModelBase.getPanelId(); _this.createLocalizableString("title", _this, true); _this.createLocalizableString("description", _this, true); _this.createLocalizableString("requiredErrorText", _this); return _this; } PanelModelBase.getPanelId = function () { return "sp_" + PanelModelBase.panelCounter++; }; PanelModelBase.prototype.getType = function () { return "panelbase"; }; PanelModelBase.prototype.setSurveyImpl = function (value) { _super.prototype.setSurveyImpl.call(this, value); if (this.isDesignMode) this.onVisibleChanged(); for (var i = 0; i < this.elements.length; i++) { this.elements[i].setSurveyImpl(value); } }; PanelModelBase.prototype.endLoadingFromJson = function () { _super.prototype.endLoadingFromJson.call(this); this.markQuestionListDirty(); this.onRowsChanged(); }; Object.defineProperty(PanelModelBase.prototype, "title", { /** * PanelModel or PageModel title property. * @description */ get: function () { return this.getLocalizableStringText("title"); }, set: function (val) { this.setLocalizableStringText("title", val); }, enumerable: true, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "locTitle", { get: function () { return this.getLocalizableString("title"); }, enumerable: true, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "description", { /** * PanelModel or PageModel description property. It renders under title by using smaller font. Unlike the title, description can be empty. * @see title */ get: function () { return this.getLocalizableStringText("description"); }, set: function (val) { this.setLocalizableStringText("description", val); }, enumerable: true, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "locDescription", { get: function () { return this.getLocalizableString("description"); }, enumerable: true, configurable: true }); PanelModelBase.prototype.locStrsChanged = function () { _super.prototype.locStrsChanged.call(this); for (var i = 0; i < this.elements.length; i++) { this.elements[i].locStrsChanged(); } }; Object.defineProperty(PanelModelBase.prototype, "requiredErrorText", { /** * The custom text that will be shown on required error. Use this property, if you do not want to show the default text. */ get: function () { return this.getLocalizableStringText("requiredErrorText"); }, set: function (val) { this.setLocalizableStringText("requiredErrorText", val); }, enumerable: true, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "locRequiredErrorText", { get: function () { return this.getLocalizableString("requiredErrorText"); }, enumerable: true, configurable: true }); PanelModelBase.prototype.getLocale = function () { return this.survey ? this.survey.getLocale() : ""; }; PanelModelBase.prototype.getMarkdownHtml = function (text) { return this.survey ? this.survey.getSurveyMarkdownHtml(this, text) : null; }; PanelModelBase.prototype.getProcessedText = function (text) { return this.textProcessor ? this.textProcessor.processText(text, true) : text; }; Object.defineProperty(PanelModelBase.prototype, "parent", { /** * A parent element. It is always null for the Page object and always not null for the Panel object. Panel object may contain Questions and other Panels. */ get: function () { return this.getPropertyValue("parent", null); }, set: function (val) { this.setPropertyValue("parent", val); }, enumerable: true, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "depth", { get: function () { if (this.parent == null) return 0; return this.parent.depth + 1; }, enumerable: true, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "visibleIf", { /** * An expression that returns true or false. If it returns true the Panel becomes visible and if it returns false the Panel becomes invisible. The library runs the expression on survey start and on changing a question value. If the property is empty then visible property is used. * @see visible */ get: function () { return this.getPropertyValue("visibleIf", ""); }, set: function (val) { this.setPropertyValue("visibleIf", val); }, enumerable: true, configurable: true }); Object.defineProperty(PanelModelBase.prototype, "cssClasses", { get: function () { var classes = { 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; }; PanelModelBase.prototype.getLayoutType = function () { return "row"; }; PanelModelBase.prototype.isLayoutTypeSupported = function (layoutType) { return layoutType !== "flow"; }; Object.defineProperty(PanelModelBase.prototype, "questions", { /** * Returns the list of all questions located in the Panel/Page, including in the nested Panels. * @see Question * @see elements */ get: function () { if (!this.isQuestionsReady) { this.questionsValue = []; for (var i = 0; i < this.elements.length; i++) { var el = this.elements[i]; if (el.isPanel) { var qs = el.questions; for (var j = 0; j < qs.length; j++) { this.questionsValue.push(qs[j]); } } else { this.questionsValue.push(el); } } this.isQuestionsReady = true; } return this.questionsValue; }, enumerable: true, configurable: true }); /** * Returns the question by its name * @param name the question name */ PanelModelBase.prototype.getQuestionByName = function (name) { var questions = this.questions; for (var i = 0; i < questions.length; i++) { if (questions[i].name == name) return questions[i]; } return null; }; /** * Retuns the element by its name. It works recursively. * @param name the element name */ PanelModelBase.prototype.getElementByName = function (name) { var elements = this.elements; for (var i = 0; i < elements.length; i++) { var el = elements[i]; if (el.name == name) return el; var pnl = el.getPanel(); if (!!pnl) { var res = pnl.getElementByName(name); if (!!res) return res; } } return null; }; PanelModelBase.prototype.getQuestionByValueName = function (valueName) { var questions = this.questions; for (var i = 0; i < questions.length; i++) { if (questions[i].getValueName() == valueName) return questions[i]; } return null; }; /** * Returns question values on the current page */ PanelModelBase.prototype.getValue = function () { var data = {}; var questions = this.questions; for (var i = 0; i < questions.length; i++) { var q = questions[i]; if (q.isEmpty()) continue; var valueName = q.getValueName(); data[valueName] = q.value; if (!!this.data) { var comment = this.data.getComment(valueName); if (!!comment) { data[valueName + __WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].commentPrefix] = comment; } } } return data; }; /** * Returns question comments on the current page */ PanelModelBase.prototype.getComments = function () { var comments = {}; if (!this.data) return comments; var questions = this.questions; for (var i = 0; i < questions.length; i++) { var q = questions[i]; var comment = this.data.getComment(q.getValueName()); if (!!comment) { comments[q.getValueName()] = comment; } } return comments; }; /** * Call this function to remove all question values from the current page/panel, that end-user will not be able to enter. * For example the value that doesn't exists in a radigroup/dropdown/checkbox choices or matrix rows/columns. * Please note, this function doesn't clear values for invisible questions or values that doesn't associated with questions. * @see Question.clearIncorrectValues */ PanelModelBase.prototype.clearIncorrectValues = function () { for (var i = 0; i < this.elements.length; i++) { this.elements[i].clearIncorrectValues(); } }; /** * Call this function to clear all errors in the panel / page and all its child elements (panels and questions) */ PanelModelBase.prototype.clearErrors = function () { for (var i = 0; i < this.elements.length; i++) { this.elements[i].clearErrors(); } this.errors = []; }; PanelModelBase.prototype.markQuestionListDirty = function () { this.isQuestionsReady = false; if (this.parent) this.parent.markQuestionListDirty(); }; Object.defineProperty(PanelModelBase.prototype, "elements", { /** * Returns the list of the elements in the object, Panel/Page. Elements can be questions or panels. The function doesn't return elements in the nested Panels. */ get: function () { return this.elementsValue; }, enumerable: true, configurable: true }); PanelModelBase.prototype.getElementsInDesign = function (includeHidden) { if (includeHidden === void 0) { includeHidden = false; } return this.elements; }; /** * Returns true if the current element belongs to the Panel/Page. It looks in nested Panels as well. * @param element * @see PanelModel */ PanelModelBase.prototype.containsElement = function (element) { for (var i = 0; i < this.elements.length; i++) { var el = this.elements[i]; if (el == element) return true; var pnl = el.getPanel(); if (!!pnl) { if (pnl.containsElement(element)) return true; } } return false; }; Object.defineProperty(PanelModelBase.prototype, "isRequired", { /** * Set this property to true, to require the answer at least in one question in the panel. */ get: function () { return this.getPropertyValue("isRequired", false); }, set: function (val) { this.setPropertyValue("isRequired", val); }, enumerable: true, configurable: true }); /** * Returns true, if there is an error on this Page or inside the current Panel * @param fireCallback set it to true, to show errors in UI * @param 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; } }; //ISurveyErrorOwner PanelModelBase.prototype.getErrorCustomText = function (text, error) { if (!!this.survey) return this.survey.getErrorCustomText(text, error); return text; }; PanelModelBase.prototype.hasRequiredError = function (rec, errors) { if (!this.isRequired) return; var visQuestions = []; this.addQuestionsToList(visQuestions, true); if (visQuestions.length == 0) return; for (var i = 0; i < visQuestions.length; i++) { if (!visQuestions[i].isEmpty()) return; } rec.result = true; errors.push(new __WEBPACK_IMPORTED_MODULE_6__error__["b" /* OneAnswerRequiredError */](this.requiredErrorText, this)); if (!rec.firstErrorQuestion) { rec.firstErrorQuestion = visQuestions[0]; } }; PanelModelBase.prototype.hasErrorsCore = function (rec) { var elements = this.elements; var element = null; for (var i = 0; i < elements.length; i++) { element = elements[i]; if (!element.isVisible) continue; if (element.isPanel) { element.hasErrorsCore(rec); } else if (element.getType() === "paneldynamic") { element.panels.forEach(function (panel) { panel.hasErrorsCore(rec); }); } else { var question = element; 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"; }; PanelModelBase.prototype.getChildrenLayoutType = function () { return "row"; }; Object.defineProperty(PanelModelBase.prototype, "root", { get: function () { var res = this; while (res.parent) res = res.parent; return res; }, enumerable: true, configurable: true }); PanelModelBase.prototype.childVisibilityChanged = function () { var newIsVisibleValue = this.getIsPageVisible(null); var oldIsVisibleValue = this.getPropertyValue("isVisible", true); if (newIsVisibleValue !== oldIsVisibleValue) { this.onVisibleChanged(); } }; PanelModelBase.prototype.createRow = function () { return new QuestionRowModel(this); }; PanelModelBase.prototype.onSurveyLoad = function () { for (var i = 0; i < this.elements.length; i++) { this.elements[i].onSurveyLoad(); } this.onElementVisibilityChanged(this); }; PanelModelBase.prototype.onFirstRendering = function () { for (var i = 0; i < this.elements.length; i++) { this.elements[i].onFirstRendering(); } this.onRowsChanged(); }; Object.defineProperty(PanelModelBase.prototype, "rows", { get: function () { return this.getPropertyValue("rows"); }, enumerable: true, configurable: true }); PanelModelBase.prototype.onRowsChanged = function () { if (this.isLoadingFromJson) return; this.setPropertyValue("rows", this.buildRows()); }; PanelModelBase.prototype.onAddElement = function (element, index) { element.setSurveyImpl(this.surveyImpl); element.parent = this; this.markQuestionListDirty(); this.updateRowsOnElementAdded(element, index); if (element.isPanel) { var p = element; if (this.survey) { this.survey.panelAdded(p, index, this, this.root); } } else { if (this.survey) { var q = element; this.survey.questionAdded(q, index, this, this.root); } } if (!!this.addElementCallback) this.addElementCallback(element); var self = this; element.registerFunctionOnPropertiesValueChanged(["visible", "isVisible"], function () { self.onElementVisibilityChanged(element); }, this.id); element.registerFunctionOnPropertyValueChanged("startWithNewLine", function () { self.onElementStartWithNewLineChanged(element); }, this.id); this.onElementVisibilityChanged(this); }; PanelModelBase.prototype.onRemoveElement = function (element) { element.parent = null; this.markQuestionListDirty(); element.unRegisterFunctionOnPropertiesValueChanged(["visible", "isVisible", "startWithNewLine"], this.id); this.updateRowsOnElementRemoved(element); if (!element.isPanel) { if (this.survey) this.survey.questionRemoved(element); } else { if (this.survey) this.survey.panelRemoved(element); } if (!!this.removeElementCallback) this.removeElementCallback(element); this.onElementVisibilityChanged(this); }; PanelModelBase.prototype.onElementVisibilityChanged = function (element) { if (this.isLoadingFromJson) return; this.updateRowsVisibility(element); this.childVisibilityChanged(); if (!!this.parent) { this.parent.onElementVisibilityChanged(this); } }; PanelModelBase.prototype.onElementStartWithNewLineChanged = function (element) { this.onRowsChanged(); }; PanelModelBase.prototype.updateRowsVisibility = function (element) { var rows = this.rows; for (var i = 0; i < rows.length; i++) { var row = rows[i]; if (row.elements.indexOf(element) > -1) { row.updateVisible(); break; } } }; PanelModelBase.prototype.canBuildRows = function () { return !this.isLoadingFromJson && this.getChildrenLayoutType() == "row"; }; PanelModelBase.prototype.buildRows = function () { if (!this.canBuildRows()) return []; var result = new Array(); for (var i = 0; i < this.elements.length; i++) { var el = this.elements[i]; var isNewRow = i == 0 || el.startWithNewLine; var row = isNewRow ? this.createRow() : result[result.length - 1]; if (isNewRow) result.push(row); row.addElement(el); } for (var i = 0; i < result.length; i++) { result[i].updateVisible(); } return result; }; PanelModelBase.prototype.updateRowsOnElementAdded = function (element, index) { if (!this.canBuildRows()) return; var dragDropInfo = new DragDropInfo(null, element); dragDropInfo.target = element; dragDropInfo.isEdge = this.elements.length > 1; if (this.elements.length < 2) { dragDropInfo.destination = this; } else { dragDropInfo.isBottom = index > 0; if (index == 0) { dragDropInfo.destination = this.elements[1]; } else { dragDropInfo.destination = this.elements[index - 1]; } } this.dragDropAddTargetToRow(dragDropInfo, null); }; PanelModelBase.prototype.updateRowsOnElementRemoved = function (element) { if (!this.canBuildRows()) return; this.updateRowsRemoveElementFromRow(element, this.findRowByElement(element)); }; PanelModelBase.prototype.updateRowsRemoveElementFromRow = function (element, row) { if (!row || !row.panel) return; var elIndex = row.elements.indexOf(element); if (elIndex < 0) return; row.elements.splice(elIndex, 1); if (row.elements.length > 0) { row.updateVisible(); } else { if (row.index >= 0) { row.panel.rows.splice(row.index, 1); } } }; PanelModelBase.prototype.findRowByElement = function (el) { var rows = this.rows; for (var i = 0; i < rows.length; i++) { if (rows[i].elements.indexOf(el) > -1) return rows[i]; } return null; }; PanelModelBase.prototype.elementWidthChanged = function (el) { if (this.isLoadingFromJson) return; var row = this.findRowByElement(el); if (!!row) { row.updateVisible(); } }; Object.defineProperty(PanelModelBase.prototype, "processedTitle", { /** * Returns rendered title text or html. */ get: function () { return this.getRenderedTitle(this.locTitle.textOrHtml); }, enumerable: true, configurable: true }); PanelModelBase.prototype.getRenderedTitle = function (str) { return this.textProcessor != null ? this.textProcessor.processText(str, true) : str; }; Object.defineProperty(PanelModelBase.prototype, "visible", { /** * Use it to get/set the object visibility. * @see visibleIf */ get: function () { return this.getPropertyValue("visible", true); }, set: function (value) { if (value === this.visible) return; this.setPropertyValue("visible", value); this.setPropertyValue("isVisible", this.isVisible); if (!this.isLoadingFromJson) this.onVisibleChanged(); }, enumerable: true, configurable: true }); PanelModelBase.prototype.onVisibleChanged = function () { this.setPropertyValue("isVisible", this.isVisible); }; Object.defineProperty(PanelModelBase.prototype, "isVisible", { /** * Returns true if object is visible or survey is in design mode right now. */ get: function () { return this.areInvisibleElementsShowing || this.getIsPageVisible(null); }, enumerable: true, configurable: true }); PanelModelBase.prototype.getIsPageVisible = function (exceptionQuestion) { if (!this.visible) return false; for (var i = 0; i < this.elements.length; i++) { if (this.elements[i] == exceptionQuestion) continue; if (this.elements[i].isVisible) return true; } return false; }; PanelModelBase.prototype.setVisibleIndex = function (index) { if (!this.isVisible || index < 0) { for (var i = 0; i < this.elements.length; i++) { this.elements[i].setVisibleIndex(-1); } return 0; } var startIndex = index; for (var i = 0; i < this.elements.length; i++) { index += this.elements[i].setVisibleIndex(index); } return index - startIndex; }; Object.defineProperty(PanelModelBase.prototype, "isReadOnly", { /** * Retuns true if readOnly property is true or survey is in display mode or parent panel/page is readOnly. * @see SurveyModel.model * @see readOnly */ get: function () { var isParentReadOnly = !!this.parent && this.parent.isReadOnly; var isSurveyReadOnly = !!this.survey && this.survey.isDisplayMode; return this.readOnly || isParentReadOnly || isSurveyReadOnly; }, enumerable: true, configurable: true }); PanelModelBase.prototype.onReadOnlyChanged = function () { for (var i = 0; i < this.elements.length; i++) { var el = this.elements[i]; el.setPropertyValue("isReadOnly", el.isReadOnly); } _super.prototype.onReadOnlyChanged.call(this); }; Object.defineProperty(PanelModelBase.prototype, "enableIf", { /** * An expression that returns true or false. If it returns false the Panel/Page becomes read only and an end-user will not able to answer on qustions inside it. * The library runs the expression on survey start and on changing a question value. If the property is empty then readOnly property is used. * @see readOnly * @see isReadOnly */ get: function () { return this.getPropertyValue("enableIf", ""); }, set: function (val) { this.setPropertyValue("enableIf", val); }, enumerable: true, configurable: true }); /** * Add an element into Panel or Page. Returns true if the element added successfully. Otherwise returns false. * @param element * @param index element index in the elements array */ PanelModelBase.prototype.addElement = function (element, index) { if (index === void 0) { index = -1; } if (!this.canAddElement(element)) return false; if (index < 0 || index >= this.elements.length) { this.elements.push(element); } else { this.elements.splice(index, 0, element); } return true; }; PanelModelBase.prototype.canAddElement = function (element) { return (!!element && element.isLayoutTypeSupported(this.getChildrenLayoutType())); }; /** * Add a question into Panel or Page. Returns true if the question added successfully. Otherwise returns false. * @param question * @param index element index in the elements array */ PanelModelBase.prototype.addQuestion = function (question, index) { if (index === void 0) { index = -1; } return this.addElement(question, index); }; /** * Add a panel into Panel or Page. Returns true if the panel added successfully. Otherwise returns false. * @param panel * @param index element index in the elements array */ PanelModelBase.prototype.addPanel = function (panel, index) { if (index === void 0) { index = -1; } return this.addElement(panel, index); }; /** * Creates a new question and adds it into the end of the elements list. Returns null, if the question could not be created or could not be added into page or panel. * @param questionType the possible values are: "text", "checkbox", "dropdown", "matrix", "html", "matrixdynamic", "matrixdropdown" and so on. * @param name a question name */ 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); if (!this.addQuestion(question)) return null; return question; }; /** * Creates a new panel and adds it into the end of the elements list. Returns null, if the panel could not be created or could not be added into page or panel. * @param name a panel name */ PanelModelBase.prototype.addNewPanel = function (name) { if (name === void 0) { name = null; } var panel = this.createNewPanel(name); if (!this.addPanel(panel)) return null; return panel; }; 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__["b" /* 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__["b" /* 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.prototype.dragDropMoveElement = function (src, target, targetIndex) { var srcIndex = src.parent.elements.indexOf(src); if (targetIndex > srcIndex) { targetIndex--; } this.removeElement(src); this.addElement(target, targetIndex); }; PanelModelBase.panelCounter = 100; return PanelModelBase; }(__WEBPACK_IMPORTED_MODULE_2__base__["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__["a" /* Serializer */].addClass("panelbase", [ "name", { name: "elements", alternativeName: "questions", baseClassName: "question", visible: false, isLightSerializable: false }, { name: "visible:boolean", default: true }, "visibleIf:condition", "enableIf:condition", "readOnly:boolean", { name: "questionTitleLocation", default: "default", choices: ["default", "top", "bottom", "left", "hidden"] }, { name: "title", serializationProperty: "locTitle" }, { name: "description:text", serializationProperty: "locDescription" } ], function () { return new PanelModelBase(); }); __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("panel", [ { name: "state", default: "default", choices: ["default", "collapsed", "expanded"] }, "isRequired:boolean", { name: "requiredErrorText:text", serializationProperty: "locRequiredErrorText" }, { name: "startWithNewLine:boolean", default: true }, { name: "innerIndent:number", default: 0, choices: [0, 1, 2, 3] }, { name: "indent:number", default: 0, choices: [0, 1, 2, 3] }, { name: "page", isSerializable: false, choices: function (obj) { var survey = obj ? obj.survey : null; return survey ? survey.pages.map(function (p) { return { value: p.name, text: p.title }; }) : []; } } ], function () { return new PanelModel(); }, "panelbase"); /***/ }), /* 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__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__(12); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__helpers__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__surveyStrings__ = __webpack_require__(2); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__error__ = __webpack_require__(11); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__choicesRestfull__ = __webpack_require__(37); /* 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.isSettingDefaultValue = false; _this.isSettingComment = false; _this.isFirstLoadChoicesFromUrl = true; var self = _this; _this.choices = _this.createItemValues("choices"); _this.registerFunctionOnPropertyValueChanged("choices", function () { if (!self.filterItems()) { self.onVisibleChoicesChanged(); } }); _this.registerFunctionOnPropertyValueChanged("hideIfChoicesEmpty", function () { self.updateVisibilityBasedOnChoices(); }); _this.createNewArray("visibleChoices"); _this.choicesByUrl = _this.createRestfull(); _this.choicesByUrl.owner = _this; var locOtherText = _this.createLocalizableString("otherText", _this, true); _this.createLocalizableString("otherErrorText", _this, true); _this.otherItemValue.locOwner = _this; _this.otherItemValue.setLocText(locOtherText); locOtherText.onGetTextCallback = function (text) { return !!text ? text : __WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("otherItemText"); }; _this.choicesByUrl.getResultCallback = function (items) { self.onLoadChoicesFromUrl(items); }; _this.choicesByUrl.updateResultCallback = function (items, serverResult) { if (self.survey) { return self.survey.updateChoicesFromServer(self, items, serverResult); } return items; }; _this.createLocalizableString("otherPlaceHolder", _this); return _this; } QuestionSelectBase.prototype.isLayoutTypeSupported = function (layoutType) { return true; }; Object.defineProperty(QuestionSelectBase.prototype, "otherItem", { /** * Returns the other item. By using this property, you may change programmatically it's value and text. * @see hasOther */ get: function () { return this.otherItemValue; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "isOtherSelected", { /** * Returns true if a user select the 'other' item. */ get: function () { return this.hasOther && this.getHasOther(this.renderedValue); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "choicesVisibleIf", { /** * An expression that returns true or false. It runs against each choices item and if for this item it returns true, then the item is visible otherwise the item becomes invisible. Please use {item} to get the current item value in the expression. * @see visibleIf * @see choicesEnableIf */ get: function () { return this.getPropertyValue("choicesVisibleIf", ""); }, set: function (val) { this.setPropertyValue("choicesVisibleIf", val); this.filterItems(); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "choicesEnableIf", { /** * An expression that returns true or false. It runs against each choices item and if for this item it returns true, then the item is enabled otherwise the item becomes disabled. Please use {item} to get the current item value in the expression. * @see choicesVisibleIf */ get: function () { return this.getPropertyValue("choicesEnableIf", ""); }, set: function (val) { this.setPropertyValue("choicesEnableIf", val); this.filterItems(); }, enumerable: true, configurable: true }); QuestionSelectBase.prototype.runCondition = function (values, properties) { _super.prototype.runCondition.call(this, values, properties); this.runItemsEnableCondition(values, properties); this.runItemsCondition(values, properties); }; QuestionSelectBase.prototype.setDefaultValue = function () { this.isSettingDefaultValue = !this.isValueEmpty(this.defaultValue) && this.hasUnknownValue(this.defaultValue); _super.prototype.setDefaultValue.call(this); this.isSettingDefaultValue = false; }; QuestionSelectBase.prototype.filterItems = function () { if (this.isLoadingFromJson || !this.data || this.areInvisibleElementsShowing) return false; var values = this.getDataFilteredValues(); var properties = this.getDataFilteredProperties(); this.runItemsEnableCondition(values, properties); return this.runItemsCondition(values, properties); }; QuestionSelectBase.prototype.runItemsCondition = function (values, properties) { this.setConditionalChoicesRunner(); var hasChanges = this.runConditionsForItems(values, properties); if (!!this.filteredChoicesValue && this.filteredChoicesValue.length === this.activeChoices.length) { this.filteredChoicesValue = null; } if (hasChanges) { if (!!this.filteredChoicesValue) { this.clearIncorrectValues(); } this.onVisibleChoicesChanged(); } return hasChanges; }; QuestionSelectBase.prototype.runItemsEnableCondition = function (values, properties) { this.setConditionalEnableChoicesRunner(); var hasChanged = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].runEnabledConditionsForItems(this.activeChoices, this.conditionChoicesEnableIfRunner, values, properties); if (hasChanged) { this.clearDisabledValues(); } }; QuestionSelectBase.prototype.setConditionalChoicesRunner = function () { if (this.choicesVisibleIf) { if (!this.conditionChoicesVisibleIfRunner) { this.conditionChoicesVisibleIfRunner = new __WEBPACK_IMPORTED_MODULE_8__conditions__["b" /* ConditionRunner */](this.choicesVisibleIf); } this.conditionChoicesVisibleIfRunner.expression = this.choicesVisibleIf; } else { this.conditionChoicesVisibleIfRunner = null; } }; QuestionSelectBase.prototype.setConditionalEnableChoicesRunner = function () { if (this.choicesEnableIf) { if (!this.conditionChoicesEnableIfRunner) { this.conditionChoicesEnableIfRunner = new __WEBPACK_IMPORTED_MODULE_8__conditions__["b" /* ConditionRunner */](this.choicesEnableIf); } this.conditionChoicesEnableIfRunner.expression = this.choicesEnableIf; } else { this.conditionChoicesEnableIfRunner = null; } }; QuestionSelectBase.prototype.runConditionsForItems = function (values, properties) { this.filteredChoicesValue = []; return __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].runConditionsForItems(this.activeChoices, this.filteredChoices, this.conditionChoicesVisibleIfRunner, values, properties); }; QuestionSelectBase.prototype.getHasOther = function (val) { return val === this.otherItem.value; }; Object.defineProperty(QuestionSelectBase.prototype, "validatedValue", { get: function () { return this.rendredValueToDataCore(this.value); }, enumerable: true, configurable: true }); QuestionSelectBase.prototype.createRestfull = function () { return new __WEBPACK_IMPORTED_MODULE_7__choicesRestfull__["a" /* ChoicesRestfull */](); }; QuestionSelectBase.prototype.getComment = function () { if (!!this.commentValue) return this.commentValue; if (this.getStoreOthersAsComment()) return _super.prototype.getComment.call(this); return this.commentValue; }; QuestionSelectBase.prototype.setComment = function (newValue) { if (this.getStoreOthersAsComment()) _super.prototype.setComment.call(this, newValue); else { if (!this.isSettingComment && newValue != this.commentValue) { this.isSettingComment = true; this.commentValue = newValue; if (this.isOtherSelected && !this.isRenderedValueSetting) { this.value = this.rendredValueToData(this.renderedValue); } this.isSettingComment = false; } } }; Object.defineProperty(QuestionSelectBase.prototype, "renderedValue", { get: function () { return this.getPropertyValue("renderedValue", null); }, set: function (val) { this.setPropertyValue("renderedValue", val); this.value = this.rendredValueToData(val); }, enumerable: true, configurable: true }); QuestionSelectBase.prototype.setQuestionValue = function (newValue) { if (__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isTwoValueEquals(this.value, newValue)) return; _super.prototype.setQuestionValue.call(this, newValue); this.setPropertyValue("renderedValue", this.rendredValueFromData(newValue)); var isOtherSel = this.isOtherSelected; if (isOtherSel && !!this.prevCommentValue) { var oldComment = this.prevCommentValue; this.prevCommentValue = ""; this.comment = oldComment; } if (!isOtherSel && !!this.comment) { if (this.getStoreOthersAsComment()) { this.prevCommentValue = this.comment; } this.comment = ""; } }; QuestionSelectBase.prototype.setNewValue = function (newValue) { newValue = this.valueFromData(newValue); if ((!this.choicesByUrl.isRunning && !this.choicesByUrl.isWaitingForParameters) || !this.isValueEmpty(newValue)) { this.cachedValueForUrlRequests = newValue; } _super.prototype.setNewValue.call(this, newValue); }; QuestionSelectBase.prototype.valueFromData = function (val) { var choiceitem = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(this.choices, val); if (!!choiceitem) { return choiceitem.value; } return _super.prototype.valueFromData.call(this, val); }; QuestionSelectBase.prototype.rendredValueFromData = function (val) { if (this.getStoreOthersAsComment()) return val; return this.renderedValueFromDataCore(val); }; QuestionSelectBase.prototype.rendredValueToData = function (val) { if (this.getStoreOthersAsComment()) return val; return this.rendredValueToDataCore(val); }; QuestionSelectBase.prototype.renderedValueFromDataCore = function (val) { if (!this.hasUnknownValue(val, true)) return this.valueFromData(val); this.comment = val; return this.otherItem.value; }; QuestionSelectBase.prototype.rendredValueToDataCore = function (val) { if (val == this.otherItem.value && this.getComment()) { val = this.getComment(); } return val; }; QuestionSelectBase.prototype.hasUnknownValue = function (val, includeOther) { if (includeOther === void 0) { includeOther = false; } if (__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isValueEmpty(val)) return false; if (includeOther && val == this.otherItem.value) return false; return __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(this.filteredChoices, val) == null; }; QuestionSelectBase.prototype.isValueDisabled = function (val) { var itemValue = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(this.filteredChoices, val); return !!itemValue && !itemValue.isEnabled; }; Object.defineProperty(QuestionSelectBase.prototype, "choices", { /** * The list of items. Every item has value and text. If text is empty, the value is rendered. The item text supports markdown. * @see choicesByUrl */ get: function () { return this.getPropertyValue("choices"); }, set: function (newValue) { this.setPropertyValue("choices", newValue); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "hideIfChoicesEmpty", { get: function () { return this.getPropertyValue("hideIfChoicesEmpty", false); }, set: function (val) { this.setPropertyValue("hideIfChoicesEmpty", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "storeOthersAsComment", { /** * Please use survey.storeOthersAsComment to change the behavior on the survey level. This property is depricated and invisible in Survey Creator. * By default the entered text in the others input in the checkbox/radiogroup/dropdown are stored as "question name " + "-Comment". The value itself is "question name": "others". Set this property to false, to store the entered text directly in the "question name" key. * Possible values are: "default", true, false * @see SurveyModel.storeOthersAsComment */ get: function () { return this.getPropertyValue("storeOthersAsComment", "default"); }, set: function (val) { this.setPropertyValue("storeOthersAsComment", val); }, enumerable: true, configurable: true }); QuestionSelectBase.prototype.hasOtherChanged = function () { this.onVisibleChoicesChanged(); }; Object.defineProperty(QuestionSelectBase.prototype, "choicesOrder", { /** * Use this property to render items in a specific order: "asc", "desc", "random". Default value is "none". */ get: function () { return this.getPropertyValue("choicesOrder", "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, "otherPlaceHolder", { /** * Use this property to set the place holder text for other or comment field . */ get: function () { return this.getLocalizableStringText("otherPlaceHolder"); }, set: function (val) { this.setLocalizableStringText("otherPlaceHolder", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "locOtherPlaceHolder", { get: function () { return this.getLocalizableString("otherPlaceHolder"); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "otherErrorText", { /** * The text that shows when the other item is choosed by the other input is empty. */ get: function () { return this.getLocalizableStringText("otherErrorText", __WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("otherRequiredError")); }, set: function (val) { this.setLocalizableStringText("otherErrorText", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "locOtherErrorText", { get: function () { return this.getLocalizableString("otherErrorText"); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "visibleChoices", { /** * The list of items as they will be rendered. If needed items are sorted and the other item is added. * @see hasOther * @see choicesOrder * @see enabledChoices */ get: function () { return this.getPropertyValue("visibleChoices", []); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "enabledChoices", { /** * The list of enabled items as they will be rendered. The disabled items are not included * @see hasOther * @see choicesOrder * @see visibleChoices */ get: function () { var res = []; var items = this.visibleChoices; for (var i = 0; i < items.length; i++) { if (items[i].isEnabled) res.push(items[i]); } return res; }, enumerable: true, configurable: true }); QuestionSelectBase.prototype.updateVisibleChoices = function () { if (this.isLoadingFromJson) return; var newValue = new Array(); var calcValue = this.calcVisibleChoices(); if (!calcValue) calcValue = []; for (var i = 0; i < calcValue.length; i++) { newValue.push(calcValue[i]); } this.setPropertyValue("visibleChoices", newValue); }; QuestionSelectBase.prototype.calcVisibleChoices = function () { if (this.canUseFilteredChoices()) return this.filteredChoices; var res = this.sortVisibleChoices(this.filteredChoices.slice()); this.addToVisibleChoices(res); return res; }; QuestionSelectBase.prototype.canUseFilteredChoices = function () { return !this.hasOther && this.choicesOrder == "none"; }; QuestionSelectBase.prototype.addToVisibleChoices = function (items) { if (this.hasOther) { items.push(this.otherItem); } }; QuestionSelectBase.prototype.getPlainData = function (options) { var _this = this; if (options === void 0) { options = { includeEmpty: true }; } var questionPlainData = _super.prototype.getPlainData.call(this, options); if (!!questionPlainData) { var values = Array.isArray(this.value) ? this.value : [this.value]; questionPlainData.isNode = true; questionPlainData.data = values.map(function (dataValue, index) { var choice = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(_this.visibleChoices, dataValue); var choiceDataItem = { name: index, title: "Choice", value: dataValue, displayValue: _this.getChoicesDisplayValue(_this.visibleChoices, dataValue), getString: function (val) { return typeof val === "object" ? JSON.stringify(val) : val; }, isNode: false }; if (!!choice) { (options.calculations || []).forEach(function (calculation) { choiceDataItem[calculation.propertyName] = choice[calculation.propertyName]; }); } return choiceDataItem; }); } return questionPlainData; }; /** * Returns the text for the current value. If the value is null then returns empty string. If 'other' is selected then returns the text for other value. */ QuestionSelectBase.prototype.getDisplayValueCore = function (keysAsText) { 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.getChoices(); }, enumerable: true, configurable: true }); QuestionSelectBase.prototype.getChoices = function () { return this.choices; }; QuestionSelectBase.prototype.supportComment = function () { return true; }; QuestionSelectBase.prototype.supportOther = function () { return true; }; QuestionSelectBase.prototype.onCheckForErrors = function (errors) { _super.prototype.onCheckForErrors.call(this, errors); if (!this.hasOther || !this.isOtherSelected || this.comment) return; errors.push(new __WEBPACK_IMPORTED_MODULE_6__error__["c" /* OtherEmptyError */](this.otherErrorText, this)); }; QuestionSelectBase.prototype.setSurveyImpl = function (value) { _super.prototype.setSurveyImpl.call(this, value); this.runChoicesByUrl(); }; QuestionSelectBase.prototype.getStoreOthersAsComment = function () { if (this.isSettingDefaultValue) return false; return (this.storeOthersAsComment === true || (this.storeOthersAsComment == "default" && (this.survey != null ? this.survey.storeOthersAsComment : true)) || (!this.choicesByUrl.isEmpty && !this.choicesFromUrl)); }; QuestionSelectBase.prototype.onSurveyLoad = function () { _super.prototype.onSurveyLoad.call(this); this.runChoicesByUrl(); this.onVisibleChoicesChanged(); }; QuestionSelectBase.prototype.onAnyValueChanged = function (name) { _super.prototype.onAnyValueChanged.call(this, name); if (name != this.getValueName()) { this.runChoicesByUrl(); } }; QuestionSelectBase.prototype.runChoicesByUrl = function () { if (!this.choicesByUrl || this.isLoadingFromJson) return; var processor = this.surveyImpl ? this.surveyImpl.getTextProcessor() : this.textProcessor; if (!processor) processor = this.survey; if (!processor) return; this.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; } if (this.isValueEmpty(this.cachedValueForUrlRequests)) { this.cachedValueForUrlRequests = this.value; } this.isFirstLoadChoicesFromUrl = false; var cachedValues = this.createCachedValueForUrlRequests(this.cachedValueForUrlRequests, checkCachedValuesOnExisting); if (array && array.length > 0) { newChoices = new Array(); __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].setData(newChoices, array); } this.choicesFromUrl = newChoices; this.filterItems(); this.onVisibleChoicesChanged(); if (newChoices) { var newValue = this.updateCachedValueForUrlRequests(cachedValues, newChoices); if (!!newValue) { this.value = undefined; 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, newChoices) { if (this.isValueEmpty(val)) return null; if (Array.isArray(val)) { var res = []; for (var i = 0; i < val.length; i++) { var updatedValue = this.updateCachedValueForUrlRequests(val[i], newChoices); if (updatedValue && !this.isValueEmpty(updatedValue.value)) { var newValue = updatedValue.value; var item = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(newChoices, updatedValue.value); if (!!item) { newValue = item.value; } res.push(newValue); } } return { value: res }; } var value = val.isExists && this.hasUnknownValue(val.value) ? null : val.value; var item = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(newChoices, value); if (!!item) { value = item.value; } return { value: value }; }; QuestionSelectBase.prototype.onVisibleChoicesChanged = function () { if (this.isLoadingFromJson) return; this.updateVisibleChoices(); this.updateVisibilityBasedOnChoices(); }; 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; if (this.clearIncorrectValuesCallback) { this.clearIncorrectValuesCallback(); } else { this.clearIncorrectValuesCore(); } }; QuestionSelectBase.prototype.clearValueIfInvisible = function () { _super.prototype.clearValueIfInvisible.call(this); this.clearIncorrectValues(); }; QuestionSelectBase.prototype.clearDisabledValues = function () { if (!this.survey || !this.survey.clearValueOnDisableItems) return; this.clearDisabledValuesCore(); }; QuestionSelectBase.prototype.clearIncorrectValuesCore = function () { var val = this.value; if (this.canClearValueAnUnknow(val)) { this.clearValue(); } }; QuestionSelectBase.prototype.canClearValueAnUnknow = function (val) { if (!this.getStoreOthersAsComment() && this.isOtherSelected) return false; return this.hasUnknownValue(val, true); }; QuestionSelectBase.prototype.clearDisabledValuesCore = function () { if (this.isValueDisabled(this.value)) { this.clearValue(); } }; QuestionSelectBase.prototype.clearUnusedValues = function () { _super.prototype.clearUnusedValues.call(this); if (!this.isOtherSelected && !this.hasComment) { this.comment = ""; } }; QuestionSelectBase.prototype.getColumnClass = function () { var columnClass = this.cssClasses.column; if (this.hasColumns) { columnClass += " sv-q-column-" + this.colCount; } return columnClass; }; Object.defineProperty(QuestionSelectBase.prototype, "columns", { get: function () { var columns = []; var colCount = this.colCount; if (this.hasColumns && this.visibleChoices.length > 0) { for (var i = 0; i < colCount; i++) { var column = []; for (var j = i; j < this.visibleChoices.length; j += colCount) { column.push(this.visibleChoices[j]); } columns.push(column); } } return columns; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionSelectBase.prototype, "hasColumns", { get: function () { return this.colCount > 1; }, enumerable: true, configurable: true }); 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", this.isFlowLayout ? 0 : 1); }, set: function (value) { if (value < 0 || value > 5 || this.isFlowLayout) return; this.setPropertyValue("colCount", value); this.fireCallback(this.colCountChangedCallback); }, enumerable: true, configurable: true }); QuestionCheckboxBase.prototype.onParentChanged = function () { _super.prototype.onParentChanged.call(this); if (this.isFlowLayout) { this.setPropertyValue("colCount", null); } }; return QuestionCheckboxBase; }(QuestionSelectBase)); __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("selectbase", [ { name: "hasComment:boolean", layout: "row" }, { name: "commentText", serializationProperty: "locCommentText", layout: "row" }, "hasOther:boolean", { name: "otherPlaceHolder", serializationProperty: "locOtherPlaceHolder" }, { name: "choices:itemvalue[]", baseValue: function () { return __WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("choices_Item"); } }, { name: "choicesOrder", default: "none", choices: ["none", "asc", "desc", "random"] }, { name: "choicesByUrl:restfull", className: "ChoicesRestfull", onGetValue: function (obj) { return obj.choicesByUrl.getData(); }, onSetValue: function (obj, value) { obj.choicesByUrl.setData(value); } }, "hideIfChoicesEmpty:boolean", "choicesVisibleIf:condition", "choicesEnableIf:condition", { name: "otherText", serializationProperty: "locOtherText" }, { name: "otherErrorText", serializationProperty: "locOtherErrorText" }, { name: "storeOthersAsComment", default: "default", choices: ["default", true, false], visible: false } ], null, "question"); __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("checkboxbase", [ { name: "colCount:number", default: 1, choices: [0, 1, 2, 3, 4, 5], layout: "row" } ], null, "selectbase"); /***/ }), /* 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__martixBase__ = __webpack_require__(42); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__helpers__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__base__ = __webpack_require__(5); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__textPreProcessor__ = __webpack_require__(22); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__ = __webpack_require__(16); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__surveyStrings__ = __webpack_require__(2); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__questionfactory__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__question_expression__ = __webpack_require__(30); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__functionsfactory__ = __webpack_require__(26); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__settings__ = __webpack_require__(9); /* 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; }); /* unused harmony export MatrixDropdownTotalCell */ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return MatrixDropdownRowModelBase; }); /* unused harmony export MatrixDropdownTotalRowModel */ /* 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", "choicesVisibleIf" ], onCellQuestionUpdate: function (cellQuestion, column, question, data) { onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data); if (!cellQuestion.optionsCaption) cellQuestion.optionsCaption = question.optionsCaption; } }, checkbox: { properties: [ "choices", "choicesOrder", "choicesByUrl", "otherText", "choicesVisibleIf" ], onCellQuestionUpdate: function (cellQuestion, column, question, data) { onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data); cellQuestion.colCount = column.colCount > -1 ? column.colCount : question.columnColCount; } }, radiogroup: { properties: [ "choices", "choicesOrder", "choicesByUrl", "otherText", "choicesVisibleIf" ], onCellQuestionUpdate: function (cellQuestion, column, question, data) { onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data); cellQuestion.colCount = column.colCount > -1 ? column.colCount : question.columnColCount; } }, text: { properties: ["placeHolder", "inputType", "maxLength"], onCellQuestionUpdate: function (cellQuestion, column, question, data) { } }, comment: { properties: ["placeHolder", "rows", "maxLength"], onCellQuestionUpdate: function (cellQuestion, column, question, data) { } }, boolean: { properties: ["defaultValue"], onCellQuestionUpdate: function (cellQuestion, column, question, data) { cellQuestion.showTitle = true; } }, expression: { properties: ["expression", "displayStyle", "currency"], onCellQuestionUpdate: function (cellQuestion, column, question, data) { } } }; 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; var self = _this; _this.createLocalizableString("totalFormat", _this); _this.registerFunctionOnPropertiesValueChanged([ "totalType", "totalExpression", "totalFormat", "totalCurrency", "totalDisplayStyle", "totalMaximumFractionDigits", "totalMinimumFractionDigits" ], function () { self.doColumnPropertiesChanged(); }); _this.updateTemplateQuestion(); _this.name = name; if (title) _this.title = title; return _this; } MatrixDropdownColumn.getColumnTypes = function () { var res = []; for (var key in matrixDropdownColumnTypes) { res.push(key); } return res; }; MatrixDropdownColumn.prototype.getDynamicPropertyName = function () { return "cellType"; }; MatrixDropdownColumn.prototype.getDynamicType = function () { return this.calcCellQuestionType(); }; MatrixDropdownColumn.prototype.getDynamicProperties = function () { var qType = this.calcCellQuestionType(); var qDefinition = matrixDropdownColumnTypes[qType]; if (qDefinition) return qDefinition.properties; return []; }; Object.defineProperty(MatrixDropdownColumn.prototype, "colOwner", { get: function () { return this.colOwnerValue; }, set: function (value) { this.colOwnerValue = value; this.updateTemplateQuestion(); }, enumerable: true, configurable: true }); MatrixDropdownColumn.prototype.locStrsChanged = function () { _super.prototype.locStrsChanged.call(this); this.locTitle.strChanged(); }; 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, "requiredIf", { get: function () { return this.templateQuestion.requiredIf; }, set: function (val) { this.templateQuestion.requiredIf = val; }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "hasCondition", { get: function () { return !!this.visibleIf || !this.enableIf || !this.requiredIf; }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "validators", { get: function () { return this.templateQuestion.validators; }, set: function (val) { this.templateQuestion.validators = val; }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "totalType", { get: function () { return this.getPropertyValue("totalType", "none"); }, set: function (val) { this.setPropertyValue("totalType", val); }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "totalExpression", { get: function () { return this.getPropertyValue("totalExpression"); }, set: function (val) { this.setPropertyValue("totalExpression", val); }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "hasTotal", { get: function () { return this.totalType != "none" || !!this.totalExpression; }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "totalFormat", { get: function () { return this.getLocalizableStringText("totalFormat", ""); }, set: function (val) { this.setLocalizableStringText("totalFormat", val); }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "locTotalFormat", { get: function () { return this.getLocalizableString("totalFormat"); }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "totalMaximumFractionDigits", { get: function () { return this.getPropertyValue("totalMaximumFractionDigits", -1); }, set: function (val) { if (val < -1 || val > 20) return; this.setPropertyValue("totalMaximumFractionDigits", val); }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "totalMinimumFractionDigits", { get: function () { return this.getPropertyValue("totalMinimumFractionDigits", -1); }, set: function (val) { if (val < -1 || val > 20) return; this.setPropertyValue("totalMinimumFractionDigits", val); }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "totalDisplayStyle", { get: function () { return this.getPropertyValue("totalDisplayStyle", "none"); }, set: function (val) { this.setPropertyValue("totalDisplayStyle", val); }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "totalCurrency", { get: function () { return this.getPropertyValue("totalCurrency", "USD"); }, set: function (val) { if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__question_expression__["b" /* getCurrecyCodes */])().indexOf(val) < 0) return; this.setPropertyValue("totalCurrency", val); }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "minWidth", { get: function () { return this.getPropertyValue("minWidth", ""); }, set: function (val) { this.setPropertyValue("minWidth", val); }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownColumn.prototype, "colCount", { get: function () { return this.getPropertyValue("colCount", -1); }, set: function (val) { if (val < -1 || val > 4) return; this.setPropertyValue("colCount", val); }, enumerable: true, configurable: true }); MatrixDropdownColumn.prototype.getLocale = function () { return this.colOwner ? this.colOwner.getLocale() : ""; }; MatrixDropdownColumn.prototype.getMarkdownHtml = function (text) { return this.colOwner ? this.colOwner.getMarkdownHtml(text) : null; }; MatrixDropdownColumn.prototype.getProcessedText = function (text) { return this.colOwner ? this.colOwner.getProcessedText(text) : text; }; MatrixDropdownColumn.prototype.createCellQuestion = function (data) { var qType = this.calcCellQuestionType(); var cellQuestion = this.createNewQuestion(qType); this.updateCellQuestion(cellQuestion, data); return cellQuestion; }; MatrixDropdownColumn.prototype.updateCellQuestion = function (cellQuestion, data) { this.setQuestionProperties(cellQuestion); var qType = cellQuestion.getType(); var qDefinition = matrixDropdownColumnTypes[qType]; if (qDefinition && qDefinition["onCellQuestionUpdate"]) { qDefinition["onCellQuestionUpdate"](cellQuestion, this, this.colOwner, data); } }; MatrixDropdownColumn.prototype.defaultCellTypeChanged = function () { this.updateTemplateQuestion(); }; MatrixDropdownColumn.prototype.calcCellQuestionType = function () { if (this.cellType !== "default") return this.cellType; if (this.colOwner) return this.colOwner.getCellType(); return __WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].matrixDefaultCellType; }; MatrixDropdownColumn.prototype.updateTemplateQuestion = function () { var prevCellType = this.templateQuestion ? this.templateQuestion.getType() : ""; var curCellType = this.calcCellQuestionType(); if (curCellType === prevCellType) return; if (this.templateQuestion) { this.removeProperties(prevCellType); } this.templateQuestionValue = this.createNewQuestion(curCellType); this.templateQuestion.locOwner = this; this.addProperties(curCellType); var self = this; this.templateQuestion.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__["a" /* Serializer */].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(); question.startLoadingFromJson(); new __WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* JsonObject */]().toObject(json, question); question.endLoadingFromJson(); question.onSurveyLoad(); } }; MatrixDropdownColumn.prototype.propertyValueChanged = function (name, oldValue, newValue) { _super.prototype.propertyValueChanged.call(this, name, oldValue, newValue); this.doColumnPropertiesChanged(); }; MatrixDropdownColumn.prototype.doColumnPropertiesChanged = function () { if (this.colOwner != null && !this.isLoadingFromJson) { this.colOwner.onColumnPropertiesChanged(this); } }; MatrixDropdownColumn.prototype.getProperties = function (curCellType) { var qDef = matrixDropdownColumnTypes[curCellType]; if (!qDef || !qDef.properties) return []; return __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].findProperties(curCellType, qDef.properties); }; MatrixDropdownColumn.prototype.removeProperties = function (curCellType) { var properties = this.getProperties(curCellType); for (var i = 0; i < properties.length; i++) { var prop = properties[i]; delete this[prop.name]; if (prop.serializationProperty) { delete this[prop.serializationProperty]; } } }; MatrixDropdownColumn.prototype.addProperties = function (curCellType) { var question = this.templateQuestion; var properties = this.getProperties(curCellType); for (var i = 0; i < properties.length; i++) { var prop = properties[i]; this.addProperty(question, prop.name, false); if (prop.serializationProperty) { this.addProperty(question, prop.serializationProperty, true); } } }; MatrixDropdownColumn.prototype.addProperty = function (question, propName, isReadOnly) { var desc = { configurable: true, get: function () { return question[propName]; } }; if (!isReadOnly) { desc["set"] = function (v) { question[propName] = v; }; } Object.defineProperty(this, propName, desc); }; return MatrixDropdownColumn; }(__WEBPACK_IMPORTED_MODULE_4__base__["b" /* Base */])); var MatrixDropdownCell = /** @class */ (function () { function MatrixDropdownCell(column, row, data) { this.column = column; this.row = row; this.data = data; this.questionValue = this.createQuestion(column, row, data); this.questionValue.updateCustomWidget(); } MatrixDropdownCell.prototype.createQuestion = function (column, row, data) { var res = data.createQuestion(this.row, this.column); res.validateValueCallback = function () { return data.validateCell(row, column.name, row.value); }; __WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* CustomPropertiesCollection */].getProperties(column.getType()).forEach(function (property) { var propertyName = property.name; if (column[propertyName] !== undefined) { res[propertyName] = column[propertyName]; } }); return res; }; Object.defineProperty(MatrixDropdownCell.prototype, "question", { get: function () { return this.questionValue; }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownCell.prototype, "value", { get: function () { return this.question.value; }, set: function (value) { this.question.value = value; }, enumerable: true, configurable: true }); MatrixDropdownCell.prototype.runCondition = function (values, properties) { this.question.runCondition(values, properties); }; return MatrixDropdownCell; }()); var MatrixDropdownTotalCell = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](MatrixDropdownTotalCell, _super); function MatrixDropdownTotalCell(column, row, data) { var _this = _super.call(this, column, row, data) || this; _this.column = column; _this.row = row; _this.data = data; _this.updateCellQuestion(); return _this; } MatrixDropdownTotalCell.prototype.createQuestion = function (column, row, data) { var res = __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].createClass("expression"); res.setSurveyImpl(row); return res; }; MatrixDropdownTotalCell.prototype.updateCellQuestion = function () { this.question.locCalculation(); this.column.updateCellQuestion(this.question, null); this.question.expression = this.getTotalExpression(); this.question.format = this.column.totalFormat; this.question.currency = this.column.totalCurrency; this.question.displayStyle = this.column.totalDisplayStyle; this.question.maximumFractionDigits = this.column.totalMaximumFractionDigits; this.question.minimumFractionDigits = this.column.totalMinimumFractionDigits; this.question.unlocCalculation(); }; MatrixDropdownTotalCell.prototype.getTotalExpression = function () { if (!!this.column.totalExpression) return this.column.totalExpression; if (this.column.totalType == "none") return ""; var funName = this.column.totalType + "InArray"; if (!__WEBPACK_IMPORTED_MODULE_10__functionsfactory__["a" /* FunctionFactory */].Instance.hasFunction(funName)) return ""; return funName + "({self}, '" + this.column.name + "')"; }; return MatrixDropdownTotalCell; }(MatrixDropdownCell)); var MatrixDropdownRowModelBase = /** @class */ (function () { function MatrixDropdownRowModelBase(data, value) { this.isSettingValue = false; this.cells = []; this.data = data; this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_5__textPreProcessor__["a" /* TextPreProcessor */](); var self = this; this.textPreProcessor.onProcess = function (textValue) { self.getProcessedTextValue(textValue); }; this.idValue = MatrixDropdownRowModelBase.getId(); } MatrixDropdownRowModelBase.getId = function () { return "srow_" + MatrixDropdownRowModelBase.idCounter++; }; Object.defineProperty(MatrixDropdownRowModelBase.prototype, "id", { get: function () { return this.idValue; }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownRowModelBase.prototype, "rowName", { get: function () { return null; }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownRowModelBase.prototype, "value", { get: function () { var result = {}; for (var i = 0; i < this.cells.length; i++) { var question = this.cells[i].question; if (!question.isEmpty()) { result[question.getValueName()] = question.value; } } return result; }, set: function (value) { this.isSettingValue = true; for (var i = 0; i < this.cells.length; i++) { var question = this.cells[i].question; var val = !!value ? value[question.getValueName()] : null; question.updateValueFromSurvey(val); question.onSurveyValueChanged(val); } this.isSettingValue = false; }, enumerable: true, configurable: true }); MatrixDropdownRowModelBase.prototype.getAllValues = function () { return this.value; }; MatrixDropdownRowModelBase.prototype.getFilteredValues = function () { var allValues = this.getAllValues(); var values = { row: allValues }; for (var key in allValues) { values[key] = allValues[key]; } return values; }; MatrixDropdownRowModelBase.prototype.getFilteredProperties = function () { return { survey: this.getSurvey(), row: this }; }; MatrixDropdownRowModelBase.prototype.runCondition = function (values, properties) { if (!!this.data) { values[MatrixDropdownRowModelBase.OwnerVariableName] = this.data.value; } values[MatrixDropdownRowModelBase.IndexVariableName] = this.rowIndex; if (!properties) properties = {}; properties[MatrixDropdownRowModelBase.RowVariableName] = this; for (var i = 0; i < this.cells.length; i++) { values[MatrixDropdownRowModelBase.RowVariableName] = this.value; this.cells[i].runCondition(values, properties); } }; MatrixDropdownRowModelBase.prototype.onAnyValueChanged = function (name) { for (var i = 0; i < this.cells.length; i++) { this.cells[i].question.onAnyValueChanged(name); } }; MatrixDropdownRowModelBase.prototype.getDataValueCore = function (valuesHash, key) { var survey = this.getSurvey(); if (!!survey) { return survey.getDataValueCore(valuesHash, key); } else { return valuesHash[key]; } }; MatrixDropdownRowModelBase.prototype.getValue = function (name) { var question = this.getQuestionByColumnName(name); return !!question ? question.value : null; }; MatrixDropdownRowModelBase.prototype.setValue = function (name, newColumnValue) { if (this.isSettingValue) return; var newValue = this.value; var changedValue = this.getValue(name); var changedQuestion = this.getQuestionByColumnName(name); var changingValue = this.data.onRowChanging(this, name, newValue); if (!!changedQuestion && !__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(changingValue, changedValue)) { this.getQuestionByColumnName(name).value = changingValue; } else { this.data.onRowChanged(this, name, newValue, newColumnValue == null && !changedQuestion); this.onAnyValueChanged(MatrixDropdownRowModelBase.RowVariableName); } }; MatrixDropdownRowModelBase.prototype.getComment = function (name) { var result = this.getValue(name + __WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].commentPrefix); return result ? result : ""; }; MatrixDropdownRowModelBase.prototype.setComment = function (name, newValue) { this.setValue(name + __WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].commentPrefix, newValue); }; Object.defineProperty(MatrixDropdownRowModelBase.prototype, "isEmpty", { get: function () { var val = this.value; if (__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isValueEmpty(val)) return true; for (var key in val) { if (val[key] !== undefined && val[key] !== null) return false; } return true; }, enumerable: true, configurable: true }); MatrixDropdownRowModelBase.prototype.getQuestionByColumn = function (column) { for (var i = 0; i < this.cells.length; i++) { if (this.cells[i].column == column) return this.cells[i].question; } return null; }; MatrixDropdownRowModelBase.prototype.getQuestionByColumnName = function (columnName) { for (var i = 0; i < this.cells.length; i++) { if (this.cells[i].column.name == columnName) return this.cells[i].question; } return null; }; MatrixDropdownRowModelBase.prototype.getSharedQuestionByName = function (columnName) { return !!this.data ? this.data.getSharedQuestionByName(columnName, this) : null; }; MatrixDropdownRowModelBase.prototype.clearIncorrectValues = function (val) { for (var key in val) { var question = this.getQuestionByColumnName(key); if (question) { var qVal = question.value; question.clearIncorrectValues(); if (!__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(qVal, question.value)) { this.setValue(key, question.value); } } else { if (!this.getSharedQuestionByName(key)) { this.setValue(key, null); } } } }; MatrixDropdownRowModelBase.prototype.getLocale = function () { return this.data ? this.data.getLocale() : ""; }; MatrixDropdownRowModelBase.prototype.getMarkdownHtml = function (text) { return this.data ? this.data.getMarkdownHtml(text) : null; }; MatrixDropdownRowModelBase.prototype.getProcessedText = function (text) { return this.data ? this.data.getProcessedText(text) : text; }; MatrixDropdownRowModelBase.prototype.locStrsChanged = function () { for (var i = 0; i < this.cells.length; i++) { this.cells[i].question.locStrsChanged(); } }; MatrixDropdownRowModelBase.prototype.updateCellQuestionOnColumnChanged = function (column) { for (var i = 0; i < this.cells.length; i++) { if (this.cells[i].column === column) { this.updateCellOnColumnChanged(this.cells[i]); return; } } }; MatrixDropdownRowModelBase.prototype.onQuestionReadOnlyChanged = function (parentIsReadOnly) { for (var i = 0; i < this.cells.length; i++) { if (!!this.cells[i].question) { this.cells[i].question.readOnly = parentIsReadOnly; } } }; MatrixDropdownRowModelBase.prototype.updateCellOnColumnChanged = function (cell) { cell.column.updateCellQuestion(cell.question, this); }; MatrixDropdownRowModelBase.prototype.buildCells = function (value) { this.isSettingValue = true; var columns = this.data.columns; for (var i = 0; i < columns.length; i++) { var column = columns[i]; if (column.isVisible) { var cell = this.createCell(column); this.cells.push(cell); if (!!value && !__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isValueEmpty(value[column.name])) { cell.question.value = value[column.name]; } } } this.isSettingValue = false; for (var i = 0; i < this.cells.length; i++) { var cell = this.cells[i]; if (!cell.question.isEmpty() && (!value || !__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(cell.question.value, value[cell.column.name]))) { this.setValue(cell.column.name, cell.question.value); } } }; MatrixDropdownRowModelBase.prototype.createCell = function (column) { return new MatrixDropdownCell(column, this, this.data); }; MatrixDropdownRowModelBase.prototype.geSurveyData = function () { return this; }; MatrixDropdownRowModelBase.prototype.getSurvey = function () { return this.data ? this.data.getSurvey() : null; }; Object.defineProperty(MatrixDropdownRowModelBase.prototype, "rowIndex", { get: function () { return !!this.data ? this.data.getRowIndex(this) + 1 : -1; }, enumerable: true, configurable: true }); //ITextProcessor MatrixDropdownRowModelBase.prototype.getProcessedTextValue = function (textValue) { var firstName = new __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__["a" /* ProcessValue */]().getFirstName(textValue.name); textValue.isExists = firstName == MatrixDropdownRowModelBase.RowVariableName; textValue.canProcess = textValue.isExists; if (!textValue.isExists) return; var values = { row: this.value }; textValue.value = new __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__["a" /* ProcessValue */]().getValue(textValue.name, values); }; MatrixDropdownRowModelBase.prototype.getTextProcessor = function () { return this; }; MatrixDropdownRowModelBase.prototype.processText = function (text, returnDisplayValue) { text = this.textPreProcessor.process(text, returnDisplayValue); if (!this.getSurvey()) return text; return this.getSurvey().processText(text, returnDisplayValue); }; MatrixDropdownRowModelBase.prototype.processTextEx = function (text, returnDisplayValue) { text = this.processText(text, returnDisplayValue); if (!this.getSurvey()) return text; var hasAllValuesOnLastRun = this.textPreProcessor.hasAllValuesOnLastRun; var res = this.getSurvey().processTextEx(text, returnDisplayValue, false); res.hasAllValuesOnLastRun = res.hasAllValuesOnLastRun && hasAllValuesOnLastRun; return res; }; MatrixDropdownRowModelBase.RowVariableName = "row"; MatrixDropdownRowModelBase.OwnerVariableName = "self"; MatrixDropdownRowModelBase.IndexVariableName = "rowIndex"; MatrixDropdownRowModelBase.idCounter = 1; return MatrixDropdownRowModelBase; }()); var MatrixDropdownTotalRowModel = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](MatrixDropdownTotalRowModel, _super); function MatrixDropdownTotalRowModel(data) { var _this = _super.call(this, data, null) || this; _this.buildCells(null); return _this; } MatrixDropdownTotalRowModel.prototype.createCell = function (column) { return new MatrixDropdownTotalCell(column, this, this.data); }; MatrixDropdownTotalRowModel.prototype.setValue = function (name, newValue) { if (!!this.data) { this.data.onTotalValueChanged(); } }; MatrixDropdownTotalRowModel.prototype.runCondition = function (values, properties) { var counter = 0; var prevValue; do { prevValue = __WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].getUnbindValue(this.value); _super.prototype.runCondition.call(this, values, properties); counter++; } while (!__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(prevValue, this.value) && counter < 3); }; MatrixDropdownTotalRowModel.prototype.updateCellOnColumnChanged = function (cell) { cell.updateCellQuestion(); }; return MatrixDropdownTotalRowModel; }(MatrixDropdownRowModelBase)); /** * 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.generatedTotalRow = 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; } Object.defineProperty(QuestionMatrixDropdownModelBase, "defaultCellType", { get: function () { return __WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].matrixDefaultCellType; }, set: function (val) { __WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].matrixDefaultCellType = val; }, enumerable: true, configurable: true }); QuestionMatrixDropdownModelBase.addDefaultColumns = function (matrix) { var colNames = __WEBPACK_IMPORTED_MODULE_8__questionfactory__["a" /* QuestionFactory */].DefaultColums; for (var i = 0; i < colNames.length; i++) matrix.addColumn(colNames[i]); }; QuestionMatrixDropdownModelBase.prototype.createColumnValues = function () { var _this = this; return this.createNewArray("columns", function (item) { item.colOwner = _this; }); }; QuestionMatrixDropdownModelBase.prototype.getType = function () { return "matrixdropdownbase"; }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "isRowsDynamic", { get: function () { return false; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnLayout", { /** * Set columnLayout to 'vertical' to place columns vertically and rows horizontally. It makes sense when we have many columns and few rows. * @see columns * @see rowCount */ get: function () { return this.getPropertyValue("columnLayout", "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", __WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].matrixDefaultCellType); }, set: function (val) { val = val.toLowerCase(); if (this.cellType == val) return; this.setPropertyValue("cellType", val); this.updateColumnsCellType(); this.fireCallback(this.updateCellsCallback); }, enumerable: true, configurable: true }); QuestionMatrixDropdownModelBase.prototype.updateColumnsCellType = function () { for (var i = 0; i < this.columns.length; i++) { this.columns[i].defaultCellTypeChanged(); } }; QuestionMatrixDropdownModelBase.prototype.updateColumnsIndexes = function (cols) { for (var i = 0; i < cols.length; i++) { cols[i].setIndex(i); } }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnColCount", { /** * The default column count for radiogroup and checkbox cell types. */ get: function () { return this.getPropertyValue("columnColCount", 0); }, set: function (value) { if (value < 0 || value > 4) return; this.setPropertyValue("columnColCount", value); this.fireCallback(this.updateCellsCallback); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnMinWidth", { /** * Use this property to set the mimimum column width. */ get: function () { return this.getPropertyValue("columnMinWidth", ""); }, set: function (val) { this.setPropertyValue("columnMinWidth", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "horizontalScroll", { /** * Set this property to true to show the horizontal scroll. */ get: function () { return this.getPropertyValue("horizontalScroll", false); }, set: function (val) { this.setPropertyValue("horizontalScroll", val); }, enumerable: true, configurable: true }); QuestionMatrixDropdownModelBase.prototype.getRequiredText = function () { return this.survey ? this.survey.requiredText : ""; }; QuestionMatrixDropdownModelBase.prototype.onColumnPropertiesChanged = function (column) { this.updateHasFooter(); if (!this.generatedVisibleRows) return; for (var i = 0; i < this.generatedVisibleRows.length; i++) { this.generatedVisibleRows[i].updateCellQuestionOnColumnChanged(column); } if (!!this.generatedTotalRow) { this.generatedTotalRow.updateCellQuestionOnColumnChanged(column); } }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "hasFooter", { get: function () { return this.getPropertyValue("hasFooter", false); }, enumerable: true, configurable: true }); QuestionMatrixDropdownModelBase.prototype.updateHasFooter = function () { this.setPropertyValue("hasFooter", this.hasTotal); }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "hasTotal", { get: function () { for (var i = 0; i < this.columns.length; i++) { if (this.columns[i].hasTotal) return true; } return false; }, enumerable: true, configurable: true }); QuestionMatrixDropdownModelBase.prototype.getCellType = function () { return this.cellType; }; QuestionMatrixDropdownModelBase.prototype.getConditionJson = function (operator, path) { if (operator === void 0) { operator = null; } if (path === void 0) { path = null; } if (!path) return _super.prototype.getConditionJson.call(this); var columnName = ""; for (var i = path.length - 1; i >= 0; i--) { if (path[i] == ".") break; columnName = path[i] + columnName; } var column = this.getColumnByName(columnName); if (!column) return null; var question = column.createCellQuestion(null); if (!question) return null; return question.getConditionJson(operator); }; QuestionMatrixDropdownModelBase.prototype.clearIncorrectValues = function () { var rows = this.visibleRows; if (!rows) return; for (var i = 0; i < rows.length; i++) { rows[i].clearIncorrectValues(this.getRowValue(i)); } }; QuestionMatrixDropdownModelBase.prototype.clearErrors = function () { _super.prototype.clearErrors.call(this); if (!!this.generatedVisibleRows) { for (var i = 0; i < this.generatedVisibleRows.length; i++) { var row = this.generatedVisibleRows[i]; for (var j = 0; j < row.cells.length; j++) { row.cells[j].question.clearErrors(); } } } }; QuestionMatrixDropdownModelBase.prototype.runCondition = function (values, properties) { _super.prototype.runCondition.call(this, values, properties); this.runCellsCondition(values, properties); this.runTotalsCondition(values, properties); }; QuestionMatrixDropdownModelBase.prototype.runCellsCondition = function (values, properties) { if (!this.generatedVisibleRows || !this.hasCellsCondition) return; var newValues = this.getRowConditionValues(values); var rows = this.generatedVisibleRows; for (var i = 0; i < rows.length; i++) { rows[i].runCondition(newValues, properties); } }; QuestionMatrixDropdownModelBase.prototype.runTotalsCondition = function (values, properties) { if (!this.generatedTotalRow) return; this.generatedTotalRow.runCondition(this.getRowConditionValues(values), properties); }; QuestionMatrixDropdownModelBase.prototype.getRowConditionValues = function (values) { var newValues = {}; if (values && values instanceof Object) { newValues = JSON.parse(JSON.stringify(values)); } newValues["row"] = {}; return newValues; }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "hasCellsCondition", { get: function () { for (var i = 0; i < this.columns.length; i++) { if (this.columns[i].hasCondition) return true; } return false; }, enumerable: true, configurable: true }); QuestionMatrixDropdownModelBase.prototype.locStrsChanged = function () { _super.prototype.locStrsChanged.call(this); var rows = this.generatedVisibleRows; if (!rows) return; var columns = this.columns; for (var i = 0; i < columns.length; i++) { columns[i].locStrsChanged(); } for (var i = 0; i < rows.length; i++) { rows[i].locStrsChanged(); } if (!!this.generatedTotalRow) { this.generatedTotalRow.locStrsChanged(); } }; /** * Returns the column by it's name. Retuns null if a column with this name doesn't exist. * @param column */ QuestionMatrixDropdownModelBase.prototype.getColumnByName = function (columnName) { for (var i = 0; i < this.columns.length; i++) { if (this.columns[i].name == columnName) return this.columns[i]; } return null; }; QuestionMatrixDropdownModelBase.prototype.getColumnName = function (columnName) { return this.getColumnByName(columnName); }; /** * Returns the column width. * @param column */ QuestionMatrixDropdownModelBase.prototype.getColumnWidth = function (column) { return column.minWidth ? column.minWidth : this.columnMinWidth; }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "choices", { /** * The default choices for dropdown, checkbox and radiogroup cell types. */ get: function () { return this.choicesValue; }, set: function (val) { this.setPropertyValue("choices", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "optionsCaption", { /** * The default options caption for dropdown cell type. */ get: function () { return this.getLocalizableStringText("optionsCaption", __WEBPACK_IMPORTED_MODULE_7__surveyStrings__["a" /* surveyLocalization */].getString("optionsCaption")); }, set: function (val) { this.setLocalizableStringText("optionsCaption", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "locOptionsCaption", { get: function () { return this.getLocalizableString("optionsCaption"); }, enumerable: true, configurable: true }); QuestionMatrixDropdownModelBase.prototype.addColumn = function (name, title) { if (title === void 0) { title = null; } var column = new MatrixDropdownColumn(name, title); this.columns.push(column); return column; }; QuestionMatrixDropdownModelBase.prototype.getVisibleRows = function () { var _this = this; if (this.isLoadingFromJson) return null; if (!this.generatedVisibleRows) { this.generatedVisibleRows = this.generateRows(); this.generatedVisibleRows.forEach(function (row) { return _this.onMatrixRowCreated(row); }); if (this.data) { var properties = { survey: this.survey }; this.runCellsCondition(this.data.getAllValues(), properties); } } return this.generatedVisibleRows; }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "totalValue", { get: function () { if (!this.hasTotal) return {}; return this.visibleTotalRow.value; }, enumerable: true, configurable: true }); QuestionMatrixDropdownModelBase.prototype.getVisibleTotalRow = function () { if (this.isLoadingFromJson) return null; if (this.hasTotal) { if (!this.generatedTotalRow) { this.generatedTotalRow = this.generateTotalRow(); if (this.data) { var properties = { survey: this.survey }; this.runTotalsCondition(this.data.getAllValues(), properties); } } } else { this.generatedTotalRow = null; } return this.generatedTotalRow; }; Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "visibleTotalRow", { get: function () { return this.getVisibleTotalRow(); }, enumerable: true, configurable: true }); QuestionMatrixDropdownModelBase.prototype.onSurveyLoad = function () { _super.prototype.onSurveyLoad.call(this); this.updateColumnsIndexes(this.columns); this.generatedVisibleRows = null; this.generatedTotalRow = null; this.updateHasFooter(); }; /** * Returns the row value. If the row value is empty, the object is empty: {}. * @param rowIndex row index from 0 to visible row count - 1. */ QuestionMatrixDropdownModelBase.prototype.getRowValue = function (rowIndex) { if (rowIndex < 0) return null; var visRows = this.visibleRows; if (rowIndex >= visRows.length) return null; var newValue = this.createNewValue(); return this.getRowValueCore(visRows[rowIndex], newValue); }; /** * Set the row value. * @param rowIndex row index from 0 to visible row count - 1. * @param rowValue an object {"column name": columnValue,... } */ QuestionMatrixDropdownModelBase.prototype.setRowValue = function (rowIndex, rowValue) { if (rowIndex < 0) return null; var visRows = this.visibleRows; if (rowIndex >= visRows.length) return null; this.onRowChanged(visRows[rowIndex], "", rowValue, false); this.onValueChanged(); }; QuestionMatrixDropdownModelBase.prototype.generateRows = function () { return null; }; QuestionMatrixDropdownModelBase.prototype.generateTotalRow = function () { return new MatrixDropdownTotalRowModel(this); }; QuestionMatrixDropdownModelBase.prototype.createNewValue = function () { return !this.value ? {} : this.createValueCopy(); }; 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) { if (!rowValue) return rowValue; for (var key in rowValue) { var question = row.getQuestionByColumnName(key); if (!question) { question = this.getSharedQuestionByName(key, row); } if (!!question) { rowValue[key] = question.displayValue; } } return rowValue; }; QuestionMatrixDropdownModelBase.prototype.getPlainData = function (options) { var _this = this; if (options === void 0) { options = { includeEmpty: true }; } var questionPlainData = _super.prototype.getPlainData.call(this, options); if (!!questionPlainData) { questionPlainData.isNode = true; questionPlainData.data = this.visibleRows.map(function (row) { var rowDataItem = { name: row.rowName, title: row.rowName, value: row.value, displayValue: _this.getRowDisplayValue(row, row.value), getString: function (val) { return typeof val === "object" ? JSON.stringify(val) : val; }, isNode: true, data: row.cells .map(function (cell) { return cell.question.getPlainData(options); }) .filter(function (d) { return !!d; }) }; (options.calculations || []).forEach(function (calculation) { rowDataItem[calculation.propertyName] = row[calculation.propertyName]; }); return rowDataItem; }); } return questionPlainData; }; QuestionMatrixDropdownModelBase.prototype.onBeforeValueChanged = function (val) { }; QuestionMatrixDropdownModelBase.prototype.onSetQuestionValue = function () { if (this.isRowChanging) return; this.onBeforeValueChanged(this.value); if (!this.generatedVisibleRows || this.generatedVisibleRows.length == 0) return; this.isRowChanging = true; var val = this.createNewValue(); for (var i = 0; i < this.generatedVisibleRows.length; i++) { var row = this.generatedVisibleRows[i]; this.generatedVisibleRows[i].value = this.getRowValueCore(row, val); } this.isRowChanging = false; }; QuestionMatrixDropdownModelBase.prototype.setQuestionValue = function (newValue) { _super.prototype.setQuestionValue.call(this, newValue); this.onSetQuestionValue(); }; 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; }; QuestionMatrixDropdownModelBase.prototype.onReadOnlyChanged = function () { _super.prototype.onReadOnlyChanged.call(this); if (!this.generateRows) return; for (var i = 0; i < this.visibleRows.length; i++) { this.visibleRows[i].onQuestionReadOnlyChanged(this.isReadOnly); } }; //IMatrixDropdownData QuestionMatrixDropdownModelBase.prototype.createQuestion = function (row, column) { return this.createQuestionCore(row, column); }; QuestionMatrixDropdownModelBase.prototype.createQuestionCore = function (row, column) { var question = column.createCellQuestion(row); if (this.isReadOnly) { question.readOnly = true; } question.setSurveyImpl(row); return question; }; QuestionMatrixDropdownModelBase.prototype.deleteRowValue = function (newValue, row) { 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.getOnCellValueChangedOptions = function (row, columnName, rowValue) { var self = this; var getQuestion = function (colName) { for (var i = 0; self.columns.length; i++) { if (self.columns[i].name === colName) { return row.cells[i].question; } } return null; }; return { row: row, columnName: columnName, rowValue: rowValue, value: !!rowValue ? rowValue[columnName] : null, getCellQuestion: getQuestion }; }; QuestionMatrixDropdownModelBase.prototype.onCellValueChanged = function (row, columnName, rowValue) { if (!this.survey) return; var options = this.getOnCellValueChangedOptions(row, columnName, rowValue); this.survey.matrixCellValueChanged(this, options); }; QuestionMatrixDropdownModelBase.prototype.validateCell = function (row, columnName, rowValue) { if (!this.survey) return; var self = this; var options = { row: row, columnName: columnName, rowValue: rowValue, value: rowValue[columnName] }; return this.survey.matrixCellValidate(this, options); }; QuestionMatrixDropdownModelBase.prototype.onRowChanging = function (row, columnName, rowValue) { if (!this.survey) return !!rowValue ? rowValue[columnName] : null; var options = this.getOnCellValueChangedOptions(row, columnName, rowValue); var oldRowValue = this.getRowValueCore(row, this.createNewValue(), true); options.oldValue = !!oldRowValue ? oldRowValue[columnName] : null; this.survey.matrixCellValueChanging(this, options); return options.value; }; QuestionMatrixDropdownModelBase.prototype.onRowChanged = function (row, columnName, newRowValue, isDeletingValue) { var oldValue = this.createNewValue(); if (this.isMatrixValueEmpty(oldValue)) oldValue = null; var newValue = this.createNewValue(); var rowValue = this.getRowValueCore(row, newValue, true); if (!rowValue) rowValue = {}; if (isDeletingValue) { delete rowValue[columnName]; } for (var i = 0; i < row.cells.length; i++) { var key = row.cells[i].question.getValueName(); delete rowValue[key]; } if (newRowValue) { newRowValue = JSON.parse(JSON.stringify(newRowValue)); for (var key in newRowValue) { if (!this.isValueEmpty(newRowValue[key])) { rowValue[key] = newRowValue[key]; } } } if (this.isObject(rowValue) && Object.keys(rowValue).length === 0) { newValue = this.deleteRowValue(newValue, row); } 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.getSharedQuestionByName = function (columnName, row) { if (!this.survey || !this.valueName) return null; var index = this.getRowIndex(row); if (index < 0) return null; return this.survey.getQuestionByValueNameFromArray(this.valueName, columnName, index); }; QuestionMatrixDropdownModelBase.prototype.onTotalValueChanged = function () { if (!!this.data && !!this.visibleTotalRow) { this.data.setValue(this.getValueName() + __WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].matrixTotalValuePostFix, this.totalValue); } }; QuestionMatrixDropdownModelBase.prototype.getQuestionFromArray = function (name, index) { if (index >= this.visibleRows.length) return null; return this.visibleRows[index].getQuestionByColumnName(name); }; QuestionMatrixDropdownModelBase.prototype.isMatrixValueEmpty = function (val) { if (!val) return; if (Array.isArray(val)) { for (var i = 0; i < val.length; i++) { if (this.isObject(val[i]) && Object.keys(val[i]).length > 0) return false; } return true; } return Object.keys(val).length == 0; }; QuestionMatrixDropdownModelBase.prototype.getSurvey = function () { return this.survey; }; return QuestionMatrixDropdownModelBase; }(__WEBPACK_IMPORTED_MODULE_2__martixBase__["a" /* QuestionMatrixBaseModel */])); __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("matrixdropdowncolumn", [ "!name", { name: "title", serializationProperty: "locTitle" }, { name: "cellType", default: "default", choices: function () { var res = MatrixDropdownColumn.getColumnTypes(); res.splice(0, 0, "default"); return res; } }, { name: "colCount", default: -1, choices: [-1, 0, 1, 2, 3, 4] }, "isRequired:boolean", { name: "requiredErrorText:text", serializationProperty: "locRequiredErrorText" }, "hasOther:boolean", "readOnly:boolean", "minWidth", "visibleIf:condition", "enableIf:condition", "requiredIf:condition", { name: "validators:validators", baseClassName: "surveyvalidator", classNamePart: "validator" }, { name: "totalType", default: "none", choices: ["none", "sum", "count", "min", "max", "avg"] }, "totalExpression:expression", { name: "totalFormat", serializationProperty: "locTotalFormat" }, { name: "totalDisplayStyle", default: "none", choices: ["none", "decimal", "currency", "percent"] }, { name: "totalCurrency", choices: function () { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__question_expression__["b" /* getCurrecyCodes */])(); }, default: "USD" }, { name: "totalMaximumFractionDigits:number", default: -1 }, { name: "totalMinimumFractionDigits:number", default: -1 } ], function () { return new MatrixDropdownColumn(""); }); __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("matrixdropdownbase", [ { name: "columns:matrixdropdowncolumns", className: "matrixdropdowncolumn" }, { name: "columnLayout", alternativeName: "columnsLocation", default: "horizontal", choices: ["horizontal", "vertical"] }, "horizontalScroll:boolean", { name: "choices:itemvalue[]" }, { name: "optionsCaption", serializationProperty: "locOptionsCaption" }, { name: "cellType", default: "dropdown", choices: function () { return MatrixDropdownColumn.getColumnTypes(); } }, { name: "columnColCount", default: 0, choices: [0, 1, 2, 3, 4] }, "columnMinWidth" ], function () { return new QuestionMatrixDropdownModelBase(""); }, "matrixbase"); /***/ }), /* 22 */ /***/ (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() { } 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; }()); /***/ }), /* 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__helpers__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__base__ = __webpack_require__(5); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__page__ = __webpack_require__(27); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__textPreProcessor__ = __webpack_require__(22); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__ = __webpack_require__(16); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__dxSurveyService__ = __webpack_require__(39); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__surveyStrings__ = __webpack_require__(2); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__error__ = __webpack_require__(11); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__localizablestring__ = __webpack_require__(17); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__stylesmanager__ = __webpack_require__(58); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__surveytimer__ = __webpack_require__(60); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__conditions__ = __webpack_require__(10); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__settings__ = __webpack_require__(9); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyModel; }); /** * Survey object contains information about the survey. Pages, Questions, flow logic and etc. */ var SurveyModel = /** @class */ (function (_super) { __WEBPACK_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 * <br/> sender the survey object that fires the event * <br/> 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__["a" /* 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. * <br/> sender the survey object that fires the event * <br/> 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. * <br/> 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. * <br/> options.showDataSavingSuccess(text) call this method to show that the data were successful saved on the server. * <br/> 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__["a" /* 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__["a" /* 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. * <br/> sender the survey object that fires the event * @see sendResultOnPageNext */ _this.onPartialSend = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired before another page becomes the current. Typically it happens when a user click on 'Next' or 'Prev' buttons. * <br/> sender the survey object that fires the event * <br/> option.oldCurrentPage the previous current/active page * <br/> option.newCurrentPage a new current/active page * <br/> 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__["a" /* Event */](); /** * The event is fired when another page becomes the current. Typically it happens when a user click on 'Next' or 'Prev' buttons. * <br/> sender the survey object that fires the event * <br/> option.oldCurrentPage the previous current/active page * <br/> 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__["a" /* 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. * <br/> sender the survey object that fires the event * <br/> options.name the value name that has being changed * <br/> 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. * <br/> options.oldValue old, previous value. * <br/> options.value a new value. You may change it * @see setValue * @see onValueChanged */ _this.onValueChanging = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* 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. * <br/> sender the survey object that fires the event * <br/> options.name the value name that has been changed * <br/> 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. * <br/> options.value a new value * @see setValue * @see onValueChanging * @see onDynamicPanelItemValueChanged * @see onMatrixCellValueChanged */ _this.onValueChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired on changing a question visibility. * <br/> sender the survey object that fires the event * <br/> options.question a question which visibility has been changed * <br/> options.name a question name * <br/> options.visible a question visible boolean value * @see Question.visibile * @see Question.visibileIf */ _this.onVisibleChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired on changing a page visibility. * <br/> sender the survey object that fires the event * <br/> options.page a page which visibility has been changed * <br/> options.visible a page visible boolean value * @see PageModel.visibile * @see PageModel.visibileIf */ _this.onPageVisibleChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired on changing a panel visibility. * <br/> sender the survey object that fires the event * <br/> options.panel a panel which visibility has been changed * <br/> options.visible a panel visible boolean value * @see PanelModel.visibile * @see PanelModel.visibileIf */ _this.onPanelVisibleChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired on adding a new question into survey. * 'question': question, 'name': question.name, 'index': index, 'parentPanel': parentPanel, 'rootPanel': rootPanel * <br/> sender the survey object that fires the event * <br/> options.question a newly added question object. * <br/> options.name a question name * <br/> options.index a index of the question in the container (page or panel) * <br/> options.parentPanel a container where question is located. It can be page or panel. * <br/> options.rootPanel typically it is a page. * @see Question */ _this.onQuestionAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired on removing a question from survey * <br/> sender the survey object that fires the event * <br/> options.question a removed question object. * <br/> options.name a question name * @see Question */ _this.onQuestionRemoved = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired on adding a panel into survey * <br/> sender the survey object that fires the event * <br/> options.panel a newly added panel object. * <br/> options.name a panel name * <br/> options.index a index of the panel in the container (page or panel) * <br/> options.parentPanel a container where question is located. It can be page or panel. * <br/> options.rootPanel typically it is a page. * @see PanelModel */ _this.onPanelAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired on removing a panel from survey * <br/> sender the survey object that fires the event * <br/> options.panel a removed panel object. * <br/> options.name a panel name * @see PanelModel */ _this.onPanelRemoved = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired on adding a page into survey * <br/> sender the survey object that fires the event * <br/> options.page a newly added panel object. * @see PanelModel */ _this.onPageAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* 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. * <br/> sender the survey object that fires the event * <br/> options.question a question * <br/> options.name a question name * <br/> options.value the current question value * <br/> options.error an error string. It is empty by default. * @see onServerValidateQuestions */ _this.onValidateQuestion = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * Use this event to validate data on your server. * <br/> sender the survey object that fires the event * <br/> options.data the values of all non-empty questions on the current page. You can get a question value as options.data["myQuestionName"]. * <br/> options.errors set your errors to this object as: options.errors["myQuestionName"] = "Error text";. It will be shown as a question error. * <br/> 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__["a" /* Event */](); /** * Use this event to modify the html before rendering, for example html on 'Thank you' page. Options has one parameter: options.html. * <br/> sender the survey object that fires the event * <br/> 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. * <br/> sender the survey object that fires the event * <br/> options.name a panel name * <br/> options.error an error string. It is empty by default. * @see onValidateQuestion */ _this.onValidatePanel = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * Use the event to change the default error text. * <br/> sender the survey object that fires the event * <br/> options.text an error text * <br/> options.error an instance of SurveyError object * <br/> options.name the error name. The following error name are available: * required, requireoneanswer, requirenumeric, exceedsize, webrequest, webrequestempty, otherempty, * uploadingfile, requiredinallrowserror, minrowcounterror, keyduplicationerror, custom */ _this.onErrorCustomText = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * Use the this event to be notified when the survey finished validate questions on the current page. It commonly happens when a user try to go to the next page or complete the survey * options.questions - the list of questions that have errors * options.errors - the list of errors */ _this.onValidatedErrorsOnCurrentPage = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * Use this event to modify the html before rendering, for example completeHtml or loadingHtml. * options.html - change this html property before the library rendered it * @see completedHtml * @see loadingHtml */ _this.onProcessHtml = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * Use this event to change the question title in the code. * <br/> sender the survey object that fires the event * <br/> options.title a calcualted question title, based on question title, name, isRequired, visibleIndex (no) * <br/> options.question a question object. */ _this.onGetQuestionTitle = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * Use this event to process the markdown text. * <br/> sender the survey object that fires the event * <br/> options.element SurveyJS element where the string is going to be rendered. It is a question, panel, page or survey * <br/> options.text a text that is going to be rendered * <br/> 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__["a" /* 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. * <br/> sender the survey object that fires the event * <br/> options.success it is true if the results were sent to the service successful * <br/> options.response a response from the service */ _this.onSendResult = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * Use it to get results after calling the getResult method. It returns a simple analytic from [dxsurvey.com](http://www.dxsurvey.com) service. * <br/> sender the survey object that fires the event * <br/> options.success it is true if the results were got from the service successful * <br/> 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. * <br/> 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. * <br/> options.response the server response * @see getResult */ _this.onGetResult = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* 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. * <br/> sender the survey object that fires the event * name: name, file: file, accept: accept * <br/> name the file name * <br/> file the Javascript File object * <br/> 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__["a" /* 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. * <br/> sender the survey object that fires the event * name: name, content: content, fileValue: fileValue * <br/> name the question name * <br/> content the file content * <br/> fileValue single file question value * <br/> 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__["a" /* 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. * <br/> sender the survey object that fires the event * name: name, value: value * <br/> name the question name * <br/> value the question value * <br/> fileName of the removed file, pass null to clear all files * <br/> callback a call back function to get the status on clearing the files operation * @see clearFiles */ _this.onClearFiles = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* 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 * <br/> question - the question where loaded choices are going to be assigned * <br/> choices - the loaded choices. You may change them to assign the correct one * <br> serverResult - a result that comes from the server as it is. */ _this.onLoadChoicesFromServer = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* 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. * <br/> name - the name of the processing value, for example, "state" in our example * <br/> value - the value of the processing text * <br/> 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__["a" /* 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 * <br/> sender the survey object that fires the event * <br/> options.question a question for which you may change the css classes * <br/> 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__["a" /* 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 * <br/> sender the survey object that fires the event * <br/> options.panel a panel for which you may change the css classes * <br/> 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__["a" /* Event */](); /** * The event is fired right after survey is rendered in DOM. options.htmlElement is the root element. * <br/> sender the survey object that fires the event * <br/> options.htmlElement a root html element binded with the survey object */ _this.onAfterRenderSurvey = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* 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 * <br/> sender the survey object that fires the event * <br/> options.page a page object for which the event is fired. Typically the current/active page. * <br/> options.htmlElement an html element binded with the page object */ _this.onAfterRenderPage = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* 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 * <br/> sender the survey object that fires the event * <br/> options.question a question object for which the event is fired * <br/> options.htmlElement an html element binded with the question object */ _this.onAfterRenderQuestion = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* 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 * <br/> sender the survey object that fires the event * <br/> options.panel a panel object for which the event is fired * <br/> options.htmlElement an html element binded with the panel object */ _this.onAfterRenderPanel = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired on adding a new row in Matrix Dynamic question. * <br/> sender the survey object that fires the event * <br/> options.question a matrix question. * @see QuestionMatrixDynamicModel * @see QuestionMatrixDynamicModel.visibleRows */ _this.onMatrixRowAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired before adding a new row in Matrix Dynamic question. * <br/> sender the survey object that fires the event * <br/> options.question a matrix question. * <br/> options.canAddRow an allowing flag. * @see QuestionMatrixDynamicModel * @see QuestionMatrixDynamicModel.visibleRows */ _this.onMatrixBeforeRowAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired on removing a row from Matrix Dynamic question. * <br/> sender the survey object that fires the event * <br/> options.question a matrix question. * <br/> options.rowIndex a removed row index. * <br/> options.row a removed row object. * @see QuestionMatrixDynamicModel * @see QuestionMatrixDynamicModel.visibleRows */ _this.onMatrixRowRemoved = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired for every cell created in Matrix Dymic and Matrix Dropdown questions. * <br/> options.question - the matrix question * <br/> options.cell - the matrix cell * <br/> options.cellQuestion - the question/editor in the cell. You may customize it, change it's properties, like choices or visible. * <br/> options.rowValue - the value of the current row. To access the value of paticular column use: options.rowValue["columnValue"] * <br/> options.column - the matrix column object * <br/> options.columName - the matrix column name * <br/> options.row - the matrix row object * @see onMatrixBeforeRowAdded * @see onMatrixRowAdded * @see QuestionMatrixDynamicModel * @see QuestionMatrixDropdownModel */ _this.onMatrixCellCreated = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired for every cell after is has been rendered in DOM. * <br/> options.question - the matrix question * <br/> options.cell - the matrix cell * <br/> options.cellQuestion - the question/editor in the cell. * <br/> options.htmlElement a html element binded with the cellQuestion object * <br/> options.column - the matrix column object * <br/> options.row - the matrix row object * @see onMatrixCellCreated * @see QuestionMatrixDynamicModel * @see QuestionMatrixDropdownModel */ _this.onMatrixAfterCellRender = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired when cell value is changed in Matrix Dymic and Matrix Dropdown questions. * <br/> options.question - the matrix question * <br/> options.columName - the matrix column name * <br/> options.value - a new value * <br/> options.row - the matrix row object * <br/> options.getCellQuestion(columnName) - the function that returns the cell question by column name. * @see onMatrixCellValueChanging * @see onMatrixBeforeRowAdded * @see onMatrixRowAdded * @see QuestionMatrixDynamicModel * @see QuestionMatrixDropdownModel */ _this.onMatrixCellValueChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired on changing cell value in Matrix Dymic and Matrix Dropdown questions. You may change the options.value property to change the value in the cell. * <br/> options.question - the matrix question * <br/> options.columName - the matrix column name * <br/> options.value - a new value * <br/> options.oldValue - the old value * <br/> options.row - the matrix row object * <br/> options.getCellQuestion(columnName) - the function that returns the cell question by column name. * @see onMatrixCellValueChanged * @see onMatrixBeforeRowAdded * @see onMatrixRowAdded * @see QuestionMatrixDynamicModel * @see QuestionMatrixDropdownModel */ _this.onMatrixCellValueChanging = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired when Matrix Dymic and Matrix Dropdown questions validate the cell value. * <br/> options.question - the matrix question * <br/> options.columName - the matrix column name * <br/> options.value - a cell value * <br/> options.row - the matrix row object * <br/> 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__["a" /* Event */](); /** * The event is fired on adding a new panel in Panel Dynamic question. * <br/> sender the survey object that fires the event * <br/> options.question a panel question. * @see QuestionPanelDynamicModel * @see QuestionPanelDynamicModel.panels */ _this.onDynamicPanelAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired on removing a panel from Panel Dynamic question. * <br/> sender the survey object that fires the event * <br/> options.question a panel question. * <br/> options.panelIndex a removed panel index. * @see QuestionPanelDynamicModel * @see QuestionPanelDynamicModel.panels */ _this.onDynamicPanelRemoved = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* 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__["a" /* Event */](); /** * The event is fired before displaying a new information in the Timer Panel. Use it to change the default text. * <br/> options.text - the timer panel info text. */ _this.onTimerPanelInfoText = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * The event is fired when item value is changed in Panel Dynamic question. * <br/> options.question - the panel question * <br/> options.panel - the dynamic panel item * <br/> options.name - the item name * <br/> options.value - a new value * <br/> options.itemIndex - the panel item index * <br/> options.itemValue - the panel item object * @see onDynamicPanelAdded * @see QuestionPanelDynamicModel */ _this.onDynamicPanelItemValueChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["a" /* Event */](); /** * Use this event to define, if the answer on the question is correct or not. * <br/> sender the survey object that fires the event * <br/> options.question a question on which you have to decide if the answer is correct or not. * <br/> 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__["a" /* Event */](); /** * Use this event to control drag&drop operations during design mode. * <br/> sender the survey object that fires the event. * <br/> options.allow set it to false to disable dragging. * <br/> options.target a target element that is dragging. * <br/> options.source a source element. It can be null, if it is a new element, dragging from toolbox. * <br/> options.parent a page or panel where target element is dragging. * <br/> 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. * <br/> 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__["a" /* 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; /** * Returns the time in seconds end-user spends on the survey * @see startTimer * @see PageModel.timeSpent */ _this.timeSpent = 0; var self = _this; if (typeof document !== "undefined") { SurveyModel.stylesManager = new __WEBPACK_IMPORTED_MODULE_11__stylesmanager__["a" /* StylesManager */](); } _this.createLocalizableString("title", _this, true); _this.createLocalizableString("description", _this, true); _this.createLocalizableString("completedHtml", _this); _this.createLocalizableString("completedBeforeHtml", _this); _this.createLocalizableString("loadingHtml", _this); _this.createLocalizableString("startSurvey", _this); _this.createLocalizableString("pagePrev", _this); _this.createLocalizableString("pageNext", _this); _this.createLocalizableString("complete", _this); _this.createLocalizableString("questionTitleTemplate", _this, true); _this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_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.completedHtmlOnConditionValue = _this.createNewArray("completedHtmlOnCondition", function (value) { value.locOwner = 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_14__settings__["a" /* settings */].commentPrefix; }, set: function (val) { __WEBPACK_IMPORTED_MODULE_14__settings__["a" /* settings */].commentPrefix = val; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "currentPageValue", { get: function () { return this.getPropertyValue("currentPageValue", null); }, set: function (val) { this.setPropertyValue("currentPageValue", val); }, enumerable: true, configurable: true }); SurveyModel.prototype.getType = function () { return "survey"; }; 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, "focusOnFirstError", { /** * Set this property to false (default value is true) if you do not want to bring the focus to the first question that has error on the page. */ get: function () { return this.getPropertyValue("focusOnFirstError", true); }, set: function (val) { this.setPropertyValue("focusOnFirstError", val); }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "showNavigationButtons", { /** * Possible values: 'bottom' (default), 'top', 'both' and 'none'. Set it to 'none' to hide 'Prev', 'Next' and 'Complete' buttons. It makes sense if you are going to create a custom navigation or have just one page or on setting goNextPageAutomatic property. * @see goNextPageAutomatic * @see showPrevButton */ get: function () { return this.getPropertyValue("showNavigationButtons", "bottom"); }, set: function (val) { if (val === true || val === undefined) { val = "bottom"; } if (val === false) { val = "none"; } this.setPropertyValue("showNavigationButtons", val); }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "showPrevButton", { /** * Set it to false to hide the 'Prev' to disable for end-users go back to their answers. * @see showNavigationButtons */ get: function () { return this.getPropertyValue("showPrevButton", true); }, set: function (val) { this.setPropertyValue("showPrevButton", val); }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "showTitle", { /** * Set it to false hide survey title. * @see title */ get: function () { return this.getPropertyValue("showTitle", true); }, set: function (val) { this.setPropertyValue("showTitle", val); }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "showPageTitles", { /** * Set it to false to hide page titles. * @see PageModel.title */ get: function () { return this.getPropertyValue("showPageTitles", true); }, set: function (val) { this.setPropertyValue("showPageTitles", val); }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "showCompletedPage", { /** * On finishing the survey the 'Thank you', page on complete, is shown. Set the property to false, to hide the 'Thank you' page. * @see data * @see onComplete */ 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. * </br> Set it to 'onHidden' to clear the question value when it becomes invisible. * </br> 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. * </br> 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); }; //ISurveyErrorOwner SurveyModel.prototype.getErrorCustomText = function (text, error) { var options = { text: text, name: error.getErrorType(), error: error }; this.onErrorCustomText.fire(this, options); return options.text; }; Object.defineProperty(SurveyModel.prototype, "emptySurveyText", { /** * Returns the text that renders when there is no any visible page and question. */ get: function () { return this.getLocString("emptySurvey"); }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "title", { /** * Survey title. * @see description */ get: function () { return this.getLocalizableStringText("title"); }, set: function (value) { this.setLocalizableStringText("title", value); }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "locTitle", { get: function () { return this.getLocalizableString("title"); }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "description", { /** * Survey description. It shows under survey title * @see title */ get: function () { return this.getLocalizableStringText("description"); }, set: function (value) { this.setLocalizableStringText("description", value); }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "locDescription", { get: function () { return this.getLocalizableString("description"); }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "completedHtml", { /** * The html that shows on completed ('Thank you') page. Set it to change the default text. * @see showCompletedPage * @see completedHtmlOnCondition * @see locale */ get: function () { return this.getLocalizableStringText("completedHtml"); }, set: function (value) { this.setLocalizableStringText("completedHtml", value); }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "locCompletedHtml", { get: function () { return this.getLocalizableString("completedHtml"); }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "completedHtmlOnCondition", { /** * The list of html condition items. If the expression of this item returns true, then survey will use this item html instead of completedHtml * @see HtmlConditionItem * @see completeHtml */ get: function () { return this.completedHtmlOnConditionValue; }, set: function (val) { this.setPropertyValue("completedHtmlOnCondition", val); }, enumerable: true, configurable: true }); /** * Perform the calculation of the given expression and returns the result value * @param expression */ SurveyModel.prototype.runExpression = function (expression) { if (!expression) return null; var values = this.getFilteredValues(); var properties = this.getFilteredProperties(); return new __WEBPACK_IMPORTED_MODULE_13__conditions__["a" /* ExpressionRunner */](expression).run(values, properties); }; /** * Perform the calculation of the given expression and true or false * @param expression */ SurveyModel.prototype.runCondition = function (expression) { if (!expression) return false; var values = this.getFilteredValues(); var properties = this.getFilteredProperties(); return new __WEBPACK_IMPORTED_MODULE_13__conditions__["b" /* ConditionRunner */](expression).run(values, properties); }; Object.defineProperty(SurveyModel.prototype, "renderedCompletedHtml", { get: function () { if (this.completedHtmlOnCondition.length == 0) return this.completedHtml; var values = this.getFilteredValues(); var properties = this.getFilteredProperties(); for (var i = 0; i < this.completedHtmlOnCondition.length; i++) { var item = this.completedHtmlOnCondition[i]; if (item.runCondition(values, properties)) { return item.html; } } return this.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) { if (!!value && value.indexOf("{no}") !== -1) { var noIndex = value.indexOf("{no}"); var prevBrIndex = noIndex; var nextBrIndex = noIndex + 4; while (prevBrIndex >= 0 && value[prevBrIndex] !== "}") prevBrIndex--; while (nextBrIndex < value.length && value[nextBrIndex] !== "{") nextBrIndex++; value = value.substring(0, prevBrIndex + 1) + value.substring(nextBrIndex); } this.setLocalizableStringText("questionTitleTemplate", value); }, enumerable: true, configurable: true }); /** * Returns the question title template * @see questionTitleTemplate * @see QuestionModel.title */ SurveyModel.prototype.getQuestionTitleTemplate = function () { if (this.questionTitleTemplateCache === undefined) { this.questionTitleTemplateCache = this.locQuestionTitleTemplate.textOrHtml; } return this.questionTitleTemplateCache; }; Object.defineProperty(SurveyModel.prototype, "locQuestionTitleTemplate", { get: function () { return this.getLocalizableString("questionTitleTemplate"); }, enumerable: true, configurable: true }); SurveyModel.prototype.getUpdatedQuestionTitle = function (question, title) { if (this.onGetQuestionTitle.isEmpty) return title; var options = { question: question, title: title }; this.onGetQuestionTitle.fire(this, options); return options.title; }; Object.defineProperty(SurveyModel.prototype, "showPageNumbers", { /** * Set this property to false to turn off the numbering on pages titles. */ get: function () { return this.getPropertyValue("showPageNumbers", false); }, set: function (value) { if (value === this.showPageNumbers) return; this.setPropertyValue("showPageNumbers", value); this.updateVisibleIndexes(); }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "showQuestionNumbers", { /** * Set this property to "off" to turn off the numbering on questions titles or "onpage" to start numbering on every page. The default value is "on". */ get: function () { return this.getPropertyValue("showQuestionNumbers", "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, "progressBarType", { /** * Type of info in the progress bar: "pages" (default), "questions" or "correctQuestions". */ get: function () { return this.getPropertyValue("progressBarType", "pages"); }, set: function (newValue) { this.setPropertyValue("progressBarType", newValue.toLowerCase()); }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isShowProgressBarOnTop", { get: function () { return this.showProgressBar === "top" || this.showProgressBar === "both"; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isShowProgressBarOnBottom", { get: function () { return this.showProgressBar === "bottom" || this.showProgressBar === "both"; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "processedTitle", { /** * Returns the text/html that renders as survey title. */ get: function () { return this.locTitle.renderedHtml; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "questionTitleLocation", { /** * Set this property to 'bottom' or 'left' to show question title under the question or on the left. * <br/><b>Note:</b> 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.updateAllQuestionsValue(); this.checkTriggers(this.valuesHash, false); this.notifyAllQuestionsOnValueChanged(); this.notifyElementsOnAnyValueOrVariableChanged(""); this.runConditions(); }, enumerable: true, configurable: true }); SurveyModel.prototype.getAllValues = function () { return this.data; }; /** * Returns survey result data as an array of plain objects: with question title, name, value and displayValue. * For complex questions (like matrix, etc.) isNode flag is set to true and data contains array of nested objects (rows) * set options.includeEmpty to false if you want to skip empty answers */ SurveyModel.prototype.getPlainData = function (options) { if (options === void 0) { options = { includeEmpty: true }; } var result = []; this.getAllQuestions().forEach(function (question) { var resultItem = question.getPlainData(options); if (!!resultItem) { result.push(resultItem); } }); return result; }; SurveyModel.prototype.getFilteredValues = function () { var values = {}; for (var key in this.variablesHash) values[key] = this.variablesHash[key]; for (var key in this.valuesHash) values[key] = this.getDataValueCore(this.valuesHash, key); values["conditionVersion"] = ++this.conditionVersion; return values; }; SurveyModel.prototype.getFilteredProperties = function () { return { survey: this }; }; SurveyModel.prototype.getDataValueCore = function (valuesHash, key) { return valuesHash[key]; }; SurveyModel.prototype.setDataValueCore = function (valuesHash, key, value) { valuesHash[key] = value; }; SurveyModel.prototype.deleteDataValueCore = function (valuesHash, key) { delete valuesHash[key]; }; Object.defineProperty(SurveyModel.prototype, "comments", { // protected iterateDataValuesHash(func: (hash: any, key: any) => void) { // var keys: any[] = []; // for (var key in this.valuesHash) { // keys.push(key); // } // keys.forEach(key => func(this.valuesHash, key)); // } /** * Returns all comments from the data. * @see data */ get: function () { var result = {}; for (var key in this.valuesHash) { if (key.indexOf(this.commentPrefix) > 0) { result[key] = this.getDataValueCore(this.valuesHash, key); } } return result; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "visiblePages", { /** * Returns the list of visible pages. If all pages are visible then it is the same as pages property. * @see pages * @see PageModel.visible * @see PageModel.visibleIf */ get: function () { if (this.isDesignMode) return this.pages; var result = new Array(); for (var i = 0; i < this.pages.length; i++) { if (this.pages[i].isVisible) { result.push(this.pages[i]); } } return result; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isEmpty", { /** * Returns true if there is no any page in the survey. The survey is empty. */ get: function () { return this.pages.length == 0; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "PageCount", { /** * depricated, misspelling, use pageCount property */ get: function () { return this.pageCount; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "pageCount", { /** * Returns the survey pages count. * @see visiblePageCount * @see pages */ get: function () { return this.pages.length; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "visiblePageCount", { /** * Returns the survey visible pages count * @see pageCount * @see visiblePages */ get: function () { return this.visiblePages.length; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "startedPage", { /** * Returns the started Page. firstPageIsStarted property should be equals to true * @see firstPageIsStarted */ get: function () { var page = this.firstPageIsStarted && this.pages.length > 0 ? this.pages[0] : null; if (!!page) { page.onFirstRendering(); } return page; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "currentPage", { /** * Returns the current survey page. If survey is rendred then it is a page that a user can see/edit. */ get: function () { var vPages = this.visiblePages; if (this.currentPageValue != null) { if (vPages.indexOf(this.currentPageValue) < 0) { this.currentPage = null; } } if (this.currentPageValue == null && vPages.length > 0) { this.currentPage = vPages[0]; } return this.currentPageValue; }, set: function (value) { var newPage = this.getPageByObject(value); if (!!value && !newPage) return; var vPages = this.visiblePages; if (newPage != null && vPages.indexOf(newPage) < 0) return; if (newPage == this.currentPageValue) return; var oldValue = this.currentPageValue; if (!this.currentPageChanging(newPage, oldValue)) return; if (!!newPage) { newPage.onFirstRendering(); } this.currentPageValue = newPage; if (!!newPage) { newPage.updateCustomWidgets(); newPage.setWasShown(true); } this.locStrsChanged(); this.currentPageChanged(newPage, oldValue); }, enumerable: true, configurable: true }); SurveyModel.prototype.getPageByObject = function (value) { if (!value) return null; if (value.getType && value.getType() == "page") return value; if (typeof value === "string" || value instanceof String) return this.getPageByName(String(value)); if (!isNaN(value)) { var index = Number(value); var vPages = this.visiblePages; if (value < 0 || value >= vPages.length) return null; return vPages[index]; } return value; }; Object.defineProperty(SurveyModel.prototype, "currentPageNo", { /** * The index of the current page in the visible pages array. It starts from 0. */ get: function () { return this.visiblePages.indexOf(this.currentPage); }, set: function (value) { var vPages = this.visiblePages; if (value < 0 || value >= vPages.length) return; this.currentPage = vPages[value]; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "questionsOrder", { /** * Use this property to randomize questions. Set it to 'random' to randomize questions, 'initial' to keep them in the same order. You can randomize questions on a specific page. * @see SurveyPage.questionsOrder */ get: function () { return this.getPropertyValue("questionsOrder", "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; if (this.progressBarType === "questions") { var questions = this.getAllQuestions(); var answeredQuestionsCount = questions.reduce(function (a, b) { return a + (b.isEmpty() ? 0 : 1); }, 0); return Math.ceil(answeredQuestionsCount * 100 / questions.length); } if (this.progressBarType === "correctQuestions") { var questions = this.getAllQuestions(); var correctAnswersCount = this.getCorrectedAnswerCount(); return Math.ceil(correctAnswersCount * 100 / questions.length); } var index = this.visiblePages.indexOf(this.currentPage) + 1; return Math.ceil(index * 100 / this.visiblePageCount); }; Object.defineProperty(SurveyModel.prototype, "isNavigationButtonsShowing", { /** * Returns true if navigation buttons: 'Prev', 'Next' or 'Complete' are shown. */ get: function () { if (this.isDesignMode) return "none"; var page = this.currentPage; if (!page) return "none"; if (page.navigationButtonsVisibility === "show") { return "bottom"; } if (page.navigationButtonsVisibility === "hide") { return "none"; } return this.showNavigationButtons; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isEditMode", { /** * Returns true if the survey in the edit mode. * @see mode */ get: function () { return this.mode == "edit"; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "isDisplayMode", { /** * Returns true if the survey in the display mode. * @see mode */ get: function () { return this.mode == "display"; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "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 () { return this.checkIsCurrentPageHasErrors(); }, enumerable: true, configurable: true }); SurveyModel.prototype.checkIsCurrentPageHasErrors = function (isFocuseOnFirstError) { if (isFocuseOnFirstError === void 0) { isFocuseOnFirstError = undefined; } if (isFocuseOnFirstError === undefined) { isFocuseOnFirstError = this.focusOnFirstError; } if (this.currentPage == null) return true; var res = this.currentPage.hasErrors(true, isFocuseOnFirstError); this.fireValidatedErrorsOnCurrentPage(); return res; }; SurveyModel.prototype.fireValidatedErrorsOnCurrentPage = function () { if (this.onValidatedErrorsOnCurrentPage.isEmpty) return; var questionsOnPage = this.currentPage.questions; var questions = new Array(); var errors = new Array(); for (var i = 0; i < questionsOnPage.length; i++) { var q = questionsOnPage[i]; if (q.errors.length > 0) { questions.push(q); for (var j = 0; j < q.errors.length; j++) { errors.push(q.errors[j]); } } } this.onValidatedErrorsOnCurrentPage.fire(this, { questions: questions, errors: errors }); }; /** * Call it to go to the previous page. It returns false if the current page is the first page already. It doesn't perform any checks, required questions can be empty. * @see isFirstPage */ SurveyModel.prototype.prevPage = function () { if (this.isFirstPage) return false; var vPages = this.visiblePages; var index = vPages.indexOf(this.currentPage); this.currentPage = vPages[index - 1]; }; /** * Call it to complete the survey, if the current page is the last one. It returns false if there is an error on the page. If there is no errors on the page, it calls doComplete and returns true. * @see isCurrentPageHasErrors * @see nextPage * @see doComplete */ SurveyModel.prototype.completeLastPage = function () { 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(); singlePage.setSurveyImpl(this); 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__["a" /* Serializer */].createClass("panel"); single.addPanel(panel); var json = new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */]().toJsonObject(page); new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* JsonObject */]().toObject(json, panel); } 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.isCompleted) { if (this.sendResultOnPageNext) { this.sendResult(this.surveyPostId, this.clientId, true); } var vPages = this.visiblePages; var index = vPages.indexOf(this.currentPage); this.currentPage = vPages[index + 1]; } else { this.doComplete(); } }; SurveyModel.prototype.setCompleted = function () { this.isCompleted = true; }; Object.defineProperty(SurveyModel.prototype, "processedCompletedHtml", { /** * Returns the html for completed 'Thank you' page. * @see completedHtml */ get: function () { var html = this.renderedCompletedHtml; if (html) { return this.processHtml(html); } return "<h3>" + this.getLocString("completingSurvey") + "</h3>"; }, 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 "<h3>" + this.getLocString("completingSurveyBefore") + "</h3>"; }, 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 "<h3>" + this.getLocString("loadingSurvey") + "</h3>"; }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "progressText", { /** * Returns the text for the current progress. */ get: function () { if (this.currentPage == null) return ""; if (this.progressBarType === "questions") { var questions = this.getAllQuestions(); var answeredQuestionsCount = questions.reduce(function (a, b) { return a + (b.isEmpty() ? 0 : 1); }, 0); return this.getLocString("questionsProgressText")["format"](answeredQuestionsCount, questions.length); } if (this.progressBarType === "correctQuestions") { var questions = this.getAllQuestions(); var correctAnswersCount = this.getCorrectedAnswerCount(); return this.getLocString("questionsProgressText")["format"](correctAnswersCount, questions.length); } var vPages = this.visiblePages; var index = vPages.indexOf(this.currentPage) + 1; return this.getLocString("progressText")["format"](index, vPages.length); }, enumerable: true, configurable: true }); SurveyModel.prototype.afterRenderSurvey = function (htmlElement) { this.onAfterRenderSurvey.fire(this, { survey: this, htmlElement: htmlElement }); }; SurveyModel.prototype.updateQuestionCssClasses = function (question, cssClasses) { this.onUpdateQuestionCssClasses.fire(this, { question: question, cssClasses: cssClasses }); }; SurveyModel.prototype.updatePanelCssClasses = function (panel, cssClasses) { this.onUpdatePanelCssClasses.fire(this, { panel: panel, cssClasses: cssClasses }); }; SurveyModel.prototype.afterRenderPage = function (htmlElement) { if (this.onAfterRenderPage.isEmpty) return; this.onAfterRenderPage.fire(this, { page: this.currentPage, htmlElement: htmlElement }); }; SurveyModel.prototype.afterRenderQuestion = function (question, htmlElement) { this.onAfterRenderQuestion.fire(this, { question: question, htmlElement: htmlElement }); }; SurveyModel.prototype.afterRenderPanel = function (panel, htmlElement) { this.onAfterRenderPanel.fire(this, { panel: panel, htmlElement: htmlElement }); }; SurveyModel.prototype.matrixBeforeRowAdded = function (options) { this.onMatrixBeforeRowAdded.fire(this, options); }; SurveyModel.prototype.matrixRowAdded = function (question) { this.onMatrixRowAdded.fire(this, { question: question }); }; SurveyModel.prototype.getQuestionByValueNameFromArray = function (valueName, name, index) { var questions = this.getQuestionsByValueNameCore(valueName); if (!questions) return; for (var i = 0; i < questions.length; i++) { var res = questions[i].getQuestionFromArray(name, index); if (!!res) return res; } return null; }; SurveyModel.prototype.matrixRowRemoved = function (question, rowIndex, row) { this.onMatrixRowRemoved.fire(this, { question: question, rowIndex: rowIndex, row: row }); }; SurveyModel.prototype.matrixCellCreated = function (question, options) { options.question = question; this.onMatrixCellCreated.fire(this, options); }; SurveyModel.prototype.matrixAfterCellRender = function (question, options) { options.question = question; this.onMatrixAfterCellRender.fire(this, options); }; SurveyModel.prototype.matrixCellValueChanged = function (question, options) { options.question = question; this.onMatrixCellValueChanged.fire(this, options); }; SurveyModel.prototype.matrixCellValueChanging = function (question, options) { options.question = question; this.onMatrixCellValueChanging.fire(this, options); }; SurveyModel.prototype.matrixCellValidate = function (question, options) { options.question = question; this.onMatrixCellValidate.fire(this, options); return options.error ? new __WEBPACK_IMPORTED_MODULE_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 && !__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(q.correctAnswer)) { 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) { if (this.onValueChanging.isEmpty) return newValue; var options = { name: valueName, question: this.getQuestionByValueName(valueName), value: newValue, oldValue: this.getValue(valueName) }; this.onValueChanging.fire(this, options); return options.value; }; SurveyModel.prototype.updateQuestionValue = function (valueName, newValue) { if (this.isLoadingFromJson) return; var questions = this.getQuestionsByValueNameCore(valueName); if (!!questions) { for (var i = 0; i < questions.length; i++) { if (this.isTwoValueEquals(questions[i].value, newValue)) continue; questions[i].updateValueFromSurvey(newValue); } } }; SurveyModel.prototype.notifyQuestionOnValueChanged = function (valueName, newValue) { if (this.isLoadingFromJson) return; var questions = this.getQuestionsByValueNameCore(valueName); if (!!questions) { for (var i = 0; i < questions.length; i++) { var question = questions[i]; if (this.checkErrorsMode == "onValueChanged") { var oldErrorCount = question.errors.length; question.hasErrors(true); if (oldErrorCount > 0 || question.errors.length > 0) { this.fireValidatedErrorsOnCurrentPage(); } } question.onSurveyValueChanged(newValue); this.onValueChanged.fire(this, { name: valueName, question: question, value: newValue }); } } else { this.onValueChanged.fire(this, { name: valueName, question: null, value: newValue }); } this.notifyElementsOnAnyValueOrVariableChanged(valueName); }; SurveyModel.prototype.notifyElementsOnAnyValueOrVariableChanged = function (name) { if (this.isEndLoadingFromJson === "processing") return; for (var i = 0; i < this.pages.length; i++) { this.pages[i].onAnyValueChanged(name); } if (!this.isEndLoadingFromJson) { this.locStrsChanged(); } }; SurveyModel.prototype.updateAllQuestionsValue = function () { var questions = this.getAllQuestions(); for (var i = 0; i < questions.length; i++) { var q = questions[i]; q.updateValueFromSurvey(this.getValue(q.getValueName())); q.updateCommentFromSurvey(this.getComment(q.getValueName())); } }; SurveyModel.prototype.notifyAllQuestionsOnValueChanged = function () { var questions = this.getAllQuestions(); for (var i = 0; i < questions.length; i++) { questions[i].onSurveyValueChanged(this.getValue(questions[i].getValueName())); } }; SurveyModel.prototype.checkOnPageTriggers = function () { var questions = this.getCurrentPageQuestions(); var values = {}; for (var i = 0; i < questions.length; i++) { var question = questions[i]; var name = question.getValueName(); values[name] = this.getValue(name); } this.checkTriggers(values, true); }; SurveyModel.prototype.getCurrentPageQuestions = function () { var result = []; var page = this.currentPage; if (!page) return result; for (var i = 0; i < page.questions.length; i++) { var question = page.questions[i]; if (!question.visible || !question.name) continue; result.push(question); } return result; }; SurveyModel.prototype.checkTriggers = function (key, isOnNextPage) { if (this.isCompleted || this.triggers.length == 0) return; var values = this.getFilteredValues(); var properties = this.getFilteredProperties(); for (var i = 0; i < this.triggers.length; i++) { var trigger = this.triggers[i]; if (trigger.isOnNextPage == isOnNextPage) { trigger.checkExpression(key, values, properties); } } }; SurveyModel.prototype.doElementsOnLoad = function () { for (var i = 0; i < this.pages.length; i++) { this.pages[i].onSurveyLoad(); } }; SurveyModel.prototype.runConditions = function () { if (this.isCompleted || this.isEndLoadingFromJson === "processing") return; var pages = this.pages; var values = this.getFilteredValues(); var properties = this.getFilteredProperties(); for (var i = 0; i < pages.length; i++) { pages[i].runCondition(values, properties); } }; /** * Send the survey result into [dxsurvey.com](http://www.dxsurvey.com) service. * @param postId [dxsurvey.com](http://www.dxsurvey.com) service postId * @param clientId Typically a customer e-mail or an identificator * @param isPartialCompleted Set it to true if the survey is not completed yet and it is an intermediate results * @see surveyPostId * @see clientId */ SurveyModel.prototype.sendResult = function (postId, clientId, isPartialCompleted) { if (postId === void 0) { postId = null; } if (clientId === void 0) { clientId = null; } if (isPartialCompleted === void 0) { isPartialCompleted = false; } if (!this.isEditMode) return; if (isPartialCompleted && this.onPartialSend) { this.onPartialSend.fire(this, null); } if (!postId && this.surveyPostId) { postId = this.surveyPostId; } if (!postId) return; if (clientId) { this.clientId = clientId; } if (isPartialCompleted && !this.clientId) return; var self = this; if (this.surveyShowDataSaving) { this.setCompletedState("saving", ""); } this.createSurveyService().sendResult(postId, this.data, function (success, response, request) { if (self.surveyShowDataSaving) { if (success) { self.setCompletedState("success", ""); } else { self.setCompletedState("error", ""); } } self.onSendResult.fire(self, { success: success, response: response, request: request }); }, this.clientId, isPartialCompleted); }; /** * It calls the [dxsurvey.com](http://www.dxsurvey.com) service and on callback fires onGetResult event with all answers that your users made for a question. * @param resultId [dxsurvey.com](http://www.dxsurvey.com) service resultId * @param name The question name * @see onGetResult */ SurveyModel.prototype.getResult = function (resultId, name) { var self = this; this.createSurveyService().getResult(resultId, name, function (success, data, dataList, response) { self.onGetResult.fire(self, { success: success, data: data, dataList: dataList, response: response }); }); }; /** * Loads the survey Json from the [dxsurvey.com](http://www.dxsurvey.com) service. If clientId is not null and user has already completed the survey, the survey will go into "completedbefore" state. * @param surveyId [dxsurvey.com](http://www.dxsurvey.com) service surveyId * @param clientId indentificator for a user, for example e-mail or unique customer id in your web application. * @see state */ SurveyModel.prototype.loadSurveyFromService = function (surveyId, cliendId) { if (surveyId === void 0) { surveyId = null; } if (cliendId === void 0) { cliendId = null; } if (surveyId) { this.surveyId = surveyId; } if (cliendId) { this.clientId = cliendId; } var self = this; this.isLoading = true; this.onLoadingSurveyFromService(); if (cliendId) { this.createSurveyService().getSurveyJsonAndIsCompleted(this.surveyId, this.clientId, function (success, json, isCompleted, response) { self.isLoading = false; if (success) { self.isCompletedBefore = isCompleted == "completed"; self.loadSurveyFromServiceJson(json); } }); } else { this.createSurveyService().loadSurvey(this.surveyId, function (success, result, response) { self.isLoading = false; if (success) { self.loadSurveyFromServiceJson(result); } }); } }; SurveyModel.prototype.loadSurveyFromServiceJson = function (json) { if (!json) return; this.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, this.data); var variable = this.getVariable(name); if (variable !== undefined) { textValue.isExists = true; textValue.value = variable; return; } if (!!firstName) firstName = firstName.toLowerCase(); var question = this.getQuestionByValueName(firstName, true); if (question) { textValue.isExists = true; name = question.getValueName() + name.substr(firstName.length); name = name.toLocaleLowerCase(); var values = {}; values[firstName] = textValue.returnDisplayValue ? question.getDisplayValue(false) : 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, newQuestionValue) { var newValue = this.questionOnValueChanging(name, newQuestionValue); if (this.isValueEqual(name, newValue) && this.isTwoValueEquals(newValue, newQuestionValue)) return; if (this.isValueEmpty(newValue)) { this.deleteDataValueCore(this.valuesHash, name); } else { newValue = this.getUnbindValue(newValue); this.setDataValueCore(this.valuesHash, name, newValue); } this.updateQuestionValue(name, newValue); 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 (oldValue === "" || oldValue === undefined) oldValue = null; if (newValue === null || oldValue === null) return newValue === oldValue; return this.isTwoValueEquals(newValue, oldValue); }; SurveyModel.prototype.doOnPageAdded = function (page) { page.setSurveyImpl(this); if (!page.name) page.name = this.generateNewName(this.pages, "page"); this.questionHashesPanelAdded(page); var options = { page: page }; this.onPageAdded.fire(this, options); }; SurveyModel.prototype.generateNewName = function (elements, baseName) { var keys = {}; for (var i = 0; i < elements.length; i++) keys[elements[i]["name"]] = true; var index = 1; while (keys[baseName + index]) index++; return baseName + index; }; SurveyModel.prototype.tryGoNextPageAutomatic = function (name) { if (!!this.isEndLoadingFromJson || !this.goNextPageAutomatic || !this.currentPage) return; var question = this.getQuestionByValueName(name); if (!question || (!!question && (!question.visible || !question.supportGoNextPageAutomatic()))) return; var questions = this.getCurrentPageQuestions(); if (questions.indexOf(question) < 0) return; for (var i = 0; i < questions.length; i++) { if (questions[i].hasInput && questions[i].isEmpty()) return; } if (!this.checkIsCurrentPageHasErrors(false)) { if (!this.isLastPage) { this.nextPage(); } else { if (this.goNextPageAutomatic === true) { this.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); } var questions = this.getQuestionsByValueNameCore(name); if (!!questions) { for (var i = 0; i < questions.length; i++) { questions[i].updateCommentFromSurvey(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); var loc = new __WEBPACK_IMPORTED_MODULE_10__localizablestring__["a" /* LocalizableString */](this, true); loc.text = options.text; return loc.textOrHtml; }, enumerable: true, configurable: true }); SurveyModel.prototype.getTimerInfoText = function () { var page = this.currentPage; if (!page) return ""; var pageSpent = this.getDisplayTime(page.timeSpent); var surveySpent = this.getDisplayTime(this.timeSpent); var pageLimitSec = this.getPageMaxTimeToFinish(page); var pageLimit = this.getDisplayTime(pageLimitSec); var surveyLimit = this.getDisplayTime(this.maxTimeToFinish); if (this.showTimerPanelMode == "page") return this.getTimerInfoPageText(page, pageSpent, pageLimit); if (this.showTimerPanelMode == "survey") return this.getTimerInfoSurveyText(surveySpent, surveyLimit); if (this.showTimerPanelMode == "all") { if (pageLimitSec <= 0 && this.maxTimeToFinish <= 0) { return this.getLocString("timerSpentAll")["format"](pageSpent, surveySpent); } if (pageLimitSec > 0 && this.maxTimeToFinish > 0) { return this.getLocString("timerLimitAll")["format"](pageSpent, pageLimit, surveySpent, surveyLimit); } var pageText = this.getTimerInfoPageText(page, pageSpent, pageLimit); var surveyText = this.getTimerInfoSurveyText(surveySpent, surveyLimit); return pageText + " " + surveyText; } return ""; }; SurveyModel.prototype.getTimerInfoPageText = function (page, pageSpent, pageLimit) { return this.getPageMaxTimeToFinish(page) > 0 ? this.getLocString("timerLimitPage")["format"](pageSpent, pageLimit) : this.getLocString("timerSpentPage")["format"](pageSpent, pageLimit); }; SurveyModel.prototype.getTimerInfoSurveyText = function (surveySpent, surveyLimit) { return this.maxTimeToFinish > 0 ? this.getLocString("timerLimitSurvey")["format"](surveySpent, surveyLimit) : this.getLocString("timerSpentSurvey")["format"](surveySpent, surveyLimit); }; SurveyModel.prototype.getDisplayTime = function (val) { var min = Math.floor(val / 60); var sec = val % 60; var res = ""; if (min > 0) { res += min + " " + this.getLocString("timerMin"); } if (res && sec == 0) return res; if (res) res += " "; return res + sec + " " + this.getLocString("timerSec"); }; /** * Call this method to start timer that will calculate how much time end-user spends on the survey or on pages * @see stopTimer * @see timeSpent */ SurveyModel.prototype.startTimer = function () { if (this.isTimerStarted || this.isDesignMode) return; var self = this; this.timerFunc = function () { self.doTimer(); }; this.isTimerStarted = true; __WEBPACK_IMPORTED_MODULE_12__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_12__surveytimer__["a" /* SurveyTimer */].instance.stop(this.timerFunc); }; Object.defineProperty(SurveyModel.prototype, "maxTimeToFinish", { /** * The maximum time in seconds that end-user has to complete the survey. If the value is 0 or less, the end-user has unlimited number of time to finish the survey. * @see startTimer * @see maxTimeToFinishPage */ get: function () { return this.getPropertyValue("maxTimeToFinish", 0); }, set: function (val) { this.setPropertyValue("maxTimeToFinish", val); }, enumerable: true, configurable: true }); Object.defineProperty(SurveyModel.prototype, "maxTimeToFinishPage", { /** * The maximum time in seconds that end-user has to complete a page in the survey. If the value is 0 or less, the end-user has unlimited time. You may override this value for every page. * @see startTimer * @see maxTimeToFinish * @see PageModel.maxTimeToFinish */ get: function () { return this.getPropertyValue("maxTimeToFinishPage", 0); }, set: function (val) { this.setPropertyValue("maxTimeToFinishPage", val); }, enumerable: true, configurable: true }); SurveyModel.prototype.getPageMaxTimeToFinish = function (page) { if (!page || page.maxTimeToFinish < 0) return 0; return page.maxTimeToFinish > 0 ? page.maxTimeToFinish : this.maxTimeToFinishPage; }; SurveyModel.prototype.doTimer = function () { var page = this.currentPage; if (page) { page.timeSpent = page.timeSpent + 1; } this.timeSpent = this.timeSpent + 1; this.onTimer.fire(this, {}); if (this.maxTimeToFinish > 0 && this.maxTimeToFinish == this.timeSpent) { this.completeLastPage(); } if (page) { var pageLimit = this.getPageMaxTimeToFinish(page); if (pageLimit > 0 && pageLimit == page.timeSpent) { if (this.isLastPage) { this.completeLastPage(); } else { this.nextPage(); } } } }; //ISurveyImplementor SurveyModel.prototype.geSurveyData = function () { return this; }; SurveyModel.prototype.getSurvey = function () { return this; }; SurveyModel.prototype.getTextProcessor = function () { return this; }; //ISurveyTriggerOwner SurveyModel.prototype.getObjects = function (pages, questions) { var result = []; Array.prototype.push.apply(result, this.getPagesByNames(pages)); Array.prototype.push.apply(result, this.getQuestionsByNames(questions)); return result; }; SurveyModel.prototype.setTriggerValue = function (name, value, isVariable) { if (!name) return; if (isVariable) { this.setVariable(name, value); } else { var processor = new __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__["a" /* ProcessValue */](); var firstName = processor.getFirstName(name); if (firstName == name) { this.setValue(name, value); } else { if (!this.getValue(firstName)) return; var data = this.getUnbindValue(this.getFilteredValues()); processor.setValue(data, name, value); this.setValue(firstName, data[firstName]); } } }; SurveyModel.prototype.copyTriggerValue = function (name, fromName) { if (!name || !fromName) return; var processor = new __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__["a" /* ProcessValue */](); var value = processor.getValue(fromName, this.getFilteredValues()); this.setTriggerValue(name, value, false); }; SurveyModel.stylesManager = null; SurveyModel.platform = "unknown"; return SurveyModel; }(__WEBPACK_IMPORTED_MODULE_3__base__["b" /* Base */])); __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].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", serializationProperty: "locTitle" }, { name: "description:text", serializationProperty: "locDescription" }, { name: "focusFirstQuestionAutomatic:boolean", default: true }, { name: "focusOnFirstError:boolean", default: true }, { name: "completedHtml:html", serializationProperty: "locCompletedHtml" }, { name: "completedBeforeHtml:html", serializationProperty: "locCompletedBeforeHtml" }, { name: "completedHtmlOnCondition:htmlconditions", className: "htmlconditionitem" }, { name: "loadingHtml:html", serializationProperty: "locLoadingHtml" }, { name: "pages", className: "page", visible: false }, { name: "questions", alternativeName: "elements", baseClassName: "question", visible: false, isLightSerializable: false, onGetValue: function (obj) { return null; }, onSetValue: function (obj, value, jsonConverter) { var page = obj.addNewPage(""); jsonConverter.toObject({ questions: value }, page); } }, { name: "triggers:triggers", baseClassName: "surveytrigger", classNamePart: "trigger" }, { name: "surveyId", visible: false }, { name: "surveyPostId", visible: false }, { name: "surveyShowDataSaving:boolean", visible: false }, "cookieName", "sendResultOnPageNext:boolean", { name: "showNavigationButtons", default: "bottom", choices: ["none", "top", "bottom", "both"] }, { name: "showPrevButton:boolean", default: true }, { name: "showTitle:boolean", default: true }, { name: "showPageTitles:boolean", default: true }, { name: "showCompletedPage:boolean", default: true }, { 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: "progressBarType", default: "pages", choices: ["pages", "questions", "correctQuestions"] }, { 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"] } ]); /***/ }), /* 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_knockout__ = __webpack_require__(6); /* 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__(27); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__panel__ = __webpack_require__(19); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__base__ = __webpack_require__(5); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__questionfactory__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__kobase__ = __webpack_require__(18); /* 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 __WEBPACK_IMPORTED_MODULE_7__kobase__["a" /* ImplementorBase */](_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__["a" /* Serializer */].overrideClassCreator("panel", function () { return new Panel(); }); __WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].overrideClassCreator("page", function () { return new Page(); }); __WEBPACK_IMPORTED_MODULE_6__questionfactory__["b" /* ElementFactory */].Instance.registerElement("panel", function (name) { return new Panel(name); }); /***/ }), /* 25 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__functionsfactory__ = __webpack_require__(26); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return Operand; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return BinaryOperand; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return UnaryOperand; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return ArrayOperand; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return Const; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return Variable; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return FunctionOperand; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return OperandMaker; }); var Operand = /** @class */ (function () { function Operand() { } Operand.prototype.hasFunction = function () { return false; }; return Operand; }()); var BinaryOperand = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](BinaryOperand, _super); function BinaryOperand(operatorName, left, right, isArithmeticOp) { if (left === void 0) { left = null; } if (right === void 0) { right = null; } if (isArithmeticOp === void 0) { isArithmeticOp = false; } var _this = _super.call(this) || this; _this.operatorName = operatorName; _this.left = left; _this.right = right; if (isArithmeticOp) { _this.consumer = OperandMaker.binaryFunctions["arithmeticOp"](operatorName); } else { _this.consumer = OperandMaker.binaryFunctions[operatorName]; } if (_this.consumer == null) { OperandMaker.throwInvalidOperatorError(operatorName); } return _this; } BinaryOperand.prototype.evaluateParam = function (x, processValue) { return x == null ? null : x.evaluate(processValue); }; BinaryOperand.prototype.evaluate = function (processValue) { return this.consumer.call(this, this.evaluateParam(this.left, processValue), this.evaluateParam(this.right, processValue)); }; BinaryOperand.prototype.toString = function () { return ("(" + OperandMaker.safeToString(this.left) + " " + OperandMaker.operatorToString(this.operatorName) + " " + OperandMaker.safeToString(this.right) + ")"); }; BinaryOperand.prototype.setVariables = function (variables) { if (this.left != null) this.left.setVariables(variables); if (this.right != null) this.right.setVariables(variables); }; BinaryOperand.prototype.hasFunction = function () { return ((!!this.left && this.left.hasFunction()) || (!!this.right && this.right.hasFunction())); }; return BinaryOperand; }(Operand)); var UnaryOperand = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](UnaryOperand, _super); function UnaryOperand(expression, operatorName) { var _this = _super.call(this) || this; _this.expression = expression; _this.operatorName = operatorName; _this.consumer = OperandMaker.unaryFunctions[operatorName]; if (_this.consumer == null) { OperandMaker.throwInvalidOperatorError(operatorName); } return _this; } UnaryOperand.prototype.toString = function () { return (OperandMaker.operatorToString(this.operatorName) + this.expression.toString()); }; UnaryOperand.prototype.evaluate = function (processValue) { var value = this.expression.evaluate(processValue); return this.consumer.call(this, value); }; UnaryOperand.prototype.setVariables = function (variables) { this.expression.setVariables(variables); }; return UnaryOperand; }(Operand)); var ArrayOperand = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](ArrayOperand, _super); function ArrayOperand(values) { var _this = _super.call(this) || this; _this.values = values; return _this; } ArrayOperand.prototype.toString = function () { return ("[" + this.values .map(function (el) { return el.toString(); }) .join(", ") + "]"); }; ArrayOperand.prototype.evaluate = function (processValue) { return this.values.map(function (el) { return el.evaluate(processValue); }); }; ArrayOperand.prototype.setVariables = function (variables) { this.values.forEach(function (el) { el.setVariables(variables); }); }; ArrayOperand.prototype.hasFunction = function () { return this.values.some(function (operand) { return operand.hasFunction(); }); }; return ArrayOperand; }(Operand)); var Const = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](Const, _super); function Const(value) { var _this = _super.call(this) || this; _this.value = value; return _this; } Const.prototype.toString = function () { return this.value.toString(); }; Const.prototype.evaluate = function () { return this.getCorrectValue(this.value); }; Const.prototype.setVariables = function (variables) { }; Const.prototype.getCorrectValue = function (value) { if (!value || typeof value != "string") return value; if (this.isBooleanValue(value)) return value === "true"; if (this.isNumericValue(value)) { if (value.indexOf("0x") == 0) return parseInt(value); return parseFloat(value); } return value; }; Const.prototype.isBooleanValue = function (value) { return (value && (value.toLowerCase() === "true" || value.toLowerCase() === "false")); }; Const.prototype.isNumericValue = 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); }; return Const; }(Operand)); var Variable = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](Variable, _super); function Variable(variableName) { var _this = _super.call(this, variableName) || this; _this.variableName = variableName; return _this; } Variable.prototype.toString = function () { return "{" + this.variableName + "}"; }; Variable.prototype.evaluate = function (processValue) { return processValue.hasValue(this.variableName) ? this.getCorrectValue(processValue.getValue(this.variableName)) : null; }; Variable.prototype.setVariables = function (variables) { variables.push(this.variableName); }; return Variable; }(Const)); var FunctionOperand = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](FunctionOperand, _super); function FunctionOperand(origionalValue, parameters) { var _this = _super.call(this) || this; _this.origionalValue = origionalValue; _this.parameters = parameters; if (Array.isArray(parameters) && parameters.length === 0) { _this.parameters = new ArrayOperand([]); } return _this; } FunctionOperand.prototype.evaluate = function (processValue) { return __WEBPACK_IMPORTED_MODULE_2__functionsfactory__["a" /* FunctionFactory */].Instance.run(this.origionalValue, this.parameters.evaluate(processValue), processValue.properties); }; FunctionOperand.prototype.toString = function () { return this.origionalValue + "(" + this.parameters.toString() + ")"; }; FunctionOperand.prototype.setVariables = function (variables) { this.parameters.setVariables(variables); }; FunctionOperand.prototype.hasFunction = function () { return true; }; return FunctionOperand; }(Operand)); var OperandMaker = /** @class */ (function () { function OperandMaker() { } OperandMaker.throwInvalidOperatorError = function (op) { throw new Error("Invalid operator: '" + op + "'"); }; OperandMaker.safeToString = function (operand) { return operand == null ? "" : operand.toString(); }; OperandMaker.toOperandString = function (value) { if (!!value && (!OperandMaker.isNumeric(value) && !OperandMaker.isBooleanValue(value))) value = "'" + value + "'"; return value; }; OperandMaker.isNumeric = function (value) { if (!!value && (value.indexOf("-") > -1 || value.indexOf("+") > 1 || value.indexOf("*") > -1 || value.indexOf("^") > -1 || value.indexOf("/") > -1 || value.indexOf("%") > -1)) return false; var val = Number(value); if (isNaN(val)) return false; return isFinite(val); }; OperandMaker.isBooleanValue = function (value) { return (!!value && (value.toLowerCase() === "true" || value.toLowerCase() === "false")); }; OperandMaker.operatorToString = function (operatorName) { var opStr = OperandMaker.signs[operatorName]; return opStr == null ? operatorName : opStr; }; OperandMaker.unaryFunctions = { empty: function (value) { if (value == null) return true; return !value; }, notempty: function (value) { return !OperandMaker.unaryFunctions.empty(value); }, negate: function (value) { return !value; } }; OperandMaker.binaryFunctions = { arithmeticOp: function (operatorName) { return function (a, b) { if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(a)) a = 0; if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(b)) b = 0; var consumer = OperandMaker.binaryFunctions[operatorName]; return consumer == null ? null : consumer.call(this, a, b); }; }, and: function (a, b) { return a && b; }, or: function (a, b) { return a || b; }, plus: function (a, b) { return a + b; }, minus: function (a, b) { return a - b; }, mul: function (a, b) { return a * b; }, div: function (a, b) { if (!b) return null; return a / b; }, mod: function (a, b) { if (!b) return null; return a % b; }, power: function (a, b) { return Math.pow(a, b); }, greater: function (left, right) { if (left == null || right == null) return false; return left > right; }, less: function (left, right) { if (left == null || right == null) return false; return left < right; }, greaterorequal: function (left, right) { if (left == null || right == null) return false; return left >= right; }, lessorequal: function (left, right) { if (left == null || right == null) return false; return left <= right; }, equal: function (left, right) { return __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isTwoValueEquals(left, right, true); }, notequal: function (left, right) { return !__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isTwoValueEquals(left, right, true); }, contains: function (left, right) { return OperandMaker.binaryFunctions.containsCore(left, right, true); }, notcontains: function (left, right) { if (!left && !__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(right)) return true; return OperandMaker.binaryFunctions.containsCore(left, right, false); }, anyof: function (left, right) { if (!left && __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(right)) return true; if (!left || !Array.isArray(left) || left.length === 0) return false; if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(right)) return true; if (!Array.isArray(right)) return OperandMaker.binaryFunctions.contains(left, right); for (var i = 0; i < right.length; i++) { if (OperandMaker.binaryFunctions.contains(left, right[i])) return true; } return false; }, allof: function (left, right) { if (!left && !__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(right)) return false; if (!Array.isArray(right)) return OperandMaker.binaryFunctions.contains(left, right); for (var i = 0; i < right.length; i++) { if (!OperandMaker.binaryFunctions.contains(left, right[i])) return false; } return true; }, containsCore: function (left, right, isContains) { if (!left) return false; if (!left.length) { left = left.toString(); } if (typeof left === "string" || left instanceof String) { if (!right) return false; right = right.toString(); var found = left.indexOf(right) > -1; return isContains ? found : !found; } var rightArray = Array.isArray(right) ? right : [right]; for (var rIndex = 0; rIndex < rightArray.length; rIndex++) { var i = 0; right = rightArray[rIndex]; for (; i < left.length; i++) { if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isTwoValueEquals(left[i], right)) break; } if (i == left.length) return !isContains; } return isContains; } }; OperandMaker.signs = { less: "<", lessorequal: "<=", greater: ">", greaterorequal: ">=", equal: "==", notequal: "!=", plus: "+", minus: "-", mul: "*", div: "/", and: "&&", or: "||", power: "^", mod: "%", negate: "!" }; return OperandMaker; }()); /***/ }), /* 26 */ /***/ (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.hasFunction = function (name) { return !!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 getInArrayParams(params) { if (params.length != 2) return null; var arr = params[0]; if (!arr) return null; if (!Array.isArray(arr) && !Array.isArray(Object.keys(arr))) return null; var name = params[1]; if (typeof name !== "string" && !(name instanceof String)) return null; return { data: arr, name: name }; } function calcInArray(params, func) { var v = getInArrayParams(params); if (!v) return undefined; var res = undefined; if (Array.isArray(v.data)) { for (var i = 0; i < v.data.length; i++) { var item = v.data[i]; if (!!item && item[v.name]) { res = func(res, item[v.name]); } } } else { for (var key in v.data) { var item = v.data[key]; if (!!item && item[v.name]) { res = func(res, item[v.name]); } } } return res; } function sumInArray(params) { var res = calcInArray(params, function (res, val) { if (res == undefined) res = 0; return res + val; }); return res !== undefined ? res : 0; } FunctionFactory.Instance.register("sumInArray", sumInArray); function minInArray(params) { return calcInArray(params, function (res, val) { if (res == undefined) return val; return res < val ? res : val; }); } FunctionFactory.Instance.register("minInArray", minInArray); function maxInArray(params) { return calcInArray(params, function (res, val) { if (res == undefined) return val; return res > val ? res : val; }); } FunctionFactory.Instance.register("maxInArray", maxInArray); function countInArray(params) { var res = calcInArray(params, function (res, val) { if (res == undefined) res = 0; return res + 1; }); return res !== undefined ? res : 0; } FunctionFactory.Instance.register("countInArray", countInArray); function avgInArray(params) { var count = countInArray(params); if (count == 0) return 0; return sumInArray(params) / count; } FunctionFactory.Instance.register("avgInArray", avgInArray); function iif(params) { if (!params && params.length !== 3) return ""; return params[0] ? params[1] : params[2]; } FunctionFactory.Instance.register("iif", iif); function getDate(params) { if (!params && params.length < 1) return null; if (!params[0]) return null; return new Date(params[0]); } FunctionFactory.Instance.register("getDate", getDate); function age(params) { if (!params && params.length < 1) return null; if (!params[0]) return null; var birthDay = new Date(params[0]); var ageDifMs = Date.now() - birthDay.getTime(); var ageDate = new Date(ageDifMs); // miliseconds from epoch return Math.abs(ageDate.getUTCFullYear() - 1970); } FunctionFactory.Instance.register("age", age); function isContainerReady(params) { if (!params && params.length < 1) return false; if (!params[0] || !this.survey) return false; var name = params[0]; var container = this.survey.getPageByName(name); if (!container) container = this.survey.getPanelByName(name); if (!container) return false; var questions = container.questions; for (var i = 0; i < questions.length; i++) { if (questions[i].hasErrors(false)) return false; } return true; } FunctionFactory.Instance.register("isContainerReady", isContainerReady); function isDisplayMode() { return this.survey && this.survey.isDisplayMode; } FunctionFactory.Instance.register("isDisplayMode", isDisplayMode); function currentDate() { return new Date(); } FunctionFactory.Instance.register("currentDate", currentDate); /***/ }), /* 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__jsonobject__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__base__ = __webpack_require__(5); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__panel__ = __webpack_require__(19); /* 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; /** * Time in seconds end-user spent on this page */ _this.timeSpent = 0; 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); }; // public get timeSpent(): number { // return this.getPropertyValue("timeSpent", 0); // } // public set timeSpent(val: number) { // this.setPropertyValue("timeSpent", val); // } /** * Returns the list of all panels in the page */ PageModel.prototype.getPanels = function (visibleOnly, includingDesignTime) { if (visibleOnly === void 0) { visibleOnly = false; } if (includingDesignTime === void 0) { includingDesignTime = false; } var result = new Array(); this.addPanelsIntoList(result, visibleOnly, includingDesignTime); return result; }; Object.defineProperty(PageModel.prototype, "maxTimeToFinish", { /** * The maximum time in seconds that end-user has to complete the page. If the value is 0 or less, the end-user has unlimited number of time to finish the page. * @see startTimer * @see SurveyModel.maxTimeToFinishPage */ get: function () { return this.getPropertyValue("maxTimeToFinish", 0); }, set: function (val) { this.setPropertyValue("maxTimeToFinish", val); }, enumerable: true, configurable: true }); PageModel.prototype.onNumChanged = function (value) { }; PageModel.prototype.onVisibleChanged = function () { if (this.isRandomizing) return; _super.prototype.onVisibleChanged.call(this); if (this.survey != null) { this.survey.pageVisibilityChanged(this, this.isVisible); } }; PageModel.prototype.dragDropStart = function (src, target, nestedPanelDepth) { if (nestedPanelDepth === void 0) { nestedPanelDepth = -1; } this.dragDropInfo = new __WEBPACK_IMPORTED_MODULE_4__panel__["a" /* DragDropInfo */](src, target, nestedPanelDepth); }; PageModel.prototype.dragDropMoveTo = function (destination, isBottom, isEdge) { if (isBottom === void 0) { isBottom = false; } if (isEdge === void 0) { isEdge = false; } if (!this.dragDropInfo) return false; this.dragDropInfo.destination = destination; this.dragDropInfo.isBottom = isBottom; this.dragDropInfo.isEdge = isEdge; this.correctDragDropInfo(this.dragDropInfo); if (!this.dragDropCanDropTagert()) return false; if (!this.dragDropCanDropSource() || !this.dragDropAllowFromSurvey()) { if (!!this.dragDropInfo.source) { var row = this.dragDropFindRow(this.dragDropInfo.target); this.updateRowsRemoveElementFromRow(this.dragDropInfo.target, row); } return false; } this.dragDropAddTarget(this.dragDropInfo); return true; }; PageModel.prototype.correctDragDropInfo = function (dragDropInfo) { if (!dragDropInfo.destination) return; var panel = dragDropInfo.destination.isPanel ? dragDropInfo.destination : null; if (!panel) return; if (!dragDropInfo.target.isLayoutTypeSupported(panel.getChildrenLayoutType())) { dragDropInfo.isEdge = true; } }; PageModel.prototype.dragDropAllowFromSurvey = function () { var dest = this.dragDropInfo.destination; if (!dest || !this.survey) return true; var insertBefore = null; var insertAfter = null; var parent = dest.isPage || (!this.dragDropInfo.isEdge && dest.isPanel) ? dest : dest.parent; if (!dest.isPage) { var container = dest.parent; if (!!container) { var elements = container.elements; var index = elements.indexOf(dest); if (index > -1) { insertBefore = dest; insertAfter = dest; if (this.dragDropInfo.isBottom) { insertBefore = index < elements.length - 1 ? elements[index + 1] : null; } else { insertAfter = index > 0 ? elements[index - 1] : null; } } } } var options = { target: this.dragDropInfo.target, source: this.dragDropInfo.source, parent: parent, insertAfter: insertAfter, insertBefore: insertBefore }; return this.survey.dragAndDropAllow(options); }; PageModel.prototype.dragDropFinish = function (isCancel) { if (isCancel === void 0) { isCancel = false; } if (!this.dragDropInfo) return; var target = this.dragDropInfo.target; var row = this.dragDropFindRow(target); var targetIndex = this.dragDropGetElementIndex(target, row); this.updateRowsRemoveElementFromRow(target, row); if (!isCancel && !!row) { var src = this.dragDropInfo.source; var isSamePanel = false; if (!!src && !!src.parent) { isSamePanel = row.panel == src.parent; if (isSamePanel) { row.panel.dragDropMoveElement(src, target, targetIndex); targetIndex = -1; } else { src.parent.removeElement(src); } } if (targetIndex > -1) { row.panel.addElement(target, targetIndex); } } this.dragDropInfo = null; return !isCancel ? target : null; }; PageModel.prototype.dragDropGetElementIndex = function (target, row) { if (!row) return -1; var index = row.elements.indexOf(target); if (row.index == 0) return index; var prevRow = row.panel.rows[row.index - 1]; var prevElement = prevRow.elements[prevRow.elements.length - 1]; return index + row.panel.elements.indexOf(prevElement) + 1; }; PageModel.prototype.dragDropCanDropTagert = function () { var destination = this.dragDropInfo.destination; if (!destination || destination.isPage) return true; return this.dragDropCanDropCore(this.dragDropInfo.target, destination); }; PageModel.prototype.dragDropCanDropSource = function () { var source = this.dragDropInfo.source; if (!source) return true; var destination = this.dragDropInfo.destination; if (!this.dragDropCanDropCore(source, destination)) return false; return this.dragDropCanDropNotNext(source, destination, this.dragDropInfo.isEdge, this.dragDropInfo.isBottom); }; PageModel.prototype.dragDropCanDropCore = function (target, destination) { if (!destination) return true; if (this.dragDropIsSameElement(destination, target)) return false; if (target.isPanel) { var pnl = target; if (pnl.containsElement(destination) || !!pnl.getElementByName(destination.name)) return false; } return true; }; PageModel.prototype.dragDropCanDropNotNext = function (source, destination, isEdge, isBottom) { if (!destination || (destination.isPanel && !isEdge)) return true; if (source.parent !== destination.parent) return true; var pnl = source.parent; var srcIndex = pnl.elements.indexOf(source); var destIndex = pnl.elements.indexOf(destination); if (destIndex < srcIndex && !isBottom) destIndex--; if (isBottom) destIndex++; return srcIndex < destIndex ? destIndex - srcIndex > 1 : srcIndex - destIndex > 0; }; PageModel.prototype.dragDropIsSameElement = function (el1, el2) { return el1 == el2 || el1.name == el2.name; }; return PageModel; }(__WEBPACK_IMPORTED_MODULE_4__panel__["b" /* PanelModelBase */])); __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].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"); /***/ }), /* 28 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base__ = __webpack_require__(5); /* 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__["a" /* 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; }()); /***/ }), /* 29 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(20); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(2); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__itemvalue__ = __webpack_require__(12); /* 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); var self = _this; _this.registerFunctionOnPropertiesValueChanged(["choicesMin", "choicesMax", "choicesStep"], function () { self.onVisibleChoicesChanged(); }); return _this; } Object.defineProperty(QuestionDropdownModel.prototype, "showOptionsCaption", { /** * This flag controls whether to show options caption item ('Choose...'). */ get: function () { return this.getPropertyValue("showOptionsCaption", true); }, set: function (val) { this.setPropertyValue("showOptionsCaption", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionDropdownModel.prototype, "optionsCaption", { /** * Use this property to set the options caption different from the default value. The default value is taken from localization strings. */ get: function () { return this.getLocalizableStringText("optionsCaption", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("optionsCaption")); }, set: function (val) { this.setLocalizableStringText("optionsCaption", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionDropdownModel.prototype, "locOptionsCaption", { get: function () { return this.getLocalizableString("optionsCaption"); }, enumerable: true, configurable: true }); QuestionDropdownModel.prototype.getType = function () { return "dropdown"; }; Object.defineProperty(QuestionDropdownModel.prototype, "selectedItem", { get: function () { if (this.isEmpty()) return null; return __WEBPACK_IMPORTED_MODULE_5__itemvalue__["a" /* ItemValue */].getItemByValue(this.visibleChoices, this.value); }, enumerable: true, configurable: true }); QuestionDropdownModel.prototype.supportGoNextPageAutomatic = function () { return true; }; QuestionDropdownModel.prototype.getChoices = function () { var items = _super.prototype.getChoices.call(this); if (this.choicesMax <= this.choicesMin) return items; var res = []; for (var i = 0; i < items.length; i++) { res.push(items[i]); } for (var i = this.choicesMin; i <= this.choicesMax; i += this.choicesStep) { res.push(new __WEBPACK_IMPORTED_MODULE_5__itemvalue__["a" /* ItemValue */](i)); } return res; }; Object.defineProperty(QuestionDropdownModel.prototype, "choicesMin", { /** * Use this and choicesMax property to automatically add choices. For example choicesMin = 1 and choicesMax = 10 will generate ten additional choices from 1 to 10. * @see choicesMax * @see choicesStep */ get: function () { return this.getPropertyValue("choicesMin", 0); }, set: function (val) { this.setPropertyValue("choicesMin", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionDropdownModel.prototype, "choicesMax", { /** * Use this and choicesMax property to automatically add choices. For example choicesMin = 1 and choicesMax = 10 will generate ten additional choices from 1 to 10. * @see choicesMin * @see choicesStep */ get: function () { return this.getPropertyValue("choicesMax", 0); }, set: function (val) { this.setPropertyValue("choicesMax", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionDropdownModel.prototype, "choicesStep", { /** * The default value is 1. It tells the value of the iterator between choicesMin and choicesMax properties. * If choicesMin = 10, choicesMax = 30 and choicesStep = 10 then you will have only three additional choices: [10, 20, 30]. * @see choicesMin * @see choicesMax */ get: function () { return this.getPropertyValue("choicesStep", 1); }, set: function (val) { if (val < 1) val = 1; this.setPropertyValue("choicesStep", val); }, enumerable: true, configurable: true }); return QuestionDropdownModel; }(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["b" /* QuestionSelectBase */])); __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("dropdown", [ { name: "optionsCaption", serializationProperty: "locOptionsCaption" }, { name: "showOptionsCaption:boolean", default: true }, { name: "choicesMin:number", default: 0 }, { name: "choicesMax:number", default: 0 }, { name: "choicesStep:number", default: 1 } ], 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; }); /***/ }), /* 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__helpers__ = __webpack_require__(4); /* 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 import */ var __WEBPACK_IMPORTED_MODULE_5__conditions__ = __webpack_require__(10); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionExpressionModel; }); /* harmony export (immutable) */ __webpack_exports__["b"] = getCurrecyCodes; /** * A Model for expression question. It is a read-only question. It calculates value based on epxression property. */ var QuestionExpressionModel = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionExpressionModel, _super); function QuestionExpressionModel(name) { var _this = _super.call(this, name) || this; _this.name = name; _this.createLocalizableString("format", _this); var self = _this; _this.registerFunctionOnPropertyValueChanged("expression", function () { if (self.expressionRunner) { self.expressionRunner = new __WEBPACK_IMPORTED_MODULE_5__conditions__["a" /* ExpressionRunner */](self.expression); } }); return _this; } QuestionExpressionModel.prototype.getType = function () { return "expression"; }; Object.defineProperty(QuestionExpressionModel.prototype, "format", { /** * Use this property to display the value in your own format. Make sure you have "{0}" substring in your string, to display the actual value. */ get: function () { return this.getLocalizableStringText("format", ""); }, set: function (val) { this.setLocalizableStringText("format", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionExpressionModel.prototype, "locFormat", { get: function () { return this.getLocalizableString("format"); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionExpressionModel.prototype, "expression", { /** * The Expression that used to calculate the question value. You may use standard operators like +, -, * and /, squares (). Here is the example of accessing the question value {questionname}. * <br/>Example: "({quantity} * {price}) * (100 - {discount}) / 100" */ get: function () { return this.getPropertyValue("expression", ""); }, set: function (val) { this.setPropertyValue("expression", val); }, enumerable: true, configurable: true }); QuestionExpressionModel.prototype.locCalculation = function () { this.expressionIsRunning = true; }; QuestionExpressionModel.prototype.unlocCalculation = function () { this.expressionIsRunning = false; }; QuestionExpressionModel.prototype.runCondition = function (values, properties) { _super.prototype.runCondition.call(this, values, properties); if (!this.expression || this.expressionIsRunning) return; this.locCalculation(); if (!this.expressionRunner) this.expressionRunner = new __WEBPACK_IMPORTED_MODULE_5__conditions__["a" /* ExpressionRunner */](this.expression); var newValue = this.expressionRunner.run(values, properties); if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isTwoValueEquals(newValue, this.value)) { this.value = newValue; } this.unlocCalculation(); }; Object.defineProperty(QuestionExpressionModel.prototype, "maximumFractionDigits", { /** * The maximum number of fraction digits to use if displayStyle is not "none". Possible values are from 0 to 20. The default value is -1 and it means that this property is not used. */ get: function () { return this.getPropertyValue("maximumFractionDigits", -1); }, set: function (val) { if (val < -1 || val > 20) return; this.setPropertyValue("maximumFractionDigits", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionExpressionModel.prototype, "minimumFractionDigits", { /** * The minimum number of fraction digits to use if displayStyle is not "none". Possible values are from 0 to 20. The default value is -1 and it means that this property is not used. */ get: function () { return this.getPropertyValue("minimumFractionDigits", -1); }, set: function (val) { if (val < -1 || val > 20) return; this.setPropertyValue("minimumFractionDigits", val); }, enumerable: true, configurable: true }); QuestionExpressionModel.prototype.getDisplayValueCore = function (keysAsText) { 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_2__question__["a" /* Question */])); function getCurrecyCodes() { return [ "AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN", "BAM", "BBD", "BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BOV", "BRL", "BSD", "BTN", "BWP", "BYN", "BZD", "CAD", "CDF", "CHE", "CHF", "CHW", "CLF", "CLP", "CNY", "COP", "COU", "CRC", "CUC", "CUP", "CVE", "CZK", "DJF", "DKK", "DOP", "DZD", "EGP", "ERN", "ETB", "EUR", "FJD", "FKP", "GBP", "GEL", "GHS", "GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL", "HRK", "HTG", "HUF", "IDR", "ILS", "INR", "IQD", "IRR", "ISK", "JMD", "JOD", "JPY", "KES", "KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD", "LSL", "LYD", "MAD", "MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRO", "MUR", "MVR", "MWK", "MXN", "MXV", "MYR", "MZN", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "OMR", "PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", "QAR", "RON", "RSD", "RUB", "RWF", "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLL", "SOS", "SRD", "SSP", "STD", "SVC", "SYP", "SZL", "THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD", "TWD", "TZS", "UAH", "UGX", "USD", "USN", "UYI", "UYU", "UZS", "VEF", "VND", "VUV", "WST", "XAF", "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XCD", "XDR", "XOF", "XPD", "XPF", "XPT", "XSU", "XTS", "XUA", "XXX", "YER", "ZAR", "ZAR", "ZMW", "ZWL" ]; } __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].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_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("expression", function (name) { return new QuestionExpressionModel(name); }); /***/ }), /* 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__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__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__validator__ = __webpack_require__(32); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionTextModel; }); /** * A Model for an input text question. */ var QuestionTextModel = /** @class */ (function (_super) { __WEBPACK_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 }); QuestionTextModel.prototype.isLayoutTypeSupported = function (layoutType) { return true; }; Object.defineProperty(QuestionTextModel.prototype, "maxLength", { /** * The maximim text length. If it is -1, defaul value, then the survey maxTextLength property will be used. * If it is 0, then the value is unlimited * @see SurveyModel.maxTextLength */ get: function () { return this.getPropertyValue("maxLength", -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__["a" /* Serializer */].addClass("text", [ { name: "inputType", default: "text", choices: [ "color", "date", "datetime", "datetime-local", "email", "month", "number", "password", "range", "tel", "text", "time", "url", "week" ] }, { name: "size:number", default: 25 }, { name: "maxLength:number", default: -1 }, { name: "placeHolder", serializationProperty: "locPlaceHolder" } ], function () { return new QuestionTextModel(""); }, "question"); __WEBPACK_IMPORTED_MODULE_1__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("text", function (name) { return new QuestionTextModel(name); }); /***/ }), /* 32 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(5); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__error__ = __webpack_require__(11); /* 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__(4); /* 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.errorOwner ? this.errorOwner.getLocale() : ""; }; SurveyValidator.prototype.getMarkdownHtml = function (text) { return !!this.errorOwner ? this.errorOwner.getMarkdownHtml(text) : null; }; SurveyValidator.prototype.getProcessedText = function (text) { return !!this.errorOwner ? this.errorOwner.getProcessedText(text) : text; }; SurveyValidator.prototype.createCustomError = function (name) { return new __WEBPACK_IMPORTED_MODULE_2__error__["a" /* CustomError */](this.getErrorText(name), this.errorOwner); }; SurveyValidator.prototype.toString = function () { var res = this.getType().replace("validator", ""); if (!!this.text) { res += ", " + this.text; } return res; }; return SurveyValidator; }(__WEBPACK_IMPORTED_MODULE_1__base__["b" /* Base */])); var ValidatorRunner = /** @class */ (function () { function ValidatorRunner() { } ValidatorRunner.prototype.run = function (owner) { var 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__["e" /* RequreNumericError */](null, this.errorOwner)); } var result = new ValidatorResult(parseFloat(value)); if (this.minValue !== null && this.minValue > result.value) { result.error = this.createCustomError(name); return result; } if (this.maxValue !== null && this.maxValue < result.value) { result.error = this.createCustomError(name); return result; } return typeof value === "number" ? null : result; }; NumericValidator.prototype.getDefaultErrorText = function (name) { var vName = name ? name : __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("value"); if (this.minValue !== null && this.maxValue !== null) { return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */] .getString("numericMinMax")["format"](vName, this.minValue, this.maxValue); } else { if (this.minValue !== null) { return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */] .getString("numericMin")["format"](vName, this.minValue); } return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */] .getString("numericMax")["format"](vName, this.maxValue); } }; 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__["b" /* 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__["a" /* Serializer */].addClass("surveyvalidator", [ { name: "text", serializationProperty: "locText" } ]); __WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("numericvalidator", ["minValue:number", "maxValue:number"], function () { return new NumericValidator(); }, "surveyvalidator"); __WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("textvalidator", ["minLength:number", "maxLength:number", "allowDigits:boolean"], function () { return new TextValidator(); }, "surveyvalidator"); __WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("answercountvalidator", ["minCount:number", "maxCount:number"], function () { return new AnswerCountValidator(); }, "surveyvalidator"); __WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("regexvalidator", ["regex"], function () { return new RegexValidator(); }, "surveyvalidator"); __WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("emailvalidator", [], function () { return new EmailValidator(); }, "surveyvalidator"); __WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("expressionvalidator", ["expression:condition"], function () { return new ExpressionValidator(); }, "surveyvalidator"); /***/ }), /* 33 */ /***/ (function(module, exports) { // removed by extract-text-webpack-plugin /***/ }), /* 34 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout__ = __webpack_require__(6); /* 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__(5); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_matrixdropdown__ = __webpack_require__(51); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__question_matrixdropdownbase__ = __webpack_require__(21); /* 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__(7); /* 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); __WEBPACK_IMPORTED_MODULE_1_knockout__["utils"].domNodeDisposal.addDisposeCallback(el, function () { cell.question.customWidget.willUnmount(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__["a" /* Serializer */].overrideClassCreator("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; }); /***/ }), /* 35 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question_text__ = __webpack_require__(31); /* 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__(7); /* 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__["a" /* Serializer */].overrideClassCreator("text", function () { return new QuestionText(""); }); __WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("text", function (name) { return new QuestionText(name); }); /***/ }), /* 36 */ /***/ (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__(112); var SurveyTemplateText = /** @class */ (function () { function SurveyTemplateText() { } SurveyTemplateText.prototype.addText = function (newText, id, name) { id = this.getId(id, name); this.text = this.text + '<script type="text/html" ' + id + ">" + newText + "</script>"; }; 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 = "</script>"; 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; }()); /***/ }), /* 37 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(5); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__itemvalue__ = __webpack_require__(12); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__error__ = __webpack_require__(11); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__settings__ = __webpack_require__(9); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ChoicesRestfull; }); var XmlParser = /** @class */ (function () { function XmlParser() { this.parser = new DOMParser(); } XmlParser.prototype.assignValue = function (target, name, value) { if (Array.isArray(target[name])) { target[name].push(value); } else if (target[name] !== undefined) { target[name] = [target[name]].concat(value); } else if (typeof value === "object" && Object.keys(value).length === 1 && Object.keys(value)[0] === name) { target[name] = value[name]; } else { target[name] = value; } }; XmlParser.prototype.xml2Json = function (xmlNode, result) { if (xmlNode.children && xmlNode.children.length > 0) { for (var i = 0; i < xmlNode.children.length; i++) { var childNode = xmlNode.children[i]; var childObject = {}; this.xml2Json(childNode, childObject); this.assignValue(result, childNode.nodeName, childObject); } } else { this.assignValue(result, xmlNode.nodeName, xmlNode.textContent); } }; XmlParser.prototype.parseXmlString = function (xmlString) { var xmlRoot = this.parser.parseFromString(xmlString, "text/xml"); var json = {}; this.xml2Json(xmlRoot, json); return json; }; return XmlParser; }()); /** * A definition for filling choices for checkbox, dropdown and radiogroup questions from resfull services. * The run method call a restfull service and results can be get on getResultCallback. */ var ChoicesRestfull = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](ChoicesRestfull, _super); function ChoicesRestfull() { var _this = _super.call(this) || this; _this.lastObjHash = ""; _this.isRunningValue = false; _this.processedUrl = ""; _this.processedPath = ""; _this.error = null; return _this; } Object.defineProperty(ChoicesRestfull, "EncodeParameters", { get: function () { return __WEBPACK_IMPORTED_MODULE_5__settings__["a" /* settings */].webserviceEncodeParameters; }, set: function (val) { __WEBPACK_IMPORTED_MODULE_5__settings__["a" /* settings */].webserviceEncodeParameters = val; }, enumerable: true, configurable: true }); ChoicesRestfull.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, __WEBPACK_IMPORTED_MODULE_5__settings__["a" /* settings */].webserviceEncodeParameters); var pPath = textProcessor.processTextEx(this.path, false, __WEBPACK_IMPORTED_MODULE_5__settings__["a" /* settings */].webserviceEncodeParameters); if (!pUrl.hasAllValuesOnLastRun || !pPath.hasAllValuesOnLastRun) { this.processedUrl = ""; this.processedPath = ""; } else { this.processedUrl = pUrl.text; this.processedPath = pPath.text; } } else { this.processedUrl = this.url; this.processedPath = this.path; } }; ChoicesRestfull.prototype.parseResponse = function (response) { var parsedResponse; if (!!response && typeof response.indexOf === "function" && response.indexOf("<") === 0) { var parser = new XmlParser(); parsedResponse = parser.parseXmlString(response); } else { try { parsedResponse = JSON.parse(response); } catch (_a) { parsedResponse = (response || "") .split("\n") .map(function (s) { return s.trim(" "); }) .filter(function (s) { return !!s; }); } } return parsedResponse; }; ChoicesRestfull.prototype.sendRequest = function () { this.isRunningValue = true; var xhr = new XMLHttpRequest(); xhr.open("GET", this.processedUrl); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); var self = this; xhr.onload = function () { self.isRunningValue = false; if (xhr.status === 200) { self.onLoad(self.parseResponse(xhr.response)); } else { self.onError(xhr.statusText, xhr.responseText); } }; var options = { request: xhr }; if (!!ChoicesRestfull.onBeforeSendRequest) { ChoicesRestfull.onBeforeSendRequest(this, options); } 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__["a" /* Serializer */].getProperties(this.itemValueType); var res = []; for (var i = 0; i < properties.length; i++) { if (properties[i].name === "value" || properties[i].name === "text" || properties[i].name === "visibleIf" || properties[i].name === "enableIf") continue; res.push(properties[i]); } return res; }; ChoicesRestfull.prototype.setData = function (json) { this.clear(); if (json.url) this.url = json.url; if (json.path) this.path = json.path; if (json.valueName) this.valueName = json.valueName; if (json.titleName) this.titleName = json.titleName; var properties = this.getCustomPropertiesNames(); for (var i = 0; i < properties.length; i++) { if (json[properties[i]]) this[properties[i]] = json[properties[i]]; } }; ChoicesRestfull.prototype.getData = function () { if (this.isEmpty) return null; var res = {}; if (this.url) res["url"] = this.url; if (this.path) res["path"] = this.path; if (this.valueName) res["valueName"] = this.valueName; if (this.titleName) res["titleName"] = this.titleName; var properties = this.getCustomPropertiesNames(); for (var i = 0; i < properties.length; i++) { if (this[properties[i]]) res[properties[i]] = this[properties[i]]; } return res; }; Object.defineProperty(ChoicesRestfull.prototype, "url", { get: function () { return this.getPropertyValue("url", ""); }, set: function (val) { this.setPropertyValue("url", val); }, enumerable: true, configurable: true }); Object.defineProperty(ChoicesRestfull.prototype, "path", { get: function () { return this.getPropertyValue("path", ""); }, set: function (val) { this.setPropertyValue("path", val); }, enumerable: true, configurable: true }); Object.defineProperty(ChoicesRestfull.prototype, "valueName", { get: function () { return this.getPropertyValue("valueName", ""); }, set: function (val) { this.setPropertyValue("valueName", val); }, enumerable: true, configurable: true }); Object.defineProperty(ChoicesRestfull.prototype, "titleName", { get: function () { return this.getPropertyValue("titleName", ""); }, set: function (val) { this.setPropertyValue("titleName", val); }, enumerable: true, configurable: true }); Object.defineProperty(ChoicesRestfull.prototype, "allowEmptyResponse", { get: function () { return this.getPropertyValue("allowEmptyResponse", false); }, set: function (val) { this.setPropertyValue("allowEmptyResponse", val); }, enumerable: true, configurable: true }); Object.defineProperty(ChoicesRestfull.prototype, "itemValueType", { get: function () { if (!this.owner) return "itemvalue"; var prop = __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].findProperty(this.owner.getType(), "choices"); if (!prop) return "itemvalue"; if (prop.type == "itemvalue[]") return "itemvalue"; return prop.type; }, enumerable: true, configurable: true }); ChoicesRestfull.prototype.clear = function () { this.url = ""; this.path = ""; this.valueName = ""; this.titleName = ""; var properties = this.getCustomPropertiesNames(); for (var i = 0; i < properties.length; i++) { if (this[properties[i]]) this[properties[i]] = ""; } }; ChoicesRestfull.prototype.onLoad = function (result) { var items = []; var updatedResult = this.getResultAfterPath(result); if (updatedResult && updatedResult["length"]) { for (var i = 0; i < updatedResult.length; i++) { var itemValue = updatedResult[i]; if (!itemValue) continue; var value = !!this.getItemValueCallback ? this.getItemValueCallback(itemValue) : this.getValue(itemValue); var title = this.getTitle(itemValue); var item = new __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */](value, title); this.setCustomProperties(item, itemValue); items.push(item); } } else { if (!this.allowEmptyResponse) { this.error = new __WEBPACK_IMPORTED_MODULE_4__error__["f" /* WebRequestEmptyError */](null, this.owner); } } 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_4__error__["g" /* WebRequestError */](status, response, this.owner); 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__["b" /* Base */])); __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("choicesByUrl", [ "url", "path", "valueName", "titleName", { name: "allowEmptyResponse:boolean", default: false } ], function () { return new ChoicesRestfull(); }); /***/ }), /* 38 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__expressions_expressionParser__ = __webpack_require__(114); /* unused harmony export ConditionsParserError */ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ConditionsParser; }); var ConditionsParserError = /** @class */ (function () { function ConditionsParserError(at, code) { this.at = at; this.code = code; } return ConditionsParserError; }()); var ConditionsParser = /** @class */ (function () { function ConditionsParser() { } ConditionsParser.prototype.createCondition = function (text) { return this.parseExpression(text); }; ConditionsParser.prototype.parseExpression = function (text) { try { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__expressions_expressionParser__["a" /* parse */])(text); } catch (e) { if (e instanceof __WEBPACK_IMPORTED_MODULE_0__expressions_expressionParser__["b" /* SyntaxError */]) { this.conditionError = new ConditionsParserError(e.location.start.offset, e.message); } } }; Object.defineProperty(ConditionsParser.prototype, "error", { get: function () { return this.conditionError; }, enumerable: true, configurable: true }); return ConditionsParser; }()); /***/ }), /* 39 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__settings__ = __webpack_require__(9); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return dxSurveyService; }); /** * The class contains methods to work with www.dxsurvey.com service. */ var dxSurveyService = /** @class */ (function () { function dxSurveyService() { } Object.defineProperty(dxSurveyService, "serviceUrl", { get: function () { return __WEBPACK_IMPORTED_MODULE_0__settings__["a" /* settings */].surveyServiceUrl; }, set: function (val) { __WEBPACK_IMPORTED_MODULE_0__settings__["a" /* settings */].surveyServiceUrl = val; }, enumerable: true, configurable: true }); dxSurveyService.prototype.loadSurvey = function (surveyId, onLoad) { var xhr = new XMLHttpRequest(); xhr.open("GET", dxSurveyService.serviceUrl + "/getSurvey?surveyId=" + surveyId); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onload = function () { var result = JSON.parse(xhr.response); onLoad(xhr.status == 200, result, xhr.response); }; xhr.send(); }; dxSurveyService.prototype.getSurveyJsonAndIsCompleted = function (surveyId, clientId, onLoad) { var xhr = new XMLHttpRequest(); xhr.open("GET", dxSurveyService.serviceUrl + "/getSurveyAndIsCompleted?surveyId=" + surveyId + "&clientId=" + clientId); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onload = function () { var result = JSON.parse(xhr.response); var surveyJson = result ? result.survey : null; var isCompleted = result ? result.isCompleted : null; onLoad(xhr.status == 200, surveyJson, isCompleted, xhr.response); }; xhr.send(); }; dxSurveyService.prototype.sendResult = function (postId, result, onSendResult, clientId, isPartialCompleted) { if (clientId === void 0) { clientId = null; } if (isPartialCompleted === void 0) { isPartialCompleted = false; } var xhr = new XMLHttpRequest(); xhr.open("POST", dxSurveyService.serviceUrl + "/post/"); xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8"); var data = { postId: postId, surveyResult: JSON.stringify(result) }; if (clientId) data["clientId"] = clientId; if (isPartialCompleted) data["isPartialCompleted"] = true; var dataStringify = JSON.stringify(data); var self = this; xhr.onload = xhr.onerror = function () { if (!onSendResult) return; onSendResult(xhr.status === 200, xhr.response, xhr); }; xhr.send(dataStringify); }; dxSurveyService.prototype.sendFile = function (postId, file, onSendFile) { var xhr = new XMLHttpRequest(); xhr.onload = xhr.onerror = function () { if (!onSendFile) return; onSendFile(xhr.status == 200, JSON.parse(xhr.response)); }; xhr.open("POST", dxSurveyService.serviceUrl + "/upload/", true); var formData = new FormData(); formData.append("file", file); formData.append("postId", postId); xhr.send(formData); }; dxSurveyService.prototype.getResult = function (resultId, name, onGetResult) { var xhr = new XMLHttpRequest(); var data = "resultId=" + resultId + "&name=" + name; xhr.open("GET", dxSurveyService.serviceUrl + "/getResult?" + data); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); var self = this; xhr.onload = function () { var result = null; var list = null; if (xhr.status == 200) { result = JSON.parse(xhr.response); list = []; for (var key in result.QuestionResult) { var el = { name: key, value: result.QuestionResult[key] }; list.push(el); } } onGetResult(xhr.status == 200, result, list, xhr.response); }; xhr.send(); }; dxSurveyService.prototype.isCompleted = function (resultId, clientId, onIsCompleted) { var xhr = new XMLHttpRequest(); var data = "resultId=" + resultId + "&clientId=" + clientId; xhr.open("GET", dxSurveyService.serviceUrl + "/isCompleted?" + data); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); var self = this; xhr.onload = function () { var result = null; if (xhr.status == 200) { result = JSON.parse(xhr.response); } onIsCompleted(xhr.status == 200, result, xhr.response); }; xhr.send(); }; return dxSurveyService; }()); /***/ }), /* 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__panel__ = __webpack_require__(19); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return FlowPanelModel; }); /** * The flow panel object. It is a container with flow layout where you can mix questions with mardown text. * */ var FlowPanelModel = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](FlowPanelModel, _super); function FlowPanelModel(name) { if (name === void 0) { name = ""; } var _this = _super.call(this, name) || this; _this.createLocalizableString("content", _this, true); var self = _this; _this.registerFunctionOnPropertyValueChanged("content", function () { self.onContentChanged(); }); return _this; } FlowPanelModel.prototype.getType = function () { return "flowpanel"; }; FlowPanelModel.prototype.getChildrenLayoutType = function () { return "flow"; }; FlowPanelModel.prototype.onSurveyLoad = function () { _super.prototype.onSurveyLoad.call(this); this.onContentChanged(); }; Object.defineProperty(FlowPanelModel.prototype, "content", { get: function () { return this.getLocalizableStringText("content"); }, set: function (val) { this.setLocalizableStringText("content", val); }, enumerable: true, configurable: true }); Object.defineProperty(FlowPanelModel.prototype, "locContent", { get: function () { return this.getLocalizableString("content"); }, enumerable: true, configurable: true }); Object.defineProperty(FlowPanelModel.prototype, "html", { get: function () { return this.getPropertyValue("html", ""); }, set: function (val) { this.setPropertyValue("html", val); }, enumerable: true, configurable: true }); FlowPanelModel.prototype.onContentChanged = function () { var html = ""; if (!!this.onCustomHtmlProducing) { html = this.onCustomHtmlProducing(); } else { html = this.produceHtml(); } this.html = html; if (!!this.contentChangedCallback) this.contentChangedCallback(); }; FlowPanelModel.prototype.produceHtml = function () { var html = []; //contentElementNamePrefix var regEx = /{(.*?(element:)[^$].*?)}/g; var str = this.content; var startIndex = 0; var res = null; while ((res = regEx.exec(str)) !== null) { if (res.index > startIndex) { html.push(str.substr(startIndex, res.index - startIndex)); startIndex = res.index; } var question = this.getQuestionFromText(res[0]); if (!!question) { html.push(this.getHtmlForQuestion(question)); } else { html.push(str.substr(startIndex, res.index + res[0].length - startIndex)); } startIndex = res.index + res[0].length; } if (startIndex < str.length) { html.push(str.substr(startIndex, str.length - startIndex)); } return html.join("").replace(new RegExp("<br>", "g"), "<br/>"); }; FlowPanelModel.prototype.getQuestionFromText = function (str) { str = str.substr(1, str.length - 2); str = str.replace(FlowPanelModel.contentElementNamePrefix, "").trim(); return this.getQuestionByName(str); }; FlowPanelModel.prototype.getHtmlForQuestion = function (question) { if (!!this.onGetHtmlForQuestion) return this.onGetHtmlForQuestion(question); return ""; }; FlowPanelModel.prototype.getQuestionHtmlId = function (question) { return this.name + "_" + question.id; }; FlowPanelModel.prototype.onAddElement = function (element, index) { _super.prototype.onAddElement.call(this, element, index); this.addElementToContent(element); element.renderWidth = ""; }; FlowPanelModel.prototype.onRemoveElement = function (element) { var searchStr = this.getElementContentText(element); this.content = this.content.replace(searchStr, ""); _super.prototype.onRemoveElement.call(this, element); }; FlowPanelModel.prototype.dragDropMoveElement = function (src, target, targetIndex) { }; FlowPanelModel.prototype.addElementToContent = function (element) { if (this.isLoadingFromJson) return; var text = this.getElementContentText(element); if (!this.insertTextAtCursor(text)) { this.content = this.content + text; } }; FlowPanelModel.prototype.insertTextAtCursor = function (text, prevName) { if (prevName === void 0) { prevName = null; } if (!this.isDesignMode || (!window && !window.getSelection)) return false; var sel = window.getSelection(); if (sel.getRangeAt && sel.rangeCount) { var range = sel.getRangeAt(0); range.deleteContents(); range.insertNode(document.createTextNode(text)); var self = this; if (self.getContent) { var str = self.getContent(prevName); this.content = str; } return true; } return false; }; FlowPanelModel.prototype.getElementContentText = function (element) { return "{" + FlowPanelModel.contentElementNamePrefix + element.name + "}"; }; FlowPanelModel.contentElementNamePrefix = "element:"; return FlowPanelModel; }(__WEBPACK_IMPORTED_MODULE_2__panel__["c" /* PanelModel */])); __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("flowpanel", [{ name: "content:html", serializationProperty: "locContent" }], function () { return new FlowPanelModel(); }, "panel"); /***/ }), /* 41 */ /***/ (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}", questionsProgressText: "Answered {0}/{1} questions", emptySurvey: "There is no visible page or question in the survey.", completingSurvey: "Thank you for completing the survey!", completingSurveyBefore: "Our records show that you have already completed this survey.", loadingSurvey: "Loading Survey...", optionsCaption: "Choose...", value: "value", requiredError: "Please answer the question.", requiredErrorInPanel: "Please answer at least one question.", requiredInAllRowsError: "Please answer questions in all rows.", numericError: "The value should be numeric.", textMinLength: "Please enter at least {0} characters.", textMaxLength: "Please enter less than {0} characters.", textMinMaxLength: "Please enter more than {0} and less than {1} characters.", minRowCountError: "Please fill in at least {0} rows.", minSelectError: "Please select at least {0} variants.", maxSelectError: "Please select no more than {0} variants.", numericMinMax: "The '{0}' should be equal or more than {1} and equal or less than {2}", numericMin: "The '{0}' should be equal or more than {1}", numericMax: "The '{0}' should be equal or less than {1}", invalidEmail: "Please enter a valid e-mail address.", invalidExpression: "The expression: {0} should return 'true'.", urlRequestError: "The request returned error '{0}'. {1}", urlGetChoicesError: "The request returned empty data or the 'path' property is incorrect", exceedMaxSize: "The file size should not exceed {0}.", otherRequiredError: "Please enter the other value.", uploadingFile: "Your file is uploading. Please wait several seconds and try again.", loadingFile: "Loading...", chooseFile: "Choose file(s)...", noFileChosen: "No file chosen", confirmDelete: "Do you want to delete the record?", keyDuplicationError: "This value should be unique.", addColumn: "Add column", addRow: "Add row", removeRow: "Remove", addPanel: "Add new", removePanel: "Remove", choices_Item: "item", matrix_column: "Column", matrix_row: "Row", savingData: "The results are saving on the server...", savingDataError: "An error occurred and we could not save the results.", savingDataSuccess: "The results were saved successfully!", saveAgainButton: "Try again", timerMin: "min", timerSec: "sec", timerSpentAll: "You have spent {0} on this page and {1} in total.", timerSpentPage: "You have spent {0} on this page.", timerSpentSurvey: "You have spent {0} in total.", timerLimitAll: "You have spent {0} of {1} on this page and {2} of {3} in total.", timerLimitPage: "You have spent {0} of {1} on this page.", timerLimitSurvey: "You have spent {0} of {1} in total.", cleanCaption: "Clean", clearCaption: "Clear", 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"; /***/ }), /* 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__itemvalue__ = __webpack_require__(12); /* 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 import */ var __WEBPACK_IMPORTED_MODULE_5__helpers__ = __webpack_require__(4); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionMatrixBaseModel; }); /** * A Model for a matrix base question. */ var QuestionMatrixBaseModel = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMatrixBaseModel, _super); function QuestionMatrixBaseModel(name) { var _this = _super.call(this, name) || this; _this.name = name; _this.generatedVisibleRows = null; _this.generatedTotalRow = null; _this.filteredRows = null; _this.filteredColumns = null; _this.columns = _this.createColumnValues(); _this.rows = _this.createItemValues("rows"); return _this; } QuestionMatrixBaseModel.prototype.createColumnValues = function () { return this.createItemValues("columns"); }; QuestionMatrixBaseModel.prototype.getType = function () { return "matrixbase"; }; Object.defineProperty(QuestionMatrixBaseModel.prototype, "isAllowTitleLeft", { get: function () { return false; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionMatrixBaseModel.prototype, "showHeader", { /** * Set this property to false, to hide table header. The default value is true. */ get: function () { return this.getPropertyValue("showHeader", true); }, set: function (val) { this.setPropertyValue("showHeader", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionMatrixBaseModel.prototype, "columns", { /** * The list of columns. A column has a value and an optional text */ get: function () { return this.getPropertyValue("columns"); }, set: function (newValue) { this.setPropertyValue("columns", newValue); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionMatrixBaseModel.prototype, "visibleColumns", { get: function () { return !!this.filteredColumns ? this.filteredColumns : this.columns; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionMatrixBaseModel.prototype, "rows", { /** * The list of rows. A row has a value and an optional text */ get: function () { return this.getPropertyValue("rows"); }, set: function (newValue) { 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.onColumnsChanged = function () { }; 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__["b" /* ConditionRunner */](this.rowsVisibleIf) : null; this.filteredRows = []; var hasChanged = __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].runConditionsForItems(this.rows, this.filteredRows, runner, values, properties); if (this.filteredRows.length === this.rows.length) { this.filteredRows = null; } return hasChanged; }; QuestionMatrixBaseModel.prototype.runConditionsForColumns = function (values, properties) { var runner = !!this.columnsVisibleIf ? new __WEBPACK_IMPORTED_MODULE_4__conditions__["b" /* ConditionRunner */](this.columnsVisibleIf) : null; this.filteredColumns = []; var hasChanged = __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].runConditionsForItems(this.columns, this.filteredColumns, runner, values, properties); if (this.filteredColumns.length === this.columns.length) { this.filteredColumns = null; } return hasChanged; }; QuestionMatrixBaseModel.prototype.clearIncorrectValues = function () { var val = this.value; if (!val) return; var newVal = null; var isChanged = false; var rows = !!this.filteredRows ? this.filteredRows : this.rows; var columns = !!this.filteredColumns ? this.filteredColumns : this.columns; for (var key in val) { if (__WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getItemByValue(rows, key) && __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getItemByValue(columns, val[key])) { if (newVal == null) newVal = {}; newVal[key] = val[key]; } else { isChanged = true; } } if (isChanged) { this.value = newVal; } _super.prototype.clearIncorrectValues.call(this); }; QuestionMatrixBaseModel.prototype.clearInvisibleValuesInRows = function () { if (this.isEmpty()) return; var oldData = __WEBPACK_IMPORTED_MODULE_5__helpers__["a" /* Helpers */].getUnbindValue(this.value); var newData = {}; var rows = this.visibleRows; for (var i = 0; i < rows.length; i++) { var key = this.getRowName(rows[i]); if (!!oldData[key]) { newData[key] = oldData[key]; } } if (__WEBPACK_IMPORTED_MODULE_5__helpers__["a" /* Helpers */].isTwoValueEquals(newData, this.value)) return; this.value = newData; }; QuestionMatrixBaseModel.prototype.getRowName = function (row) { return row.name; }; return QuestionMatrixBaseModel; }(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */])); __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("matrixbase", [ "columnsVisibleIf:condition", "rowsVisibleIf:condition", { name: "showHeader:boolean", default: true } ], undefined, "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__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"; }; QuestionBooleanModel.prototype.isLayoutTypeSupported = function (layoutType) { return true; }; Object.defineProperty(QuestionBooleanModel.prototype, "isIndeterminate", { /** * Returns true if the question check will be rendered in indeterminate mode. value is empty. */ get: function () { return this.isEmpty(); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionBooleanModel.prototype, "hasTitle", { get: function () { return 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) { if (val === true) val = "true"; if (val === false) val = "false"; this.setPropertyValue("defaultValue", val); this.updateValueWithDefaults(); }, enumerable: true, configurable: true }); QuestionBooleanModel.prototype.getDefaultValue = function () { if (this.defaultValue == "indeterminate") return null; return this.defaultValue == "true" ? this.getValueTrue() : this.getValueFalse(); }; Object.defineProperty(QuestionBooleanModel.prototype, "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__["a" /* Serializer */].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); }); /***/ }), /* 44 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(20); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__helpers__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__itemvalue__ = __webpack_require__(12); /* 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.onCreating = function () { _super.prototype.onCreating.call(this); this.createNewArray("renderedValue"); this.createNewArray("value"); }; QuestionCheckboxModel.prototype.getFirstInputElementId = function () { return this.inputId + "_0"; }; Object.defineProperty(QuestionCheckboxModel.prototype, "selectAllItem", { /** * Returns the select all item. By using this property, you may change programmatically it's value and text. * @see hasSelectAll */ get: function () { return this.selectAllItemValue; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionCheckboxModel.prototype, "noneItem", { /** * Returns the none item. By using this property, you may change programmatically it's value and text. * @see hasNone */ get: function () { return this.noneItemValue; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionCheckboxModel.prototype, "noneText", { /** * Use this property to set the different text for none item. */ get: function () { return this.getLocalizableStringText("noneText", __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("noneItemText")); }, set: function (val) { this.setLocalizableStringText("noneText", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionCheckboxModel.prototype, "locNoneText", { get: function () { return this.getLocalizableString("noneText"); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionCheckboxModel.prototype, "selectAllText", { /** * Use this property to set the different text for Select All item. */ get: function () { return this.getLocalizableStringText("selectAllText", __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("selectAllItemText")); }, set: function (val) { this.setLocalizableStringText("selectAllText", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionCheckboxModel.prototype, "locSelectAllText", { get: function () { return this.getLocalizableString("selectAllText"); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionCheckboxModel.prototype, "hasSelectAll", { /** * Set this property to true, to show the "Select All" item on the top. If end-user checks this item, then all items are checked. */ get: function () { return this.getPropertyValue("hasSelectAll", false); }, set: function (val) { this.setPropertyValue("hasSelectAll", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionCheckboxModel.prototype, "isAllSelected", { /** * Returns true if all items are selected * @see toggleSelectAll */ get: function () { var val = this.value; if (!val || !Array.isArray(val)) return false; if (this.isItemSelected(this.noneItem)) return false; var allItemCount = this.visibleChoices.length; if (this.hasOther) allItemCount--; if (this.hasNone) allItemCount--; if (this.hasSelectAll) allItemCount--; var selectedCount = val.length; if (this.isItemSelected(this.otherItem)) selectedCount--; return selectedCount === allItemCount; }, set: function (val) { if (val) { this.selectAll(); } else { this.clearValue(); } }, enumerable: true, configurable: true }); /** * It will select all items, except other and none. If all items have been already selected then it will clear the value * @see isAllSelected * @see selectAll */ QuestionCheckboxModel.prototype.toggleSelectAll = function () { this.isAllSelected = !this.isAllSelected; }; /** * Select all items, except other and none. */ QuestionCheckboxModel.prototype.selectAll = function () { var val = []; for (var i = 0; i < this.visibleChoices.length; i++) { var item = this.visibleChoices[i]; if (item === this.noneItem || item === this.otherItem || item === this.selectAllItem) continue; val.push(item.value); } this.value = val; }; Object.defineProperty(QuestionCheckboxModel.prototype, "hasNone", { /** * Set this property to true, to show the "None" item on the bottom. If end-user checks this item, all other items would be unchecked. */ get: function () { return this.getPropertyValue("hasNone", false); }, set: function (val) { this.setPropertyValue("hasNone", val); }, enumerable: true, configurable: true }); /** * Returns true if item is checked * @param item checkbox item value */ QuestionCheckboxModel.prototype.isItemSelected = function (item) { if (item === this.selectAllItem) return this.isAllSelected; var val = this.renderedValue; if (!val || !Array.isArray(val)) return false; for (var i = 0; i < val.length; i++) { if (__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isTwoValueEquals(val[i], item.value)) return true; } return false; }; QuestionCheckboxModel.prototype.setNewValue = function (newValue) { newValue = this.valueFromData(newValue); var value = this.value; if (!newValue) newValue = []; if (!value) value = []; if (__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isTwoValueEquals(value, newValue)) return; if (this.hasNone) { var prevNoneIndex = this.noneIndexInArray(value); var newNoneIndex = this.noneIndexInArray(newValue); if (prevNoneIndex > -1) { if (newNoneIndex > -1 && newValue.length > 1) { newValue.splice(newNoneIndex, 1); } } else { if (newNoneIndex > -1) { newValue.splice(0, newValue.length); newValue.push(this.noneItem.value); } } } _super.prototype.setNewValue.call(this, newValue); }; QuestionCheckboxModel.prototype.noneIndexInArray = function (val) { if (!val || !Array.isArray(val)) return -1; var noneValue = this.noneItem.value; for (var i = 0; i < val.length; i++) { if (val[i] == noneValue) return i; } return -1; }; QuestionCheckboxModel.prototype.canUseFilteredChoices = function () { return !this.hasNone && !this.hasSelectAll && _super.prototype.canUseFilteredChoices.call(this); }; QuestionCheckboxModel.prototype.addToVisibleChoices = function (items) { if (this.hasSelectAll) { items.unshift(this.selectAllItem); } _super.prototype.addToVisibleChoices.call(this, items); if (this.hasNone) { items.push(this.noneItem); } }; QuestionCheckboxModel.prototype.getDisplayValueCore = function (keysAsText) { if (this.isEmpty()) return ""; var items = this.visibleChoices; var values = this.createValueCopy(); 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) { if (this.hasComment) { this.value = null; } else { this.clearValue(); } } return; } var newValue = []; for (var i = 0; i < val.length; i++) { if ((!clearDisabled && !this.canClearValueAnUnknow(val[i])) || (clearDisabled && !this.isValueDisabled(val[i]))) { newValue.push(val[i]); } } if (newValue.length == val.length) return; if (newValue.length == 0) { this.clearValue(); } else { this.value = newValue; } }; QuestionCheckboxModel.prototype.getConditionJson = function (operator, path) { if (operator === void 0) { operator = null; } if (path === void 0) { path = null; } var json = _super.prototype.getConditionJson.call(this); if (operator == "contains" || operator == "notcontains") { json["type"] = "radiogroup"; } return json; }; QuestionCheckboxModel.prototype.isAnswerCorrect = function () { return __WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isArrayContainsEqual(this.value, this.correctAnswer); }; QuestionCheckboxModel.prototype.setDefaultValueWithOthers = function () { this.value = this.renderedValueFromDataCore(this.defaultValue); }; QuestionCheckboxModel.prototype.getHasOther = function (val) { if (!val || !Array.isArray(val)) return false; return val.indexOf(this.otherItem.value) >= 0; }; QuestionCheckboxModel.prototype.valueFromData = function (val) { if (!val) return val; if (!Array.isArray(val)) return [_super.prototype.valueFromData.call(this, val)]; var value = []; for (var i = 0; i < val.length; i++) { var choiceitem = __WEBPACK_IMPORTED_MODULE_5__itemvalue__["a" /* ItemValue */].getItemByValue(this.choices, val[i]); if (!!choiceitem) { value.push(choiceitem.value); } else { value.push(val[i]); } } return value; }; QuestionCheckboxModel.prototype.renderedValueFromDataCore = function (val) { if (!val || !Array.isArray(val)) val = []; for (var i = 0; i < val.length; i++) { if (val[i] == this.otherItem.value) return val; if (this.hasUnknownValue(val[i])) { this.comment = val[i]; var newVal = val.slice(); newVal[i] = this.otherItem.value; return newVal; } } return val; }; QuestionCheckboxModel.prototype.rendredValueToDataCore = function (val) { if (!val || !val.length) return val; for (var i = 0; i < val.length; i++) { if (val[i] == this.otherItem.value) { if (this.getComment()) { var newVal = val.slice(); newVal[i] = this.getComment(); return newVal; } } } return val; }; QuestionCheckboxModel.prototype.hasUnknownValue = function (val, includeOther) { if (includeOther === void 0) { includeOther = false; } if (this.hasNone && val == this.noneItemValue.value) return false; return _super.prototype.hasUnknownValue.call(this, val, includeOther); }; QuestionCheckboxModel.prototype.getType = function () { return "checkbox"; }; return QuestionCheckboxModel; }(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["a" /* QuestionCheckboxBase */])); __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("checkbox", [ "hasSelectAll:boolean", "hasNone:boolean", { name: "noneText", serializationProperty: "locNoneText" }, { name: "selectAllText", serializationProperty: "locSelectAllText" } ], function () { return new QuestionCheckboxModel(""); }, "checkboxbase"); __WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("checkbox", function (name) { var q = new QuestionCheckboxModel(name); q.choices = __WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].DefaultChoices; return q; }); /***/ }), /* 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__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__(4); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCommentModel; }); /** * A Model for a comment question */ var QuestionCommentModel = /** @class */ (function (_super) { __WEBPACK_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__["a" /* Serializer */].addClass("comment", [ { name: "maxLength:number", default: -1 }, { name: "cols:number", default: 50 }, { name: "rows:number", default: 4 }, { name: "placeHolder", serializationProperty: "locPlaceHolder" } ], function () { return new QuestionCommentModel(""); }, "question"); __WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("comment", function (name) { return new QuestionCommentModel(name); }); /***/ }), /* 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__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__["a" /* Serializer */].addClass("empty", [], function () { return new QuestionEmptyModel(""); }, "question"); /***/ }), /* 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__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__(5); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __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 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. * <br/> sender the question object that fires the event * <br/> options.state new question state value. */ _this.onStateChanged = new __WEBPACK_IMPORTED_MODULE_4__base__["a" /* 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, "allowImagesPreview", { /** * Set it to false if you want to disable images preview. */ get: function () { return this.getPropertyValue("allowImagesPreview", true); }, set: function (val) { this.setPropertyValue("allowImagesPreview", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionFileModel.prototype, "maxSize", { /** * Use this property to setup the maximum allowed file size. */ get: function () { return this.getPropertyValue("maxSize", 0); }, set: function (val) { this.setPropertyValue("maxSize", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionFileModel.prototype, "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 this.allowImagesPreview && !!fileItem && this.isFileImage(fileItem); }; QuestionFileModel.prototype.setQuestionValue = function (newValue) { var _this = this; _super.prototype.setQuestionValue.call(this, newValue); this.previewValue = []; var state = (!Array.isArray(newValue) && !!newValue) || (Array.isArray(newValue) && newValue.length > 0) ? this.showPreview ? "loading" : "loaded" : "empty"; this.stateChanged(state); if (!this.showPreview || !newValue) return; var newValues = Array.isArray(newValue) ? newValue : !!newValue ? [newValue] : []; if (this.storeDataAsText) { newValues.forEach(function (value) { var content = value.content || value; _this.previewValue = _this.previewValue.concat([ { name: value.name, type: value.type, content: content } ]); }); if (state === "loading") this.stateChanged("loaded"); } else { newValues.forEach(function (value) { var content = value.content || value; _this.survey.downloadFile(_this.name, value, function (status, data) { if (status === "success") { _this.previewValue = _this.previewValue.concat([ { content: data, name: value.name, type: value.type } ]); if (_this.previewValue.length === newValues.length) { _this.stateChanged("loaded"); } } else { _this.stateChanged("error"); } }); }); } }; QuestionFileModel.prototype.onCheckForErrors = function (errors) { _super.prototype.onCheckForErrors.call(this, errors); if (this.isUploading && this.waitForUpload) { errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["k" /* UploadingFileError */](__WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("uploadingFile"), this)); } }; QuestionFileModel.prototype.stateChanged = function (state) { if (state === "loading") { this.isUploading = true; } if (state === "loaded") { this.isUploading = false; } this.currentState = state; this.onStateChanged.fire(this, { state: state }); }; QuestionFileModel.prototype.allFilesOk = function (files) { var _this = this; var errorLength = this.errors ? this.errors.length : 0; (files || []).forEach(function (file) { if (_this.maxSize > 0 && file.size > _this.maxSize) { _this.errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["l" /* ExceedSizeError */](_this.maxSize, _this)); } }); return errorLength === this.errors.length; }; QuestionFileModel.prototype.isFileImage = function (file) { if (!file) return false; var imagePrefix = "data:image"; var subStr = file.content && file.content.substr(0, imagePrefix.length); subStr = subStr && subStr.toLowerCase(); var result = subStr === imagePrefix || (!!file.type && file.type.toLowerCase().indexOf("image/") === 0); return result; }; QuestionFileModel.prototype.getPlainData = function (options) { if (options === void 0) { options = { includeEmpty: true }; } var questionPlainData = _super.prototype.getPlainData.call(this, options); if (!!questionPlainData && !this.isEmpty()) { questionPlainData.isNode = false; var values = Array.isArray(this.value) ? this.value : [this.value]; questionPlainData.data = values.map(function (dataValue, index) { return { name: index, title: "File", value: (dataValue.content && dataValue.content) || dataValue, displayValue: (dataValue.name && dataValue.name) || dataValue, getString: function (val) { return typeof val === "object" ? JSON.stringify(val) : val; }, isNode: false }; }); } return questionPlainData; }; return QuestionFileModel; }(__WEBPACK_IMPORTED_MODULE_1__question__["a" /* Question */])); __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addClass("file", [ { name: "showPreview:boolean", default: true }, "allowMultiple:boolean", { name: "allowImagesPreview:boolean", default: true }, "imageHeight", "imageWidth", "acceptedTypes", { name: "storeDataAsText:boolean", default: true }, { name: "waitForUpload:boolean", default: false }, "maxSize:number" ], function () { return new QuestionFileModel(""); }, "question"); __WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("file", function (name) { return new QuestionFileModel(name); }); /***/ }), /* 48 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__questionnonvalue__ = __webpack_require__(57); /* 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__["a" /* Serializer */].addClass("html", [{ name: "html:html", serializationProperty: "locHtml" }], function () { return new QuestionHtmlModel(""); }, "nonvalue"); __WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("html", function (name) { return new QuestionHtmlModel(name); }); /***/ }), /* 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__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__(20); /* 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 }); QuestionImagePickerModel.prototype.clearIncorrectValues = function () { if (this.multiSelect) { var val = this.value; if (!val) return; if (!Array.isArray(val) || val.length == 0) { this.clearValue(); return; } var newValue = []; for (var i = 0; i < val.length; i++) { if (!this.hasUnknownValue(val[i], true)) { newValue.push(val[i]); } } if (newValue.length == val.length) return; if (newValue.length == 0) { this.clearValue(); } else { this.value = newValue; } } else { _super.prototype.clearIncorrectValues.call(this); } }; Object.defineProperty(QuestionImagePickerModel.prototype, "showLabel", { /** * Show label under the image. */ get: function () { return this.getPropertyValue("showLabel", false); }, set: function (newValue) { this.setPropertyValue("showLabel", newValue); }, enumerable: true, configurable: true }); QuestionImagePickerModel.prototype.getValueCore = function () { 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__["a" /* Serializer */].addClass("imageitemvalue", ["imageLink"], null, "itemvalue"); __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("imagepicker", [ { name: "hasOther", visible: false }, { name: "otherText", visible: false }, { name: "optionsCaption", visible: false }, { name: "otherErrorText", visible: false }, { name: "storeOthersAsComment", visible: false }, { name: "contentMode", default: "image", choices: ["image", "video"] }, { name: "imageFit", default: "contain", choices: ["none", "contain", "cover", "fill"] }, { name: "imageHeight:number", default: 150 }, { name: "imageWidth:number", default: 200 } ], function () { return new QuestionImagePickerModel(""); }, "checkboxbase"); __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addProperty("imagepicker", { name: "showLabel:boolean", default: false }); __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addProperty("imagepicker", { name: "colCount:number", default: 0, choices: [0, 1, 2, 3, 4, 5] }); __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addProperty("imagepicker", { name: "multiSelect:boolean", default: false }); __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addProperty("imagepicker", { name: "choices:imageitemvalue[]" }); __WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("imagepicker", function (name) { var q = new QuestionImagePickerModel(name); //q.choices = QuestionFactory.DefaultChoices; return q; }); /***/ }), /* 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__helpers__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__itemvalue__ = __webpack_require__(12); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__martixBase__ = __webpack_require__(42); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__surveyStrings__ = __webpack_require__(2); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__error__ = __webpack_require__(11); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__questionfactory__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__localizablestring__ = __webpack_require__(17); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__question_dropdown__ = __webpack_require__(29); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__settings__ = __webpack_require__(9); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MatrixRowModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "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(__WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].matrixDefaultRowName, column, val); }; MartrixCells.prototype.getCellLocText = function (row, column) { row = this.getCellRowColumnValue(row, this.rows); column = this.getCellRowColumnValue(column, this.columns); if (!row || !column) return null; if (!this.values[row]) return null; if (!this.values[row][column]) return null; return this.values[row][column]; }; MartrixCells.prototype.getDefaultCellLocText = function (column, val) { return this.getCellLocText(__WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].matrixDefaultRowName, column); }; MartrixCells.prototype.getCellDisplayLocText = function (row, column) { var cellText = this.getCellLocText(row, column); if (cellText && !cellText.isEmpty) return cellText; cellText = this.getCellLocText(__WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].matrixDefaultRowName, column); if (cellText && !cellText.isEmpty) return cellText; if (typeof column == "number") { column = column >= 0 && column < this.columns.length ? this.columns[column] : null; } if (column && column.locText) return column.locText; return null; }; MartrixCells.prototype.getCellText = function (row, column) { var loc = this.getCellLocText(row, column); return loc ? loc.text : null; }; MartrixCells.prototype.getDefaultCellText = function (column) { var loc = this.getCellLocText(__WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].matrixDefaultRowName, 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_8__localizablestring__["a" /* LocalizableString */](this.cellsOwner, true); }; 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_8__localizablestring__["a" /* LocalizableString */](_this); _this.cellsValue = new MartrixCells(_this); var self = _this; _this.registerFunctionOnPropertyValueChanged("columns", function () { self.onColumnsChanged(); }); _this.registerFunctionOnPropertyValueChanged("rows", function () { if (!self.filterItems()) { self.onRowsChanged(); } }); return _this; } QuestionMatrixModel.prototype.getType = function () { return "matrix"; }; Object.defineProperty(QuestionMatrixModel.prototype, "isAllRowRequired", { /** * Set this property to true, if you want a user to answer all rows. */ get: function () { return this.getPropertyValue("isAllRowRequired", false); }, set: function (val) { this.setPropertyValue("isAllRowRequired", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionMatrixModel.prototype, "hasRows", { /** * Returns true, if there is at least one row. */ get: function () { return this.rows.length > 0; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionMatrixModel.prototype, "rowsOrder", { /** * Use this property to render items in a specific order: "random" or "initial". Default is "initial". */ get: function () { return this.getPropertyValue("rowsOrder", "initial"); }, set: function (val) { val = val.toLowerCase(); if (val == this.rowsOrder) return; this.setPropertyValue("rowsOrder", val); this.onRowsChanged(); }, enumerable: true, configurable: true }); QuestionMatrixModel.prototype.getRows = function () { return this.rows; }; QuestionMatrixModel.prototype.getColumns = function () { return this.visibleColumns; }; QuestionMatrixModel.prototype.getVisibleRows = function () { var result = new Array(); var val = this.value; if (!val) val = {}; var rows = !!this.filteredRows ? this.filteredRows : this.rows; for (var i = 0; i < rows.length; i++) { var row = rows[i]; if (this.isValueEmpty(row.value)) continue; result.push(this.createMatrixRow(row, this.id + "_" + row.value.toString().replace(/\s/g, "_"), val[row.value])); } if (result.length == 0 && !this.filteredRows) { result.push(this.createMatrixRow(new __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */](null), this.name.replace(/\s/g, "_"), val)); } result = this.sortVisibleRows(result); this.generatedVisibleRows = result; return result; }; QuestionMatrixModel.prototype.sortVisibleRows = function (array) { var order = this.rowsOrder.toLowerCase(); if (order == "random") return __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].randomizeArray(array); return array; }; Object.defineProperty(QuestionMatrixModel.prototype, "visibleRows", { /** * Returns the list of visible rows as model objects. * @see rowsVisibleIf */ get: function () { return this.getVisibleRows(); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionMatrixModel.prototype, "cells", { get: function () { return this.cellsValue; }, set: function (value) { this.cells.setJson(value && value.getJson ? value.getJson() : null); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionMatrixModel.prototype, "hasCellText", { get: function () { return !this.cells.isEmpty; }, enumerable: true, configurable: true }); QuestionMatrixModel.prototype.setCellText = function (row, column, val) { this.cells.setCellText(row, column, val); }; QuestionMatrixModel.prototype.getCellText = function (row, column) { return this.cells.getCellText(row, column); }; QuestionMatrixModel.prototype.setDefaultCellText = function (column, val) { this.cells.setDefaultCellText(column, val); }; QuestionMatrixModel.prototype.getDefaultCellText = function (column) { return this.cells.getDefaultCellText(column); }; QuestionMatrixModel.prototype.getCellDisplayText = function (row, column) { return this.cells.getCellDisplayText(row, column); }; QuestionMatrixModel.prototype.getCellDisplayLocText = function (row, column) { var loc = this.cells.getCellDisplayLocText(row, column); return loc ? loc : this.emptyLocalizableString; }; QuestionMatrixModel.prototype.supportGoNextPageAutomatic = function () { return this.hasValuesInAllRows(); }; QuestionMatrixModel.prototype.onCheckForErrors = function (errors) { _super.prototype.onCheckForErrors.call(this, errors); if (this.hasErrorInRows()) { errors.push(new __WEBPACK_IMPORTED_MODULE_6__error__["j" /* RequiredInAllRowsError */](null, this)); } }; QuestionMatrixModel.prototype.hasErrorInRows = function () { if (!this.isAllRowRequired) return false; return !this.hasValuesInAllRows(); }; QuestionMatrixModel.prototype.hasValuesInAllRows = function () { var rows = this.generatedVisibleRows; if (!rows) rows = this.visibleRows; if (!rows) return true; for (var i = 0; i < rows.length; i++) { var val = rows[i].value; if (!val) return false; } return true; }; QuestionMatrixModel.prototype.createMatrixRow = function (item, fullName, value) { return new MatrixRowModel(item, fullName, this, value); }; QuestionMatrixModel.prototype.setQuestionValue = function (newValue) { _super.prototype.setQuestionValue.call(this, newValue); if (this.isRowChanging || !this.generatedVisibleRows || this.generatedVisibleRows.length == 0) return; this.isRowChanging = true; var val = this.value; if (!val) val = {}; if (this.rows.length == 0) { this.generatedVisibleRows[0].value = val; } else { for (var i = 0; i < this.generatedVisibleRows.length; i++) { var row = this.generatedVisibleRows[i]; var rowVal = val[row.name] ? val[row.name] : null; this.generatedVisibleRows[i].value = rowVal; } } this.isRowChanging = false; }; QuestionMatrixModel.prototype.getDisplayValueCore = function (keysAsText) { var values = this.createValueCopy(); if (!values) return values; var res = {}; for (var key in values) { var newKey = keysAsText ? __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(this.rows, key) : key; if (!newKey) newKey = key; var newValue = __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(this.columns, values[key]); if (!newValue) newValue = values[key]; res[newKey] = newValue; } return res; }; QuestionMatrixModel.prototype.getPlainData = function (options) { var _this = this; if (options === void 0) { options = { includeEmpty: true }; } var questionPlainData = _super.prototype.getPlainData.call(this, options); if (!!questionPlainData) { var values = this.createValueCopy(); questionPlainData.isNode = true; questionPlainData.data = Object.keys(values || {}).map(function (rowName) { var row = _this.rows.filter(function (r) { return r.value === rowName; })[0]; var rowDataItem = { name: rowName, title: !!row ? row.text : "row", value: values[rowName], displayValue: __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(_this.visibleColumns, values[rowName]), getString: function (val) { return typeof val === "object" ? JSON.stringify(val) : val; }, isNode: false }; var item = __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */].getItemByValue(_this.visibleColumns, values[rowName]); if (!!item) { (options.calculations || []).forEach(function (calculation) { rowDataItem[calculation.propertyName] = item[calculation.propertyName]; }); } return rowDataItem; }); } return questionPlainData; }; QuestionMatrixModel.prototype.addConditionNames = function (names) { for (var i = 0; i < this.rows.length; i++) { if (this.rows[i].value) { names.push(this.name + "." + this.rows[i].value); } } }; QuestionMatrixModel.prototype.addConditionObjectsByContext = function (objects, context) { for (var i = 0; i < this.rows.length; i++) { var row = this.rows[i]; if (!!row.value) { objects.push({ name: this.name + "." + row.value, text: this.processedTitle + "." + row.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_9__question_dropdown__["a" /* QuestionDropdownModel */](path); question.choices = this.columns; var json = new __WEBPACK_IMPORTED_MODULE_4__jsonobject__["b" /* JsonObject */]().toJsonObject(question); json["type"] = question.getType(); return json; }; QuestionMatrixModel.prototype.clearValueIfInvisible = function () { _super.prototype.clearValueIfInvisible.call(this); if (this.hasRows) { this.clearInvisibleValuesInRows(); } }; QuestionMatrixModel.prototype.getFirstInputElementId = function () { var rows = this.generatedVisibleRows; if (!rows) rows = this.visibleRows; if (rows.length > 0 && this.visibleColumns.length > 0) { return this.inputId + "_" + rows[0].name + "_" + 0; } return _super.prototype.getFirstInputElementId.call(this); }; //IMatrixData QuestionMatrixModel.prototype.onMatrixRowChanged = function (row) { if (this.isRowChanging) return; this.isRowChanging = true; if (!this.hasRows) { this.setNewValue(row.value); } else { var newValue = this.value; if (!newValue) { newValue = {}; } newValue[row.name] = row.value; this.setNewValue(newValue); } this.isRowChanging = false; }; return QuestionMatrixModel; }(__WEBPACK_IMPORTED_MODULE_3__martixBase__["a" /* QuestionMatrixBaseModel */])); __WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("matrix", [ { name: "columns:itemvalue[]", baseValue: function () { return __WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("matrix_column"); } }, { name: "rows:itemvalue[]", baseValue: function () { return __WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("matrix_row"); } }, { name: "cells:cells", serializationProperty: "cells" }, { name: "rowsOrder", default: "initial", choices: ["initial", "random"] }, "isAllRowRequired:boolean" ], function () { return new QuestionMatrixModel(""); }, "matrixbase"); __WEBPACK_IMPORTED_MODULE_7__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrix", function (name) { var q = new QuestionMatrixModel(name); q.rows = __WEBPACK_IMPORTED_MODULE_7__questionfactory__["a" /* QuestionFactory */].DefaultRows; q.columns = __WEBPACK_IMPORTED_MODULE_7__questionfactory__["a" /* QuestionFactory */].DefaultColums; return q; }); /***/ }), /* 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__question_matrixdropdownbase__ = __webpack_require__(21); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__itemvalue__ = __webpack_require__(12); /* 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(value); return _this; } Object.defineProperty(MatrixDropdownRowModel.prototype, "rowName", { get: function () { return this.name; }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownRowModel.prototype, "text", { get: function () { return this.item.text; }, enumerable: true, configurable: true }); Object.defineProperty(MatrixDropdownRowModel.prototype, "locText", { get: function () { return this.item.locText; }, enumerable: true, configurable: true }); return MatrixDropdownRowModel; }(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["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; _this.createLocalizableString("totalText", _this, true); var self = _this; _this.registerFunctionOnPropertyValueChanged("rows", function () { self.generatedVisibleRows = null; self.filterItems(); }); return _this; } QuestionMatrixDropdownModel.prototype.getType = function () { return "matrixdropdown"; }; Object.defineProperty(QuestionMatrixDropdownModel.prototype, "totalText", { /** * Set this property to show it on the first column for the total row. */ get: function () { return this.getLocalizableStringText("totalText", ""); }, set: function (val) { this.setLocalizableStringText("totalText", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionMatrixDropdownModel.prototype, "locTotalText", { get: function () { return this.getLocalizableString("totalText"); }, enumerable: true, configurable: true }); QuestionMatrixDropdownModel.prototype.getDisplayValueCore = function (keysAsText) { var values = this.createValueCopy(); if (!values) return values; var rows = this.visibleRows; var res = {}; for (var i = 0; i < rows.length; i++) { var rowValue = this.rows[i].value; var val = values[rowValue]; if (!val) continue; if (keysAsText) { var displayRowValue = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(this.rows, rowValue); if (!!displayRowValue) { rowValue = displayRowValue; } } res[rowValue] = this.getRowDisplayValue(rows[i], val); } return values; }; QuestionMatrixDropdownModel.prototype.addConditionNames = function (names) { for (var i = 0; i < this.rows.length; i++) { if (!this.rows[i].value) continue; var prefix = this.name + "." + this.rows[i].value + "."; for (var j = 0; j < this.columns.length; j++) { names.push(prefix + this.columns[j].name); } } }; QuestionMatrixDropdownModel.prototype.addConditionObjectsByContext = function (objects, context) { var hasContext = !!context ? this.columns.indexOf(context) > -1 : false; for (var i = 0; i < this.rows.length; i++) { var row = this.rows[i]; if (!row.value) continue; var prefixName = this.name + "." + row.value + "."; var prefixTitle = this.processedTitle + "." + row.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.clearValueIfInvisible = function () { _super.prototype.clearValueIfInvisible.call(this); this.clearInvisibleValuesInRows(); }; QuestionMatrixDropdownModel.prototype.getRowName = function (row) { return row.rowName; }; 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__["a" /* Serializer */].addClass("matrixdropdown", [ { name: "rows:itemvalue[]" }, "rowsVisibleIf:condition", { name: "totalText", serializationProperty: "locTotalText" } ], function () { return new QuestionMatrixDropdownModel(""); }, "matrixdropdownbase"); __WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrixdropdown", function (name) { var q = new QuestionMatrixDropdownModel(name); q.choices = [1, 2, 3, 4, 5]; q.rows = __WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].DefaultColums; __WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["a" /* QuestionMatrixDropdownModelBase */].addDefaultColumns(q); return q; }); /***/ }), /* 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__question_matrixdropdownbase__ = __webpack_require__(21); /* 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__(11); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__helpers__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__settings__ = __webpack_require__(9); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "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(value); return _this; } Object.defineProperty(MatrixDynamicRowModel.prototype, "rowName", { get: function () { return this.id; }, enumerable: true, configurable: true }); return MatrixDynamicRowModel; }(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["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 > __WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].matrixMaximumRowCount) 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", __WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].matrixMaximumRowCount); }, set: function (val) { if (val <= 0) return; if (val > __WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].matrixMaximumRowCount) val = __WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].matrixMaximumRowCount; if (val == this.maxRowCount) return; this.setPropertyValue("maxRowCount", val); if (val < this.minRowCount) this.minRowCount = val; if (this.rowCount > val) this.rowCount = val; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionMatrixDynamicModel.prototype, "canAddRow", { /** * Returns true, if a new row can be added. * @see maxRowCount * @see 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(); 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.isRequireConfirmOnRowDelete(value) || confirm(this.confirmDeleteText)) { this.removeRow(value); } }; QuestionMatrixDynamicModel.prototype.isRequireConfirmOnRowDelete = function (index) { if (!this.confirmDelete) return false; if (index < 0 || index >= this.rowCount) return false; var value = this.createNewValue(); if (__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(value) || !Array.isArray(value)) return false; if (index >= value.length) return false; return !__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(value[index]); }; /** * Removes a row by it's index. * @param index a row index, from 0 to rowCount - 1 */ QuestionMatrixDynamicModel.prototype.removeRow = function (index) { if (!this.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); } this.rowCountValue--; if (this.value) { var val = this.createNewValue(); val.splice(index, 1); val = this.deleteRowValue(val, null); this.isRowChanging = true; this.value = val; this.isRowChanging = false; } 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. <br/> * 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.createValueCopy(); if (!values || !Array.isArray(values)) return values; var rows = this.visibleRows; for (var i = 0; i < rows.length && i < values.length; i++) { var val = values[i]; if (!val) continue; values[i] = this.getRowDisplayValue(rows[i], val); } return values; }; QuestionMatrixDynamicModel.prototype.addConditionNames = function (names) { for (var i = 0; i < this.columns.length; i++) { names.push(this.name + "[0]." + this.columns[i].name); } }; QuestionMatrixDynamicModel.prototype.addConditionObjectsByContext = function (objects, context) { var hasContext = !!context ? this.columns.indexOf(context) > -1 : false; for (var i = 0; i < this.columns.length; i++) { var column = this.columns[i]; objects.push({ name: this.name + "[0]." + column.name, text: this.processedTitle + "[0]." + column.fullTitle, question: this }); if (hasContext && column != context) { objects.push({ name: "row." + column.name, text: "row." + column.fullTitle, question: this }); } } }; QuestionMatrixDynamicModel.prototype.supportGoNextPageAutomatic = function () { return false; }; QuestionMatrixDynamicModel.prototype.onCheckForErrors = function (errors) { _super.prototype.onCheckForErrors.call(this, errors); if (this.hasErrorInRows()) { errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["i" /* MinRowCountError */](this.minRowCount, this)); } }; 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__["h" /* KeyDuplicationError */](this.keyDuplicationError, this)); return true; } } keyValues.push(value); return false; }; QuestionMatrixDynamicModel.prototype.generateRows = function () { var result = new Array(); if (this.rowCount === 0) return result; var val = this.createNewValue(); for (var i = 0; i < this.rowCount; i++) { result.push(this.createMatrixRow(this.getRowValueByIndex(val, i))); } if (!this.isValueEmpty(this.getDefaultRowValue(false))) { this.value = val; } return result; }; QuestionMatrixDynamicModel.prototype.createMatrixRow = function (value) { return new MatrixDynamicRowModel(this.rowCounter++, this, value); }; QuestionMatrixDynamicModel.prototype.onBeforeValueChanged = function (val) { 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 () { var result = this.createValueCopy(); if (!result || !Array.isArray(result)) result = []; if (result.length > this.rowCount) result.splice(this.rowCount); var rowValue = this.getDefaultRowValue(false); rowValue = rowValue || {}; for (var i = result.length; i < this.rowCount; i++) { result.push(__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].getUnbindValue(rowValue)); } return result; }; QuestionMatrixDynamicModel.prototype.deleteRowValue = function (newValue, row) { var isEmpty = true; for (var i = 0; i < newValue.length; i++) { if (this.isObject(newValue[i]) && Object.keys(newValue[i]).length > 0) { isEmpty = false; break; } } return isEmpty ? null : newValue; }; QuestionMatrixDynamicModel.prototype.getRowValueByIndex = function (questionValue, index) { return index >= 0 && index < questionValue.length ? questionValue[index] : null; }; QuestionMatrixDynamicModel.prototype.getRowValueCore = function (row, questionValue, create) { if (create === void 0) { create = false; } if (!this.generatedVisibleRows) return {}; return this.getRowValueByIndex(questionValue, this.generatedVisibleRows.indexOf(row)); }; return QuestionMatrixDynamicModel; }(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["a" /* QuestionMatrixDropdownModelBase */])); __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addClass("matrixdynamic", [ { name: "rowsVisibleIf:condition", visible: false }, { name: "rowCount:number", default: 2 }, { name: "minRowCount:number", default: 0 }, { name: "maxRowCount:number", default: __WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].matrixMaximumRowCount }, { name: "keyName" }, { name: "keyDuplicationError", serializationProperty: "locKeyDuplicationError" }, "defaultRowValue:rowvalue", "defaultValueFromLastRow:boolean", { name: "confirmDelete:boolean" }, { name: "confirmDeleteText", serializationProperty: "locConfirmDeleteText" }, { name: "addRowLocation", default: "default", choices: ["default", "top", "bottom", "topBottom"] }, { name: "addRowText", serializationProperty: "locAddRowText" }, { name: "removeRowText", serializationProperty: "locRemoveRowText" } ], function () { return new QuestionMatrixDynamicModel(""); }, "matrixdropdownbase"); __WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrixdynamic", function (name) { var q = new QuestionMatrixDynamicModel(name); q.choices = [1, 2, 3, 4, 5]; __WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["a" /* QuestionMatrixDropdownModelBase */].addDefaultColumns(q); 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__base__ = __webpack_require__(5); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(8); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_text__ = __webpack_require__(31); /* 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__(4); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MultipleTextItemModel; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMultipleTextModel; }); var MultipleTextItemModel = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](MultipleTextItemModel, _super); function MultipleTextItemModel(name, title) { if (name === void 0) { name = null; } if (title === void 0) { title = null; } var _this = _super.call(this) || this; _this.editorValue = _this.createEditor(name); _this.editor.questionTitleTemplateCallback = function () { return ""; }; _this.editor.titleLocation = "left"; if (title) { _this.title = title; } return _this; } MultipleTextItemModel.prototype.getType = function () { return "multipletextitem"; }; Object.defineProperty(MultipleTextItemModel.prototype, "id", { get: function () { return this.editor.id; }, enumerable: true, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "name", { /** * The item name. */ get: function () { return this.editor.name; }, set: function (val) { this.editor.name = val; }, enumerable: true, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "editor", { get: function () { return this.editorValue; }, enumerable: true, configurable: true }); MultipleTextItemModel.prototype.createEditor = function (name) { return new __WEBPACK_IMPORTED_MODULE_3__question_text__["a" /* QuestionTextModel */](name); }; MultipleTextItemModel.prototype.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.editor.maxLength; }, set: function (val) { this.editor.maxLength = val; }, enumerable: true, configurable: true }); MultipleTextItemModel.prototype.getMaxLength = function () { var survey = this.getSurvey(); return __WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].getMaxLength(this.maxLength, survey ? survey.maxTextLength : -1); }; Object.defineProperty(MultipleTextItemModel.prototype, "placeHolder", { /** * The input place holder. */ get: function () { return this.editor.placeHolder; }, set: function (val) { this.editor.placeHolder = val; }, enumerable: true, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "locPlaceHolder", { get: function () { return this.editor.locPlaceHolder; }, enumerable: true, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "requiredErrorText", { /** * The custom text that will be shown on required error. Use this property, if you do not want to show the default text. */ get: function () { return this.editor.requiredErrorText; }, set: function (val) { this.editor.requiredErrorText = val; }, enumerable: true, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "locRequiredErrorText", { get: function () { return this.editor.locRequiredErrorText; }, enumerable: true, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "validators", { /** * The list of question validators. */ get: function () { return this.editor.validators; }, set: function (val) { this.editor.validators = val; }, enumerable: true, configurable: true }); Object.defineProperty(MultipleTextItemModel.prototype, "value", { /** * The item value. */ get: function () { return this.data ? this.data.getMultipleTextValue(this.name) : null; }, set: function (value) { if (this.data != null) { this.data.setMultipleTextValue(this.name, value); } }, enumerable: true, configurable: true }); MultipleTextItemModel.prototype.isEmpty = function () { return __WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(this.value); }; MultipleTextItemModel.prototype.onValueChanged = function (newValue) { if (this.valueChangedCallback) this.valueChangedCallback(newValue); }; //ISurveyImpl MultipleTextItemModel.prototype.geSurveyData = function () { return this; }; MultipleTextItemModel.prototype.getSurvey = function () { return this.data ? this.data.getSurvey() : null; }; MultipleTextItemModel.prototype.getTextProcessor = function () { return this.data ? this.data.getTextProcessor() : null; }; //ISurveyData MultipleTextItemModel.prototype.getValue = function (name) { if (!this.data) return null; return this.data.getMultipleTextValue(name); }; MultipleTextItemModel.prototype.setValue = function (name, value) { if (this.data) { this.data.setMultipleTextValue(name, value); } }; MultipleTextItemModel.prototype.getComment = function (name) { return null; }; MultipleTextItemModel.prototype.setComment = function (name, newValue) { }; MultipleTextItemModel.prototype.getAllValues = function () { if (this.data) return this.data.getAllValues(); return this.value; }; MultipleTextItemModel.prototype.getFilteredValues = function () { return this.getAllValues(); }; MultipleTextItemModel.prototype.getFilteredProperties = function () { return { survey: this.getSurvey() }; }; //IValidatorOwner MultipleTextItemModel.prototype.getValidatorTitle = function () { return this.title; }; Object.defineProperty(MultipleTextItemModel.prototype, "validatedValue", { get: function () { return this.value; }, set: function (val) { this.value = val; }, enumerable: true, configurable: true }); MultipleTextItemModel.prototype.getDataFilteredValues = function () { return this.getFilteredValues(); }; MultipleTextItemModel.prototype.getDataFilteredProperties = function () { return this.getFilteredProperties(); }; return MultipleTextItemModel; }(__WEBPACK_IMPORTED_MODULE_1__base__["b" /* Base */])); /** * A Model for a multiple text question. */ var QuestionMultipleTextModel = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMultipleTextModel, _super); function QuestionMultipleTextModel(name) { var _this = _super.call(this, name) || this; _this.name = name; _this.isMultipleItemValueChanging = false; var self = _this; _this.items = _this.createNewArray("items", function (item) { item.setData(self); }); _this.registerFunctionOnPropertyValueChanged("items", function () { self.fireCallback(self.colCountChangedCallback); }); _this.registerFunctionOnPropertyValueChanged("colCount", function () { self.fireCallback(self.colCountChangedCallback); }); return _this; } QuestionMultipleTextModel.prototype.getType = function () { return "multipletext"; }; QuestionMultipleTextModel.prototype.setSurveyImpl = function (value) { _super.prototype.setSurveyImpl.call(this, value); for (var i = 0; i < this.items.length; i++) { this.items[i].setData(this); } }; Object.defineProperty(QuestionMultipleTextModel.prototype, "isAllowTitleLeft", { get: function () { return false; }, enumerable: true, configurable: true }); QuestionMultipleTextModel.prototype.onSurveyLoad = function () { this.editorsOnSurveyLoad(); _super.prototype.onSurveyLoad.call(this); this.fireCallback(this.colCountChangedCallback); }; QuestionMultipleTextModel.prototype.setQuestionValue = function (newValue) { _super.prototype.setQuestionValue.call(this, newValue); for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; if (item.editor) item.editor.updateValueFromSurvey(item.value); } }; QuestionMultipleTextModel.prototype.onSurveyValueChanged = function (newValue) { _super.prototype.onSurveyValueChanged.call(this, newValue); for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; if (item.editor) item.editor.onSurveyValueChanged(item.value); } }; QuestionMultipleTextModel.prototype.editorsOnSurveyLoad = function () { for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; if (item.editor) { item.editor.onSurveyLoad(); } } }; Object.defineProperty(QuestionMultipleTextModel.prototype, "items", { /** * The list of input items. */ get: function () { return this.getPropertyValue("items"); }, set: function (val) { this.setPropertyValue("items", val); }, enumerable: true, configurable: true }); /** * Add a new text item. * @param name a item name * @param title a item title (optional) */ QuestionMultipleTextModel.prototype.addItem = function (name, title) { if (title === void 0) { title = null; } var item = this.createTextItem(name, title); this.items.push(item); return item; }; QuestionMultipleTextModel.prototype.getItemByName = function (name) { for (var i = 0; i < this.items.length; i++) { if (this.items[i].name == name) return this.items[i]; } return null; }; QuestionMultipleTextModel.prototype.addConditionNames = function (names) { for (var i = 0; i < this.items.length; i++) { names.push(this.name + "." + this.items[i].name); } }; QuestionMultipleTextModel.prototype.addConditionObjectsByContext = function (objects, context) { for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; objects.push({ name: this.name + "." + item.name, text: this.processedTitle + "." + item.fullTitle, question: this }); } }; QuestionMultipleTextModel.prototype.getConditionJson = function (operator, path) { if (operator === void 0) { operator = null; } if (path === void 0) { path = null; } if (!path) return _super.prototype.getConditionJson.call(this); var item = this.getItemByName(path); if (!item) return null; var json = new __WEBPACK_IMPORTED_MODULE_4__jsonobject__["b" /* JsonObject */]().toJsonObject(item); json["type"] = "text"; return json; }; QuestionMultipleTextModel.prototype.locStrsChanged = function () { _super.prototype.locStrsChanged.call(this); for (var i = 0; i < this.items.length; i++) { this.items[i].locStrsChanged(); } }; QuestionMultipleTextModel.prototype.supportGoNextPageAutomatic = function () { for (var i = 0; i < this.items.length; i++) { if (this.items[i].isEmpty()) return false; } return true; }; Object.defineProperty(QuestionMultipleTextModel.prototype, "colCount", { /** * The number of columns. Items are rendred in one line if the value is 0. */ get: function () { return this.getPropertyValue("colCount", 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.hasErrors = function (fireCallback) { if (fireCallback === void 0) { fireCallback = true; } var res = _super.prototype.hasErrors.call(this, fireCallback); for (var i = 0; i < this.items.length; i++) { res = this.items[i].editor.hasErrors(fireCallback) || res; } return res; }; QuestionMultipleTextModel.prototype.getAllErrors = function () { var result = _super.prototype.getAllErrors.call(this); for (var i = 0; i < this.items.length; i++) { var errors = this.items[i].editor.getAllErrors(); if (errors && errors.length > 0) { result = result.concat(errors); } } return result; }; QuestionMultipleTextModel.prototype.clearErrors = function () { _super.prototype.clearErrors.call(this); for (var i = 0; i < this.items.length; i++) { this.items[i].editor.clearErrors(); } }; //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.getChildrenLayoutType = function () { return "row"; }; QuestionMultipleTextModel.prototype.elementWidthChanged = function (el) { }; return QuestionMultipleTextModel; }(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */])); __WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("multipletextitem", [ "name", "isRequired:boolean", { name: "placeHolder", serializationProperty: "locPlaceHolder" }, { name: "inputType", default: "text", choices: [ "color", "date", "datetime", "datetime-local", "email", "month", "number", "password", "range", "tel", "text", "time", "url", "week" ] }, { name: "title", serializationProperty: "locTitle" }, { name: "maxLength:number", default: -1 }, { name: "requiredErrorText:text", serializationProperty: "locRequiredErrorText" }, { name: "validators:validators", baseClassName: "surveyvalidator", classNamePart: "validator" } ], function () { return new MultipleTextItemModel(""); }); __WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].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_5__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("multipletext", function (name) { var q = new QuestionMultipleTextModel(name); q.addItem("text1"); q.addItem("text2"); return q; }); /***/ }), /* 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__helpers__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__surveyStrings__ = __webpack_require__(2); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__textPreProcessor__ = __webpack_require__(22); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditionProcessValue__ = __webpack_require__(16); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__question__ = __webpack_require__(8); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__panel__ = __webpack_require__(19); /* 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__(11); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__settings__ = __webpack_require__(9); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionPanelDynamicItem; }); /* unused harmony export QuestionPanelDynamicTemplateSurveyImpl */ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionPanelDynamicModel; }); var QuestionPanelDynamicItem = /** @class */ (function () { function QuestionPanelDynamicItem(data, panel) { this.data = data; this.panelValue = panel; var self = this; this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_3__textPreProcessor__["a" /* TextPreProcessor */](); this.textPreProcessor.onProcess = function (textValue) { self.getProcessedTextValue(textValue); }; this.setSurveyImpl(); } Object.defineProperty(QuestionPanelDynamicItem.prototype, "panel", { get: function () { return this.panelValue; }, enumerable: true, configurable: true }); QuestionPanelDynamicItem.prototype.setSurveyImpl = function () { this.panel.setSurveyImpl(this); }; QuestionPanelDynamicItem.prototype.getValue = function (name) { var values = this.getAllValues(); return values[name]; }; QuestionPanelDynamicItem.prototype.setValue = function (name, newValue) { this.data.setPanelItemData(this, name, newValue); }; QuestionPanelDynamicItem.prototype.getComment = function (name) { var result = this.getValue(name + __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].commentPrefix); return result ? result : ""; }; QuestionPanelDynamicItem.prototype.setComment = function (name, newValue) { this.setValue(name + __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].commentPrefix, newValue); }; QuestionPanelDynamicItem.prototype.getAllValues = function () { return this.data.getPanelItemData(this); }; QuestionPanelDynamicItem.prototype.getFilteredValues = function () { var values = { panel: this.getAllValues() }; var surveyValues = !!this.data && !!this.data.getRootData() ? this.data.getRootData().getFilteredValues() : {}; for (var key in surveyValues) { values[key] = surveyValues[key]; } return values; }; QuestionPanelDynamicItem.prototype.getFilteredProperties = function () { if (!!this.data && !!this.data.getRootData()) return this.data.getRootData().getFilteredProperties(); return { survey: this.getSurvey() }; }; QuestionPanelDynamicItem.prototype.geSurveyData = function () { return this; }; QuestionPanelDynamicItem.prototype.getSurvey = function () { return this.data ? this.data.getSurvey() : null; }; QuestionPanelDynamicItem.prototype.getTextProcessor = function () { return this; }; //ITextProcessor QuestionPanelDynamicItem.prototype.getProcessedTextValue = function (textValue) { if (!textValue) return; 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); if (!question && !!this.data) { question = this.data.getSharedQuestionFromArray(firstName, this.data.getItemIndex(this)); } var values = {}; if (question) { values[firstName] = textValue.returnDisplayValue ? question.displayValue : question.value; } else { var allValues = this.getAllValues(); if (allValues) { values[firstName] = allValues[firstName]; } } textValue.value = new __WEBPACK_IMPORTED_MODULE_4__conditionProcessValue__["a" /* ProcessValue */]().getValue(textValue.name, values); }; QuestionPanelDynamicItem.prototype.processText = function (text, returnDisplayValue) { text = this.textPreProcessor.process(text, returnDisplayValue); var survey = this.getSurvey(); return survey ? survey.processText(text, returnDisplayValue) : text; }; QuestionPanelDynamicItem.prototype.processTextEx = function (text, returnDisplayValue) { text = this.processText(text, returnDisplayValue); var hasAllValuesOnLastRun = this.textPreProcessor.hasAllValuesOnLastRun; var res = { hasAllValuesOnLastRun: true, text: text }; if (this.getSurvey()) { res = this.getSurvey().processTextEx(text, returnDisplayValue, false); } res.hasAllValuesOnLastRun = res.hasAllValuesOnLastRun && hasAllValuesOnLastRun; return res; }; QuestionPanelDynamicItem.ItemVariableName = "panel"; QuestionPanelDynamicItem.IndexVariableName = "panelIndex"; return QuestionPanelDynamicItem; }()); var QuestionPanelDynamicTemplateSurveyImpl = /** @class */ (function () { function QuestionPanelDynamicTemplateSurveyImpl(data) { this.data = data; } QuestionPanelDynamicTemplateSurveyImpl.prototype.geSurveyData = function () { return null; }; QuestionPanelDynamicTemplateSurveyImpl.prototype.getSurvey = function () { return this.data.getSurvey(); }; QuestionPanelDynamicTemplateSurveyImpl.prototype.getTextProcessor = function () { return null; }; return QuestionPanelDynamicTemplateSurveyImpl; }()); /** * A Model for a panel dymanic question. You setup the template panel, but adding elements (any question or a panel) and assign a text to it's title, and this panel will be used as a template on creating dynamic panels. The number of panels is defined by panelCount property. * An end-user may dynamically add/remove panels, unless you forbidden this. */ var QuestionPanelDynamicModel = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionPanelDynamicModel, _super); function QuestionPanelDynamicModel(name) { var _this = _super.call(this, name) || this; _this.name = name; _this.loadingPanelCount = 0; _this.currentIndexValue = -1; _this.isAddingNewPanels = false; _this.createNewArray("panels"); _this.templateValue = _this.createAndSetupNewPanelObject(); _this.template.renderWidth = "100%"; _this.template.selectedElementInDesign = _this; var self = _this; _this.template.addElementCallback = function (element) { self.addOnPropertyChangedCallback(element); self.rebuildPanels(); }; _this.template.removeElementCallback = function (element) { self.rebuildPanels(); }; _this.createLocalizableString("confirmDeleteText", _this); _this.createLocalizableString("keyDuplicationError", _this); _this.createLocalizableString("panelAddText", _this); _this.createLocalizableString("panelRemoveText", _this); _this.createLocalizableString("panelPrevText", _this); _this.createLocalizableString("panelNextText", _this); _this.registerFunctionOnPropertyValueChanged("panelsState", function () { self.setPanelsState(); }); return _this; } QuestionPanelDynamicModel.prototype.setSurveyImpl = function (value) { _super.prototype.setSurveyImpl.call(this, value); this.setTemplatePanelSurveyImpl(); this.setPanelsSurveyImpl(); }; QuestionPanelDynamicModel.prototype.assignOnPropertyChangedToTemplate = function () { var elements = this.template.elements; for (var i = 0; i < elements.length; i++) { this.addOnPropertyChangedCallback(elements[i]); } }; QuestionPanelDynamicModel.prototype.addOnPropertyChangedCallback = function (element) { var self = this; element.onPropertyChanged.add(function (element, options) { self.onTemplateElementPropertyChanged(element, options); }); if (element.isPanel) { element.addElementCallback = function (element) { self.addOnPropertyChangedCallback(element); }; } }; QuestionPanelDynamicModel.prototype.onTemplateElementPropertyChanged = function (element, options) { if (this.isLoadingFromJson || this.isDesignMode || this.panels.length == 0) return; var property = __WEBPACK_IMPORTED_MODULE_7__jsonobject__["a" /* Serializer */].findProperty(element.getType(), options.name); if (!property) return; var panels = this.panels; for (var i = 0; i < panels.length; i++) { var question = panels[i].getQuestionByName(element.name); if (!!question && question[options.name] !== options.newValue) { question[options.name] = options.newValue; } } }; QuestionPanelDynamicModel.prototype.getType = function () { return "paneldynamic"; }; Object.defineProperty(QuestionPanelDynamicModel.prototype, "isAllowTitleLeft", { get: function () { return false; }, enumerable: true, configurable: true }); QuestionPanelDynamicModel.prototype.removeElement = function (element) { return this.template.removeElement(element); }; Object.defineProperty(QuestionPanelDynamicModel.prototype, "template", { /** * The template Panel. This panel is used as a template on creatign dynamic panels * @see templateElements * @see templateTitle * @see panelCount */ get: function () { return this.templateValue; }, enumerable: true, configurable: true }); QuestionPanelDynamicModel.prototype.getPanel = function () { return this.template; }; Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateElements", { /** * The template Panel elements, questions and panels. * @see templateElements * @see template * @see panelCount */ get: function () { return this.template.elements; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateTitle", { /** * The template Panel title property. * @see templateElements * @see template * @see panelCount */ get: function () { return this.template.title; }, set: function (newValue) { this.template.title = newValue; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "locTemplateTitle", { get: function () { return this.template.locTitle; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateDescription", { /** * The template Panel description property. * @see templateElements * @see template * @see panelCount * @see templateTitle */ get: function () { return this.template.description; }, set: function (newValue) { this.template.description = newValue; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "locTemplateDescription", { get: function () { return this.template.locDescription; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "items", { get: function () { var res = []; for (var i = 0; i < this.panels.length; i++) { res.push(this.panels[i].data); } return res; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "panels", { /** * The array of dynamic panels created based on panel template * @see template * @see panelCount */ get: function () { return this.getPropertyValue("panels"); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "currentIndex", { /** * The index of current active dynamical panel when the renderMode is not "list". If there is no dymamic panel (panelCount = 0) or renderMode equals "list" it returns -1, otherwise it returns a value from 0 to panelCount - 1. * @see currentPanel * @see panels * @see panelCount * @see renderMode */ get: function () { if (this.isRenderModeList) return -1; if (this.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; }; QuestionPanelDynamicModel.prototype.prepareValueForPanelCreating = function () { this.addingNewPanelsValue = this.value; this.isAddingNewPanels = true; this.isNewPanelsValueChanged = false; }; QuestionPanelDynamicModel.prototype.setValueAfterPanelsCreating = function () { this.isAddingNewPanels = false; if (this.isNewPanelsValueChanged) { this.isValueChangingInternally = true; this.value = this.addingNewPanelsValue; this.isValueChangingInternally = false; } }; QuestionPanelDynamicModel.prototype.getValueCore = function () { return this.isAddingNewPanels ? this.addingNewPanelsValue : _super.prototype.getValueCore.call(this); }; QuestionPanelDynamicModel.prototype.setValueCore = function (newValue) { if (this.isAddingNewPanels) { this.isNewPanelsValueChanged = true; this.addingNewPanelsValue = newValue; } else { _super.prototype.setValueCore.call(this, newValue); } }; Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelCount", { /** * Use this property to get/set the number of dynamic panels. * @see template * @see minPanelCount * @see maxPanelCount * @see addPanel * @see removePanel * @see removePanelUI */ get: function () { return this.isLoadingFromJson || this.isDesignMode ? this.loadingPanelCount : this.panels.length; }, set: function (val) { if (val < 0) return; if (this.isLoadingFromJson || this.isDesignMode) { this.loadingPanelCount = val; return; } if (val == this.panels.length || this.isDesignMode) return; this.prepareValueForPanelCreating(); for (var i = this.panelCount; i < val; i++) { var panel = this.createNewPanel(); this.panels.push(panel); if (this.renderMode == "list" && this.panelsState != "default") { if (this.panelsState === "expand") { panel.expand(); } else { panel.collapse(); } } } if (val < this.panelCount) this.panels.splice(val, this.panelCount - val); this.setValueAfterPanelsCreating(); this.setValueBasedOnPanelCount(); this.reRunCondition(); this.fireCallback(this.panelCountChangedCallback); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelsState", { /** * Use this property to allow the end-user to collapse/expand the panels. It works only if the renderMode property equals to "list" and templateTitle property is not empty. The following values are available: * <br/> default - the default value. User can't collpase/expand panels * <br/> expanded - User can collpase/expand panels and all panels are expanded by default * <br/> collapsed - User can collpase/expand panels and all panels are collapsed by default * <br/> 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.setTemplatePanelSurveyImpl = function () { this.template.setSurveyImpl(this.isDesignMode ? this.surveyImpl : new QuestionPanelDynamicTemplateSurveyImpl(this)); }; QuestionPanelDynamicModel.prototype.setPanelsSurveyImpl = function () { for (var i = 0; i < this.panels.length; i++) { var panel = this.panels[i]; if (panel == this.template) continue; panel.setSurveyImpl(panel.data); } }; QuestionPanelDynamicModel.prototype.setPanelsState = function () { if (this.isDesignMode || this.renderMode != "list") return; for (var i = 0; i < this.panels.length; i++) { var state = this.panelsState; if (state === "firstExpanded") { state = i === 0 ? "expanded" : "collapsed"; } this.panels[i].state = state; } }; QuestionPanelDynamicModel.prototype.setValueBasedOnPanelCount = function () { var value = this.value; if (!value || !Array.isArray(value)) value = []; if (value.length == this.panelCount) return; for (var i = value.length; i < this.panelCount; i++) value.push({}); if (value.length > this.panelCount) { value.splice(this.panelCount, value.length - this.panelCount); } this.isValueChangingInternally = true; this.value = value; this.isValueChangingInternally = false; }; Object.defineProperty(QuestionPanelDynamicModel.prototype, "minPanelCount", { /** * The minimum panel count. A user could not delete a panel if the panelCount equals to minPanelCount * @see panelCount * @see maxPanelCount */ get: function () { return this.getPropertyValue("minPanelCount", 0); }, set: function (val) { if (val < 0) val = 0; if (val == this.minPanelCount) return; this.setPropertyValue("minPanelCount", val); if (val > this.maxPanelCount) this.maxPanelCount = val; if (this.panelCount < val) this.panelCount = val; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "maxPanelCount", { /** * The maximum panel count. A user could not add a panel if the panelCount equals to maxPanelCount * @see panelCount * @see minPanelCount */ get: function () { return this.getPropertyValue("maxPanelCount", __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].panelMaximumPanelCount); }, set: function (val) { if (val <= 0) return; if (val > __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].panelMaximumPanelCount) val = __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].panelMaximumPanelCount; if (val == this.maxPanelCount) return; this.setPropertyValue("maxPanelCount", val); if (val < this.minPanelCount) this.minPanelCount = val; if (this.panelCount > val) this.panelCount = val; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "allowAddPanel", { /** * Set this property to false to hide the 'Add New' button * @see allowRemovePanel */ get: function () { return this.getPropertyValue("allowAddPanel", 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.panels.length; i++) { var counter = this.setPanelVisibleIndex(this.panels[i], startIndex, this.showQuestionNumbers != "off"); if (this.showQuestionNumbers == "onSurvey") { startIndex += counter; } } _super.prototype.setVisibleIndex.call(this, this.showQuestionNumbers != "onSurvey" ? value : -1); return this.showQuestionNumbers != "onSurvey" ? 1 : startIndex - value; }; QuestionPanelDynamicModel.prototype.setPanelVisibleIndex = function (panel, index, showIndex) { if (!showIndex) { panel.setVisibleIndex(-1); return 0; } return panel.setVisibleIndex(index); }; Object.defineProperty(QuestionPanelDynamicModel.prototype, "canAddPanel", { /** * Returns true when an end user may add a new panel. The question is not read only and panelCount less than maxPanelCount * @see isReadOnly * @see panelCount * @see maxPanelCount */ get: function () { if (this.survey && this.survey.isDesignMode) return false; return (this.allowAddPanel && !this.isReadOnly && this.panelCount < this.maxPanelCount); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "canRemovePanel", { /** * Returns true when an end user may remove a panel. The question is not read only and panelCount is more than minPanelCount * @see isReadOnly * @see panelCount * @see minPanelCount */ get: function () { if (this.survey && this.survey.isDesignMode) return false; return (this.allowRemovePanel && !this.isReadOnly && this.panelCount > this.minPanelCount); }, enumerable: true, configurable: true }); QuestionPanelDynamicModel.prototype.rebuildPanels = function () { if (this.isLoadingFromJson) return; this.prepareValueForPanelCreating(); var panels = []; if (this.isDesignMode) { new QuestionPanelDynamicItem(this, this.template); panels.push(this.template); } else { for (var i = 0; i < this.panelCount; i++) { panels.push(this.createNewPanel()); } } (_a = this.panels).splice.apply(_a, [0, this.panels.length].concat(panels)); this.setValueAfterPanelsCreating(); this.setPanelsState(); this.reRunCondition(); this.fireCallback(this.panelCountChangedCallback); var _a; }; Object.defineProperty(QuestionPanelDynamicModel.prototype, "defaultPanelValue", { /** * If it is not empty, then this value is set to every new panel, including panels created initially, unless the defaultValue is not empty * @see defaultValue * @see defaultValueFromLastRow */ get: function () { return this.getPropertyValue("defaultPanelValue"); }, set: function (val) { this.setPropertyValue("defaultPanelValue", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionPanelDynamicModel.prototype, "defaultValueFromLastPanel", { /** * Set it to true to copy the value into new added panel from the last panel. If defaultPanelValue is set and this property equals to true, * then the value for new added panel is merging. * @see defaultValue * @see defaultPanelValue */ get: function () { return this.getPropertyValue("defaultValueFromLastPanel", false); }, set: function (val) { this.setPropertyValue("defaultValueFromLastPanel", val); }, enumerable: true, configurable: true }); QuestionPanelDynamicModel.prototype.isDefaultValueEmpty = function () { return (_super.prototype.isDefaultValueEmpty.call(this) && this.isValueEmpty(this.defaultPanelValue)); }; QuestionPanelDynamicModel.prototype.setDefaultValue = function () { if (this.isValueEmpty(this.defaultPanelValue) || !this.isValueEmpty(this.defaultValue)) { _super.prototype.setDefaultValue.call(this); return; } if (!this.isEmpty() || this.panelCount == 0) return; var newValue = []; for (var i = 0; i < this.panelCount; i++) { newValue.push(this.defaultPanelValue); } this.value = newValue; }; QuestionPanelDynamicModel.prototype.isEmpty = function () { var val = this.value; if (!val || !Array.isArray(val)) return true; for (var i = 0; i < val.length; i++) { if (!this.isRowEmpty(val[i])) return false; } return true; }; QuestionPanelDynamicModel.prototype.isRowEmpty = function (val) { for (var prop in val) { if (val.hasOwnProperty(prop)) return false; } return true; }; /** * Add a new dynamic panel based on the template Panel. It checks if canAddPanel returns true and then calls addPanel method. * @see template * @see panelCount * @see panels * @see canAddPanel */ QuestionPanelDynamicModel.prototype.addPanelUI = function () { if (!this.canAddPanel) return null; var newPanel = this.addPanel(); if (this.renderMode === "list" && this.panelsState !== "default") { newPanel.expand(); } return newPanel; }; /** * Add a new dynamic panel based on the template Panel. * @see template * @see panelCount * @see panels */ QuestionPanelDynamicModel.prototype.addPanel = function () { this.panelCount++; if (!this.isRenderModeList) { this.currentIndex = this.panelCount - 1; } var newValue = this.value; var hasModified = false; if (!this.isValueEmpty(this.defaultPanelValue)) { if (!!newValue && Array.isArray(newValue) && newValue.length == this.panelCount) { hasModified = true; this.copyValue(newValue[newValue.length - 1], this.defaultPanelValue); } } if (this.defaultValueFromLastPanel && !!newValue && Array.isArray(newValue) && newValue.length > 1 && newValue.length == this.panelCount) { hasModified = true; this.copyValue(newValue[newValue.length - 1], newValue[newValue.length - 2]); } if (hasModified) { this.value = newValue; } if (this.survey) this.survey.dynamicPanelAdded(this); return this.panels[this.panelCount - 1]; }; QuestionPanelDynamicModel.prototype.copyValue = function (src, dest) { for (var key in dest) { src[key] = dest[key]; } }; /** * Call removePanel function. Do nothing is canRemovePanel returns false. If confirmDelete set to true, it shows the confirmation dialog first. * @param value a panel or panel index * @see removePanel * @see confirmDelete * @see confirmDeleteText * @see canRemovePanel * */ QuestionPanelDynamicModel.prototype.removePanelUI = function (value) { if (!this.canRemovePanel) return; if (!this.confirmDelete || confirm(this.confirmDeleteText)) { this.removePanel(value); } }; /** * Goes to the next panel in the PanelDynamic * */ QuestionPanelDynamicModel.prototype.goToNextPanel = function () { if (this.renderMode !== "list" && this.currentPanel.hasErrors()) return; this.currentIndex++; }; /** * Goes to the previous panel in the PanelDynamic * */ QuestionPanelDynamicModel.prototype.goToPrevPanel = function () { this.currentIndex--; }; /** * Removes a dynamic panel from the panels array. * @param value a panel or panel index * @see panels * @see template */ QuestionPanelDynamicModel.prototype.removePanel = function (value) { var index = this.getPanelIndex(value); if (index < 0 || index >= this.panelCount) return; this.panels.splice(index, 1); var value = this.value; if (!value || !Array.isArray(value) || index >= value.length) return; value.splice(index, 1); this.value = value; this.fireCallback(this.panelCountChangedCallback); if (this.survey) this.survey.dynamicPanelRemoved(this, index); }; QuestionPanelDynamicModel.prototype.getPanelIndex = function (val) { if (!isNaN(parseFloat(val)) && isFinite(val)) return val; var items = this.items; for (var i = 0; i < this.panels.length; i++) { if (this.panels[i] === val || items[i] === val) return i; } return -1; }; QuestionPanelDynamicModel.prototype.locStrsChanged = function () { _super.prototype.locStrsChanged.call(this); var panels = this.panels; for (var i = 0; i < panels.length; i++) { panels[i].locStrsChanged(); } }; QuestionPanelDynamicModel.prototype.clearIncorrectValues = function () { for (var i = 0; i < this.panels.length; i++) { this.clearIncorrectValuesInPanel(i); } }; QuestionPanelDynamicModel.prototype.clearErrors = function () { _super.prototype.clearErrors.call(this); for (var i = 0; i < this.panels.length; i++) { this.panels[i].clearErrors(); } }; QuestionPanelDynamicModel.prototype.getQuestionFromArray = function (name, index) { if (index >= this.panelCount) return null; return this.panels[index].getQuestionByName(name); }; QuestionPanelDynamicModel.prototype.clearIncorrectValuesInPanel = function (index) { var panel = this.panels[index]; panel.clearIncorrectValues(); var val = this.value; var values = !!val && index < val.length ? val[index] : null; if (!values) return; var isChanged = false; for (var key in values) { if (!panel.getQuestionByName(key) && !this.getSharedQuestionFromArray(key, index)) { delete values[key]; isChanged = true; } } if (isChanged) { val[index] = values; this.value = val; } }; QuestionPanelDynamicModel.prototype.getSharedQuestionFromArray = function (name, panelIndex) { return !!this.survey && !!this.valueName ? this.survey.getQuestionByValueNameFromArray(this.valueName, name, panelIndex) : null; }; QuestionPanelDynamicModel.prototype.addConditionNames = function (names) { var prefix = this.name + "[0]."; var panelNames = []; var questions = this.template.questions; for (var i = 0; i < questions.length; i++) { questions[i].addConditionNames(panelNames); } for (var i = 0; i < panelNames.length; i++) { names.push(prefix + panelNames[i]); } }; QuestionPanelDynamicModel.prototype.addConditionObjectsByContext = function (objects, context) { var hasContext = !!context ? this.template.questions.indexOf(context) > -1 : false; var prefixName = this.name + "[0]."; var prefixText = this.processedTitle + "[0]."; var panelObjs = new Array(); var questions = this.template.questions; for (var i = 0; i < questions.length; i++) { questions[i].addConditionObjectsByContext(panelObjs, context); } for (var i = 0; i < panelObjs.length; i++) { objects.push({ name: prefixName + panelObjs[i].name, text: prefixText + panelObjs[i].text, question: panelObjs[i].question }); } if (hasContext) { for (var i = 0; i < panelObjs.length; i++) { if (panelObjs[i].question == context) continue; objects.push({ name: "panel." + panelObjs[i].name, text: "panel." + panelObjs[i].text, question: panelObjs[i].question }); } } }; QuestionPanelDynamicModel.prototype.getConditionJson = function (operator, path) { if (operator === void 0) { operator = null; } if (path === void 0) { path = null; } if (!path) return _super.prototype.getConditionJson.call(this, operator, path); var questionName = path; var pos = path.indexOf("."); if (pos > -1) { questionName = path.substr(0, pos); path = path.substr(pos + 1); } var question = this.template.getQuestionByName(questionName); if (!question) return null; return question.getConditionJson(operator, path); }; QuestionPanelDynamicModel.prototype.onReadOnlyChanged = function () { var readOnly = this.isReadOnly; this.template.readOnly = readOnly; for (var i = 0; i < this.panels.length; i++) { this.panels[i].readOnly = readOnly; } _super.prototype.onReadOnlyChanged.call(this); }; QuestionPanelDynamicModel.prototype.onSurveyLoad = function () { this.template.readOnly = this.isReadOnly; this.template.onSurveyLoad(); if (this.loadingPanelCount > 0) { this.panelCount = this.loadingPanelCount; } if (this.isDesignMode) { this.rebuildPanels(); } this.setPanelsSurveyImpl(); this.setPanelsState(); this.assignOnPropertyChangedToTemplate(); _super.prototype.onSurveyLoad.call(this); }; QuestionPanelDynamicModel.prototype.onFirstRendering = function () { this.template.onFirstRendering(); for (var i = 0; i < this.panels.length; i++) { this.panels[i].onFirstRendering(); } _super.prototype.onFirstRendering.call(this); }; QuestionPanelDynamicModel.prototype.runCondition = function (values, properties) { _super.prototype.runCondition.call(this, values, properties); this.runPanelsCondition(values, properties); }; QuestionPanelDynamicModel.prototype.reRunCondition = function () { if (!this.data) return; this.runCondition(this.getDataFilteredValues(), this.getDataFilteredProperties()); }; QuestionPanelDynamicModel.prototype.runPanelsCondition = function (values, properties) { var newValues = {}; if (values && values instanceof Object) { newValues = JSON.parse(JSON.stringify(values)); } for (var i = 0; i < this.panels.length; i++) { var panelValues = this.getPanelItemData(this.panels[i].data); newValues[QuestionPanelDynamicItem.ItemVariableName] = panelValues; newValues[QuestionPanelDynamicItem.IndexVariableName] = i; this.panels[i].runCondition(newValues, properties); } }; QuestionPanelDynamicModel.prototype.onAnyValueChanged = function (name) { _super.prototype.onAnyValueChanged.call(this, name); for (var i = 0; i < this.panels.length; i++) { this.panels[i].onAnyValueChanged(name); this.panels[i].onAnyValueChanged(QuestionPanelDynamicItem.ItemVariableName); } }; QuestionPanelDynamicModel.prototype.hasErrors = function (fireCallback) { if (fireCallback === void 0) { fireCallback = true; } if (this.isValueChangingInternally) return false; if (!!this.changingValueQuestion) { return this.changingValueQuestion.hasErrors(fireCallback); } else { 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.getDisplayValueCore = function (keysAsText) { var values = this.createValueCopy(); if (!values || !Array.isArray(values)) return values; for (var i = 0; i < this.panels.length && i < values.length; i++) { var val = values[i]; if (!val) continue; values[i] = this.getPanelDisplayValue(i, val, keysAsText); } return values; }; QuestionPanelDynamicModel.prototype.getPanelDisplayValue = function (panelIndex, val, keysAsText) { if (!val) return val; var panel = this.panels[panelIndex]; for (var key in val) { var question = panel.getQuestionByValueName(key); if (!question) { question = this.getSharedQuestionFromArray(key, panelIndex); } if (!!question) { val[key] = question.getDisplayValue(keysAsText); } } return val; }; QuestionPanelDynamicModel.prototype.hasErrorInPanels = function (fireCallback) { 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__["h" /* KeyDuplicationError */](this.keyDuplicationError, this)); return true; } } keyValues.push(value); return false; }; QuestionPanelDynamicModel.prototype.createNewPanel = function () { var panel = this.createAndSetupNewPanelObject(); var json = this.template.toJSON(); new __WEBPACK_IMPORTED_MODULE_7__jsonobject__["b" /* JsonObject */]().toObject(json, panel); panel.renderWidth = "100%"; panel.updateCustomWidgets(); new QuestionPanelDynamicItem(this, panel); return panel; }; QuestionPanelDynamicModel.prototype.createAndSetupNewPanelObject = function () { var panel = this.createNewPanelObject(); var self = this; panel.onGetQuestionTitleLocation = function () { return self.getTemplateQuestionTitleLocation(); }; return panel; }; QuestionPanelDynamicModel.prototype.getTemplateQuestionTitleLocation = function () { return this.templateTitleLocation != "default" ? this.templateTitleLocation : this.getTitleLocationCore(); }; QuestionPanelDynamicModel.prototype.createNewPanelObject = function () { return new __WEBPACK_IMPORTED_MODULE_6__panel__["c" /* PanelModel */](); }; QuestionPanelDynamicModel.prototype.setPanelCountBasedOnValue = function () { if (this.isValueChangingInternally) return; var val = this.value; var newPanelCount = val && Array.isArray(val) ? val.length : 0; if (newPanelCount == 0 && this.loadingPanelCount > 0) { newPanelCount = this.loadingPanelCount; } this.panelCount = newPanelCount; }; QuestionPanelDynamicModel.prototype.setQuestionValue = function (newValue) { _super.prototype.setQuestionValue.call(this, newValue); this.setPanelCountBasedOnValue(); for (var i = 0; i < this.panels.length; i++) { this.panelUpdateValueFromSurvey(this.panels[i]); } }; QuestionPanelDynamicModel.prototype.onSurveyValueChanged = function (newValue) { _super.prototype.onSurveyValueChanged.call(this, newValue); for (var i = 0; i < this.panels.length; i++) { this.panelSurveyValueChanged(this.panels[i]); } if (newValue === undefined) { this.setValueBasedOnPanelCount(); } }; QuestionPanelDynamicModel.prototype.panelUpdateValueFromSurvey = function (panel) { var questions = panel.questions; var values = this.getPanelItemData(panel.data); for (var i = 0; i < questions.length; i++) { var q = questions[i]; q.updateValueFromSurvey(values[q.getValueName()]); q.updateCommentFromSurvey(values[q.getValueName() + __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].commentPrefix]); } }; QuestionPanelDynamicModel.prototype.panelSurveyValueChanged = function (panel) { var questions = panel.questions; var values = this.getPanelItemData(panel.data); for (var i = 0; i < questions.length; i++) { var q = questions[i]; q.onSurveyValueChanged(values[q.getValueName()]); } }; QuestionPanelDynamicModel.prototype.onSetData = function () { _super.prototype.onSetData.call(this); if (this.isDesignMode) { this.setTemplatePanelSurveyImpl(); this.rebuildPanels(); } }; //IQuestionPanelDynamicData QuestionPanelDynamicModel.prototype.getItemIndex = function (item) { return this.items.indexOf(item); }; QuestionPanelDynamicModel.prototype.getPanelItemData = function (item) { var items = this.items; var index = items.indexOf(item); var qValue = this.value; if (index < 0 && Array.isArray(qValue) && qValue.length > items.length) { index = items.length; } if (index < 0) return {}; if (!qValue || !Array.isArray(qValue) || qValue.length <= index) return {}; return qValue[index]; }; QuestionPanelDynamicModel.prototype.setPanelItemData = function (item, name, val) { var items = this.items; var index = items.indexOf(item); if (index < 0) index = items.length; var qValue = __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].getUnbindValue(this.value); if (!qValue || !Array.isArray(qValue)) { qValue = []; } if (qValue.length <= index) { for (var i = qValue.length; i <= index; i++) { qValue.push({}); } } if (!qValue[index]) qValue[index] = {}; if (!this.isValueEmpty(val)) { qValue[index][name] = val; } else { delete qValue[index][name]; } if (index >= 0 && index < this.panels.length) { this.changingValueQuestion = this.panels[index].getQuestionByValueName(name); } this.value = qValue; this.changingValueQuestion = null; if (this.survey) { var options = { question: this, panel: item.panel, name: name, itemIndex: index, itemValue: qValue[index], value: val }; this.survey.dynamicPanelItemValueChanged(this, options); } }; QuestionPanelDynamicModel.prototype.getSurvey = function () { return this.survey; }; QuestionPanelDynamicModel.prototype.getRootData = function () { return this.data; }; QuestionPanelDynamicModel.prototype.getPlainData = function (options) { if (options === void 0) { options = { includeEmpty: true }; } var questionPlainData = _super.prototype.getPlainData.call(this, options); if (!!questionPlainData) { questionPlainData.isNode = true; questionPlainData.data = this.panels.map(function (panel, index) { var panelDataItem = { name: panel.name || index, title: panel.title || "Panel", value: panel.getValue(), displayValue: panel.getValue(), getString: function (val) { return typeof val === "object" ? JSON.stringify(val) : val; }, isNode: true, data: panel.questions .map(function (question) { return question.getPlainData(options); }) .filter(function (d) { return !!d; }) }; (options.calculations || []).forEach(function (calculation) { panelDataItem[calculation.propertyName] = panel[calculation.propertyName]; }); return panelDataItem; }); } return questionPlainData; }; return QuestionPanelDynamicModel; }(__WEBPACK_IMPORTED_MODULE_5__question__["a" /* Question */])); __WEBPACK_IMPORTED_MODULE_7__jsonobject__["a" /* Serializer */].addClass("paneldynamic", [ { name: "templateElements", alternativeName: "questions", visible: false, isLightSerializable: false }, { name: "templateTitle:text", serializationProperty: "locTemplateTitle" }, { name: "templateDescription:text", serializationProperty: "locTemplateDescription" }, { name: "allowAddPanel:boolean", default: true }, { name: "allowRemovePanel:boolean", default: true }, { name: "panelCount:number", default: 0, choices: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] }, { name: "minPanelCount:number", default: 0 }, { name: "maxPanelCount:number", default: __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].panelMaximumPanelCount }, "defaultPanelValue:panelvalue", "defaultValueFromLastPanel:boolean", { name: "panelsState", default: "default", choices: ["default", "collapsed", "expanded", "firstExpanded"] }, { name: "keyName" }, { name: "keyDuplicationError", serializationProperty: "locKeyDuplicationError" }, { name: "confirmDelete:boolean" }, { name: "confirmDeleteText", serializationProperty: "locConfirmDeleteText" }, { name: "panelAddText", serializationProperty: "locPanelAddText" }, { name: "panelRemoveText", serializationProperty: "locPanelRemoveText" }, { name: "panelPrevText", serializationProperty: "locPanelPrevText" }, { name: "panelNextText", serializationProperty: "locPanelNextText" }, { name: "showQuestionNumbers", default: "off", choices: ["off", "onPanel", "onSurvey"] }, { name: "showRangeInProgress", 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); }); /***/ }), /* 55 */ /***/ (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__(20); /* 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, "canShowClearButton", { get: function () { return this.showClearButton && !this.isReadOnly; }, enumerable: true, configurable: true }); Object.defineProperty(QuestionRadiogroupModel.prototype, "clearButtonCaption", { get: function () { return __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("clearCaption"); }, enumerable: true, configurable: true }); QuestionRadiogroupModel.prototype.supportGoNextPageAutomatic = function () { return true; }; return QuestionRadiogroupModel; }(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["a" /* QuestionCheckboxBase */])); __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("radiogroup", [{ name: "showClearButton:boolean", default: false }], function () { return new QuestionRadiogroupModel(""); }, "checkboxbase"); __WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("radiogroup", function (name) { var q = new QuestionRadiogroupModel(name); q.choices = __WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].DefaultChoices; return q; }); /***/ }), /* 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__itemvalue__ = __webpack_require__(12); /* 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 import */ var __WEBPACK_IMPORTED_MODULE_5__settings__ = __webpack_require__(9); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionRatingModel; }); /** * A Model for a rating question. */ var QuestionRatingModel = /** @class */ (function (_super) { __WEBPACK_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 (!this.isLoadingFromJson && val > this.rateMax - this.rateStep) val = this.rateMax - this.rateStep; this.setPropertyValue("rateMin", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionRatingModel.prototype, "rateMax", { /** * This property is used to generate rate values if rateValues array is empty. It is the last value in the rating. The default value is 5. * @see rateValues * @see rateMin * @see rateStep */ get: function () { return this.getPropertyValue("rateMax", 5); }, set: function (val) { if (!this.isLoadingFromJson && val < this.rateMin + this.rateStep) val = this.rateMin + this.rateStep; this.setPropertyValue("rateMax", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionRatingModel.prototype, "rateStep", { /** * This property is used to generate rate values if rateValues array is empty. It is the step value. The number of rate values are (rateMax - rateMin) / rateStep. The default value is 1. * @see rateValues * @see rateMin * @see rateMax */ get: function () { return this.getPropertyValue("rateStep", 1); }, set: function (val) { if (val <= 0) val = 1; if (!this.isLoadingFromJson && val > this.rateMax - this.rateMin) val = this.rateMax - this.rateMin; this.setPropertyValue("rateStep", val); }, enumerable: true, configurable: true }); QuestionRatingModel.prototype.getDisplayValueCore = function (keysAsText) { if (this.isEmpty()) return ""; var res = __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(this.visibleRateValues, this.value); return !!res ? res : this.createValueCopy(); }; Object.defineProperty(QuestionRatingModel.prototype, "visibleRateValues", { get: function () { if (this.rateValues.length > 0) return this.rateValues; var res = []; var value = this.rateMin; while (value <= this.rateMax && res.length < __WEBPACK_IMPORTED_MODULE_5__settings__["a" /* settings */].ratingMaximumRateValueCount) { res.push(new __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */](value)); value += this.rateStep; } return res; }, enumerable: true, configurable: true }); QuestionRatingModel.prototype.getType = function () { return "rating"; }; QuestionRatingModel.prototype.supportGoNextPageAutomatic = function () { return true; }; QuestionRatingModel.prototype.supportComment = function () { return true; }; QuestionRatingModel.prototype.supportOther = function () { return true; }; Object.defineProperty(QuestionRatingModel.prototype, "minRateDescription", { /** * The description of minimum (first) item. */ get: function () { return this.getLocalizableStringText("minRateDescription"); }, set: function (val) { this.setLocalizableStringText("minRateDescription", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionRatingModel.prototype, "locMinRateDescription", { get: function () { return this.getLocalizableString("minRateDescription"); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionRatingModel.prototype, "maxRateDescription", { /** * The description of maximum (last) item. */ get: function () { return this.getLocalizableStringText("maxRateDescription"); }, set: function (val) { this.setLocalizableStringText("maxRateDescription", val); }, enumerable: true, configurable: true }); Object.defineProperty(QuestionRatingModel.prototype, "locMaxRateDescription", { get: function () { return this.getLocalizableString("maxRateDescription"); }, enumerable: true, configurable: true }); return QuestionRatingModel; }(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */])); __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("rating", [ { name: "hasComment:boolean", layout: "row" }, { name: "commentText", serializationProperty: "locCommentText", layout: "row" }, { name: "rateValues:itemvalue[]" }, { name: "rateMin:number", default: 1 }, { name: "rateMax:number", default: 5 }, { name: "rateStep:number", default: 1 }, { 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); }); /***/ }), /* 57 */ /***/ (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__["a" /* Serializer */].addClass("nonvalue", [ { name: "title", visible: false }, { name: "description", visible: false }, { name: "valueName", visible: false }, { name: "enableIf", visible: false }, { name: "defaultValue", visible: false }, { name: "correctAnswer", visible: false }, { name: "isRequired", visible: false }, { name: "requiredErrorText", visible: false }, { name: "readOnly", visible: false }, { name: "validators", visible: false } ], function () { return new QuestionNonValue(""); }, "question"); /***/ }), /* 58 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defaultCss_cssstandard__ = __webpack_require__(13); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return StylesManager; }); var StylesManager = /** @class */ (function () { function StylesManager() { this.sheet = null; if (StylesManager.Enabled) { this.sheet = StylesManager.findSheet(StylesManager.SurveyJSStylesSheetId); if (!this.sheet) { this.sheet = StylesManager.createSheet(StylesManager.SurveyJSStylesSheetId); this.initializeStyles(this.sheet); } } } StylesManager.findSheet = function (styleSheetId) { for (var i = 0; i < document.styleSheets.length; i++) { if (!!document.styleSheets[i].ownerNode && document.styleSheets[i].ownerNode["id"] === styleSheetId) { return document.styleSheets[i]; } } return null; }; StylesManager.createSheet = function (styleSheetId) { var style = document.createElement("style"); style.id = styleSheetId; // Add a media (and/or media query) here if you'd like! // style.setAttribute("media", "screen") // style.setAttribute("media", "only screen and (max-width : 1024px)") style.appendChild(document.createTextNode("")); document.head.appendChild(style); return style.sheet; }; StylesManager.applyTheme = function (themeName, themeSelector) { if (themeName === void 0) { themeName = "default"; } if (themeSelector === void 0) { themeSelector = ".sv_main"; } var ThemeCss; if (["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"; } if (StylesManager.Enabled) { var sheet_1 = StylesManager.findSheet(themeName + themeSelector); if (!sheet_1) { sheet_1 = StylesManager.createSheet(themeName + themeSelector); var theme_1 = StylesManager.ThemeColors[themeName] || StylesManager.ThemeColors["default"]; Object.keys(ThemeCss).forEach(function (selector) { var cssRuleText = ThemeCss[selector]; Object.keys(theme_1).forEach(function (colorVariableName) { return (cssRuleText = cssRuleText.replace(new RegExp("\\" + colorVariableName, "g"), theme_1[colorVariableName])); }); sheet_1.insertRule(themeSelector + selector + " { " + cssRuleText + " }", 0); }); } } }; StylesManager.prototype.initializeStyles = function (sheet) { if (StylesManager.Enabled) { Object.keys(StylesManager.Styles).forEach(function (selector) { return sheet.insertRule(selector + " { " + StylesManager.Styles[selector] + " }", 0); }); Object.keys(StylesManager.Media).forEach(function (selector) { sheet.insertRule(StylesManager.Media[selector].media + " { " + selector + " { " + StylesManager.Media[selector].style + " } }", 0); }); } }; StylesManager.SurveyJSStylesSheetId = "surveyjs"; StylesManager.Styles = { // ".sv_bootstrap_css": // "position: relative; width: 100%; background-color: #f4f4f4", // ".sv_bootstrap_css .sv_custom_header": // "position: absolute; width: 100%; height: 275px; background-color: #e7e7e7;", // ".sv_bootstrap_css .sv_container": // "max-width: 80%; margin: auto; position: relative; color: #6d7072; padding: 0 1em;", // ".sv_bootstrap_css .panel-body": // "background-color: white; padding: 1em 1em 5em 1em; border-top: 2px solid lightgray;", ".sv_main span": "word-break: break-word;", ".sv_main legend": "border: none; margin: 0;", ".sv_bootstrap_css .sv_qstn": "padding: 0.5em 1em 1.5em 1em;", ".sv_bootstrap_css .sv_qcbc input[type=checkbox], .sv_bootstrap_css .sv_qcbc input[type=radio]": "vertical-align: middle; margin-top: -1px", ".sv_bootstrap_css .sv_qstn fieldset": "display: block;", ".sv_bootstrap_css .sv_qstn .sv_q_checkbox_inline, .sv_bootstrap_css .sv_qstn .sv_q_radiogroup_inline": "display: inline-block;", ".sv_main.sv_bootstrapmaterial_css .sv_q_radiogroup_control_label": "display: inline; position: static;", ".sv_main.sv_bootstrapmaterial_css .checkbox": "margin-top:10px;margin-bottom:10px;", ".sv_row": "clear: both;", ".sv_row .sv_qstn": "float: left", ".sv_row .sv_qstn:last-child": "float: none", ".sv_qstn": "display: inline-block; vertical-align: top; overflow: auto;", ".progress": "width: 60%;", ".progress-bar": "width: auto; margin-left: 2px; margin-right: 2px;", ".sv_p_container": "display: inline-block; vertical-align: top;", ".sv_qbln .checkbox-material": "margin-right: 3px;", ".sv_qcbx .checkbox-material": "margin-right: 5px;", ".sv_qcbx .checkbox label": "justify-content: left; display: inline-block;", ".sv_qstn .radio label": "justify-content: left; display: inline-block;", ".sv_qstn .sv_q_imgsel > label img": "pointer-events: none;", ".sv_qstn .sv_q_imgsel.sv_q_imagepicker_inline": "display: inline-block;", ".sv_qstn label.sv_q_m_label": "position: absolute; margin: 0; display: block; width: 100%;", ".sv_qstn td": "position: relative;", ".sv_q_mt_item_value": "float: left;", ".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-column-1": "width: 100%; max-width: 100%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;", ".sv_qstn .sv-q-column-2": "max-width: 50%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;", ".sv_qstn .sv-q-column-3": "max-width: 33.33333%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;", ".sv_qstn .sv-q-column-4": "max-width: 25%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;", ".sv_qstn .sv-q-column-5": "max-width: 20%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;", ".sv_qstn .sv_q_file_input": "color: transparent;", ".sv_qstn .sv_q_imgsel label > div": "overflow: hidden; white-space: nowrap; text-overflow: ellipsis; padding: 4px; border: 1px solid lightgray; border-radius: 4px;", ".sv_qstn .sv_q_imgsel label > div > img, .sv_qstn .sv_q_imgsel label > div > embed": "display: block;", ".sv_qstn table tr td .sv_q_m_cell_label": "position: absolute; left: 0; right: 0; top: 0; bottom: 0;", "f-panel": "padding: 0.5em 1em; display: inline-block; line-height: 2em;", ".sv_progress_bar > span": "white-space: nowrap;", ".sv_qstn .sv_q_select_column": "display: inline-block; vertical-align: top; min-width: 10%;", ".sv_qstn .sv_q_select_column > *:not(.sv_technical)": "display: block;", ".sv_main .sv_container .sv_body .sv_p_root .sv_qstn .sv_q_select_column textarea": "margin-left: 0; padding-left: 0; line-height: initial;" }; StylesManager.Media = { ".sv_qstn fieldset .sv-q-col-1": { style: "width: 100%;", media: "@media only screen and (max-width: 480px)" }, ".sv_qstn fieldset .sv-q-col-2": { style: "width: 100%;", media: "@media only screen and (max-width: 480px)" }, ".sv_qstn fieldset .sv-q-col-3": { style: "width: 100%;", media: "@media only screen and (max-width: 480px)" }, ".sv_qstn fieldset .sv-q-col-4": { style: "width: 100%;", media: "@media only screen and (max-width: 480px)" }, ".sv_qstn fieldset .sv-q-col-5": { style: "width: 100%;", media: "@media only screen and (max-width: 480px)" }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn": { style: "display: block; width: 100% !important;", media: "@media (max-width: 600px)" }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .title-left": { style: "float: none;", media: "@media (max-width: 600px)" }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .sv_q_radiogroup_inline, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .sv_q_checkbox_inline, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .sv_q_imagepicker_inline": { style: "display: block;", media: "@media (max-width: 600px)" }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table": { style: "display: block;", media: "@media (max-width: 600px)" }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table thead": { style: "display: none;", media: "@media (max-width: 600px)" }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table tbody, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table tr, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table td": { style: "display: block;", media: "@media (max-width: 600px)" }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table:not(.sv_q_matrix) td:before": { style: "content: attr(headers);", media: "@media (max-width: 600px)" }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.sv_q_matrix td:after": { style: "content: attr(headers); padding-left: 1em", media: "@media (max-width: 600px)" }, ".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .radio label, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .checkbox label": { style: "line-height: 12px; vertical-align: top;", media: "@media (max-width: 600px)" }, ".sv_qstn label.sv_q_m_label": { style: "display: inline;", media: "@media (max-width: 600px)" }, ".sv_main .sv_custom_header": { style: "display: none;", media: "@media (max-width: 1300px)" }, ".sv_main .sv_container .sv_header h3": { style: "font-size: 1.5em;", media: "@media (max-width: 1300px)" }, ".sv_main .sv_container .sv_header h3 span": { style: "font-size: 0.75em;", media: "@media (max-width: 700px)" } }; 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 input:not([type='button']):not([type='reset']):not([type='submit']):not([type='image']):not([type='checkbox']):not([type='radio'])": "border: 1px solid $border-color; background-color: $inputs-background-color;color: $text-color;", ".sv_default_css input:not([type='button']):not([type='reset']):not([type='submit']):not([type='image']):not([type='checkbox']):not([type='radio']):focus": "border: 1px solid $main-color;", ".sv_default_css .sv_container .sv_body .sv_p_root .sv_q .sv_select_wrapper .sv_q_dropdown_control ": "background-color: $inputs-background-color;", ".sv_default_css .sv_q_other input:focus": "border-color: $main-color;", ".sv_default_css .sv_q_text_root:focus": "border-color: $main-color;", ".sv_default_css .sv_q_dropdown_control:focus": "border-color: $main-color;", ".sv_default_css input[type='text']:focus": "border-color: $main-color;", '.sv_default_css .sv_container .sv_body .sv_p_root .sv_q input[type="radio"]:focus, .sv_default_css .sv_container .sv_body .sv_p_root .sv_q input[type="checkbox"]:focus': "outline: 1px dotted $main-color;", ".sv_default_css select:focus": "border-color: $main-color;", ".sv_default_css textarea:focus": "border-color: $main-color;", ".sv_default_css .sv_select_wrapper": "background-color: $body-background-color;", ".sv_default_css .sv_select_wrapper::before": "background-color: $main-color;", ".sv_default_css .sv_q_rating_item.active .sv_q_rating_item_text": "background-color: $main-hover-color; border-color: $main-hover-color; color: $body-background-color;", ".sv_default_css .sv_q_rating_item .sv_q_rating_item_text": "border-color: $border-color;", ".sv_default_css .sv_q_rating_item .sv_q_rating_item_text:hover": "border-color: $main-hover-color;", ".sv_default_css table.sv_q_matrix tr": "border-color: $border-color;", ".sv_default_css table.sv_q_matrix_dropdown tr": "border-color: $border-color;", ".sv_default_css table.sv_q_matrix_dynamic tr": "border-color: $border-color;", ".sv_default_css .sv_q_m_cell_selected": "color: $body-background-color; background-color: $main-hover-color;", ".sv_main .sv_q_file_remove:hover": "color: $main-color;", ".sv_main .sv_q_imgsel.checked label>div": "background-color: $main-color", ".sv_default_css .sv_p_description": "padding-left: 1.29em;" }; StylesManager.bootstrapThemeCss = { ".sv_main .sv_q_imgsel.checked label>div": "background-color: $main-color", ".sv_main .sv_p_description": "padding-left: 1.66em;", ".sv_main .sv_qstn_error_bottom": "margin-top: 20px; margin-bottom: 0;", ".sv_main .progress": "width: 60%;", ".sv_main .progress-bar": "width: auto; margin-left: 2px; margin-right: 2px;", ".sv_main .table>tbody>tr>td": "min-width: 90px;", ".sv_main f-panel .sv_qstn": "padding: 0; vertical-align: middle;" }; StylesManager.bootstrapmaterialThemeCss = { ".sv_main.sv_bootstrapmaterial_css .form-group.is-focused .form-control": "background-image: linear-gradient($main-color, $main-color), linear-gradient(#D2D2D2, #D2D2D2);", ".sv_main.sv_bootstrapmaterial_css .form-group.is-focused label": "color:$main-color;", ".sv_main.sv_bootstrapmaterial_css .sv_qstn label.sv_q_m_label": "height: 100%;", ".sv_main.sv_bootstrapmaterial_css .checkbox input[type=checkbox]:checked + .checkbox-material .check": "border-color: $main-color;", ".sv_main.sv_bootstrapmaterial_css label.checkbox-inline input[type=checkbox]:checked + .checkbox-material .check": "border-color: $main-color;", ".sv_main.sv_bootstrapmaterial_css .checkbox input[type=checkbox]:checked + .checkbox-material .check:before": "color: $main-color;", ".sv_main.sv_bootstrapmaterial_css label.checkbox-inline input[type=checkbox]:checked + .checkbox-material .check:before": "color: $main-color;", ".sv_main.sv_bootstrapmaterial_css .radio input[type=radio]:checked ~ .circle": "border-color: $main-color;", ".sv_main.sv_bootstrapmaterial_css label.radio-inline input[type=radio]:checked ~ .circle": "border-color: $main-color;", ".sv_main.sv_bootstrapmaterial_css .radio input[type=radio]:checked ~ .check": "background-color: $main-color;", ".sv_main.sv_bootstrapmaterial_css label.radio-inline input[type=radio]:checked ~ .check": "background-color: $main-color;", ".sv_main.sv_bootstrapmaterial_css .btn-default.active": "background-color: $main-color; color: $body-background-color;", ".sv_main.sv_bootstrapmaterial_css .btn-default:active": "background-color: $main-color; color: $body-background-color;", ".sv_main.sv_bootstrapmaterial_css .btn-secondary.active": "background-color: $main-color; color: $body-background-color;", ".sv_main.sv_bootstrapmaterial_css .btn-secondary:active": "background-color: $main-color; color: $body-background-color;", ".sv_main.sv_bootstrapmaterial_css .open>.dropdown-toggle.btn-default": "background-color: $main-color; color: $body-background-color;", ".sv_main.sv_bootstrapmaterial_css input[type='button'].btn-primary, .sv_main.sv_bootstrapmaterial_css button.btn-primary": "color: $body-background-color; background-color: $main-color;", ".sv_main.sv_bootstrapmaterial_css input[type='button'].btn-primary:hover, .sv_main.sv_bootstrapmaterial_css button.btn-primary:hover": "background-color: $main-hover-color;", ".sv_main .sv_q_imgsel.checked label>div": "background-color: $main-color;", ".sv_main.sv_bootstrapmaterial_css .sv_q_file_remove:hover": "color: $main-color;", ".sv_main.sv_bootstrapmaterial_css .form-group input[type=file]": "position: relative; opacity: 1;", ".sv_main.sv_bootstrapmaterial_css .progress": "width: 60%;", ".sv_main.sv_bootstrapmaterial_css .progress-bar": "width: auto; margin-left: 2px; margin-right: 2px;" }; StylesManager.Enabled = true; return StylesManager; }()); /***/ }), /* 59 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(5); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__survey__ = __webpack_require__(23); /* 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__["b" /* Base */])); /***/ }), /* 60 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base__ = __webpack_require__(5); /* unused harmony export surveyTimerFunctions */ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyTimer; }); var surveyTimerFunctions = { setTimeout: function (func) { return window.setTimeout(func, 1000); }, clearTimeout: function (timerId) { window.clearTimeout(timerId); } }; var SurveyTimer = /** @class */ (function () { function SurveyTimer() { this.listenerCounter = 0; this.timerId = -1; this.onTimer = new __WEBPACK_IMPORTED_MODULE_0__base__["a" /* Event */](); } Object.defineProperty(SurveyTimer, "instance", { get: function () { if (!SurveyTimer.instanceValue) { SurveyTimer.instanceValue = new SurveyTimer(); } return SurveyTimer.instanceValue; }, enumerable: true, configurable: true }); SurveyTimer.prototype.start = function (func) { var _this = this; if (func === void 0) { func = null; } if (func) { this.onTimer.add(func); } if (this.timerId < 0) { this.timerId = surveyTimerFunctions.setTimeout(function () { _this.doTimer(); }); } this.listenerCounter++; }; SurveyTimer.prototype.stop = function (func) { if (func === void 0) { func = null; } if (func) { this.onTimer.remove(func); } this.listenerCounter--; if (this.listenerCounter == 0 && this.timerId > -1) { surveyTimerFunctions.clearTimeout(this.timerId); this.timerId = -1; } }; SurveyTimer.prototype.doTimer = function () { var _this = this; if (this.timerId < 0) return; this.onTimer.fire(this, {}); this.timerId = surveyTimerFunctions.setTimeout(function () { _this.doTimer(); }); }; SurveyTimer.instanceValue = null; return SurveyTimer; }()); /***/ }), /* 61 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__cssstandard__ = __webpack_require__(13); /* 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", bodyEmpty: "panel-body card-block mt-4 sv_body_empty", 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", flowRoot: "sv_q_flow sv_qstn", titleLeftRoot: "sv_qstn_left", title: "", number: "sv_q_num", 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: "", locationTop: "sv_qstn_error_top", locationBottom: "sv_qstn_error_bottom" }, 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", column: "sv_q_select_column" }, comment: "form-control", dropdown: { root: "", control: "form-control", other: "sv_q_dd_other form-control" }, html: { root: "" }, matrix: { root: "table sv_q_matrix", label: "sv_q_m_label", cellText: "sv_q_m_cell_text", cellTextSelected: "sv_q_m_cell_selected bg-primary", cellLabel: "sv_q_m_cell_label" }, matrixdropdown: { root: "table" }, matrixdynamic: { root: "table", button: "button", buttonAdd: "", buttonRemove: "", iconAdd: "", iconRemove: "" }, paneldynamic: { root: "", 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", column: "sv_q_select_column" }, 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; /***/ }), /* 62 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__cssstandard__ = __webpack_require__(13); /* 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", bodyEmpty: "panel-body sv_body_empty", 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", flowRoot: "sv_q_flow form-group", titleLeftRoot: "sv_qstn_left", title: "", number: "sv_q_num", 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: "", locationTop: "sv_qstn_error_top", locationBottom: "sv_qstn_error_bottom" }, 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", column: "sv_q_select_column" }, comment: "form-control", dropdown: { root: "", control: "form-control", other: "sv_q_dd_other form-control" }, html: { root: "" }, matrix: { root: "table sv_q_matrix", row: "form-group", label: "sv_q_m_label radio-inline", cellText: "sv_q_m_cell_text", cellTextSelected: "sv_q_m_cell_selected bg-primary", cellLabel: "sv_q_m_cell_label", itemValue: "form-control" }, matrixdropdown: { root: "table", itemValue: "form-group" }, matrixdynamic: { root: "table", button: "btn btn-primary", itemValue: "form-group", buttonAdd: "", buttonRemove: "", iconAdd: "", iconRemove: "" }, 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", column: "sv_q_select_column" }, 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; /***/ }), /* 63 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__localization_arabic__ = __webpack_require__(116); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__localization_bulgarian__ = __webpack_require__(117); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__localization_catalan__ = __webpack_require__(118); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__localization_czech__ = __webpack_require__(119); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__localization_danish__ = __webpack_require__(120); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__localization_dutch__ = __webpack_require__(121); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__localization_finnish__ = __webpack_require__(122); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__localization_french__ = __webpack_require__(123); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__localization_georgian__ = __webpack_require__(124); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__localization_german__ = __webpack_require__(125); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__localization_greek__ = __webpack_require__(126); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__localization_hebrew__ = __webpack_require__(127); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__localization_hungarian__ = __webpack_require__(128); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__localization_icelandic__ = __webpack_require__(129); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__localization_indonesian__ = __webpack_require__(130); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__localization_italian__ = __webpack_require__(131); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__localization_japanese__ = __webpack_require__(132); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__localization_korean__ = __webpack_require__(133); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__localization_latvian__ = __webpack_require__(134); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__localization_lithuanian__ = __webpack_require__(135); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__localization_norwegian__ = __webpack_require__(136); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__localization_persian__ = __webpack_require__(137); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__localization_polish__ = __webpack_require__(138); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__localization_portuguese__ = __webpack_require__(139); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__localization_romanian__ = __webpack_require__(140); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__localization_russian__ = __webpack_require__(141); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__localization_simplified_chinese__ = __webpack_require__(142); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__localization_spanish__ = __webpack_require__(143); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__localization_swedish__ = __webpack_require__(144); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__localization_turkish__ = __webpack_require__(146); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__localization_traditional_chinese__ = __webpack_require__(145); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__localization_ukrainian__ = __webpack_require__(147); /***/ }), /* 64 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__main_scss__ = __webpack_require__(33); /* 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__settings__ = __webpack_require__(9); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_1__settings__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(4); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return __WEBPACK_IMPORTED_MODULE_2__helpers__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__validator__ = __webpack_require__(32); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return __WEBPACK_IMPORTED_MODULE_3__validator__["c"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return __WEBPACK_IMPORTED_MODULE_3__validator__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return __WEBPACK_IMPORTED_MODULE_3__validator__["d"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return __WEBPACK_IMPORTED_MODULE_3__validator__["e"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return __WEBPACK_IMPORTED_MODULE_3__validator__["f"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return __WEBPACK_IMPORTED_MODULE_3__validator__["g"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return __WEBPACK_IMPORTED_MODULE_3__validator__["h"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return __WEBPACK_IMPORTED_MODULE_3__validator__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__itemvalue__ = __webpack_require__(12); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return __WEBPACK_IMPORTED_MODULE_4__itemvalue__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__base__ = __webpack_require__(5); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "m", function() { return __WEBPACK_IMPORTED_MODULE_5__base__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "n", function() { return __WEBPACK_IMPORTED_MODULE_5__base__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "o", function() { return __WEBPACK_IMPORTED_MODULE_5__base__["d"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "p", function() { return __WEBPACK_IMPORTED_MODULE_5__base__["c"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__error__ = __webpack_require__(11); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "q", function() { return __WEBPACK_IMPORTED_MODULE_6__error__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "r", function() { return __WEBPACK_IMPORTED_MODULE_6__error__["d"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "s", function() { return __WEBPACK_IMPORTED_MODULE_6__error__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "t", function() { return __WEBPACK_IMPORTED_MODULE_6__error__["e"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "u", function() { return __WEBPACK_IMPORTED_MODULE_6__error__["l"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__localizablestring__ = __webpack_require__(17); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "v", function() { return __WEBPACK_IMPORTED_MODULE_7__localizablestring__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__htmlConditionItem__ = __webpack_require__(115); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "w", function() { return __WEBPACK_IMPORTED_MODULE_8__htmlConditionItem__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__choicesRestfull__ = __webpack_require__(37); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "x", function() { return __WEBPACK_IMPORTED_MODULE_9__choicesRestfull__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__functionsfactory__ = __webpack_require__(26); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "y", function() { return __WEBPACK_IMPORTED_MODULE_10__functionsfactory__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__conditions__ = __webpack_require__(10); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "z", function() { return __WEBPACK_IMPORTED_MODULE_11__conditions__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "A", function() { return __WEBPACK_IMPORTED_MODULE_11__conditions__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__expressions_expressions__ = __webpack_require__(25); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "B", function() { return __WEBPACK_IMPORTED_MODULE_12__expressions_expressions__["g"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__conditionsParser__ = __webpack_require__(38); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "C", function() { return __WEBPACK_IMPORTED_MODULE_13__conditionsParser__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__conditionProcessValue__ = __webpack_require__(16); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "D", function() { return __WEBPACK_IMPORTED_MODULE_14__conditionProcessValue__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__jsonobject__ = __webpack_require__(1); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "E", function() { return __WEBPACK_IMPORTED_MODULE_15__jsonobject__["e"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "F", function() { return __WEBPACK_IMPORTED_MODULE_15__jsonobject__["f"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "G", function() { return __WEBPACK_IMPORTED_MODULE_15__jsonobject__["g"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "H", function() { return __WEBPACK_IMPORTED_MODULE_15__jsonobject__["h"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "I", function() { return __WEBPACK_IMPORTED_MODULE_15__jsonobject__["i"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "J", function() { return __WEBPACK_IMPORTED_MODULE_15__jsonobject__["j"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "K", function() { return __WEBPACK_IMPORTED_MODULE_15__jsonobject__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "L", function() { return __WEBPACK_IMPORTED_MODULE_15__jsonobject__["d"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "M", function() { return __WEBPACK_IMPORTED_MODULE_15__jsonobject__["k"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "N", function() { return __WEBPACK_IMPORTED_MODULE_15__jsonobject__["l"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "O", function() { return __WEBPACK_IMPORTED_MODULE_15__jsonobject__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__question_matrixdropdownbase__ = __webpack_require__(21); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "P", function() { return __WEBPACK_IMPORTED_MODULE_16__question_matrixdropdownbase__["c"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Q", function() { return __WEBPACK_IMPORTED_MODULE_16__question_matrixdropdownbase__["d"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "R", function() { return __WEBPACK_IMPORTED_MODULE_16__question_matrixdropdownbase__["e"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "S", function() { return __WEBPACK_IMPORTED_MODULE_16__question_matrixdropdownbase__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "T", function() { return __WEBPACK_IMPORTED_MODULE_16__question_matrixdropdownbase__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__question_matrixdropdown__ = __webpack_require__(51); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "U", function() { return __WEBPACK_IMPORTED_MODULE_17__question_matrixdropdown__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "V", function() { return __WEBPACK_IMPORTED_MODULE_17__question_matrixdropdown__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__question_matrixdynamic__ = __webpack_require__(52); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "W", function() { return __WEBPACK_IMPORTED_MODULE_18__question_matrixdynamic__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "X", function() { return __WEBPACK_IMPORTED_MODULE_18__question_matrixdynamic__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__question_matrix__ = __webpack_require__(50); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Y", function() { return __WEBPACK_IMPORTED_MODULE_19__question_matrix__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Z", function() { return __WEBPACK_IMPORTED_MODULE_19__question_matrix__["c"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_0", function() { return __WEBPACK_IMPORTED_MODULE_19__question_matrix__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__question_multipletext__ = __webpack_require__(53); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_1", function() { return __WEBPACK_IMPORTED_MODULE_20__question_multipletext__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_2", function() { return __WEBPACK_IMPORTED_MODULE_20__question_multipletext__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__panel__ = __webpack_require__(19); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_3", function() { return __WEBPACK_IMPORTED_MODULE_21__panel__["c"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_4", function() { return __WEBPACK_IMPORTED_MODULE_21__panel__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_5", function() { return __WEBPACK_IMPORTED_MODULE_21__panel__["d"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__flowpanel__ = __webpack_require__(40); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_6", function() { return __WEBPACK_IMPORTED_MODULE_22__flowpanel__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__page__ = __webpack_require__(27); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_7", function() { return __WEBPACK_IMPORTED_MODULE_23__page__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__question__ = __webpack_require__(8); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_8", function() { return __WEBPACK_IMPORTED_MODULE_24__question__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__questionnonvalue__ = __webpack_require__(57); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_9", function() { return __WEBPACK_IMPORTED_MODULE_25__questionnonvalue__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__question_empty__ = __webpack_require__(46); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_10", function() { return __WEBPACK_IMPORTED_MODULE_26__question_empty__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__question_baseselect__ = __webpack_require__(20); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_11", function() { return __WEBPACK_IMPORTED_MODULE_27__question_baseselect__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_12", function() { return __WEBPACK_IMPORTED_MODULE_27__question_baseselect__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__question_checkbox__ = __webpack_require__(44); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_13", function() { return __WEBPACK_IMPORTED_MODULE_28__question_checkbox__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__question_comment__ = __webpack_require__(45); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_14", function() { return __WEBPACK_IMPORTED_MODULE_29__question_comment__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__question_dropdown__ = __webpack_require__(29); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_15", function() { return __WEBPACK_IMPORTED_MODULE_30__question_dropdown__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__questionfactory__ = __webpack_require__(3); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_16", function() { return __WEBPACK_IMPORTED_MODULE_31__questionfactory__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_17", function() { return __WEBPACK_IMPORTED_MODULE_31__questionfactory__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_32__question_file__ = __webpack_require__(47); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_18", function() { return __WEBPACK_IMPORTED_MODULE_32__question_file__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_33__question_html__ = __webpack_require__(48); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_19", function() { return __WEBPACK_IMPORTED_MODULE_33__question_html__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_34__question_radiogroup__ = __webpack_require__(55); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_20", function() { return __WEBPACK_IMPORTED_MODULE_34__question_radiogroup__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_35__question_rating__ = __webpack_require__(56); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_21", function() { return __WEBPACK_IMPORTED_MODULE_35__question_rating__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_36__question_expression__ = __webpack_require__(30); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_22", function() { return __WEBPACK_IMPORTED_MODULE_36__question_expression__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_37__question_text__ = __webpack_require__(31); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_23", function() { return __WEBPACK_IMPORTED_MODULE_37__question_text__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_38__question_boolean__ = __webpack_require__(43); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_24", function() { return __WEBPACK_IMPORTED_MODULE_38__question_boolean__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_39__question_imagepicker__ = __webpack_require__(49); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_25", function() { return __WEBPACK_IMPORTED_MODULE_39__question_imagepicker__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_40__question_paneldynamic__ = __webpack_require__(54); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_26", function() { return __WEBPACK_IMPORTED_MODULE_40__question_paneldynamic__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_27", function() { return __WEBPACK_IMPORTED_MODULE_40__question_paneldynamic__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_41__surveytimer__ = __webpack_require__(60); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_28", function() { return __WEBPACK_IMPORTED_MODULE_41__surveytimer__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_42__survey__ = __webpack_require__(23); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_29", function() { return __WEBPACK_IMPORTED_MODULE_42__survey__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_43__trigger__ = __webpack_require__(148); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_30", function() { return __WEBPACK_IMPORTED_MODULE_43__trigger__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_31", function() { return __WEBPACK_IMPORTED_MODULE_43__trigger__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_32", function() { return __WEBPACK_IMPORTED_MODULE_43__trigger__["c"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_33", function() { return __WEBPACK_IMPORTED_MODULE_43__trigger__["d"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_34", function() { return __WEBPACK_IMPORTED_MODULE_43__trigger__["e"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_35", function() { return __WEBPACK_IMPORTED_MODULE_43__trigger__["f"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_36", function() { return __WEBPACK_IMPORTED_MODULE_43__trigger__["g"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_44__surveyWindow__ = __webpack_require__(59); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_37", function() { return __WEBPACK_IMPORTED_MODULE_44__surveyWindow__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_45__textPreProcessor__ = __webpack_require__(22); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_38", function() { return __WEBPACK_IMPORTED_MODULE_45__textPreProcessor__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_46__dxSurveyService__ = __webpack_require__(39); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_39", function() { return __WEBPACK_IMPORTED_MODULE_46__dxSurveyService__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_47__localization_english__ = __webpack_require__(41); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_40", function() { return __WEBPACK_IMPORTED_MODULE_47__localization_english__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_48__surveyStrings__ = __webpack_require__(2); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_41", function() { return __WEBPACK_IMPORTED_MODULE_48__surveyStrings__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_42", function() { return __WEBPACK_IMPORTED_MODULE_48__surveyStrings__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_49__questionCustomWidgets__ = __webpack_require__(28); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_43", function() { return __WEBPACK_IMPORTED_MODULE_49__questionCustomWidgets__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_44", function() { return __WEBPACK_IMPORTED_MODULE_49__questionCustomWidgets__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_50__stylesmanager__ = __webpack_require__(58); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_45", function() { return __WEBPACK_IMPORTED_MODULE_50__stylesmanager__["a"]; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Version; }); // styles var Version; Version = "" + "1.0.93"; //Uncomment to include the "date" question type. //export {default as QuestionDateModel} from "../../plugins/question_date"; /***/ }), /* 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_knockout__ = __webpack_require__(6); /* 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__(59); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__kosurvey__ = __webpack_require__(15); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyWindow; }); var koTemplate = __webpack_require__(113); 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 */])); /***/ }), /* 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_knockout__ = __webpack_require__(6); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__flowpanel__ = __webpack_require__(40); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__kobase__ = __webpack_require__(18); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__base__ = __webpack_require__(5); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return FlowPanel; }); var FlowPanel = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](FlowPanel, _super); function FlowPanel(name) { if (name === void 0) { name = ""; } var _this = _super.call(this, name) || this; _this.koElementType = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"]("survey-flowpanel"); new __WEBPACK_IMPORTED_MODULE_4__kobase__["a" /* ImplementorBase */](_this); _this.onCreating(); var self = _this; _this.koElementAfterRender = function (el, con) { return self.elementAfterRender(el, con); }; return _this; } FlowPanel.prototype.onCreating = function () { }; FlowPanel.prototype.getHtmlForQuestion = function (question) { return ('<span question="true" contenteditable="false" id="flowpanel_' + question.name + '"><!-- ko template: { name: "survey-flowpanel-question", data: "' + question.name + '"} --><!-- /ko --></span>'); }; FlowPanel.prototype.elementAfterRender = function (elements, con) { if (!this.survey) return; var el = __WEBPACK_IMPORTED_MODULE_5__base__["c" /* SurveyElement */].GetFirstNonTextElement(elements); if (!!el) { this.survey.afterRenderQuestion(con, el); } }; return FlowPanel; }(__WEBPACK_IMPORTED_MODULE_2__flowpanel__["a" /* FlowPanelModel */])); __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].overrideClassCreator("flowpanel", function () { return new FlowPanel(); }); /* ElementFactory.Instance.registerElement("flowpanel", name => { return new FlowPanel(name); }); */ __WEBPACK_IMPORTED_MODULE_1_knockout__["components"].register("f-panel", { viewModel: { createViewModel: function (params, componentInfo) { var self = this; var question = __WEBPACK_IMPORTED_MODULE_1_knockout__["unwrap"](params.question); self.element = componentInfo.element; self.element.innerHTML = question.html; self.isOnFocus = false; self.wasChanged = false; self.isContentUpdating = false; question.contentChangedCallback = function () { if (self.isContentUpdating) return; __WEBPACK_IMPORTED_MODULE_1_knockout__["cleanNode"](self.element); self.element.innerHTML = question.html; __WEBPACK_IMPORTED_MODULE_1_knockout__["applyBindings"]({ question: question }, self.element); __WEBPACK_IMPORTED_MODULE_1_knockout__["tasks"].runEarly(); }; self.element.onfocus = function () { self.isOnFocus = true; }; self.element.onblur = function () { if (self.wasChanged) self.updateContent(); self.isOnFocus = false; self.wasChanged = false; }; self.element.ondragend = function (event) { var regEx = /{(.*?(element:)[^$].*?)}/g; var str = self.element.innerHTML; var res = regEx.exec(str); if (res !== null) { var q = question.getQuestionFromText(res[0]); if (!!q) { question.content = self.getContent(q.name); } } }; self.updateContent = function () { self.isContentUpdating = true; question.content = self.getContent(); self.isContentUpdating = false; }; question.getContent = self.getContent = function (deletedName) { var content = document.createElement("DIV"); content.innerHTML = self.element.innerHTML; var cps = content.querySelectorAll('span[question="true"]'); for (var i = 0; i < cps.length; i++) { var name = cps[i].id.replace("flowpanel_", ""); var html = ""; if (name !== deletedName) { var el = question.getQuestionByName(name); html = !!el ? question.getElementContentText(el) : ""; } cps[i].outerHTML = html; } return content.innerHTML; }; var config = { characterData: true, attributes: true, childList: true, subtree: true }; var callback = function (mutationsList, observer) { if (!self.isOnFocus) return; self.wasChanged = true; }; var observer = new MutationObserver(callback); observer.observe(self.element, config); return { question: question }; } }, template: "<div></div>" }); /***/ }), /* 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_boolean__ = __webpack_require__(43); /* 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__(7); /* 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; return _this; } return QuestionBooleanImplementor; }(__WEBPACK_IMPORTED_MODULE_4__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.checkedValue; var itemClass = this["koCss"]().item + (isChecked ? " checked" : ""); return itemClass; }; return QuestionBoolean; }(__WEBPACK_IMPORTED_MODULE_1__question_boolean__["a" /* QuestionBooleanModel */])); __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].overrideClassCreator("boolean", function () { return new QuestionBoolean(""); }); __WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("boolean", function (name) { return new QuestionBoolean(name); }); /***/ }), /* 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__(6); /* 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__(14); /* 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__(44); /* 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) { return _super.call(this, question) || this; } QuestionCheckboxImplementor.prototype.getKoValue = function () { return this.question.renderedValue; }; 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; if (!this.hasColumns) { itemClass += 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__["a" /* Serializer */].overrideClassCreator("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; }); /***/ }), /* 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__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__(45); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__koquestion__ = __webpack_require__(7); /* 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__["a" /* Serializer */].overrideClassCreator("comment", function () { return new QuestionComment(""); }); __WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("comment", function (name) { return new QuestionComment(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__question_dropdown__ = __webpack_require__(29); /* 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__(14); /* 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__["a" /* Serializer */].overrideClassCreator("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; }); /***/ }), /* 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_empty__ = __webpack_require__(46); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__koquestion__ = __webpack_require__(7); /* 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__["a" /* Serializer */].overrideClassCreator("empty", function () { return new QuestionEmpty(""); }); /***/ }), /* 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__(6); /* 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__(30); /* 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__(7); /* 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__["a" /* Serializer */].overrideClassCreator("expression", function () { return new QuestionExpression(""); }); __WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("expression", function (name) { return new QuestionExpression(name); }); /***/ }), /* 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_knockout__ = __webpack_require__(6); /* 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__(47); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__koquestion__ = __webpack_require__(7); /* 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__["a" /* Serializer */].overrideClassCreator("file", function () { return new QuestionFile(""); }); __WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("file", function (name) { return new QuestionFile(name); }); /***/ }), /* 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__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__(7); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__question_html__ = __webpack_require__(48); /* 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__["a" /* Serializer */].overrideClassCreator("html", function () { return new QuestionHtml(""); }); __WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("html", function (name) { return new QuestionHtml(name); }); /***/ }), /* 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__question_imagepicker__ = __webpack_require__(49); /* 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__(14); /* 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["koValue"]().indexOf(item.value) !== -1) { itemClass += " checked"; } } else { if (!!item.value && item.value == this["koValue"]()) { itemClass += " checked"; } } return itemClass; }; return QuestionImagePicker; }(__WEBPACK_IMPORTED_MODULE_1__question_imagepicker__["a" /* QuestionImagePickerModel */])); __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].overrideClassCreator("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; }); /***/ }), /* 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_knockout__ = __webpack_require__(6); /* 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__(50); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__koquestion__ = __webpack_require__(7); /* 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__(4); /* 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.onColumnsChanged = function () { _super.prototype.onColumnsChanged.call(this); this.koVisibleRows(this.visibleRows); this.koVisibleColumns(this.visibleColumns); }; 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__["a" /* Serializer */].overrideClassCreator("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; }); /***/ }), /* 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__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__(34); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__question_matrixdynamic__ = __webpack_require__(52); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__question_matrixdropdownbase__ = __webpack_require__(21); /* 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__["a" /* Serializer */].overrideClassCreator("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; }); /***/ }), /* 78 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout__ = __webpack_require__(6); /* 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__(53); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__koquestion__ = __webpack_require__(7); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__koquestion_text__ = __webpack_require__(35); /* 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__["a" /* Serializer */].overrideClassCreator("multipletextitem", function () { return new MultipleTextItem(""); }); __WEBPACK_IMPORTED_MODULE_5__jsonobject__["a" /* Serializer */].overrideClassCreator("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; }); /***/ }), /* 79 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout__ = __webpack_require__(6); /* 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__(5); /* 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__(7); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__question_paneldynamic__ = __webpack_require__(54); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__kopage__ = __webpack_require__(24); /* 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); var self = _this; _this.koAddPanelClick = function () { self.addPanel(); }; _this.koRemovePanelClick = function (data) { self.removePanel(data); }; _this.koPrevPanelClick = function () { self.question.goToPrevPanel(); }; _this.koNextPanelClick = function () { self.question.goToNextPanel(); }; _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__["a" /* Serializer */].overrideClassCreator("paneldynamic", function () { return new QuestionPanelDynamic(""); }); __WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("paneldynamic", function (name) { return new QuestionPanelDynamic(name); }); /***/ }), /* 80 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question_radiogroup__ = __webpack_require__(55); /* 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__(14); /* 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; if (!this.hasColumns) { itemClass += 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__["a" /* Serializer */].overrideClassCreator("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; }); /***/ }), /* 81 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout__ = __webpack_require__(6); /* 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__(7); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_rating__ = __webpack_require__(56); /* 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__["a" /* Serializer */].overrideClassCreator("rating", function () { return new QuestionRating(""); }); __WEBPACK_IMPORTED_MODULE_5__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("rating", function (name) { return new QuestionRating(name); }); /***/ }), /* 82 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-comment\">\n <!-- ko ifnot: question.isReadOnly -->\n <textarea type=\"text\" data-bind=\"value: $data.question.comment, visible: $data.visible, css: question.koCss().other, attr: {maxLength: question.getOthersMaxLength(), 'aria-label': !!question.locTitle && question.locTitle.renderedHtml, placeholder: question.otherPlaceHolder}\"></textarea>\n <!-- /ko -->\n <!-- ko if: question.isReadOnly -->\n <div data-bind=\"text: $data.question.comment, visible: $data.visible, css: question.koCss().other\"></div>\n <!-- /ko -->\n</script>\n"; /***/ }), /* 83 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-flowpanel\">\n <div data-bind=\"style:{ width: renderWidth }, attr: {id: id}, css: cssClasses.panel.container\">\n <h4 data-bind=\"visible: (processedTitle.length > 0), css: cssClasses.panel.title\">\n <!-- ko template: { name: 'survey-string', data: locTitle } -->\n <!-- /ko -->\n </h4>\n <div data-bind=\"css: cssClasses.panel.description\">\n <!-- ko template: { name: 'survey-string', data: locDescription } -->\n <!-- /ko -->\n </div>\n <div data-bind=\"style: { paddingLeft: innerPaddingLeft}\"></div>\n <f-panel params=\"question: question\" data-bind=\"attr: {contenteditable : question.isDesignMode, placeHolder: question.placeHolder}\"></f-panel>\n </div>\n</script>\n<script type=\"text/html\" id=\"survey-flowpanel-question\">\n <!-- ko with: $parent.question.getQuestionByName($data) -->\n <!-- ko template: { name: koElementType(), data: $data, as: 'question', afterRender: parent.koElementAfterRender } --><!-- /ko -->\n <!-- /ko -->\n</script>\n"; /***/ }), /* 84 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-content\">\n\n <div data-bind=\"css: css.root, afterRender: koEventAfterRender\">\n <form onsubmit=\"return false;\">\n <div class=\"sv_custom_header\"></div>\n <div class=\"sv_container\">\n <!-- ko if: (title.length > 0) && showTitle && koState() == 'running' -->\n <div data-bind=\"css: css.header\">\n <h3><!-- ko template: { name: 'survey-string', data: locTitle } --><!-- /ko --></h3>\n <h5><!-- ko template: { name: 'survey-string', data: locDescription } --><!-- /ko --></h5>\n </div>\n <!-- /ko -->\n <!-- ko if: koState() == \"starting\" -->\n <div data-bind=\"css: css.body\">\n <!-- ko if: isNavigationButtonsShowing === 'top' || isNavigationButtonsShowing === 'both' -->\n <!-- ko template: { name: 'survey-navigation-start'} -->\n <!-- /ko -->\n <!-- /ko -->\n <div data-bind=\"attr: { id: startedPage.id }, template: { name: 'survey-page', data: startedPage, afterRender: koAfterRenderPage }\"></div>\n <!-- ko if: isNavigationButtonsShowing === 'bottom' || isNavigationButtonsShowing === 'both' -->\n <!-- ko template: { name: 'survey-navigation-start'} -->\n <!-- /ko -->\n <!-- /ko -->\n </div>\n <!-- /ko -->\n <!-- ko if: koState() == \"running\" -->\n <div data-bind=\"css: css.body\">\n <!-- ko if: isTimerPanelShowingOnTop -->\n <!-- ko template: { name: 'survey-timerpanel'} -->\n <!-- /ko -->\n <!-- /ko -->\n <div data-bind=\"visible: isShowProgressBarOnTop, template: 'survey-progress'\"></div>\n <!-- ko if: isNavigationButtonsShowing === 'top' || isNavigationButtonsShowing === 'both' -->\n <!-- ko template: { name: 'survey-navigation'} -->\n <!-- /ko -->\n <!-- /ko -->\n <!-- ko if: koCurrentPage -->\n <div data-bind=\"attr: { id: koCurrentPage().id }, template: { name: 'survey-page', data: koCurrentPage, afterRender: koAfterRenderPage }\"></div>\n <!-- /ko -->\n <div style=\"margin-top:1em\" data-bind=\"visible: isShowProgressBarOnBottom, template: 'survey-progress'\"></div>\n <!-- ko if: isTimerPanelShowingOnBottom -->\n <!-- ko template: { name: 'survey-timerpanel'} -->\n <!-- /ko -->\n <!-- /ko -->\n <!-- ko if: isNavigationButtonsShowing === 'bottom' || isNavigationButtonsShowing === 'both' -->\n <!-- ko template: { name: 'survey-navigation'} -->\n <!-- /ko -->\n <!-- /ko -->\n </div>\n <!-- /ko -->\n <!-- ko if: koState() == \"completed\" && showCompletedPage -->\n <div data-bind=\"html: processedCompletedHtml, css: completedCss\"></div>\n <div data-bind=\"visible: koCompletedState() != '', css: css.saveData.root\">\n <div data-bind=\"css: koCompletedStateCss\">\n <span data-bind=\"text:koCompletedStateText\"></span>\n <input type=\"button\" data-bind=\"visible: koCompletedState() == 'error', value: getLocString('saveAgainButton'), click: doComplete, css: css.saveData.saveAgainButton\"\n />\n </div>\n </div>\n <!-- /ko -->\n <!-- ko if: koState() == \"completedbefore\" -->\n <div data-bind=\"html: processedCompletedBeforeHtml, css: css.body\"></div>\n <!-- /ko -->\n <!-- ko if: koState() == \"loading\" -->\n <div data-bind=\"html: processedLoadingHtml, css: css.body\"></div>\n <!-- /ko -->\n <!-- ko if: koState() == \"empty\" -->\n <div data-bind=\"text:emptySurveyText, css: css.bodyEmpty\"></div>\n <!-- /ko -->\n </div>\n </form>\n </div>\n</script>\n<script type=\"text/html\" id=\"survey-navigation\">\n <div data-bind=\"css: css.footer\">\n <input type=\"button\" data-bind=\"value: pagePrevText, click: prevPage, visible: !koIsFirstPage() && isShowPrevButton, css: cssNavigationPrev\"\n />\n <input type=\"button\" data-bind=\"value: pageNextText, click: nextPageUIClick, event: { mousedown: nextPageMouseDown }, visible: !koIsLastPage(), css: cssNavigationNext\" />\n <input type=\"button\" data-bind=\"value: completeText, click: completeLastPage, visible: koIsLastPage() && isEditMode, css: cssNavigationComplete\"\n />\n </div>\n</script>\n<script type=\"text/html\" id=\"survey-navigation-start\">\n <div data-bind=\"css: css.footer\">\n <input type=\"button\" data-bind=\"value: startSurveyText, click: start, css: cssNavigationStart\" />\n </div>\n</script>\n"; /***/ }), /* 85 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-matrixcell\">\n <td data-bind=\"css: $context.question.koCss().itemValue + (cell.question.errors.length > 0 ? ' ' + cell.question.koCss().hasError : ''), attr: { headers: cell.question.isVisible ? cell.column.locTitle.renderedHtml : '' }\">\n <div data-bind=\"visible: cell.question.isVisible\">\n <!-- ko if: cell.question.survey.questionErrorLocation == 'top' -->\n <div data-bind=\"css: cell.question.koCss().error.locationTop\">\n <!-- ko template: { name: 'survey-question-errors', data: cell.question } -->\n <!-- /ko -->\n </div>\n <!-- /ko -->\n\n <!-- ko template: { name: question.koTemplateName(), data: cell.question, as: 'question' } -->\n <!-- /ko -->\n\n <!-- ko if: cell.question.survey.questionErrorLocation == 'bottom' -->\n <div data-bind=\"css: cell.question.koCss().error.locationBottom\">\n <!-- ko template: { name: 'survey-question-errors', data: cell.question } -->\n <!-- /ko -->\n </div>\n <!-- /ko -->\n </div>\n </td>\n</script>\n"; /***/ }), /* 86 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-page\">\n <div data-bind=\"css: data.css.page.root\">\n <h4 data-bind=\"visible: data.showPageTitles, css: data.css.pageTitle\">\n <!-- ko template: { name: 'survey-string', data: locTitle } -->\n <!-- /ko -->\n </h4>\n <div data-bind=\"css: data.css.pageDescription\">\n <!-- ko template: { name: 'survey-string', data: locDescription } -->\n <!-- /ko -->\n </div>\n <!-- ko template: { name: 'survey-rows', data: $data} -->\n <!-- /ko -->\n </div>\n</script>\n"; /***/ }), /* 87 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-panel\">\n <div data-bind=\"style:{ width: renderWidth }, attr: {id: id}, css: cssClasses.panel.container\">\n <h4 data-bind=\"visible: (processedTitle.length > 0), css: $data.getTitleStyle(), click: doExpand\">\n <!-- ko template: { name: 'survey-string', data: locTitle } -->\n <!-- /ko -->\n <span class=\"sv_panel_icon\" data-bind=\"visible: koIsCollapsed() || koIsExpanded(), css: {sv_expanded: !koIsCollapsed()}\"></span>\n </h4>\n <div data-bind=\"css: cssClasses.panel.description\">\n <!-- ko template: { name: 'survey-string', data: locDescription } -->\n <!-- /ko -->\n </div>\n <!-- ko template: { name: 'survey-question-errors', data: $data } -->\n <!-- /ko -->\n <div data-bind=\"visible: !koIsCollapsed(), style: { paddingLeft: innerPaddingLeft}\">\n <!-- ko template: { name: 'survey-rows', data: $data} -->\n <!-- /ko -->\n </div>\n </div>\n</script>"; /***/ }), /* 88 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-progress\">\n <div data-bind=\"css: css.progress\">\n <div data-bind=\"css: css.progressBar, style:{width: koProgress() + '%'}\"\n role=\"progressbar\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n <span data-bind=\"text:koProgressText\"></span>\n </div>\n </div>\n</script>"; /***/ }), /* 89 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-boolean\">\n <div data-bind=\"css: question.koCss().root\">\n <label data-bind=\"css: question.getItemCss()\">\n <input type=\"checkbox\" data-bind=\"attr: {name: question.name, id: question.inputId, 'aria-label': question.locTitle.renderedHtml}, checked: question.checkedValue, surveyProp: {indeterminate: question.isIndeterminate}, enable: !question.isReadOnly\"\n />\n <span data-bind=\"css: question.koCss().materialDecorator\">\n <span class=\"check\"></span>\n </span>\n <span data-bind=\"css: question.koCss().label\">\n <!-- ko template: { name: 'survey-string', data: locDisplayLabel } -->\n <!-- /ko -->\n </span>\n </label>\n </div>\n</script>\n"; /***/ }), /* 90 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-checkbox\">\n <fieldset data-bind=\"css: question.koCss().root\">\n <legend data-bind=\"attr: { 'aria-label': question.locTitle.renderedHtml }\"></legend>\n <!-- ko ifnot: question.hasColumns -->\n <!-- ko foreach: { data: question.visibleChoices, as: 'item', afterRender: question.koAfterRender } -->\n <!-- ko template: 'survey-checkbox-item' -->\n <!-- /ko -->\n <!-- /ko -->\n <!-- /ko -->\n <!-- ko if: question.hasColumns -->\n <!-- ko foreach: question.columns -->\n <div data-bind=\"css: question.getColumnClass()\">\n <!-- ko foreach: { data: $data, as: 'item', afterRender: question.koAfterRender } -->\n <!-- ko template: 'survey-checkbox-item' -->\n <!-- /ko -->\n <!-- /ko -->\n </div>\n <!-- /ko -->\n <!-- /ko -->\n </fieldset>\n</script>\n<script type=\"text/html\" id=\"survey-checkbox-item\">\n <div data-bind=\"css: question.getItemClass(item)\">\n <label data-bind=\"css: question.koCss().label\">\n <!-- ko if: item == question.selectAllItem -->\n <input type=\"checkbox\" data-bind=\"attr: {name: question.name, id: question.inputId + '_' + $index(), 'aria-label': item.locText.renderedHtml }, checked: question.koAllSelected, enable: !question.isReadOnly, css: question.koCss().itemControl\"/>\n <!-- /ko -->\n <!-- ko if: item != question.selectAllItem -->\n <input type=\"checkbox\" data-bind=\"attr: {name: question.name, id: question.inputId + '_' + $index(), 'aria-label': item.locText.renderedHtml }, checkedValue: item.value, checked: question.koValue, enable: !question.isReadOnly && item.isEnabled, css: question.koCss().itemControl\"/>\n <!-- /ko -->\n <span data-bind=\"css: question.koCss().materialDecorator\">\n <span class=\"check\"></span>\n </span>\n <span data-bind=\"css: question.koCss().controlLabel\">\n <!-- ko template: { name: 'survey-string', data: item.locText } -->\n <!-- /ko -->\n </span>\n </label>\n <!-- ko if: question.hasOther && (item.value == question.otherItem.value) -->\n <div class=\"form-group\" data-bind=\"template: { name: 'survey-comment', data: {'question': question, 'visible': question.isOtherSelected } }\"></div>\n <!-- /ko -->\n </div>\n</script>\n"; /***/ }), /* 91 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-comment\">\n <textarea type=\"text\" data-bind=\"attr: {'readonly': question.isReadOnly, maxLength: question.getMaxLength(), cols: question.cols, rows: question.rows, id: question.inputId, placeholder: question.placeHolder, 'aria-label': question.locTitle.renderedHtml}, value:question.value, css: question.koCss().root\"></textarea>\n</script>"; /***/ }), /* 92 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-dropdown\">\n <!-- ko ifnot: question.isReadOnly -->\n <div data-bind=\"css: question.koCss().selectWrapper\">\n <select data-bind=\"attr: {id: question.inputId, 'aria-label': question.locTitle.renderedHtml}, value: question.renderedValue, valueAllowUnset: true, css: question.koCss().control\">\n <!-- ko if: question.showOptionsCaption -->\n <option data-bind=\"text:question.optionsCaption, value: null\"></option>\n <!-- /ko -->\n <!-- ko foreach: question.visibleChoices -->\n <option data-bind=\"value: $data.value, text: $data.text, attr: { disabled: !$data.isEnabled }\"></option>\n <!-- /ko -->\n </select>\n </div>\n <!-- /ko -->\n <!-- ko if: question.isReadOnly -->\n <div data-bind=\"text: question.hasOther && question.isOtherSelected ? question.otherText : question.displayValue, css: question.koCss().control\"></div>\n <!-- /ko -->\n <!-- ko if: question.hasOther -->\n <div class=\"form-group\" data-bind=\"template: { name: 'survey-comment', data: {'question': question, 'visible': question.isOtherSelected } }, style: {display: question.isFlowLayout ? 'inline': ''}\"></div>\n <!-- /ko -->\n</script>\n"; /***/ }), /* 93 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-empty\">\n<div></div>\n</script>\n"; /***/ }), /* 94 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-errors\">\n <div role=\"alert\" data-bind=\"visible: errors.length > 0, foreach: { data: errors, as: 'error'}, css: question.koCss().error.root\">\n <div>\n <span aria-hidden=\"true\" data-bind=\"css: question.koCss().error.icon\"></span>\n <span data-bind=\"css: question.koCss().error.item\">\n <!-- ko template: { name: 'survey-string', data: error.locText } --><!-- /ko -->\n </span>\n </div>\n </div>\n</script>"; /***/ }), /* 95 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-expression\">\n <div data-bind=\"text:question.koDisplayValue, css: question.koCss().root\"></div>\n</script>"; /***/ }), /* 96 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-file\">\n <div data-bind=\"css: question.cssClasses.root\">\n <!-- ko ifnot: question.isReadOnly -->\n <input type=\"file\" data-bind=\"css: question.cssClasses.fileInput, attr: {id: question.inputId, 'aria-label': question.locTitle.renderedHtml, multiple: question.allowMultiple ? 'multiple' : undefined, title: koInputTitle, accept: question.acceptedTypes }, event: {change: question.dochange}\">\n <!-- ko if: question.koHasValue -->\n <button type=\"button\" data-bind=\"css: question.cssClasses.removeButton, click: question.doclean, text: question.cleanButtonCaption\"></button>\n <!-- /ko -->\n <!-- /ko -->\n <!-- ko if: question.isReadOnly -->\n <input type=\"file\" disabled data-bind=\"css: 'form-control ' + question.cssClasses.placeholderInput, attr: { placeholder: question.title }\" style=\"color: transparent;\"/>\n <!-- /ko -->\n <div data-bind=\"foreach: question.koData, visible: question.koHasValue\">\n <span data-bind=\"visible: question.showPreview, css: question.cssClasses.preview\">\n <!-- ko if: $data.name -->\n <div>\n <a data-bind=\"style: { width: question.imageWidth + 'px' }, text: $data.name, attr: { href: $data.content, title: $data.name, download: $data.name }\"></a>\n </div>\n <!-- /ko -->\n <!-- ko if: question.canPreviewImage($data) -->\n <img data-bind=\"attr: { src: $data.content, height: question.imageHeight, width: question.imageWidth }\" alt=\"File preview\">\n <!-- /ko -->\n <!-- ko if: $data.name -->\n <div>\n <!-- ko ifnot: question.isReadOnly -->\n <span data-bind=\"css: question.cssClasses.removeFile, click: question.doremovefile, text: question.removeFileCaption\"></span>\n <!-- /ko -->\n </div>\n <!-- /ko -->\n </span>\n </div>\n </div>\n</script>\n"; /***/ }), /* 97 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-html\">\n <div data-bind=\"html: question.locHtml.koRenderedHtml, css: question.koCss().root\"></div>\n</script>\n"; /***/ }), /* 98 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-imagepicker\">\n <fieldset data-bind=\"css: question.koCss().root\">\n <legend data-bind=\"attr: { 'aria-label': question.locTitle.renderedHtml }\"></legend>\n <!-- ko foreach: { data: question.visibleChoices, as: 'item', afterRender: question.koAfterRender} -->\n <div data-bind=\"css: question.getItemClass(item)\">\n <label data-bind=\"css: question.koCss().label\">\n <input style=\"display: none;\" data-bind=\"attr: {type: question.multiSelect ? 'checkbox' : 'radio', name: question.name + '_' + question.id, value: item.value, id: ($index() == 0) ? question.inputId : '', 'aria-label': question.locTitle.renderedHtml}, checked: question.koValue, enable: !question.isReadOnly, css: question.koCss().itemControl\"\n />\n <div>\n <!-- ko if: question.contentMode === \"image\" -->\n <img data-bind=\"css: question.koCss().image, attr: { src: $data.imageLink, width: question.imageWidth ? question.imageWidth + 'px' : undefined, height: question.imageHeight ? question.imageHeight + 'px' : undefined }, style: { objectFit: question.imageFit }\"/>\n <!-- /ko -->\n <!-- ko if: question.contentMode === \"video\" -->\n <embed data-bind=\"css: question.koCss().image, attr: { src: $data.imageLink, width: question.imageWidth ? question.imageWidth + 'px' : undefined, height: question.imageHeight ? question.imageHeight + 'px' : undefined }, style: { objectFit: question.imageFit }\"/>\n <!-- /ko -->\n <!-- ko if: question.showLabel -->\n <span data-bind=\"text: text || value, attr: { title: text || value }, css: question.koCss().itemText\"></span>\n <!-- /ko -->\n </div>\n </label>\n </div>\n <!-- /ko -->\n </fieldset>\n</script>\n"; /***/ }), /* 99 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-matrix\">\n <fieldset>\n <legend data-bind=\"attr: { 'aria-label': question.locTitle.renderedHtml }\"></legend>\n <table data-bind=\"css: question.koCss().root\">\n <!-- ko if: question.showHeader -->\n <thead>\n <tr>\n <td data-bind=\"visible: question.hasRows\"></td>\n <!-- ko foreach: question.koVisibleColumns -->\n <th>\n <!-- ko template: { name: 'survey-string', data: locText } -->\n <!-- /ko -->\n </th>\n <!-- /ko -->\n </tr>\n </thead>\n <!-- /ko -->\n <tbody>\n <!-- ko foreach: { data: question.koVisibleRows, as: 'row' } -->\n <tr data-bind=\"css: question.koCss().row\">\n <td data-bind=\"visible: question.hasRows\">\n <!-- ko template: { name: 'survey-string', data: row.locText } -->\n <!-- /ko -->\n </td>\n <!-- ko foreach: question.koVisibleColumns -->\n <!-- ko if: question.hasCellText -->\n <td data-bind=\"css: question.getItemCss(row, $data), click: function() { if(!question.isReadOnly) {row.koCellClick($data); } }\">\n <!-- ko template: { name: 'survey-string', data: question.getCellDisplayLocText(row.name, $data) } -->\n <!-- /ko -->\n </td>\n <!-- /ko -->\n <!-- ko if: !question.hasCellText -->\n <td data-bind=\"attr: { headers: $data.locText.renderedHtml }\">\n <label data-bind=\"css: question.getItemCss(row, $data)\">\n <input type=\"radio\" data-bind=\"css: question.koCss().itemValue, attr: {name: row.fullName, 'aria-label': question.locTitle.renderedHtml, value: '' + $data.value, id: question.inputId + '_' + row.name + '_' + $index()}, checked: row.koValue, enable: !question.isReadOnly\"\n />\n <span class=\"circle\"></span>\n <span class=\"check\"></span>\n <span style=\"display: none\" data-bind=\"text: $data.locText.text\"></span>\n </label>\n </td>\n <!-- /ko -->\n <!-- /ko -->\n </tr>\n <!-- /ko -->\n </tbody>\n </table>\n </fieldset>\n</script>\n<script type=\"text/html\" id=\"survey-text\">\n <span data-bind=\"text:$data.renderedHtml\"></span>\n</script>"; /***/ }), /* 100 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-matrixdynamic\">\n <div data-bind=\"visible: question.koIsAddRowOnTop(), css: question.koCss().footer\">\n <button type=\"button\" data-bind=\"click:question.koAddRowClick, css: question.koCss().button + ' ' + question.koCss().buttonAdd\">\n <span data-bind=\"text: question.addRowText\"></span>\n <span data-bind=\"css: question.koCss().iconAdd\"></span>\n </button>\n </div>\n <div data-bind=\"style: {overflowX: question.horizontalScroll? 'scroll': ''}\">\n <table data-bind=\"visible: question.koIsHorizontalColumnLayout, css: question.koCss().root\">\n <thead data-bind=\"visible: question.showHeader\">\n <tr>\n <!-- ko if: question.hasRowText --><td></td><!-- /ko -->\n <!-- ko foreach: question.koVisibleColumns -->\n <th data-bind=\"style: { minWidth: question.getColumnWidth($data) }\">\n <!-- ko template: { name: 'survey-string', data: locTitle } -->\n <!-- /ko -->\n </th>\n <!-- /ko -->\n <!-- ko if: question.koCanRemoveRow -->\n <td></td>\n <!-- /ko -->\n </tr>\n </thead>\n <tbody>\n <!-- ko foreach: { data: question.koRows, as: 'row' } -->\n <tr>\n <!-- ko if: question.hasRowText --><td><!-- ko template: { name: 'survey-string', data: row.locText } --><!-- /ko --></td><!-- /ko -->\n <!-- ko foreach: row.cells-->\n <!-- ko template: { name: 'survey-matrixcell', data: $data, as: \"cell\", afterRender: $data.data.koCellAfterRender } -->\n <!-- /ko -->\n <!-- /ko -->\n <!-- ko if: question.koCanRemoveRow -->\n <td>\n <button type=\"button\" data-bind=\"click:question.koRemoveRowClick, css: question.koCss().button + ' ' + question.koCss().buttonRemove\">\n <span data-bind=\"text: question.removeRowText\"></span>\n <span data-bind=\"css: question.koCss().iconRemove\"></span>\n </button>\n </td>\n <!-- /ko -->\n </tr>\n <!-- /ko -->\n </tbody>\n <!-- ko if:question.hasFooter -->\n <tfoot>\n <tr>\n <!-- ko if: question.hasRowText --><td><!-- ko template: { name: 'survey-string', data: question.locTotalText } --><!-- /ko --></td><!-- /ko -->\n <!-- ko foreach: question.visibleTotalRow.cells-->\n <td>\n <!-- ko if: $data.question -->\n <!-- ko template: { name: \"survey-question-expression\", data: $data.question, as: 'question' } -->\n <!-- /ko -->\n <!-- /ko -->\n </td>\n <!-- /ko -->\n <!-- ko if: question.koCanRemoveRow -->\n <td></td>\n <!-- /ko -->\n </tr>\n </tfoot>\n <!-- /ko -->\n </table>\n <!-- ko if: !question.koIsHorizontalColumnLayout() -->\n <table data-bind=\"css: question.koCss().root\">\n <!-- ko if: question.hasRowText -->\n <thead>\n <tr>\n <th data-bind=\"visible: question.showHeader\"></th>\n <!-- ko foreach: { data: question.koRows, as: 'row' } -->\n <th><!-- ko template: { name: 'survey-string', data: row.locText } --><!-- /ko --></th>\n <!-- /ko -->\n <!-- ko if:question.hasFooter -->\n <th><!-- ko template: { name: 'survey-string', data: question.locTotalText } --><!-- /ko --></th>\n <!-- /ko -->\n </tr>\n </thead>\n <!-- /ko -->\n <tbody>\n <!-- ko foreach: { data: question.koVisibleColumns, as: 'column' } -->\n <tr>\n <th data-bind=\"visible: question.showHeader, style: { minWidth: question.getColumnWidth($data) }\">\n <!-- ko template: { name: 'survey-string', data: locTitle } -->\n <!-- /ko -->\n </th>\n <!-- ko foreach: { data: question.koRows, as: 'row' } -->\n <!-- ko template: { name: 'survey-matrixcell', data: row.cells[column.index], as: \"cell\", afterRender: row.data.koCellAfterRender } -->\n <!-- /ko -->\n <!-- /ko -->\n <!-- ko if:question.hasFooter -->\n <td>\n <!-- ko if: column.hasTotal -->\n <!-- ko template: { name: \"survey-question-expression\", data: question.visibleTotalRow.cells[column.index].question, as: 'question' } -->\n <!-- /ko -->\n <!-- /ko -->\n </td>\n <!-- /ko -->\n </tr>\n <!-- /ko -->\n <!-- ko if: question.koCanRemoveRow -->\n <tr>\n <td data-bind=\"visible: question.showHeader\">\n </td>\n <!-- ko foreach: { data: question.koRows, as: 'row' } -->\n <td>\n <button type=\"button\" data-bind=\"click:question.koRemoveRowClick, css: question.koCss().button + ' ' + question.koCss().buttonRemove\">\n <span data-bind=\"text: question.removeRowText\"></span>\n <span data-bind=\"css: question.koCss().iconRemove\"></span>\n </button>\n </td>\n <!-- /ko -->\n <!-- ko if:question.hasFooter -->\n <td></td>\n <!-- /ko -->\n </tr>\n <!-- /ko -->\n </tbody>\n </table>\n <!-- /ko -->\n </div>\n <div data-bind=\"visible: question.koIsAddRowOnBottom(), css: question.koCss().footer\">\n <button type=\"button\" data-bind=\"click:question.koAddRowClick, css: question.koCss().button + ' ' + question.koCss().buttonAdd\">\n <span data-bind=\"text: question.addRowText\"></span>\n <span data-bind=\"css: question.koCss().iconAdd\"></span>\n </button>\n </div>\n</script>\n"; /***/ }), /* 101 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-multipletext\">\n <table data-bind=\"css: question.koCss().root, foreach: { data: question.koRows, as: 'row' }\">\n <tr data-bind=\"foreach: { data: row, as: 'item' }, css: question.koCss().row\">\n <td data-bind=\"css: question.koCss().itemTitle\"><!-- ko template: { name: 'survey-string', data: item.locTitle } --><!-- /ko --></td>\n <td>\n <!-- ko if: item.editor.errorLocation == 'top' -->\n <div data-bind=\"css: question.koCss().error.locationTop\">\n <!-- ko template: { name: 'survey-question-errors', data: item.editor } -->\n <!-- /ko -->\n </div>\n <!-- /ko -->\n <!-- ko template: { name: item.editor.koTemplateName(), data: item.editor, as: 'question' } -->\n <!-- /ko -->\n <!-- ko if: item.editor.errorLocation == 'bottom' -->\n <div data-bind=\"css: question.koCss().error.locationBottom\">\n <!-- ko template: { name: 'survey-question-errors', data: item.editor } -->\n <!-- /ko -->\n </div>\n <!-- /ko -->\n </td>\n </tr>\n </table>\n</script>\n"; /***/ }), /* 102 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-paneldynamic-navigator\">\n <input type=\"range\" min=\"0\" style=\"width:25%;float:left;margin:5px\" data-bind=\"visible: koIsRange, value: question.koRangeValue, attr: {max: question.koRangeMax}\" />\n <input type=\"button\" style=\"float:left;margin:5px\" data-bind=\"visible: question.koIsPrevButton, click:question.koPrevPanelClick, css: question.koCss().button + ' ' + question.koCss().buttonPrev, value: question.panelPrevText\" />\n <input type=\"button\" style=\"float:left;margin:5px\" data-bind=\"visible: question.koIsNextButton, click:question.koNextPanelClick, css: question.koCss().button + ' ' + question.koCss().buttonNext, value: question.panelNextText\" />\n <input type=\"button\" style=\"float:left;margin:5px\" data-bind=\"visible:question.koCanAddPanel, click:question.koAddPanelClick, css: question.koCss().button + ' ' + question.koCss().buttonAdd, value: question.panelAddText\" />\n</script>\n"; /***/ }), /* 103 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-paneldynamic\">\n <div data-bind=\"css: question.koCss().root\">\n <!-- ko if: question.koIsList() -->\n <!-- ko foreach: { data: question.panels } -->\n <!-- ko template: { name: 'survey-panel', data: $data, as: 'question', afterRender: question.koPanelAfterRender } -->\n <!-- /ko -->\n <input type=\"button\" style=\"margin-top:5px\" data-bind=\"visible: question.koCanRemovePanel() && !$data.koIsCollapsed(), click:question.koRemovePanelClick, css: question.koCss().button + ' ' + question.koCss().buttonRemove, value: question.panelRemoveText\"\n />\n <hr/>\n <!-- /ko -->\n <input type=\"button\" data-bind=\"visible:question.koCanAddPanel, click:question.koAddPanelClick, css: question.koCss().button + ' ' + question.koCss().buttonAdd, value: question.panelAddText\"\n />\n <!-- /ko -->\n <!-- ko ifnot: question.koIsList() -->\n <div data-bind=\"visible:question.koIsProgressTop\">\n <!-- ko template: { name: 'survey-question-paneldynamic-navigator', data: question, as: 'question'} -->\n <!-- /ko -->\n </div>\n <!-- ko if: question.koPanel() -->\n <!-- ko template: { name: 'survey-panel', data: question.koPanel(), as: 'question', afterRender: question.koPanelAfterRender } -->\n <!-- /ko -->\n <!-- /ko -->\n <input type=\"button\" style=\"margin-top:5px\" data-bind=\"visible: question.koCanRemovePanel, click:question.koRemovePanelClick, css: question.koCss().button + ' ' + question.koCss().buttonRemove, value: question.panelRemoveText\"\n />\n <div data-bind=\"visible:question.koIsProgressBottom\">\n <!-- ko template: { name: 'survey-question-paneldynamic-navigator', data: question, as: 'question'} -->\n <!-- /ko -->\n </div>\n <!-- /ko -->\n </div>\n</script>\n"; /***/ }), /* 104 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-radiogroup\">\n <fieldset data-bind=\"css: question.koCss().root\">\n <legend data-bind=\"attr: { 'aria-label': question.locTitle.renderedHtml }\"></legend>\n <!-- ko ifnot: question.hasColumns -->\n <!-- ko foreach: { data: question.visibleChoices, as: 'item', afterRender: question.koAfterRender } -->\n <!-- ko template: 'survey-radiogroup-item' -->\n <!-- /ko -->\n <!-- /ko -->\n <!-- /ko -->\n <!-- ko if: question.hasColumns -->\n <!-- ko foreach: question.columns -->\n <div data-bind=\"css: question.getColumnClass()\">\n <!-- ko foreach: { data: $data, as: 'item', afterRender: question.koAfterRender } -->\n <!-- ko template: 'survey-radiogroup-item' -->\n <!-- /ko -->\n <!-- /ko -->\n </div>\n <!-- /ko -->\n <!-- /ko -->\n <!-- ko if: question.canShowClearButton -->\n <div>\n <input type=\"button\" data-bind=\"click:question.clearValue, css: question.koCss().clearButton, value: question.clearButtonCaption\"/>\n </div>\n <!-- /ko -->\n </fieldset>\n</script>\n<script type=\"text/html\" id=\"survey-radiogroup-item\">\n <div data-bind=\"css: question.getItemClass(item)\">\n <label data-bind=\"css: question.koCss().label\">\n <input type=\"radio\" data-bind=\"attr: {name: question.name + '_' + question.id, id: question.inputId + '_' + $index(), 'aria-label': item.locText.renderedHtml}, checkedValue: item.value, checked: question.renderedValue, enable: !question.isReadOnly && item.isEnabled, css: question.koCss().itemControl\"\n />\n <span data-bind=\"css: question.koCss().materialDecorator\"></span>\n <span class=\"check\"></span>\n <span data-bind=\"css: question.koCss().controlLabel\">\n <!-- ko template: { name: 'survey-string', data: item.locText } -->\n <!-- /ko -->\n </span>\n </label>\n <!-- ko if: question.hasOther && (item.value == question.otherItem.value) -->\n <div class=\"form-group\" data-bind=\"template: { name: 'survey-comment', data: {'question': question, 'visible': question.isOtherSelected}}\"></div>\n <!-- /ko -->\n </div>\n</script>\n"; /***/ }), /* 105 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-rating\">\n <div data-bind=\"css: question.koCss().root\">\n <!-- ko foreach: question.koVisibleRateValues -->\n <label data-bind=\"css: question.koGetCss($data)\">\n <input type=\"radio\" style=\"display: none;\" data-bind=\"attr: {name: question.name, id: question.name + $index(), value: $data.value, 'aria-label': $data.locText.text}, event: { change: question.koChange}, enable: !question.isReadOnly\"\n />\n <!-- ko if: $index() == 0 -->\n <span data-bind=\"css: question.koCss().minText\">\n <!-- ko template: { name: 'survey-string', data: question.locMinRateDescription } -->\n <!-- /ko -->\n </span>\n <!-- /ko -->\n\n <span data-bind=\"css: question.koCss().itemText\">\n <!-- ko template: { name: 'survey-string', data: $data.locText } -->\n <!-- /ko -->\n </span>\n\n <!-- ko if: $index() == (question.koVisibleRateValues().length-1) -->\n <span data-bind=\"css: question.koCss().maxText\">\n <!-- ko template: { name: 'survey-string', data: question.locMaxRateDescription } -->\n <!-- /ko -->\n </span>\n <!-- /ko -->\n </label>\n <!-- /ko -->\n </div>\n <div data-bind=\"visible: question.hasOther\">\n <div data-bind=\"template: { name: 'survey-comment', data: {'question': question } }\"></div>\n </div>\n</script>"; /***/ }), /* 106 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-text\">\n <input data-bind=\"disable: question.isReadOnly, attr: {type: question.inputType, size: question.size, id: question.inputId, placeholder: question.inputType === 'range' ? undefined : question.placeHolder, maxLength: question.getMaxLength(), 'aria-label': question.locTitle.renderedHtml}, value:question.value, css: question.koCss().root\"/>\n</script>\n"; /***/ }), /* 107 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question\">\n <div data-bind=\"css: question.koRootClass, style: { paddingLeft: question.paddingLeft, paddingRight: question.paddingRight, width: question.renderWidth }, attr: {id: question.id}\">\n <div data-bind=\"css: {'title-left': question.hasTitleOnLeft}\">\n <!-- ko if: question.hasTitleOnLeftTop -->\n <!--ko template: { name: 'survey-question-title', data: question } -->\n <!-- /ko -->\n <!-- /ko -->\n </div>\n\n <div data-bind=\"css: {'content-left': question.hasTitleOnLeft}\">\n <!-- ko if: question.errorLocation == 'top' -->\n <div data-bind=\"css: question.koCss().error.locationTop\">\n <!-- ko template: { name: 'survey-question-errors', data: question } -->\n <!-- /ko -->\n </div>\n <!-- /ko -->\n <!-- ko template: { name: question.koTemplateName(), data: question, afterRender: question.koQuestionAfterRender } -->\n <!-- /ko -->\n <!-- ko if: question.hasComment -->\n <div class=\"form-group\">\n <!-- ko template: { name: 'survey-string', data: question.locCommentText } -->\n <!-- /ko -->\n <div data-bind=\"template: { name: 'survey-comment', data: {'question': question, 'visible': true } }\"></div>\n </div>\n <!-- /ko -->\n <!-- ko if: question.errorLocation == 'bottom' -->\n <div data-bind=\"css: question.koCss().error.locationBottom\">\n <!-- ko template: { name: 'survey-question-errors', data: question } -->\n <!-- /ko -->\n </div>\n <!-- /ko -->\n <!-- ko if: question.hasTitleOnBottom -->\n <!--ko template: { name: 'survey-question-title', data: question } -->\n <!-- /ko -->\n <!-- /ko -->\n </div>\n </div>\n</script>\n"; /***/ }), /* 108 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-question-title\">\n <h5 data-bind=\"css: koCss().title\">\n <!-- ko if: no -->\n <span style=\"position: static;\" data-bind=\"css: koCss().number, text: no\"></span>\n <span style=\"position: static;\">. </span>\n <!-- /ko -->\n <!-- ko template: { name: 'survey-string', data: locTitle } --><!-- /ko -->\n </h5>\n <div data-bind=\"visible: !locDescription.isEmpty, css: koCss().description\">\n <!-- ko template: { name: 'survey-string', data: locDescription } --><!-- /ko -->\n </div>\n</script>\n"; /***/ }), /* 109 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-rows\">\n <!-- ko foreach: { data: rows, as: 'row'} -->\n <!-- ko if: row.visible -->\n <div data-bind=\"css: panel.cssClasses.row\">\n <!-- ko foreach: { data: row.elements, as: 'question' , afterRender: row.koAfterRender } -->\n <!-- ko if: question.isVisible -->\n <!-- ko template: { name: question.koElementType, data: question, afterRender: $parent.koElementAfterRender } -->\n <!-- /ko -->\n <!-- /ko -->\n <!-- /ko -->\n </div>\n <!-- /ko -->\n <!-- /ko -->\n</script>"; /***/ }), /* 110 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-string\">\n <!-- ko ifnot: koHasHtml -->\n <span style=\"position: static;\" data-bind=\"text: koRenderedHtml\"></span>\n <!-- /ko -->\n <!-- ko if: koHasHtml -->\n <span style=\"position: static;\" data-bind=\"html: koRenderedHtml\"></span>\n <!-- /ko -->\n</script>\n"; /***/ }), /* 111 */ /***/ (function(module, exports) { module.exports = "<script type=\"text/html\" id=\"survey-timerpanel\">\n <div data-bind=\"text:koTimerInfoText\"></div>\n</script>\n"; /***/ }), /* 112 */ /***/ (function(module, exports, __webpack_require__) { module.exports = "" + __webpack_require__(84) + " " + __webpack_require__(82) + "\n" + __webpack_require__(86) + "\n" + __webpack_require__(87) + "" + __webpack_require__(83) + "\n" + __webpack_require__(88) + " " + __webpack_require__(109) + "\n" + __webpack_require__(110) + " " + __webpack_require__(111) + "\n" + __webpack_require__(85) + " " + __webpack_require__(107) + "\n" + __webpack_require__(108) + " " + __webpack_require__(90) + "\n" + __webpack_require__(91) + " " + __webpack_require__(92) + "\n" + __webpack_require__(94) + " " + __webpack_require__(96) + "\n" + __webpack_require__(97) + " " + __webpack_require__(99) + "\n" + __webpack_require__(100) + "\n" + __webpack_require__(103) + "\n" + __webpack_require__(102) + "\n" + __webpack_require__(101) + "\n" + __webpack_require__(104) + " " + __webpack_require__(105) + "\n" + __webpack_require__(106) + " " + __webpack_require__(89) + "\n" + __webpack_require__(93) + " " + __webpack_require__(95) + "\n" + __webpack_require__(98) + "\n"; /***/ }), /* 113 */ /***/ (function(module, exports) { module.exports = "<div style=\"position: fixed; bottom: 3px; right: 10px; max-width: 60%;\" data-bind=\"css: css.window.root\">\n <div data-bind=\"css: css.window.header.root\">\n <span data-bind=\"click:doExpand\" style=\"width: 100%; cursor: pointer;\">\n <span style=\"padding-right:10px\" data-bind=\"css: css.window.header.title, text: locTitle.koRenderedHtml\"></span>\n <span aria-hidden=\"true\" data-bind=\"css: koExpandedCss\"></span>\n </span>\n <span data-bind=\"visible:koExpanded, click:doExpand\" style=\"float: right; cursor: pointer;\">\n <span style=\"padding-right:10px\" data-bind=\"css: css.window.header.title\">X</span>\n </span>\n </div>\n <div data-bind=\"visible:koExpanded, css: css.window.body\">\n <div id=\"windowSurveyJS\"></div>\n </div>\n</div>"; /***/ }), /* 114 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__expressions__ = __webpack_require__(25); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SyntaxError; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return parse; }); // tslint:disable:only-arrow-functions // tslint:disable:object-literal-shorthand // tslint:disable:trailing-comma // tslint:disable:object-literal-sort-keys // tslint:disable:one-variable-per-declaration // tslint:disable:max-line-length // tslint:disable:no-consecutive-blank-lines // tslint:disable:align // Generated by PEG.js v. 0.10.0 (ts-pegjs plugin v. 0.2.3 ) // // https://pegjs.org/ https://github.com/metadevpro/ts-pegjs var SyntaxError = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SyntaxError, _super); function SyntaxError(message, expected, found, location) { var _this = _super.call(this) || this; _this.message = message; _this.expected = expected; _this.found = found; _this.location = location; _this.name = "SyntaxError"; if (typeof Error.captureStackTrace === "function") { Error.captureStackTrace(_this, SyntaxError); } return _this; } SyntaxError.buildMessage = function (expected, found) { function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); } function literalEscape(s) { return s .replace(/\\/g, "\\\\") .replace(/"/g, "\\\"") .replace(/\0/g, "\\0") .replace(/\t/g, "\\t") .replace(/\n/g, "\\n") .replace(/\r/g, "\\r") .replace(/[\x00-\x0F]/g, function (ch) { return "\\x0" + hex(ch); }) .replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { return "\\x" + hex(ch); }); } function classEscape(s) { return s .replace(/\\/g, "\\\\") .replace(/\]/g, "\\]") .replace(/\^/g, "\\^") .replace(/-/g, "\\-") .replace(/\0/g, "\\0") .replace(/\t/g, "\\t") .replace(/\n/g, "\\n") .replace(/\r/g, "\\r") .replace(/[\x00-\x0F]/g, function (ch) { return "\\x0" + hex(ch); }) .replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { return "\\x" + hex(ch); }); } function describeExpectation(expectation) { switch (expectation.type) { case "literal": return "\"" + literalEscape(expectation.text) + "\""; case "class": var escapedParts = expectation.parts.map(function (part) { return Array.isArray(part) ? classEscape(part[0]) + "-" + classEscape(part[1]) : classEscape(part); }); return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]"; case "any": return "any character"; case "end": return "end of input"; case "other": return expectation.description; } } function describeExpected(expected1) { var descriptions = expected1.map(describeExpectation); var i; var j; descriptions.sort(); if (descriptions.length > 0) { for (i = 1, j = 1; i < descriptions.length; i++) { if (descriptions[i - 1] !== descriptions[i]) { descriptions[j] = descriptions[i]; j++; } } descriptions.length = j; } switch (descriptions.length) { case 1: return descriptions[0]; case 2: return descriptions[0] + " or " + descriptions[1]; default: return descriptions.slice(0, -1).join(", ") + ", or " + descriptions[descriptions.length - 1]; } } function describeFound(found1) { return found1 ? "\"" + literalEscape(found1) + "\"" : "end of input"; } return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; }; return SyntaxError; }(Error)); function peg$parse(input, options) { options = options !== undefined ? options : {}; var peg$FAILED = {}; var peg$startRuleFunctions = { Expression: peg$parseExpression }; var peg$startRuleFunction = peg$parseExpression; var peg$c0 = function (head, tail) { return buildBinaryOperand(head, tail, true); }; var peg$c1 = "||"; var peg$c2 = peg$literalExpectation("||", false); var peg$c3 = "or"; var peg$c4 = peg$literalExpectation("or", true); var peg$c5 = function () { return "or"; }; var peg$c6 = "&&"; var peg$c7 = peg$literalExpectation("&&", false); var peg$c8 = "and"; var peg$c9 = peg$literalExpectation("and", true); var peg$c10 = function () { return "and"; }; var peg$c11 = function (head, tail) { return buildBinaryOperand(head, tail); }; var peg$c12 = "<="; var peg$c13 = peg$literalExpectation("<=", false); var peg$c14 = "=<"; var peg$c15 = peg$literalExpectation("=<", false); var peg$c16 = "lessorequal"; var peg$c17 = peg$literalExpectation("lessorequal", true); var peg$c18 = function () { return "lessorequal"; }; var peg$c19 = ">="; var peg$c20 = peg$literalExpectation(">=", false); var peg$c21 = "=>"; var peg$c22 = peg$literalExpectation("=>", false); var peg$c23 = "greaterorequal"; var peg$c24 = peg$literalExpectation("greaterorequal", true); var peg$c25 = function () { return "greaterorequal"; }; var peg$c26 = "=="; var peg$c27 = peg$literalExpectation("==", false); var peg$c28 = "="; var peg$c29 = peg$literalExpectation("=", false); var peg$c30 = "equals"; var peg$c31 = peg$literalExpectation("equals", true); var peg$c32 = "equal"; var peg$c33 = peg$literalExpectation("equal", true); var peg$c34 = function () { return "equal"; }; var peg$c35 = "!="; var peg$c36 = peg$literalExpectation("!=", false); var peg$c37 = "<>"; var peg$c38 = peg$literalExpectation("<>", false); var peg$c39 = "notequals"; var peg$c40 = peg$literalExpectation("notequals", true); var peg$c41 = "notequal"; var peg$c42 = peg$literalExpectation("notequal", true); var peg$c43 = function () { return "notequal"; }; var peg$c44 = "<"; var peg$c45 = peg$literalExpectation("<", false); var peg$c46 = "less"; var peg$c47 = peg$literalExpectation("less", true); var peg$c48 = function () { return "less"; }; var peg$c49 = ">"; var peg$c50 = peg$literalExpectation(">", false); var peg$c51 = "greater"; var peg$c52 = peg$literalExpectation("greater", true); var peg$c53 = function () { return "greater"; }; var peg$c54 = "+"; var peg$c55 = peg$literalExpectation("+", false); var peg$c56 = function () { return "plus"; }; var peg$c57 = "-"; var peg$c58 = peg$literalExpectation("-", false); var peg$c59 = function () { return "minus"; }; var peg$c60 = "*"; var peg$c61 = peg$literalExpectation("*", false); var peg$c62 = function () { return "mul"; }; var peg$c63 = "/"; var peg$c64 = peg$literalExpectation("/", false); var peg$c65 = function () { return "div"; }; var peg$c66 = "%"; var peg$c67 = peg$literalExpectation("%", false); var peg$c68 = function () { return "mod"; }; var peg$c69 = "^"; var peg$c70 = peg$literalExpectation("^", false); var peg$c71 = "power"; var peg$c72 = peg$literalExpectation("power", true); var peg$c73 = function () { return "power"; }; var peg$c74 = "*="; var peg$c75 = peg$literalExpectation("*=", false); var peg$c76 = "contains"; var peg$c77 = peg$literalExpectation("contains", true); var peg$c78 = "contain"; var peg$c79 = peg$literalExpectation("contain", true); var peg$c80 = function () { return "contains"; }; var peg$c81 = "notcontains"; var peg$c82 = peg$literalExpectation("notcontains", true); var peg$c83 = "notcontain"; var peg$c84 = peg$literalExpectation("notcontain", true); var peg$c85 = function () { return "notcontains"; }; var peg$c86 = "anyof"; var peg$c87 = peg$literalExpectation("anyof", true); var peg$c88 = function () { return "anyof"; }; var peg$c89 = "allof"; var peg$c90 = peg$literalExpectation("allof", true); var peg$c91 = function () { return "allof"; }; var peg$c92 = "("; var peg$c93 = peg$literalExpectation("(", false); var peg$c94 = ")"; var peg$c95 = peg$literalExpectation(")", false); var peg$c96 = function (expr) { return expr; }; var peg$c97 = function (name, params) { return new __WEBPACK_IMPORTED_MODULE_1__expressions__["a" /* FunctionOperand */](name, params); }; var peg$c98 = "!"; var peg$c99 = peg$literalExpectation("!", false); var peg$c100 = "negate"; var peg$c101 = peg$literalExpectation("negate", true); var peg$c102 = function (expr) { return new __WEBPACK_IMPORTED_MODULE_1__expressions__["b" /* UnaryOperand */](expr, "negate"); }; var peg$c103 = function (expr, op) { return new __WEBPACK_IMPORTED_MODULE_1__expressions__["b" /* UnaryOperand */](expr, op); }; var peg$c104 = "empty"; var peg$c105 = peg$literalExpectation("empty", true); var peg$c106 = function () { return "empty"; }; var peg$c107 = "notempty"; var peg$c108 = peg$literalExpectation("notempty", true); var peg$c109 = function () { return "notempty"; }; var peg$c110 = "undefined"; var peg$c111 = peg$literalExpectation("undefined", false); var peg$c112 = "null"; var peg$c113 = peg$literalExpectation("null", false); var peg$c114 = function () { return null; }; var peg$c115 = function (value) { return new __WEBPACK_IMPORTED_MODULE_1__expressions__["c" /* Const */](value); }; var peg$c116 = "{"; var peg$c117 = peg$literalExpectation("{", false); var peg$c118 = "}"; var peg$c119 = peg$literalExpectation("}", false); var peg$c120 = function (value) { return new __WEBPACK_IMPORTED_MODULE_1__expressions__["d" /* Variable */](value); }; var peg$c121 = "'"; var peg$c122 = peg$literalExpectation("'", false); var peg$c123 = function (value) { return value; }; var peg$c124 = "\""; var peg$c125 = peg$literalExpectation("\"", false); var peg$c126 = "["; var peg$c127 = peg$literalExpectation("[", false); var peg$c128 = "]"; var peg$c129 = peg$literalExpectation("]", false); var peg$c130 = function (sequence) { return sequence; }; var peg$c131 = ","; var peg$c132 = peg$literalExpectation(",", false); var peg$c133 = function (expr, tail) { if (expr == null) return []; var array = [expr]; if (Array.isArray(tail)) { var flatten = flattenArray(tail); for (var i = 3; i < flatten.length; i += 4) { array.push(flatten[i]); } } return new __WEBPACK_IMPORTED_MODULE_1__expressions__["e" /* ArrayOperand */](array); }; var peg$c134 = "true"; var peg$c135 = peg$literalExpectation("true", true); var peg$c136 = function () { return true; }; var peg$c137 = "false"; var peg$c138 = peg$literalExpectation("false", true); var peg$c139 = function () { return false; }; var peg$c140 = "0x"; var peg$c141 = peg$literalExpectation("0x", false); var peg$c142 = function () { return parseInt(text(), 16); }; var peg$c143 = /^[\-]/; var peg$c144 = peg$classExpectation(["-"], false, false); var peg$c145 = function (sign, num) { return sign == null ? num : -num; }; var peg$c146 = "."; var peg$c147 = peg$literalExpectation(".", false); var peg$c148 = function () { return parseFloat(text()); }; var peg$c149 = function () { return parseInt(text(), 10); }; var peg$c150 = "0"; var peg$c151 = peg$literalExpectation("0", false); var peg$c152 = function () { return 0; }; var peg$c153 = function (chars) { return chars.join(""); }; var peg$c154 = "\\'"; var peg$c155 = peg$literalExpectation("\\'", false); var peg$c156 = function () { return "'"; }; var peg$c157 = "\\\""; var peg$c158 = peg$literalExpectation("\\\"", false); var peg$c159 = function () { return "\""; }; var peg$c160 = /^[^"'{}]/; var peg$c161 = peg$classExpectation(["\"", "'", "{", "}"], true, false); var peg$c162 = function () { return text(); }; var peg$c163 = /^[^{}]/; var peg$c164 = peg$classExpectation(["{", "}"], true, false); var peg$c165 = /^[0-9]/; var peg$c166 = peg$classExpectation([["0", "9"]], false, false); var peg$c167 = /^[1-9]/; var peg$c168 = peg$classExpectation([["1", "9"]], false, false); var peg$c169 = /^[a-zA-Z]/; var peg$c170 = peg$classExpectation([["a", "z"], ["A", "Z"]], false, false); var peg$c171 = peg$otherExpectation("whitespace"); var peg$c172 = /^[ \t\n\r]/; var peg$c173 = peg$classExpectation([" ", "\t", "\n", "\r"], false, false); var peg$currPos = 0; var peg$savedPos = 0; var peg$posDetailsCache = [{ line: 1, column: 1 }]; var peg$maxFailPos = 0; var peg$maxFailExpected = []; var peg$silentFails = 0; var peg$resultsCache = {}; var peg$result; if (options.startRule !== undefined) { if (!(options.startRule in peg$startRuleFunctions)) { throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); } peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; } function text() { return input.substring(peg$savedPos, peg$currPos); } function location() { return peg$computeLocation(peg$savedPos, peg$currPos); } function expected(description, location1) { location1 = location1 !== undefined ? location1 : peg$computeLocation(peg$savedPos, peg$currPos); throw peg$buildStructuredError([peg$otherExpectation(description)], input.substring(peg$savedPos, peg$currPos), location1); } function error(message, location1) { location1 = location1 !== undefined ? location1 : peg$computeLocation(peg$savedPos, peg$currPos); throw peg$buildSimpleError(message, location1); } function peg$literalExpectation(text1, ignoreCase) { return { type: "literal", text: text1, ignoreCase: ignoreCase }; } function peg$classExpectation(parts, inverted, ignoreCase) { return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase }; } function peg$anyExpectation() { return { type: "any" }; } function peg$endExpectation() { return { type: "end" }; } function peg$otherExpectation(description) { return { type: "other", description: description }; } function peg$computePosDetails(pos) { var details = peg$posDetailsCache[pos]; var p; if (details) { return details; } else { p = pos - 1; while (!peg$posDetailsCache[p]) { p--; } details = peg$posDetailsCache[p]; details = { line: details.line, column: details.column }; while (p < pos) { if (input.charCodeAt(p) === 10) { details.line++; details.column = 1; } else { details.column++; } p++; } peg$posDetailsCache[pos] = details; return details; } } function peg$computeLocation(startPos, endPos) { var startPosDetails = peg$computePosDetails(startPos); var endPosDetails = peg$computePosDetails(endPos); return { start: { offset: startPos, line: startPosDetails.line, column: startPosDetails.column }, end: { offset: endPos, line: endPosDetails.line, column: endPosDetails.column } }; } function peg$fail(expected1) { if (peg$currPos < peg$maxFailPos) { return; } if (peg$currPos > peg$maxFailPos) { peg$maxFailPos = peg$currPos; peg$maxFailExpected = []; } peg$maxFailExpected.push(expected1); } function peg$buildSimpleError(message, location1) { return new SyntaxError(message, [], "", location1); } function peg$buildStructuredError(expected1, found, location1) { return new SyntaxError(SyntaxError.buildMessage(expected1, found), expected1, found, location1); } function peg$parseExpression() { var s0, s1, s2, s3, s4, s5, s6, s7, s8; var key = peg$currPos * 34 + 0; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parse_(); if (s1 !== peg$FAILED) { s2 = peg$parseLogicOr(); if (s2 !== peg$FAILED) { s3 = []; s4 = peg$currPos; s5 = peg$parse_(); if (s5 !== peg$FAILED) { s6 = peg$parseOrSign(); if (s6 !== peg$FAILED) { s7 = peg$parse_(); if (s7 !== peg$FAILED) { s8 = peg$parseLogicOr(); if (s8 !== peg$FAILED) { s5 = [s5, s6, s7, s8]; s4 = s5; } else { peg$currPos = s4; s4 = peg$FAILED; } } else { peg$currPos = s4; s4 = peg$FAILED; } } else { peg$currPos = s4; s4 = peg$FAILED; } } else { peg$currPos = s4; s4 = peg$FAILED; } while (s4 !== peg$FAILED) { s3.push(s4); s4 = peg$currPos; s5 = peg$parse_(); if (s5 !== peg$FAILED) { s6 = peg$parseOrSign(); if (s6 !== peg$FAILED) { s7 = peg$parse_(); if (s7 !== peg$FAILED) { s8 = peg$parseLogicOr(); if (s8 !== peg$FAILED) { s5 = [s5, s6, s7, s8]; s4 = s5; } else { peg$currPos = s4; s4 = peg$FAILED; } } else { peg$currPos = s4; s4 = peg$FAILED; } } else { peg$currPos = s4; s4 = peg$FAILED; } } else { peg$currPos = s4; s4 = peg$FAILED; } } if (s3 !== peg$FAILED) { s4 = peg$parse_(); if (s4 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c0(s2, s3); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseOrSign() { var s0, s1; var key = peg$currPos * 34 + 1; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c1) { s1 = peg$c1; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c2); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 2).toLowerCase() === peg$c3) { s1 = input.substr(peg$currPos, 2); peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c4); } } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c5(); } s0 = s1; peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseLogicOr() { var s0, s1, s2, s3, s4, s5, s6, s7; var key = peg$currPos * 34 + 2; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseLogicAnd(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parse_(); if (s4 !== peg$FAILED) { s5 = peg$parseAndSign(); if (s5 !== peg$FAILED) { s6 = peg$parse_(); if (s6 !== peg$FAILED) { s7 = peg$parseLogicAnd(); if (s7 !== peg$FAILED) { s4 = [s4, s5, s6, s7]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parse_(); if (s4 !== peg$FAILED) { s5 = peg$parseAndSign(); if (s5 !== peg$FAILED) { s6 = peg$parse_(); if (s6 !== peg$FAILED) { s7 = peg$parseLogicAnd(); if (s7 !== peg$FAILED) { s4 = [s4, s5, s6, s7]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } if (s2 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c0(s1, s2); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseAndSign() { var s0, s1; var key = peg$currPos * 34 + 3; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c6) { s1 = peg$c6; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c7); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 3).toLowerCase() === peg$c8) { s1 = input.substr(peg$currPos, 3); peg$currPos += 3; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c9); } } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c10(); } s0 = s1; peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseLogicAnd() { var s0, s1, s2, s3, s4, s5, s6, s7; var key = peg$currPos * 34 + 4; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseCompOps(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parse_(); if (s4 !== peg$FAILED) { s5 = peg$parseComparableOperators(); if (s5 !== peg$FAILED) { s6 = peg$parse_(); if (s6 !== peg$FAILED) { s7 = peg$parseCompOps(); if (s7 !== peg$FAILED) { s4 = [s4, s5, s6, s7]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parse_(); if (s4 !== peg$FAILED) { s5 = peg$parseComparableOperators(); if (s5 !== peg$FAILED) { s6 = peg$parse_(); if (s6 !== peg$FAILED) { s7 = peg$parseCompOps(); if (s7 !== peg$FAILED) { s4 = [s4, s5, s6, s7]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } if (s2 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c11(s1, s2); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseComparableOperators() { var s0, s1; var key = peg$currPos * 34 + 5; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c12) { s1 = peg$c12; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c13); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 2) === peg$c14) { s1 = peg$c14; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c15); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 11).toLowerCase() === peg$c16) { s1 = input.substr(peg$currPos, 11); peg$currPos += 11; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c17); } } } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c18(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c19) { s1 = peg$c19; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c20); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 2) === peg$c21) { s1 = peg$c21; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c22); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 14).toLowerCase() === peg$c23) { s1 = input.substr(peg$currPos, 14); peg$currPos += 14; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c24); } } } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c25(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c26) { s1 = peg$c26; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c27); } } if (s1 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 61) { s1 = peg$c28; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c29); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 6).toLowerCase() === peg$c30) { s1 = input.substr(peg$currPos, 6); peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c31); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 5).toLowerCase() === peg$c32) { s1 = input.substr(peg$currPos, 5); peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c33); } } } } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c34(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c35) { s1 = peg$c35; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c36); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 2) === peg$c37) { s1 = peg$c37; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c38); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 9).toLowerCase() === peg$c39) { s1 = input.substr(peg$currPos, 9); peg$currPos += 9; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c40); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 8).toLowerCase() === peg$c41) { s1 = input.substr(peg$currPos, 8); peg$currPos += 8; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c42); } } } } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c43(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 60) { s1 = peg$c44; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c45); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 4).toLowerCase() === peg$c46) { s1 = input.substr(peg$currPos, 4); peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c47); } } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c48(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 62) { s1 = peg$c49; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c50); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 7).toLowerCase() === peg$c51) { s1 = input.substr(peg$currPos, 7); peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c52); } } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c53(); } s0 = s1; } } } } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseCompOps() { var s0, s1, s2, s3, s4, s5, s6, s7; var key = peg$currPos * 34 + 6; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parsePlusMinusOps(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parse_(); if (s4 !== peg$FAILED) { s5 = peg$parsePlusMinusSigns(); if (s5 !== peg$FAILED) { s6 = peg$parse_(); if (s6 !== peg$FAILED) { s7 = peg$parsePlusMinusOps(); if (s7 !== peg$FAILED) { s4 = [s4, s5, s6, s7]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parse_(); if (s4 !== peg$FAILED) { s5 = peg$parsePlusMinusSigns(); if (s5 !== peg$FAILED) { s6 = peg$parse_(); if (s6 !== peg$FAILED) { s7 = peg$parsePlusMinusOps(); if (s7 !== peg$FAILED) { s4 = [s4, s5, s6, s7]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } if (s2 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c0(s1, s2); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsePlusMinusSigns() { var s0, s1; var key = peg$currPos * 34 + 7; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 43) { s1 = peg$c54; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c55); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c56(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 45) { s1 = peg$c57; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c58); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c59(); } s0 = s1; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsePlusMinusOps() { var s0, s1, s2, s3, s4, s5, s6, s7; var key = peg$currPos * 34 + 8; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseMulDivOps(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parse_(); if (s4 !== peg$FAILED) { s5 = peg$parseMulDivSigns(); if (s5 !== peg$FAILED) { s6 = peg$parse_(); if (s6 !== peg$FAILED) { s7 = peg$parseMulDivOps(); if (s7 !== peg$FAILED) { s4 = [s4, s5, s6, s7]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parse_(); if (s4 !== peg$FAILED) { s5 = peg$parseMulDivSigns(); if (s5 !== peg$FAILED) { s6 = peg$parse_(); if (s6 !== peg$FAILED) { s7 = peg$parseMulDivOps(); if (s7 !== peg$FAILED) { s4 = [s4, s5, s6, s7]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } if (s2 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c0(s1, s2); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseMulDivSigns() { var s0, s1; var key = peg$currPos * 34 + 9; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 42) { s1 = peg$c60; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c61); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c62(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 47) { s1 = peg$c63; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c64); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c65(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 37) { s1 = peg$c66; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c67); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c68(); } s0 = s1; } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseMulDivOps() { var s0, s1, s2, s3, s4, s5, s6, s7; var key = peg$currPos * 34 + 10; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseBinaryFuncOp(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parse_(); if (s4 !== peg$FAILED) { s5 = peg$parsePowerSigns(); if (s5 !== peg$FAILED) { s6 = peg$parse_(); if (s6 !== peg$FAILED) { s7 = peg$parseBinaryFuncOp(); if (s7 !== peg$FAILED) { s4 = [s4, s5, s6, s7]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parse_(); if (s4 !== peg$FAILED) { s5 = peg$parsePowerSigns(); if (s5 !== peg$FAILED) { s6 = peg$parse_(); if (s6 !== peg$FAILED) { s7 = peg$parseBinaryFuncOp(); if (s7 !== peg$FAILED) { s4 = [s4, s5, s6, s7]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } if (s2 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c0(s1, s2); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsePowerSigns() { var s0, s1; var key = peg$currPos * 34 + 11; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 94) { s1 = peg$c69; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c70); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 5).toLowerCase() === peg$c71) { s1 = input.substr(peg$currPos, 5); peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c72); } } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c73(); } s0 = s1; peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseBinaryFuncOp() { var s0, s1, s2, s3, s4, s5, s6, s7; var key = peg$currPos * 34 + 12; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseFactor(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parse_(); if (s4 !== peg$FAILED) { s5 = peg$parseBinFunctions(); if (s5 !== peg$FAILED) { s6 = peg$parse_(); if (s6 !== peg$FAILED) { s7 = peg$parseFactor(); if (s7 === peg$FAILED) { s7 = null; } if (s7 !== peg$FAILED) { s4 = [s4, s5, s6, s7]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parse_(); if (s4 !== peg$FAILED) { s5 = peg$parseBinFunctions(); if (s5 !== peg$FAILED) { s6 = peg$parse_(); if (s6 !== peg$FAILED) { s7 = peg$parseFactor(); if (s7 === peg$FAILED) { s7 = null; } if (s7 !== peg$FAILED) { s4 = [s4, s5, s6, s7]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } if (s2 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c11(s1, s2); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseBinFunctions() { var s0, s1; var key = peg$currPos * 34 + 13; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c74) { s1 = peg$c74; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c75); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 8).toLowerCase() === peg$c76) { s1 = input.substr(peg$currPos, 8); peg$currPos += 8; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c77); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 7).toLowerCase() === peg$c78) { s1 = input.substr(peg$currPos, 7); peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c79); } } } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c80(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.substr(peg$currPos, 11).toLowerCase() === peg$c81) { s1 = input.substr(peg$currPos, 11); peg$currPos += 11; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c82); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 10).toLowerCase() === peg$c83) { s1 = input.substr(peg$currPos, 10); peg$currPos += 10; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c84); } } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c85(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.substr(peg$currPos, 5).toLowerCase() === peg$c86) { s1 = input.substr(peg$currPos, 5); peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c87); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c88(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.substr(peg$currPos, 5).toLowerCase() === peg$c89) { s1 = input.substr(peg$currPos, 5); peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c90); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c91(); } s0 = s1; } } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseFactor() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 34 + 14; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 40) { s1 = peg$c92; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c93); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); if (s2 !== peg$FAILED) { s3 = peg$parseExpression(); if (s3 !== peg$FAILED) { s4 = peg$parse_(); if (s4 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 41) { s5 = peg$c94; peg$currPos++; } else { s5 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c95); } } if (s5 === peg$FAILED) { s5 = null; } if (s5 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c96(s3); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$parseFunctionOp(); if (s0 === peg$FAILED) { s0 = peg$parseUnaryFunctionOp(); if (s0 === peg$FAILED) { s0 = peg$parseAtom(); if (s0 === peg$FAILED) { s0 = peg$parseArrayOp(); } } } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseFunctionOp() { var s0, s1, s2, s3, s4; var key = peg$currPos * 34 + 15; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseLettersAndDigits(); if (s1 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 40) { s2 = peg$c92; peg$currPos++; } else { s2 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c93); } } if (s2 !== peg$FAILED) { s3 = peg$parseSequence(); if (s3 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 41) { s4 = peg$c94; peg$currPos++; } else { s4 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c95); } } if (s4 === peg$FAILED) { s4 = null; } if (s4 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c97(s1, s3); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUnaryFunctionOp() { var s0, s1, s2, s3; var key = peg$currPos * 34 + 16; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 33) { s1 = peg$c98; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c99); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 6).toLowerCase() === peg$c100) { s1 = input.substr(peg$currPos, 6); peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c101); } } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); if (s2 !== peg$FAILED) { s3 = peg$parseExpression(); if (s3 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c102(s3); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parseAtom(); if (s1 !== peg$FAILED) { s2 = peg$parse_(); if (s2 !== peg$FAILED) { s3 = peg$parseUnFunctions(); if (s3 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c103(s1, s3); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUnFunctions() { var s0, s1; var key = peg$currPos * 34 + 17; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5).toLowerCase() === peg$c104) { s1 = input.substr(peg$currPos, 5); peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c105); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c106(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.substr(peg$currPos, 8).toLowerCase() === peg$c107) { s1 = input.substr(peg$currPos, 8); peg$currPos += 8; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c108); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c109(); } s0 = s1; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseAtom() { var s0, s1, s2, s3, s4; var key = peg$currPos * 34 + 18; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parse_(); if (s1 !== peg$FAILED) { if (input.substr(peg$currPos, 9) === peg$c110) { s2 = peg$c110; peg$currPos += 9; } else { s2 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c111); } } if (s2 === peg$FAILED) { if (input.substr(peg$currPos, 4) === peg$c112) { s2 = peg$c112; peg$currPos += 4; } else { s2 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c113); } } } if (s2 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c114(); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parse_(); if (s1 !== peg$FAILED) { s2 = peg$parseConstValue(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c115(s2); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parse_(); if (s1 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 123) { s2 = peg$c116; peg$currPos++; } else { s2 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c117); } } if (s2 !== peg$FAILED) { s3 = peg$parseValueInput(); if (s3 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 125) { s4 = peg$c118; peg$currPos++; } else { s4 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c119); } } if (s4 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c120(s3); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseConstValue() { var s0, s1, s2, s3; var key = peg$currPos * 34 + 19; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$parseLogicValue(); if (s0 === peg$FAILED) { s0 = peg$parseArithmeticValue(); if (s0 === peg$FAILED) { s0 = peg$parseLettersAndDigits(); if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 39) { s1 = peg$c121; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c122); } } if (s1 !== peg$FAILED) { s2 = peg$parseAnyInput(); if (s2 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 39) { s3 = peg$c121; peg$currPos++; } else { s3 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c122); } } if (s3 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c123(s2); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 34) { s1 = peg$c124; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c125); } } if (s1 !== peg$FAILED) { s2 = peg$parseAnyInput(); if (s2 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { s3 = peg$c124; peg$currPos++; } else { s3 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c125); } } if (s3 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c123(s2); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } } } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseArrayOp() { var s0, s1, s2, s3; var key = peg$currPos * 34 + 20; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 91) { s1 = peg$c126; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c127); } } if (s1 !== peg$FAILED) { s2 = peg$parseSequence(); if (s2 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 93) { s3 = peg$c128; peg$currPos++; } else { s3 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c129); } } if (s3 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c130(s2); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSequence() { var s0, s1, s2, s3, s4, s5, s6, s7; var key = peg$currPos * 34 + 21; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseExpression(); if (s1 === peg$FAILED) { s1 = null; } if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parse_(); if (s4 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 44) { s5 = peg$c131; peg$currPos++; } else { s5 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c132); } } if (s5 !== peg$FAILED) { s6 = peg$parse_(); if (s6 !== peg$FAILED) { s7 = peg$parseExpression(); if (s7 !== peg$FAILED) { s4 = [s4, s5, s6, s7]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parse_(); if (s4 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 44) { s5 = peg$c131; peg$currPos++; } else { s5 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c132); } } if (s5 !== peg$FAILED) { s6 = peg$parse_(); if (s6 !== peg$FAILED) { s7 = peg$parseExpression(); if (s7 !== peg$FAILED) { s4 = [s4, s5, s6, s7]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } if (s2 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c133(s1, s2); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseLogicValue() { var s0, s1; var key = peg$currPos * 34 + 22; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 4).toLowerCase() === peg$c134) { s1 = input.substr(peg$currPos, 4); peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c135); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c136(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.substr(peg$currPos, 5).toLowerCase() === peg$c137) { s1 = input.substr(peg$currPos, 5); peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c138); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c139(); } s0 = s1; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseArithmeticValue() { var s0, s1, s2; var key = peg$currPos * 34 + 23; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c140) { s1 = peg$c140; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c141); } } if (s1 !== peg$FAILED) { s2 = peg$parseDigits(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c142(); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; if (peg$c143.test(input.charAt(peg$currPos))) { s1 = input.charAt(peg$currPos); peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c144); } } if (s1 === peg$FAILED) { s1 = null; } if (s1 !== peg$FAILED) { s2 = peg$parseNumber(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c145(s1, s2); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseNumber() { var s0, s1, s2, s3; var key = peg$currPos * 34 + 24; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseDigits(); if (s1 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 46) { s2 = peg$c146; peg$currPos++; } else { s2 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c147); } } if (s2 !== peg$FAILED) { s3 = peg$parseDigits(); if (s3 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c148(); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parseNonZeroDigits(); if (s1 !== peg$FAILED) { s2 = peg$parseDigits(); if (s2 === peg$FAILED) { s2 = null; } if (s2 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c149(); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 48) { s1 = peg$c150; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c151); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c152(); } s0 = s1; } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseValueInput() { var s0, s1, s2; var key = peg$currPos * 34 + 25; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = []; s2 = peg$parseValueCharacters(); if (s2 !== peg$FAILED) { while (s2 !== peg$FAILED) { s1.push(s2); s2 = peg$parseValueCharacters(); } } else { s1 = peg$FAILED; } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c153(s1); } s0 = s1; peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseAnyInput() { var s0, s1, s2; var key = peg$currPos * 34 + 26; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = []; s2 = peg$parseAnyCharacters(); if (s2 !== peg$FAILED) { while (s2 !== peg$FAILED) { s1.push(s2); s2 = peg$parseAnyCharacters(); } } else { s1 = peg$FAILED; } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c153(s1); } s0 = s1; peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseAnyCharacters() { var s0, s1; var key = peg$currPos * 34 + 27; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c154) { s1 = peg$c154; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c155); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c156(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c157) { s1 = peg$c157; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c158); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c159(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (peg$c160.test(input.charAt(peg$currPos))) { s1 = input.charAt(peg$currPos); peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c161); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c162(); } s0 = s1; } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseValueCharacters() { var s0, s1; var key = peg$currPos * 34 + 28; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (peg$c163.test(input.charAt(peg$currPos))) { s1 = input.charAt(peg$currPos); peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c164); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c162(); } s0 = s1; peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseLettersAndDigits() { var s0, s1, s2, s3, s4, s5, s6; var key = peg$currPos * 34 + 29; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseLetters(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parseDigits(); if (s4 !== peg$FAILED) { s5 = []; s6 = peg$parseLetters(); while (s6 !== peg$FAILED) { s5.push(s6); s6 = peg$parseLetters(); } if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parseDigits(); if (s4 !== peg$FAILED) { s5 = []; s6 = peg$parseLetters(); while (s6 !== peg$FAILED) { s5.push(s6); s6 = peg$parseLetters(); } if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } if (s2 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c162(); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDigits() { var s0, s1; var key = peg$currPos * 34 + 30; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = []; if (peg$c165.test(input.charAt(peg$currPos))) { s1 = input.charAt(peg$currPos); peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c166); } } if (s1 !== peg$FAILED) { while (s1 !== peg$FAILED) { s0.push(s1); if (peg$c165.test(input.charAt(peg$currPos))) { s1 = input.charAt(peg$currPos); peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c166); } } } } else { s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseNonZeroDigits() { var s0, s1; var key = peg$currPos * 34 + 31; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = []; if (peg$c167.test(input.charAt(peg$currPos))) { s1 = input.charAt(peg$currPos); peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c168); } } if (s1 !== peg$FAILED) { while (s1 !== peg$FAILED) { s0.push(s1); if (peg$c167.test(input.charAt(peg$currPos))) { s1 = input.charAt(peg$currPos); peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c168); } } } } else { s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseLetters() { var s0, s1; var key = peg$currPos * 34 + 32; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = []; if (peg$c169.test(input.charAt(peg$currPos))) { s1 = input.charAt(peg$currPos); peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c170); } } if (s1 !== peg$FAILED) { while (s1 !== peg$FAILED) { s0.push(s1); if (peg$c169.test(input.charAt(peg$currPos))) { s1 = input.charAt(peg$currPos); peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c170); } } } } else { s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parse_() { var s0, s1; var key = peg$currPos * 34 + 33; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = []; if (peg$c172.test(input.charAt(peg$currPos))) { s1 = input.charAt(peg$currPos); peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c173); } } while (s1 !== peg$FAILED) { s0.push(s1); if (peg$c172.test(input.charAt(peg$currPos))) { s1 = input.charAt(peg$currPos); peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c173); } } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c171); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function buildBinaryOperand(head, tail, isArithmeticOp) { if (isArithmeticOp === void 0) { isArithmeticOp = false; } return tail.reduce(function (result, elements) { return new __WEBPACK_IMPORTED_MODULE_1__expressions__["f" /* BinaryOperand */](elements[1], result, elements[3], isArithmeticOp); }, head); } function flattenArray(array) { return [].concat.apply([], array); } peg$result = peg$startRuleFunction(); if (peg$result !== peg$FAILED && peg$currPos === input.length) { return peg$result; } else { if (peg$result !== peg$FAILED && peg$currPos < input.length) { peg$fail(peg$endExpectation()); } throw peg$buildStructuredError(peg$maxFailExpected, peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, peg$maxFailPos < input.length ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)); } } var parse = peg$parse; /***/ }), /* 115 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(5); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__conditions__ = __webpack_require__(10); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return HtmlConditionItem; }); /** * A class that contains expression and html propeties. It uses in survey.completedHtmlOnCondition array. * If the expression returns true then html of this item uses instead of survey.completedHtml property * @see SurveyModel.completedHtmlOnCondition * @see SurveyModel.completedHtml */ var HtmlConditionItem = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](HtmlConditionItem, _super); function HtmlConditionItem(expression, html) { if (expression === void 0) { expression = null; } if (html === void 0) { html = null; } var _this = _super.call(this) || this; _this.createLocalizableString("html", _this); _this.expression = expression; _this.html = html; return _this; } HtmlConditionItem.prototype.getType = function () { return "htmlconditionitem"; }; HtmlConditionItem.prototype.runCondition = function (values, properties) { if (!this.expression) return false; return new __WEBPACK_IMPORTED_MODULE_3__conditions__["b" /* ConditionRunner */](this.expression).run(values, properties); }; Object.defineProperty(HtmlConditionItem.prototype, "expression", { /** * The expression property. If this expression returns true, then survey will use html property to show on complete page. */ get: function () { return this.getPropertyValue("expression", ""); }, set: function (val) { this.setPropertyValue("expression", val); }, enumerable: true, configurable: true }); Object.defineProperty(HtmlConditionItem.prototype, "html", { /** * The html that shows on completed ('Thank you') page. The expression should return true * @see expression */ get: function () { return this.getLocalizableStringText("html"); }, set: function (value) { this.setLocalizableStringText("html", value); }, enumerable: true, configurable: true }); Object.defineProperty(HtmlConditionItem.prototype, "locHtml", { get: function () { return this.getLocalizableString("html"); }, enumerable: true, configurable: true }); HtmlConditionItem.prototype.getLocale = function () { return !!this.locOwner ? this.locOwner.getLocale() : ""; }; HtmlConditionItem.prototype.getMarkdownHtml = function (text) { return !!this.locOwner ? this.locOwner.getMarkdownHtml(text) : null; }; HtmlConditionItem.prototype.getProcessedText = function (text) { return this.locOwner ? this.locOwner.getProcessedText(text) : text; }; return HtmlConditionItem; }(__WEBPACK_IMPORTED_MODULE_2__base__["b" /* Base */])); __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("htmlconditionitem", [ "expression:condition", { name: "html:html", serializationProperty: "locHtml" } ], function () { return new HtmlConditionItem(); }, "base"); /***/ }), /* 116 */ /***/ (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"] = "العربية"; /***/ }), /* 117 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2); /* unused harmony export bulgarianStrings */ //Uncomment this line on creating a translation file var bulgarianStrings = { pagePrevText: "Назад", pageNextText: "Напред", completeText: "Край", startSurveyText: "Начало", otherItemText: "Друго (опишете)", noneItemText: "Нито един", selectAllItemText: "Всички", progressText: "стр. {0}, общо стр. {1}", emptySurvey: "Анкетата не съдържа видими страници или въпроси.", completingSurvey: "Благодарим ви за участието в анкетата!", completingSurveyBefore: "Изглежда, че вие вече сте попълнили анкетата.", loadingSurvey: "Зареждане на анкетата...", optionsCaption: "Изберете...", value: "value", requiredError: "Моля, отговорете на следния въпрос.", requiredErrorInPanel: "Моля, отговорете поне на един от въпросите.", requiredInAllRowsError: "Моля, отговорете на въпросите на всички редове.", numericError: "Стойността следва да бъде число.", textMinLength: "Моля, използвайте поне {0} символа.", textMaxLength: "Моля, използвайте не повече от {0} символа.", textMinMaxLength: "Моля, използвайте повече от {0} и по-малко от {1} символа.", minRowCountError: "Моля, попълнете поне {0} реда.", minSelectError: "Моля, изберете поне {0} варианта.", maxSelectError: "Моля, изберете не повече от {0} варианта.", numericMinMax: "Стойността '{0}' следва да бъде равна или по-голяма от {1} и равна или по-малка от {2}", numericMin: "Стойността '{0}' следва да бъде равна или по-голяма от {1}", numericMax: "Стойността '{0}' следва да бъде равна или по-малка от {1}", invalidEmail: "Моля, въведете валиден адрес на електронна поща.", invalidExpression: "Изразът: {0} трябва да дава резултат 'true' (истина).", urlRequestError: "Заявката води до грешка '{0}'. {1}", urlGetChoicesError: "Заявката не връща данни или частта 'path' (път до търсения ресурс на сървъра) е неправилно зададена", exceedMaxSize: "Размерът на файла следва да не превишава {0}.", otherRequiredError: "Моля, въведете другата стойност.", uploadingFile: "Вашит файл се зарежда на сървъра. Моля, изчакайте няколко секунди и тогава опитвайте отново.", loadingFile: "Зареждане...", chooseFile: "Изберете файл(ове)...", confirmDelete: "Желаете ли да изтриете записа?", keyDuplicationError: "Стойността следва да бъде уникална.", addColumn: "Добавяне на колона", addRow: "Добавяне на ред", removeRow: "Премахване на ред", addPanel: "Добавяне на панел", removePanel: "Премахване на панел", choices_Item: "елемент", matrix_column: "Колона", matrix_row: "Ред", savingData: "Резултатите се запазват на сървъра...", savingDataError: "Поради възникнала грешка резултатите не можаха да бъдат запазени.", savingDataSuccess: "Резултатите бяха запазени успешно!", saveAgainButton: "Нов опит", timerMin: "мин", timerSec: "сек", timerSpentAll: "Вие използвахте {0} на тази страница и общо {1}.", timerSpentPage: "Вие използвахте {0} на тази страница.", timerSpentSurvey: "Вие използвахте общо {0}.", timerLimitAll: "Вие изпозвахте {0} от {1} на тази страница и общо {2} от {3}.", timerLimitPage: "Вие използвахте {0} от {1} на тази страница.", timerLimitSurvey: "Вие използвахте общо {0} от {1}.", cleanCaption: "Изчистване", clearCaption: "Начално състояние", removeFileCaption: "Премахване на файла" }; //Uncomment these two lines on creating a translation file. You should replace "en" and enStrings with your locale ("fr", "de" and so on) and your variable. __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["bg"] = bulgarianStrings; __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["bg"] = "Bulgarian"; /***/ }), /* 118 */ /***/ (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à"; /***/ }), /* 119 */ /***/ (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"; /***/ }), /* 120 */ /***/ (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"; /***/ }), /* 121 */ /***/ (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"; /***/ }), /* 122 */ /***/ (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"; /***/ }), /* 123 */ /***/ (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"; /***/ }), /* 124 */ /***/ (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"] = "ქართული"; /***/ }), /* 125 */ /***/ (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: "Abschließen", startSurveyText: "Start", otherItemText: "Sonstiges (Beschreibung)", noneItemText: "Nichts", selectAllItemText: "Alle auswählen", progressText: "Seite {0} von {1}", emptySurvey: "Es ist keine Frage vorhanden.", completingSurvey: "Danke, dass Sie die Umfrage abgeschlossen haben!", completingSurveyBefore: "Wir haben festgestellt, dass Sie diese Umfrage bereits abgeschlossen haben.", loadingSurvey: "Fragebogen wird geladen...", optionsCaption: "Bitte auswählen...", value: "Wert", requiredError: "Bitte beantworten Sie diese Frage.", requiredErrorInPanel: "Bitte beantworten Sie mindestens eine Frage.", requiredInAllRowsError: "Bitte beantworten Sie alle Fragen.", numericError: "Der Wert muss eine Zahl sein.", textMinLength: "Bitte geben sie mindestens {0} Zeichen ein.", textMaxLength: "Bitte geben Sie nicht mehr als {0} Zeichen ein.", textMinMaxLength: "Bitte geben sie mindestens {0} und maximal {1} Zeichen ein.", minRowCountError: "Bitte machen Sie in mindestens {0} Zeilen eine Eingabe.", minSelectError: "Bitte wählen Sie mindestens {0} Variante(n) aus.", maxSelectError: "Bitte wählen Sie nicht mehr als {0} Variante(n) aus.", numericMinMax: "'{0}' muss größer oder gleich {1} und kleiner oder gleich {2} sein", numericMin: "'{0}' muss größer oder gleich {1} sein", numericMax: "'{0}' muss kleiner oder gleich {1} sein", invalidEmail: "Bitte geben Sie eine gültige E-Mail-Adresse ein.", invalidExpression: "Der Ausdruck: {0} muss den Wert 'wahr'(true) zurückliefern.", urlRequestError: "Die Anfrage lieferte den folgenden Fehler zurück '{0}'. {1}", urlGetChoicesError: "Die Anfrage lieferte leere Daten zurück oder der Wert der Variable 'path' ist falsch", exceedMaxSize: "Die Dateigröße darf {0} nicht überschreiten.", otherRequiredError: "Bitte geben Sie den anderen Wert ein.", uploadingFile: "Ihre Datei wird hochgeladen. Bitte warten Sie ein paar Sekunden und versuchen Sie es dann erneut.", loadingFile: "Wird geladen...", chooseFile: "Datei(en) auswählen...", confirmDelete: "Wollen Sie den Eintrag löschen?", keyDuplicationError: "Dieser Wert muss eindeutig sein.", addColumn: "Spalte hinzufügen", addRow: "Zeile hinzufügen", removeRow: "Entfernen", addPanel: "Neu hinzufügen", removePanel: "Entfernen", choices_Item: "Element", matrix_column: "Spalte", matrix_row: "Zeile", savingData: "Die Ergebnisse werden auf dem Server gespeichert...", savingDataError: "Es ist ein Fehler aufgetreten. Die Ergebnisse konnten nicht gespeichert werden.", savingDataSuccess: "Die Ergebnisse wurden gespeichert!", saveAgainButton: "Bitte versuchen Sie es erneut", timerMin: "Min.", timerSec: "Sek.", timerSpentAll: "Sie waren {0} auf dieser Seite und insgesamt {1}.", timerSpentPage: "Sie waren {0} auf dieser Seite.", timerSpentSurvey: "Sie haben insgesamt {0} benötigt.", timerLimitAll: "Sie waren {0} von {1} auf dieser Seite und insgesamt {2} von {3}.", timerLimitPage: "Sie waren {0} von {1} auf dieser Seite.", timerLimitSurvey: "Sie haben insgesamt {0} von {1} benötigt.", cleanCaption: "Sauber", clearCaption: "Leeren", removeFileCaption: "Datei löschen" }; __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["de"] = germanSurveyStrings; __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["de"] = "deutsch"; /***/ }), /* 126 */ /***/ (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"] = "ελληνικά"; /***/ }), /* 127 */ /***/ (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"] = "עברית"; /***/ }), /* 128 */ /***/ (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"; /***/ }), /* 129 */ /***/ (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"; /***/ }), /* 130 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2); /* unused harmony export indonesianStrings */ var indonesianStrings = { pagePrevText: "Sebelumnya", pageNextText: "Selanjutnya", completeText: "Selesai", startSurveyText: "Mulai", otherItemText: "Lainnya (jelaskan)", noneItemText: "Tidak Ada", selectAllItemText: "Pilih Semua", progressText: "Halaman {0} dari {1}", emptySurvey: "Tidak ada halaman atau pertanyaan dalam survei.", completingSurvey: "Terima kasih telah menyelesaikan survei!", completingSurveyBefore: "Catatan kami menunjukkan bahwa Anda telah menyelesaikan survei ini.", loadingSurvey: "Memuat survei...", optionsCaption: "Pilih...", value: "nilai", requiredError: "Silahkan jawab pertanyaan berikut.", requiredErrorInPanel: "Silahkan jawab setidaknya satu petanyaan.", requiredInAllRowsError: "Silahkan jawab pertanyaan pada semua baris.", numericError: "Nilai harus berupa angka.", textMinLength: "Silahkan masukkan setidaknya {0} karakter.", textMaxLength: "Silahkan masukkan kurang {0} karakter.", textMinMaxLength: "PSilahkan masukkan lebih dari {0} dan kurang dari {1} karakter.", minRowCountError: "Silahkan isi setidaknya {0} baris.", minSelectError: "Silahkan pilih setidaknya {0} varian.", maxSelectError: "Silahkan pilih tidak lebih dari {0} varian.", numericMinMax: "'{0}' harus sama dengan atau lebih dari {1} dan harus sama dengan atau kurang dari {2}", numericMin: "'{0}' harus sama dengan atau lebih dari {1}", numericMax: "'{0}' harus sama dengan atau kurang dari {1}", invalidEmail: "Silahkan masukkan e-mail yang benar.", invalidExpression: "Ekspresi: {0} harus mengembalikan 'benar'.", urlRequestError: "Permintaan mengembalikan kesalahan '{0}'. {1}", urlGetChoicesError: "Permintaan mengembalikan data kosong atau properti 'path' salah.", exceedMaxSize: "Ukuran berkas tidak boleh melebihi {0}.", otherRequiredError: "Silahkan masukkan nilai lainnnya.", uploadingFile: "Berkas Anda sedang diunggah. Silahkan tunggu beberapa saat atau coba lagi.", loadingFile: "Memuat...", chooseFile: "Pilih berkas...", confirmDelete: "Apakah Anda ingin menghapus catatan?", keyDuplicationError: "Nilai harus unik.", addColumn: "Tambah kolom", addRow: "Tambah baris", removeRow: "Hapus", addPanel: "Tambah baru", removePanel: "Hapus", choices_Item: "item", matrix_column: "Kolom", matrix_row: "Baris", savingData: "Hasil sedang disimpan pada server...", savingDataError: "Kesalahan terjadi dan kami tidak dapat menyimpan hasil.", savingDataSuccess: "Hasil telah sukses disimpan!", saveAgainButton: "Coba lagi", timerMin: "menit", timerSec: "detik", timerSpentAll: "Anda telah menghabiskan {0} pada halaman ini dan {1} secara keseluruhan.", timerSpentPage: "YAnda telah menghabiskan {0} pada halaman ini.", timerSpentSurvey: "Anda telah menghabiskan {0} secara keseluruhan.", timerLimitAll: "Anda telah menghabiskan {0} dari {1} pada halaman ini dan {2} dari {3} secara keseluruhan.", timerLimitPage: "Anda telah menghabiskan {0} dari {1} pada halaman ini.", timerLimitSurvey: "Anda telah menghabiskan {0} dari {1} secara keseluruhan.", cleanCaption: "Bersihkan", clearCaption: "Bersihkan", removeFileCaption: "Hapus berkas ini" }; __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["id"] = indonesianStrings; __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["id"] = "Bahasa Indonesia"; /***/ }), /* 131 */ /***/ (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"; /***/ }), /* 132 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2); /* unused harmony export japaneseSurveyStrings */ // Uncomment this line on creating a translation file var japaneseSurveyStrings = { pagePrevText: "前の", pageNextText: "次へ", completeText: "完了", startSurveyText: "スタート", otherItemText: "その他(説明)", noneItemText: "なし", selectAllItemText: "すべて選択", progressText: "{0}/{1}頁", emptySurvey: "この調査に表示できるページや質問はありません", completingSurvey: "調査を完了してくれてありがとうございました", loadingSurvey: "調査をダウンロード中", optionsCaption: "選択", requiredError: "質問にお答え下さい", numericError: "数字でご記入下さい", textMinLength: "{0} 文字以上で入力して下さい", minRowCountError: "{0}行以上で入力して下さい", minSelectError: "{0}種類以上を選択して下さい", numericMin: "'{0}' は同等か{1}より大きくなければなりません", numericMax: "'{0}' は同等か{1}より小さくなければなりません", invalidEmail: "有効なメールアドレスをご記入下さい", exceedMaxSize: "ファイルのサイズは{0}を超えてはいけません", uploadingFile: "ファイルをアップロード中です。しばらくしてから再度お試し下さい", loadingFile: "読み込み中", chooseFile: "ファイルを選択", cleanCaption: "削除", clearCaption: "空白", removeFileCaption: "このファイルを削除" }; //Uncomment these two lines on creating a translation file. You should replace "en" and enStrings with your locale ("fr", "de" and so on) and your variable. __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ja"] = japaneseSurveyStrings; __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ja"] = "日本語"; /***/ }), /* 133 */ /***/ (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"] = "한국어"; /***/ }), /* 134 */ /***/ (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"; /***/ }), /* 135 */ /***/ (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ų"; /***/ }), /* 136 */ /***/ (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"; /***/ }), /* 137 */ /***/ (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"] = "فارْسِى"; /***/ }), /* 138 */ /***/ (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"; /***/ }), /* 139 */ /***/ (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", startSurveyText: "Começar", otherItemText: "Outros (descrever)", noneItemText: "Nenhum", selectAllItemText: "Selecionar Todos", 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.", requiredErrorInPanel: "Por favor, responda pelo menos uma pergunta.", requiredInAllRowsError: "Por favor, responda as perguntas em todas as linhas.", numericError: "O valor deve ser numérico.", textMinLength: "Por favor, insira pelo menos {0} caracteres.", textMaxLength: "Por favor, insira menos de {0} caracteres.", textMinMaxLength: "Por favor, insira mais de {0} e menos de {1} caracteres.", minRowCountError: "Preencha pelo menos {0} linhas.", minSelectError: "Selecione pelo menos {0} opções.", maxSelectError: "Por favor, selecione não mais do que {0} opções.", numericMinMax: "O '{0}' deve ser igual ou superior a {1} e igual ou menor que {2}", numericMin: "O '{0}' deve ser igual ou superior a {1}", numericMax: "O '{0}' deve ser igual ou inferior a {1}", invalidEmail: "Por favor, informe um e-mail válido.", invalidExpression: "A expressão: {0} deve retornar 'verdadeiro'.", urlRequestError: "A requisição retornou o erro '{0}'. {1}", urlGetChoicesError: "A requisição não retornou dados ou o 'caminho' da requisição não está correto", exceedMaxSize: "O tamanho do arquivo não deve exceder {0}.", otherRequiredError: "Por favor, informe o outro valor.", uploadingFile: "Seu arquivo está sendo carregado. Por favor, aguarde alguns segundos e tente novamente.", loadingFile: "Carregando...", chooseFile: "Selecione o(s) arquivo(s)...", confirmDelete: "Tem certeza que deseja deletar?", keyDuplicationError: "Esse valor deve ser único.", addColumn: "Adicionar coluna", addRow: "Adicionar linha", removeRow: "Remover linha", addPanel: "Adicionar novo", removePanel: "Remover", choices_Item: "item", matrix_column: "Coluna", matrix_row: "Linha", savingData: "Os resultados esto sendo salvos no servidor...", savingDataError: "Ocorreu um erro e não foi possível salvar os resultados.", savingDataSuccess: "Os resultados foram salvos com sucesso!", saveAgainButton: "Tente novamente", timerMin: "min", timerSec: "seg", timerSpentAll: "Você gastou {0} nesta página e {1} no total.", timerSpentPage: "Você gastou {0} nesta página.", timerSpentSurvey: "Você gastou {0} no total.", timerLimitAll: "Você gastou {0} de {1} nesta página e {2} de {3} no total.", timerLimitPage: "Você gastou {0} de {1} nesta página.", timerLimitSurvey: "Você gastou {0} de {1} no total.", cleanCaption: "Limpar", clearCaption: "Limpar", removeFileCaption: "Remover este arquivo" }; __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["pt"] = portugueseSurveyStrings; __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["pt"] = "português"; /***/ }), /* 140 */ /***/ (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ă"; /***/ }), /* 141 */ /***/ (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"] = "русский"; /***/ }), /* 142 */ /***/ (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: "提交问卷", startSurveyText: "开始问卷", otherItemText: "填写其他答案", noneItemText: "无", selectAllItemText: "选择全部", progressText: "第 {0} 页, 共 {1} 页", questionsProgressText: "第 {0}/{1} 题", emptySurvey: "问卷中没有问题或页面", completingSurveyBefore: "你已完成问卷.", completingSurvey: "感谢您的参与!", loadingSurvey: "问卷正在加载中...", optionsCaption: "请选择...", value: "值", requiredError: "请填写此问题", requiredErrorInPanel: "至少回答一题.", requiredInAllRowsError: "请填写所有行中问题", numericError: "答案必须是个数字", textMinLength: "答案长度至少 {0} 个字符", textMaxLength: "答案长度不能超过 {0} 个字符", textMinMaxLength: "答案长度必须在 {0} - {1} 个字符之间", minRowCountError: "最少需要填写 {0} 行答案", minSelectError: "最少需要选择 {0} 项答案", maxSelectError: "最多只能选择 {0} 项答案", numericMinMax: "答案 '{0}' 必须大于等于 {1} 且小于等于 {2}", numericMin: "答案 '{0}' 必须大于等于 {1}", numericMax: "答案 '{0}' 必须小于等于 {1}", invalidEmail: "请输入有效的 Email 地址", invalidExpression: "公式: {0} 无效.", urlRequestError: "载入选项时发生错误 '{0}': {1}", urlGetChoicesError: "未能载入有效的选项或请求参数路径有误", exceedMaxSize: "文件大小不能超过 {0}", otherRequiredError: "请完成其他问题", uploadingFile: "文件上传中... 请耐心等待几秒后重试", loadingFile: "加载...", chooseFile: "选择文件...", noFileChosen: "未选择文件", confirmDelete: "删除记录?", keyDuplicationError: "主键不能重复", addColumn: "添加列", addRow: "添加行", removeRow: "删除答案", addPanel: "新添", removePanel: "删除", choices_Item: "选项", matrix_column: "列", matrix_row: "行", savingData: "正在将结果保存到服务器...", savingDataError: "在保存结果过程中发生了错误,结果未能保存", savingDataSuccess: "结果保存成功!", saveAgainButton: "请重试", timerMin: "分", timerSec: "秒", timerSpentAll: "本页用时 {0} 总计用时{1} .", timerSpentPage: "本页用时{0} .", timerSpentSurvey: "总计用时 {0} .", timerLimitAll: "本页用时 {0} 共 {1}, 总计用时 {2} 共 {3} .", timerLimitPage: "本页用时 {0} 共 {1} .", timerLimitSurvey: "总计用时 {0} 共 {1}.", cleanCaption: "清理", clearCaption: "清除", removeFileCaption: "移除文件" }; __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["zh-cn"] = simplifiedChineseSurveyStrings; __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["zh-cn"] = "简体中文"; /***/ }), /* 143 */ /***/ (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"; /***/ }), /* 144 */ /***/ (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"; /***/ }), /* 145 */ /***/ (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"] = "繁體中文"; /***/ }), /* 146 */ /***/ (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"; /***/ }), /* 147 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2); /* unused harmony export ukrainianSurveyStrings */ var ukrainianSurveyStrings = { pagePrevText: "Назад", pageNextText: "Далі", completeText: "Завершити", startSurveyText: "Почати", otherItemText: "Інше (будь ласка, опишіть)", noneItemText: "Жоден", selectAllItemText: "Вибрати все", progressText: "Сторінка {0} з {1}", questionsProgressText: "Відповіли на {0}/{1} питань", emptySurvey: "Немає жодного питання.", completingSurvey: "Дякуємо Вам за заповнення анкети!", completingSurveyBefore: "Ви вже проходили це опитування.", loadingSurvey: "Завантаження опитування...", optionsCaption: "Вибрати...", value: "значення", requiredError: "Будь ласка, дайте відповідь.", requiredErrorInPanel: "Будь ласка, дайте відповідь хоча б на одне питання.", requiredInAllRowsError: "Будь ласка, дайте відповідь на питання в кожному рядку.", numericError: "Відповідь повинна бути числом.", textMinLength: "Будь ласка введіть більше {0} символів.", textMaxLength: "Будь ласка введіть менше {0} символів.", textMinMaxLength: "Будь ласка введіть більше {0} и менше {1} символів.", minRowCountError: "Будь ласка, заповніть не менше {0} рядків.", minSelectError: "Будь ласка, виберіть хоча б {0} варіантів.", maxSelectError: "Будь ласка, виберіть не більше {0} варіантів.", numericMinMax: "'{0}' повинно бути не менше ніж {1}, і не більше ніж {2}", numericMin: "'{0}' повинно бути не менше ніж {1}", numericMax: "'{0}' повинно бути не більше ніж {1}", invalidEmail: "Будь ласка, введіть дійсну адресу електронної пошти.", invalidExpression: "Вираз {0} повинен повертати 'true'.", urlRequestError: "Запит повернув помилку '{0}'. {1}", urlGetChoicesError: "Відповідь на запит повернулась порожньою або властивіть 'path' вказано невірно", exceedMaxSize: "Розмір файлу не повинен перевищувати {0}.", otherRequiredError: "Будь ласка, введіть дані в поле 'Інше'", uploadingFile: "Ваш файл завантажується. Зачекайте декілька секунд і спробуйте знову.", loadingFile: "Завантаження...", chooseFile: "Виберіть файл(и)...", noFileChosen: "Файл не вибрано", confirmDelete: "Ви хочете видалити запис?", keyDuplicationError: "Це значення повинно бути унікальним.", addColumn: "Додати колонку", addRow: "Додати рядок", removeRow: "Видалити", addPanel: "Додати нову", removePanel: "Видалити", choices_Item: "Варіант", matrix_column: "Колонка", matrix_row: "Рядок", savingData: "Результати зберігаються на сервер...", savingDataError: "Відбулася помилка, результат не був збережений.", savingDataSuccess: "Резвультат успішно збережений!", saveAgainButton: "Спробувати знову", timerMin: "хв", timerSec: "сек", timerSpentAll: "Ви витратили {0} на цій сторінці і {1} загалом.", timerSpentPage: "Ви витратили {0} на цій сторінці.", timerSpentSurvey: "Ви витратили {0} протягом тесту.", timerLimitAll: "Ви витратили {0} з {1} на цій сторінці і {2} з {3} для всього тесту.", timerLimitPage: "Ви витратили {0} з {1} на цій сторінці.", timerLimitSurvey: "Ви витратили {0} з {1} для всього тесту.", cleanCaption: "Очистити", clearCaption: "Очистити", removeFileCaption: "Видалити файл" }; __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ua"] = ukrainianSurveyStrings; __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ua"] = "українська"; /***/ }), /* 148 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(5); /* 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__expressions_expressions__ = __webpack_require__(25); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__ = __webpack_require__(16); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return Trigger; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyTrigger; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return SurveyTriggerVisible; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyTriggerComplete; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return SurveyTriggerSetValue; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return SurveyTriggerRunExpression; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return SurveyTriggerCopyValue; }); /** * A base class for all triggers. * A trigger calls a method when the expression change the result: from false to true or from true to false. * Please note, it runs only one changing the expression result. */ var Trigger = /** @class */ (function (_super) { __WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](Trigger, _super); function Trigger() { var _this = _super.call(this) || this; _this.usedNames = []; var self = _this; _this.registerFunctionOnPropertiesValueChanged(["operator", "value", "name"], function () { self.oldPropertiesChanged(); }); _this.registerFunctionOnPropertyValueChanged("expression", function () { self.onExpressionChanged(); }); return _this; } Object.defineProperty(Trigger, "operators", { get: function () { if (Trigger.operatorsValue != null) return Trigger.operatorsValue; Trigger.operatorsValue = { empty: function (value, expectedValue) { return !value; }, notempty: function (value, expectedValue) { return !!value; }, equal: function (value, expectedValue) { return value == expectedValue; }, notequal: function (value, expectedValue) { return value != expectedValue; }, contains: function (value, expectedValue) { return value && value["indexOf"] && value.indexOf(expectedValue) > -1; }, notcontains: function (value, expectedValue) { return (!value || !value["indexOf"] || value.indexOf(expectedValue) == -1); }, greater: function (value, expectedValue) { return value > expectedValue; }, less: function (value, expectedValue) { return value < expectedValue; }, greaterorequal: function (value, expectedValue) { return value >= expectedValue; }, lessorequal: function (value, expectedValue) { return value <= expectedValue; } }; return Trigger.operatorsValue; }, enumerable: true, configurable: true }); Trigger.prototype.getType = function () { return "triggerbase"; }; Trigger.prototype.toString = function () { var res = this.getType().replace("trigger", ""); var exp = !!this.expression ? this.expression : this.buildExpression(); if (exp) { res += ", " + exp; } return res; }; Object.defineProperty(Trigger.prototype, "operator", { get: function () { return this.getPropertyValue("operator", "equal"); }, set: function (value) { if (!value) return; value = value.toLowerCase(); if (!Trigger.operators[value]) return; this.setPropertyValue("operator", value); }, enumerable: true, configurable: true }); Object.defineProperty(Trigger.prototype, "value", { get: function () { return this.getPropertyValue("value", null); }, set: function (val) { this.setPropertyValue("value", val); }, enumerable: true, configurable: true }); Object.defineProperty(Trigger.prototype, "name", { get: function () { return this.getPropertyValue("name", ""); }, set: function (val) { this.setPropertyValue("name", val); }, enumerable: true, configurable: true }); Object.defineProperty(Trigger.prototype, "expression", { get: function () { return this.getPropertyValue("expression", ""); }, set: function (val) { this.setPropertyValue("expression", val); }, enumerable: true, configurable: true }); Trigger.prototype.checkExpression = function (keys, values, properties) { if (properties === void 0) { properties = null; } if (!this.isCheckRequired(keys)) return; if (!!this.conditionRunner) { this.perform(values, properties); } }; Trigger.prototype.check = function (value) { var triggerResult = Trigger.operators[this.operator](value, this.value); if (triggerResult) { this.onSuccess({}, null); } else { this.onFailure(); } }; Trigger.prototype.perform = function (values, properties) { var 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.hasFunction = false; this.conditionRunner = null; }; Trigger.prototype.buildExpression = function () { if (!this.name) return ""; if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(this.value) && this.isRequireValue) return ""; return ("{" + this.name + "} " + this.operator + " " + __WEBPACK_IMPORTED_MODULE_5__expressions_expressions__["h" /* OperandMaker */].toOperandString(this.value)); }; Trigger.prototype.isCheckRequired = function (keys) { if (!keys) return false; this.buildUsedNames(); if (this.hasFunction === true) return true; for (var i = 0; i < this.usedNames.length; i++) { if (keys.hasOwnProperty(this.usedNames[i])) return true; //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__["b" /* ConditionRunner */](expression); this.hasFunction = this.conditionRunner.hasFunction(); this.usedNames = this.conditionRunner.getVariables(); var processValue = new __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__["a" /* ProcessValue */](); for (var i = 0; i < this.usedNames.length; i++) { this.usedNames[i] = processValue.getFirstName(this.usedNames[i]); } }; Object.defineProperty(Trigger.prototype, "isRequireValue", { get: function () { return this.operator !== "empty" && this.operator != "notempty"; }, enumerable: true, configurable: true }); Trigger.operatorsValue = null; return Trigger; }(__WEBPACK_IMPORTED_MODULE_2__base__["b" /* Base */])); /** * It extends the Trigger base class and add properties required for SurveyJS classes. */ var SurveyTrigger = /** @class */ (function (_super) { __WEBPACK_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.setCompleted(); }; return SurveyTriggerComplete; }(SurveyTrigger)); /** * If expression returns true, the value from property **setValue** will be set to **setToName** */ 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)); /** * If expression returns true, the **runExpression** will be run. If **setToName** property is not empty then the result of **runExpression** will be set to it. */ var SurveyTriggerRunExpression = /** @class */ (function (_super) { __WEBPACK_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__["a" /* 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)); /** * If expression returns true, the value from question **fromName** will be set into **setToName**. */ 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__["a" /* Serializer */].addClass("trigger", [ { name: "operator", default: "equal" }, "value", "expression:condition" ]); __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("surveytrigger", ["name"], null, "trigger"); __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("visibletrigger", ["pages", "questions"], function () { return new SurveyTriggerVisible(); }, "surveytrigger"); __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("completetrigger", [], function () { return new SurveyTriggerComplete(); }, "surveytrigger"); __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("setvaluetrigger", ["!setToName", "setValue", "isVariable:boolean"], function () { return new SurveyTriggerSetValue(); }, "surveytrigger"); __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("copyvaluetrigger", ["!setToName", "!fromName"], function () { return new SurveyTriggerCopyValue(); }, "surveytrigger"); __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("runExpressiontrigger", ["setToName", "runExpression"], function () { return new SurveyTriggerRunExpression(); }, "surveytrigger"); /***/ }), /* 149 */ /***/ (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__(64); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Version", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["a"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "settings", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["b"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Helpers", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["c"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "AnswerCountValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["d"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "EmailValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["e"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "NumericValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["f"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "RegexValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["g"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["h"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "TextValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["i"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ValidatorResult", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["j"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ValidatorRunner", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["k"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ItemValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["l"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Base", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["m"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Event", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["n"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["o"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyElement", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["p"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "CustomError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["q"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "AnswerRequiredError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["r"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "OneAnswerRequiredError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["s"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "RequreNumericError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["t"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ExceedSizeError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["u"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "LocalizableString", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["v"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "HtmlConditionItem", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["w"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ChoicesRestfull", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["x"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "FunctionFactory", 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__, "Operand", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["B"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ConditionsParser", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["C"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ProcessValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["D"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["E"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonIncorrectTypeError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["F"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMetadata", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["G"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMetadataClass", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["H"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMissingTypeError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["I"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMissingTypeErrorBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["J"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonObject", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["K"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonObjectProperty", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["L"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonRequiredPropertyError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["M"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonUnknownPropertyError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["N"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Serializer", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["O"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownCell", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["P"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownColumn", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Q"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "matrixDropdownColumnTypes", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["R"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownRowModelBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["S"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdownModelBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["T"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownRowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["U"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdownModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["V"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDynamicRowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["W"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDynamicModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["X"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixRowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Y"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MartrixCells", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Z"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_0"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MultipleTextItemModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_1"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMultipleTextModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_2"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PanelModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_3"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PanelModelBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_4"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_5"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "FlowPanelModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_6"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PageModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_7"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Question", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_8"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionNonValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_9"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionEmptyModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_10"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckboxBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_11"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionSelectBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_12"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckboxModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_13"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCommentModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_14"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionDropdownModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_15"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionFactory", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_16"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ElementFactory", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_17"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionFileModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_18"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionHtmlModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_19"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRadiogroupModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_20"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRatingModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_21"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionExpressionModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_22"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionTextModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_23"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionBooleanModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_24"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionImagePickerModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_25"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamicModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_26"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamicItem", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_27"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTimer", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_28"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_29"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTrigger", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_30"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerComplete", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_31"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerSetValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_32"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerVisible", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_33"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerCopyValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_34"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerRunExpression", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_35"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Trigger", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_36"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyWindowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_37"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "TextPreProcessor", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_38"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "dxSurveyService", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_39"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "englishStrings", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_40"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "surveyLocalization", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_41"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "surveyStrings", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_42"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCustomWidget", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_43"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "CustomWidgetCollection", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_44"]; }); /* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "StylesManager", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_45"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__chunks_localization__ = __webpack_require__(63); /* 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__(13); /* 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__(61); /* 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__(62); /* 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__(33); /* 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__(15); /* 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__(18); /* 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__(24); /* 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_koflowpanel__ = __webpack_require__(66); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlowPanel", function() { return __WEBPACK_IMPORTED_MODULE_10__knockout_koflowpanel__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__knockout_koquestion__ = __webpack_require__(7); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionImplementor", function() { return __WEBPACK_IMPORTED_MODULE_11__knockout_koquestion__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__knockout_koquestion_baseselect__ = __webpack_require__(14); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionSelectBaseImplementor", function() { return __WEBPACK_IMPORTED_MODULE_12__knockout_koquestion_baseselect__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckboxBaseImplementor", function() { return __WEBPACK_IMPORTED_MODULE_12__knockout_koquestion_baseselect__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__knockout_koquestion_checkbox__ = __webpack_require__(68); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckbox", function() { return __WEBPACK_IMPORTED_MODULE_13__knockout_koquestion_checkbox__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__knockout_koquestion_comment__ = __webpack_require__(69); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionComment", function() { return __WEBPACK_IMPORTED_MODULE_14__knockout_koquestion_comment__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__knockout_koquestion_dropdown__ = __webpack_require__(70); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionDropdown", function() { return __WEBPACK_IMPORTED_MODULE_15__knockout_koquestion_dropdown__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__knockout_koquestion_file__ = __webpack_require__(73); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionFile", function() { return __WEBPACK_IMPORTED_MODULE_16__knockout_koquestion_file__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__knockout_koquestion_html__ = __webpack_require__(74); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionHtml", function() { return __WEBPACK_IMPORTED_MODULE_17__knockout_koquestion_html__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__knockout_koquestion_matrix__ = __webpack_require__(76); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MatrixRow", function() { return __WEBPACK_IMPORTED_MODULE_18__knockout_koquestion_matrix__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrix", function() { return __WEBPACK_IMPORTED_MODULE_18__knockout_koquestion_matrix__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__knockout_koquestion_matrixdropdown__ = __webpack_require__(34); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdown", function() { return __WEBPACK_IMPORTED_MODULE_19__knockout_koquestion_matrixdropdown__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__knockout_koquestion_matrixdynamic__ = __webpack_require__(77); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDynamicImplementor", function() { return __WEBPACK_IMPORTED_MODULE_20__knockout_koquestion_matrixdynamic__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDynamic", function() { return __WEBPACK_IMPORTED_MODULE_20__knockout_koquestion_matrixdynamic__["b"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__knockout_koquestion_paneldynamic__ = __webpack_require__(79); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamic", function() { return __WEBPACK_IMPORTED_MODULE_21__knockout_koquestion_paneldynamic__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__knockout_koquestion_multipletext__ = __webpack_require__(78); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MultipleTextItem", function() { return __WEBPACK_IMPORTED_MODULE_22__knockout_koquestion_multipletext__["a"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMultipleTextImplementor", function() { return __WEBPACK_IMPORTED_MODULE_22__knockout_koquestion_multipletext__["b"]; }); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionMultipleText", function() { return __WEBPACK_IMPORTED_MODULE_22__knockout_koquestion_multipletext__["c"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__knockout_koquestion_radiogroup__ = __webpack_require__(80); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionRadiogroup", function() { return __WEBPACK_IMPORTED_MODULE_23__knockout_koquestion_radiogroup__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__knockout_koquestion_rating__ = __webpack_require__(81); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionRating", function() { return __WEBPACK_IMPORTED_MODULE_24__knockout_koquestion_rating__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__knockout_koquestion_text__ = __webpack_require__(35); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionText", function() { return __WEBPACK_IMPORTED_MODULE_25__knockout_koquestion_text__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__knockout_koquestion_boolean__ = __webpack_require__(67); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionBoolean", function() { return __WEBPACK_IMPORTED_MODULE_26__knockout_koquestion_boolean__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__knockout_koquestion_empty__ = __webpack_require__(71); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionEmpty", function() { return __WEBPACK_IMPORTED_MODULE_27__knockout_koquestion_empty__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__knockout_koquestion_expression__ = __webpack_require__(72); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionExpression", function() { return __WEBPACK_IMPORTED_MODULE_28__knockout_koquestion_expression__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__knockout_koquestion_imagepicker__ = __webpack_require__(75); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "QuestionImagePicker", function() { return __WEBPACK_IMPORTED_MODULE_29__knockout_koquestion_imagepicker__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__knockout_koSurveyWindow__ = __webpack_require__(65); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyWindow", function() { return __WEBPACK_IMPORTED_MODULE_30__knockout_koSurveyWindow__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__knockout_templateText__ = __webpack_require__(36); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyTemplateText", function() { return __WEBPACK_IMPORTED_MODULE_31__knockout_templateText__["a"]; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_32_knockout__ = __webpack_require__(6); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_32_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_32_knockout__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_33__survey__ = __webpack_require__(23); // 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"; __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_7__knockout_kosurvey__["b" /* registerTemplateEngine */])(__WEBPACK_IMPORTED_MODULE_32_knockout__, __WEBPACK_IMPORTED_MODULE_33__survey__["a" /* SurveyModel */].platform); /***/ }) /******/ ]); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBhYmZmNDNkMzkwNzQ2ZDhkOTYwNSIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9jaHVua3MvaGVscGVycy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvanNvbm9iamVjdC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc3VydmV5U3RyaW5ncy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25mYWN0b3J5LnRzIiwid2VicGFjazovLy8uL3NyYy9oZWxwZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9iYXNlLnRzIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJyb290XCI6XCJrb1wiLFwiY29tbW9uanMyXCI6XCJrbm9ja291dFwiLFwiY29tbW9uanNcIjpcImtub2Nrb3V0XCIsXCJhbWRcIjpcImtub2Nrb3V0XCJ9Iiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbmRpdGlvbnMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Vycm9yLnRzIiwid2VicGFjazovLy8uL3NyYy9pdGVtdmFsdWUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fYmFzZXNlbGVjdC50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29zdXJ2ZXkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbmRpdGlvblByb2Nlc3NWYWx1ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemFibGVzdHJpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvYmFzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGFuZWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX2Jhc2VzZWxlY3QudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdGV4dFByZVByb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc3VydmV5LnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb3BhZ2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V4cHJlc3Npb25zL2V4cHJlc3Npb25zLnRzIiwid2VicGFjazovLy8uL3NyYy9mdW5jdGlvbnNmYWN0b3J5LnRzIiwid2VicGFjazovLy8uL3NyYy9wYWdlLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbkN1c3RvbVdpZGdldHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX2Ryb3Bkb3duLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9leHByZXNzaW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl90ZXh0LnRzIiwid2VicGFjazovLy8uL3NyYy92YWxpZGF0b3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21haW4uc2NzcyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhkcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl90ZXh0LnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZVRleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Nob2ljZXNSZXN0ZnVsbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29uZGl0aW9uc1BhcnNlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZHhTdXJ2ZXlTZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9mbG93cGFuZWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9lbmdsaXNoLnRzIiwid2VicGFjazovLy8uL3NyYy9tYXJ0aXhCYXNlLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9ib29sZWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9jaGVja2JveC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fY29tbWVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fZW1wdHkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX2ZpbGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX2h0bWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX2ltYWdlcGlja2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9tYXRyaXgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9tYXRyaXhkeW5hbWljLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9tdWx0aXBsZXRleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX3BhbmVsZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fcmFkaW9ncm91cC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fcmF0aW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbm5vbnZhbHVlLnRzIiwid2VicGFjazovLy8uL3NyYy9zdHlsZXNtYW5hZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9zdXJ2ZXlXaW5kb3cudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N1cnZleXRpbWVyLnRzIiwid2VicGFjazovLy8uL3NyYy9kZWZhdWx0Q3NzL2Nzc2Jvb3RzdHJhcC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZGVmYXVsdENzcy9jc3Nib290c3RyYXBtYXRlcmlhbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9jaHVua3MvbG9jYWxpemF0aW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9lbnRyaWVzL2NodW5rcy9tb2RlbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29TdXJ2ZXlXaW5kb3cudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvZmxvd3BhbmVsLnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fY2hlY2tib3gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fY29tbWVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9lbXB0eS50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9leHByZXNzaW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2ZpbGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25faHRtbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9pbWFnZXBpY2tlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fbWF0cml4ZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9tdWx0aXBsZXRleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fcGFuZWxkeW5hbWljLnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX3JhZGlvZ3JvdXAudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fcmF0aW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvY29tbWVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvZmxvd3BhbmVsLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9pbmRleC5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvbWF0cml4Y2VsbC5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcGFnZS5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcGFuZWwuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3Byb2dyZXNzLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1ib29sZWFuLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1jaGVja2JveC5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tY29tbWVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tZHJvcGRvd24uaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWVtcHR5Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1lcnJvcnMuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWV4cHJlc3Npb24uaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWZpbGUuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWh0bWwuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWltYWdlcGlja2VyLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1tYXRyaXguaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLW1hdHJpeGR5bmFtaWMuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLW11bHRpcGxldGV4dC5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tcGFuZWxkeW5hbWljLW5hdmlnYXRvci5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tcGFuZWxkeW5hbWljLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1yYWRpb2dyb3VwLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1yYXRpbmcuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLXRleHQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbnRpdGxlLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9yb3dzLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9zdHJpbmcuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3RpbWVycGFuZWwuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL2VudHJ5Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy93aW5kb3cvd2luZG93Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V4cHJlc3Npb25zL2V4cHJlc3Npb25QYXJzZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2h0bWxDb25kaXRpb25JdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vYXJhYmljLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vYnVsZ2FyaWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vY2F0YWxhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2N6ZWNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZGFuaXNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZHV0Y2gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9maW5uaXNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZnJlbmNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZ2VvcmdpYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9nZXJtYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9ncmVlay50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2hlYnJldy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2h1bmdhcmlhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2ljZWxhbmRpYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2luZG9uZXNpYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9pdGFsaWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vamFwYW5lc2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9rb3JlYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9sYXR2aWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vbGl0aHVhbmlhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL25vcndlZ2lhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3BlcnNpYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9wb2xpc2gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9wb3J0dWd1ZXNlLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vcm9tYW5pYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9ydXNzaWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vc2ltcGxpZmllZC1jaGluZXNlLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vc3BhbmlzaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3N3ZWRpc2gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi90cmFkaXRpb25hbC1jaGluZXNlLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vdHVya2lzaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3VrcmFpbmlhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHJpZ2dlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9rbm9ja291dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7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LElBQUksQ0FBQyxLQUFLLFdBQVcsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDdEUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssV0FBVyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUV0RSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ3pDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxNQUFNLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxNQUFNLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDbkUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFD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LENBQUM7WUFDdkUsQ0FBQztZQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBQ0gsOEJBQUM7QUFBRCxDQUFDLENBckk0QywyREFBUSxHQXFJcEQ7O0FBRUs7SUFDSixNQUFNLENBQUM7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztLQUNOLENBQUM7QUFDSixDQUFDO0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQ2pCLFlBQVksRUFDWjtJQUNFLHVCQUF1QjtJQUN2QixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUUsV0FBVyxFQUFFO0lBQ3REO1FBQ0UsSUFBSSxFQUFFLGNBQWM7UUFDcEIsT0FBTyxFQUFFLE1BQU07UUFDZixPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUM7S0FDcEQ7SUFDRDtRQUNFLElBQUksRUFBRSxVQUFVO1FBQ2hCLE9BQU8sRUFBRTtZQUNQLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxFQUFFLEtBQUs7S0FDZjtJQUNELEVBQUUsSUFBSSxFQUFFLDhCQUE4QixFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRTtJQUNyRCxFQUFFLElBQUksRUFBRSw4QkFBOEIsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDckQsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtJQUM5QyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtJQUN2QyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtJQUNwQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtJQUN0QyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtJQUNwQyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO0lBQzdDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO0NBQ3ZDLEVBQ0Q7SUFDRSxNQUFNLENBQUMsSUFBSSx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6QyxDQUFDLEVBQ0QsVUFBVSxDQUNYLENBQUM7QUFDRix5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsY0FBSTtJQUMxRCxNQUFNLENBQUMsSUFBSSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQzNXaUQ7QUFDVjtBQUNKO0FBRUY7QUFDUztBQUU3Qzs7R0FFRztBQUNIO0lBQXVDLG9GQUFRO0lBQzdDLDJCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixLQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYSxFQUFFLEtBQUksQ0FBQyxDQUFDOztJQUNwRCxDQUFDO0lBQ00sbUNBQU8sR0FBZDtRQUNFLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUlELHNCQUFXLHdDQUFTO1FBSHBCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNwRCxDQUFDO2FBQ0QsVUFBcUIsR0FBVztZQUM5QixHQUFHLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQztnQkFBQyxHQUFHLEdBQUcsZ0JBQWdCLENBQUM7WUFDcEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUN0RCxFQUFFLENBQUMsQ0FDRCxDQUFDLElBQUksQ0FBQyxpQkFBaUI7Z0JBQ3ZCLEdBQUcsS0FBSyxPQUFPO2dCQUNmLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBQyxJQUFJLFFBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsRUFBaEMsQ0FBZ0MsQ0FDN0QsQ0FBQyxDQUFDLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxrRUFBYyxFQUFFLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQzs7O09BWkE7SUFhRCxpREFBcUIsR0FBckIsVUFBc0IsVUFBa0I7UUFDdEMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFNRCxzQkFBVyx3Q0FBUztRQUxwQjs7OztXQUlHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELENBQUM7YUFDRCxVQUFxQixHQUFXO1lBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsQ0FBQzs7O09BSEE7SUFJTSx3Q0FBWSxHQUFuQjtRQUNFLE1BQU0sQ0FBQyx5REFBTyxDQUFDLFlBQVksQ0FDekIsSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzdDLENBQUM7SUFDSixDQUFDO0lBSUQsc0JBQVcsbUNBQUk7UUFIZjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUNELFVBQWdCLEdBQVc7WUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyQyxDQUFDOzs7T0FIQTtJQUlELG1DQUFPLEdBQVA7UUFDRSxNQUFNLENBQUMsaUJBQU0sT0FBTyxXQUFFLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUNELHNEQUEwQixHQUExQjtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBSUQsc0JBQVcsMENBQVc7UUFIdEI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEQsQ0FBQzthQUNELFVBQXVCLEdBQVc7WUFDaEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwRCxDQUFDOzs7T0FIQTtJQUlELHNCQUFJLDZDQUFjO2FBQWxCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRCxDQUFDOzs7T0FBQTtJQUNTLHVDQUFXLEdBQXJCLFVBQXNCLFFBQWE7UUFDakMsUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxpQkFBTSxXQUFXLFlBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUNTLDRDQUFnQixHQUExQixVQUEyQixRQUFhO1FBQ3RDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUMvQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDNUQsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdELENBQUM7UUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFDTyxvQ0FBUSxHQUFoQixVQUFpQixLQUFVO1FBQ3pCLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNILHdCQUFDO0FBQUQsQ0FBQyxDQXZGc0MsMkRBQVEsR0F1RjlDOztBQUVELCtEQUFVLENBQUMsUUFBUSxDQUNqQixNQUFNLEVBQ047SUFDRTtRQUNFLElBQUksRUFBRSxXQUFXO1FBQ2pCLE9BQU8sRUFBRSxNQUFNO1FBQ2YsT0FBTyxFQUFFO1lBQ1AsT0FBTztZQUNQLE1BQU07WUFDTixVQUFVO1lBQ1YsZ0JBQWdCO1lBQ2hCLE9BQU87WUFDUCxPQUFPO1lBQ1AsUUFBUTtZQUNSLFVBQVU7WUFDVixPQUFPO1lBQ1AsS0FBSztZQUNMLE1BQU07WUFDTixNQUFNO1lBQ04sS0FBSztZQUNMLE1BQU07U0FDUDtLQUNGO0lBQ0QsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7SUFDcEMsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ3pDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBRTtDQUNqRSxFQUNEO0lBQ0UsTUFBTSxDQUFDLElBQUksaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkMsQ0FBQyxFQUNELFVBQVUsQ0FDWCxDQUFDO0FBRUYseUVBQWUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLGNBQUk7SUFDcEQsTUFBTSxDQUFDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0STJEO0FBQ0o7QUFDTDtBQUVYO0FBQ0s7QUFDWDtBQUVwQztJQUNFLHlCQUFtQixLQUFVLEVBQVMsS0FBeUI7UUFBekIsb0NBQXlCO1FBQTVDLFVBQUssR0FBTCxLQUFLLENBQUs7UUFBUyxVQUFLLEdBQUwsS0FBSyxDQUFvQjtJQUFHLENBQUM7SUFDckUsc0JBQUM7QUFBRCxDQUFDOztBQUNEOztHQUVHO0FBQ0g7SUFBcUMsa0ZBQUk7SUFFdkM7UUFBQSxZQUNFLGlCQUFPLFNBRVI7UUFEQyxLQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLEtBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzs7SUFDbkQsQ0FBQztJQUNELHNCQUFXLGlDQUFJO2FBQWY7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLENBQUM7YUFDRCxVQUFnQixLQUFhO1lBQzNCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0MsQ0FBQzs7O09BSEE7SUFJRCxzQkFBVyxnREFBbUI7YUFBOUI7WUFDRSxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2YsQ0FBQzs7O09BQUE7SUFDRCxzQkFBSSxvQ0FBTzthQUFYO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxDQUFDOzs7T0FBQTtJQUNTLHNDQUFZLEdBQXRCLFVBQXVCLElBQVk7UUFDakMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUNTLDZDQUFtQixHQUE3QixVQUE4QixJQUFZO1FBQ3hDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ00sa0NBQVEsR0FBZixVQUFnQixLQUFVLEVBQUUsSUFBbUI7UUFBbkIsa0NBQW1CO1FBQzdDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ00sMkNBQWlCLEdBQXhCLFVBQ0UsS0FBVSxFQUNWLE1BQVcsRUFDWCxVQUFlLEVBQ2YsSUFBbUI7UUFBbkIsa0NBQW1CO1FBRW5CLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsbUNBQVMsR0FBVDtRQUNFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzlELENBQUM7SUFDRCx5Q0FBZSxHQUFmLFVBQWdCLElBQVk7UUFDMUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFFLENBQUM7SUFDRCwwQ0FBZ0IsR0FBaEIsVUFBaUIsSUFBWTtRQUMzQixNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzRSxDQUFDO0lBQ1MsMkNBQWlCLEdBQTNCLFVBQTRCLElBQVk7UUFDdEMsTUFBTSxDQUFDLElBQUksMkRBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBQ00sa0NBQVEsR0FBZjtRQUNFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNoQixHQUFHLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDMUIsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ0gsc0JBQUM7QUFBRCxDQUFDLENBdkRvQyxtREFBSSxHQXVEeEM7O0FBUUQ7SUFBQTtJQXlCQSxDQUFDO0lBeEJRLDZCQUFHLEdBQVYsVUFBVyxLQUFzQjtRQUMvQixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakQsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBQzNCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxlQUFlLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FDbEMsS0FBSyxDQUFDLGNBQWMsRUFDcEIsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQzFCLENBQUM7WUFDSixDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ04sZUFBZSxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FDM0MsS0FBSyxDQUFDLGNBQWMsRUFDcEIsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEVBQzdCLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxFQUNqQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FDMUIsQ0FBQztZQUNKLENBQUM7WUFDRCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDakQsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNILHNCQUFDO0FBQUQsQ0FBQzs7QUFDRDs7R0FFRztBQUNIO0lBQXNDLG1GQUFlO0lBQ25ELDBCQUFtQixRQUF1QixFQUFTLFFBQXVCO1FBQXZELDBDQUF1QjtRQUFTLDBDQUF1QjtRQUExRSxZQUNFLGlCQUFPLFNBQ1I7UUFGa0IsY0FBUSxHQUFSLFFBQVEsQ0FBZTtRQUFTLGNBQVEsR0FBUixRQUFRLENBQWU7O0lBRTFFLENBQUM7SUFDTSxrQ0FBTyxHQUFkO1FBQ0UsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0lBQzVCLENBQUM7SUFDTSxtQ0FBUSxHQUFmLFVBQWdCLEtBQVUsRUFBRSxJQUFtQjtRQUFuQixrQ0FBbUI7UUFDN0MsRUFBRSxDQUFDLENBQUMseURBQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQzdDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsTUFBTSxDQUFDLElBQUksZUFBZSxDQUN4QixJQUFJLEVBQ0osSUFBSSxrRUFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUM5QyxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksTUFBTSxHQUFHLElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDM0QsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMzRCxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxNQUFNLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNuRCxDQUFDO0lBQ1MsOENBQW1CLEdBQTdCLFVBQThCLElBQVk7UUFDeEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDckQsTUFBTSxDQUFDLDBFQUFrQjtpQkFDdEIsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUMxQixRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixNQUFNLENBQUMsMEVBQWtCO3FCQUN0QixTQUFTLENBQUMsWUFBWSxDQUFDLENBQ3ZCLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDckMsQ0FBQztZQUNELE1BQU0sQ0FBQywwRUFBa0I7aUJBQ3RCLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FDdkIsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztJQUNPLG1DQUFRLEdBQWhCLFVBQWlCLEtBQVU7UUFDekIsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0gsdUJBQUM7QUFBRCxDQUFDLENBOUNxQyxlQUFlLEdBOENwRDs7QUFDRDs7R0FFRztBQUNIO0lBQW1DLGdGQUFlO0lBQ2hELHVCQUNTLFNBQXFCLEVBQ3JCLFNBQXFCLEVBQ3JCLFdBQWtCO1FBRmxCLHlDQUFxQjtRQUNyQix5Q0FBcUI7UUFDckIsZ0RBQWtCO1FBSDNCLFlBS0UsaUJBQU8sU0FDUjtRQUxRLGVBQVMsR0FBVCxTQUFTLENBQVk7UUFDckIsZUFBUyxHQUFULFNBQVMsQ0FBWTtRQUNyQixpQkFBVyxHQUFYLFdBQVcsQ0FBTzs7SUFHM0IsQ0FBQztJQUNNLCtCQUFPLEdBQWQ7UUFDRSxNQUFNLENBQUMsZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFDTSxnQ0FBUSxHQUFmLFVBQWdCLEtBQVUsRUFBRSxJQUFtQjtRQUFuQixrQ0FBbUI7UUFDN0MsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsSUFBSSx5REFBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDN0QsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLEdBQUcsR0FBRyxlQUFlLENBQUM7WUFDMUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckIsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNqRSxDQUFDO1FBQ0gsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDeEQsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN4RCxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNTLDJDQUFtQixHQUE3QixVQUE4QixJQUFZO1FBQ3hDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sQ0FBQywwRUFBa0I7aUJBQ3RCLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUM3QixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNyQixNQUFNLENBQUMsMEVBQWtCO2lCQUN0QixTQUFTLENBQUMsZUFBZSxDQUFDLENBQzFCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsMEVBQWtCO2FBQ3RCLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FDMUIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFDSCxvQkFBQztBQUFELENBQUMsQ0F4Q2tDLGVBQWUsR0F3Q2pEOztBQUVEO0lBQTBDLHVGQUFlO0lBQ3ZELDhCQUFtQixRQUF1QixFQUFTLFFBQXVCO1FBQXZELDBDQUF1QjtRQUFTLDBDQUF1QjtRQUExRSxZQUNFLGlCQUFPLFNBQ1I7UUFGa0IsY0FBUSxHQUFSLFFBQVEsQ0FBZTtRQUFTLGNBQVEsR0FBUixRQUFRLENBQWU7O0lBRTFFLENBQUM7SUFDTSxzQ0FBTyxHQUFkO1FBQ0UsTUFBTSxDQUFDLHNCQUFzQixDQUFDO0lBQ2hDLENBQUM7SUFDTSx1Q0FBUSxHQUFmLFVBQWdCLEtBQVUsRUFBRSxJQUFtQjtRQUFuQixrQ0FBbUI7UUFDN0MsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDN0QsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUN6QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUMzQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQ3hCLElBQUksRUFDSixJQUFJLENBQUMsaUJBQWlCLENBQ3BCLDBFQUFrQjtpQkFDZixTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FDM0IsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUM1QixDQUNGLENBQUM7UUFDSixDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDM0MsTUFBTSxDQUFDLElBQUksZUFBZSxDQUN4QixJQUFJLEVBQ0osSUFBSSxDQUFDLGlCQUFpQixDQUNwQiwwRUFBa0I7aUJBQ2YsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQzNCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDNUIsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ1Msa0RBQW1CLEdBQTdCLFVBQThCLElBQVk7UUFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFDSCwyQkFBQztBQUFELENBQUMsQ0FuQ3lDLGVBQWUsR0FtQ3hEOztBQUNEOztHQUVHO0FBQ0g7SUFBb0MsaUZBQWU7SUFDakQsd0JBQW1CLEtBQW9CO1FBQXBCLG9DQUFvQjtRQUF2QyxZQUNFLGlCQUFPLFNBQ1I7UUFGa0IsV0FBSyxHQUFMLEtBQUssQ0FBZTs7SUFFdkMsQ0FBQztJQUNNLGdDQUFPLEdBQWQ7UUFDRSxNQUFNLENBQUMsZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUNNLGlDQUFRLEdBQWYsVUFBZ0IsS0FBVSxFQUFFLElBQW1CO1FBQW5CLGtDQUFtQjtRQUM3QyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3ZDLElBQUksRUFBRSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM1QyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUM7b0JBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUNPLGlDQUFRLEdBQWhCLFVBQWlCLEVBQVUsRUFBRSxLQUFVLEVBQUUsSUFBWTtRQUNuRCxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNoQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDSCxxQkFBQztBQUFELENBQUMsQ0F0Qm1DLGVBQWUsR0FzQmxEOztBQUNEOztHQUVHO0FBQ0g7SUFBb0MsaUZBQWU7SUFFakQ7UUFBQSxZQUNFLGlCQUFPLFNBQ1I7UUFITyxRQUFFLEdBQUcsd0hBQXdILENBQUM7O0lBR3RJLENBQUM7SUFDTSxnQ0FBTyxHQUFkO1FBQ0UsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFDTSxpQ0FBUSxHQUFmLFVBQWdCLEtBQVUsRUFBRSxJQUFtQjtRQUFuQixrQ0FBbUI7UUFDN0MsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3hCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNyQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDUyw0Q0FBbUIsR0FBN0IsVUFBOEIsSUFBWTtRQUN4QyxNQUFNLENBQUMsMEVBQWtCLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDSCxxQkFBQztBQUFELENBQUMsQ0FoQm1DLGVBQWUsR0FnQmxEOztBQUVEOztHQUVHO0FBQ0g7SUFBeUMsc0ZBQWU7SUFHdEQ7UUFBQSxZQUNFLGlCQUFPLFNBQ1I7UUFKTyxxQkFBZSxHQUFvQixJQUFJLENBQUM7O0lBSWhELENBQUM7SUFDTSxxQ0FBTyxHQUFkO1FBQ0UsTUFBTSxDQUFDLHFCQUFxQixDQUFDO0lBQy9CLENBQUM7SUFDRCxzQkFBVyxvREFBbUI7YUFBOUI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ2QsQ0FBQzs7O09BQUE7SUFDTSwrQ0FBaUIsR0FBeEIsVUFDRSxLQUFVLEVBQ1YsTUFBVyxFQUNYLFVBQWUsRUFDZixJQUFtQjtRQUFuQixrQ0FBbUI7UUFFbkIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNsQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxvRUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNsRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDdkQsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ1QsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFDUyxpREFBbUIsR0FBN0IsVUFBOEIsSUFBWTtRQUN4QyxNQUFNLENBQUMsMEVBQWtCO2FBQ3RCLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUM5QixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNILDBCQUFDO0FBQUQsQ0FBQyxDQWxDd0MsZUFBZSxHQWtDdkQ7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUU7SUFDckMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLHFCQUFxQixFQUFFLFNBQVMsRUFBRTtDQUNuRCxDQUFDLENBQUM7QUFDSCwrREFBVSxDQUFDLFFBQVEsQ0FDakIsa0JBQWtCLEVBQ2xCLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsRUFDdEM7SUFDRSxNQUFNLENBQUMsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO0FBQ2hDLENBQUMsRUFDRCxpQkFBaUIsQ0FDbEIsQ0FBQztBQUNGLCtEQUFVLENBQUMsUUFBUSxDQUNqQixlQUFlLEVBQ2YsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsQ0FBQyxFQUMvRDtJQUNFLE1BQU0sQ0FBQyxJQUFJLGFBQWEsRUFBRSxDQUFDO0FBQzdCLENBQUMsRUFDRCxpQkFBaUIsQ0FDbEIsQ0FBQztBQUNGLCtEQUFVLENBQUMsUUFBUSxDQUNqQixzQkFBc0IsRUFDdEIsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQyxFQUN0QztJQUNFLE1BQU0sQ0FBQyxJQUFJLG9CQUFvQixFQUFFLENBQUM7QUFDcEMsQ0FBQyxFQUNELGlCQUFpQixDQUNsQixDQUFDO0FBQ0YsK0RBQVUsQ0FBQyxRQUFRLENBQ2pCLGdCQUFnQixFQUNoQixDQUFDLE9BQU8sQ0FBQyxFQUNUO0lBQ0UsTUFBTSxDQUFDLElBQUksY0FBYyxFQUFFLENBQUM7QUFDOUIsQ0FBQyxFQUNELGlCQUFpQixDQUNsQixDQUFDO0FBQ0YsK0RBQVUsQ0FBQyxRQUFRLENBQ2pCLGdCQUFnQixFQUNoQixFQUFFLEVBQ0Y7SUFDRSxNQUFNLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQztBQUM5QixDQUFDLEVBQ0QsaUJBQWlCLENBQ2xCLENBQUM7QUFFRiwrREFBVSxDQUFDLFFBQVEsQ0FDakIscUJBQXFCLEVBQ3JCLENBQUMsc0JBQXNCLENBQUMsRUFDeEI7SUFDRSxNQUFNLENBQUMsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0FBQ25DLENBQUMsRUFDRCxpQkFBaUIsQ0FDbEIsQ0FBQzs7Ozs7OztBQ25YRix5Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0ErQjtBQUNTO0FBQ2lDO0FBS2pDO0FBQ0c7QUFDVTtBQUVGO0FBRW5EO0lBQW1ELGdHQUFtQjtJQVdwRSx1Q0FBWSxRQUFrQjtRQUE5QixZQUNFLGtCQUFNLFFBQVEsQ0FBQyxTQWdFaEI7UUEvREMsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDO1FBQ2hCLEtBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFTLEVBQU8sRUFBRSxHQUFRO1lBQ2pELE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUM7UUFDRixLQUFJLENBQUMsUUFBUSxHQUFHLG9EQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsS0FBSSxDQUFDLE1BQU0sR0FBRyxzREFBZSxDQUFDO1lBQzVCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQStCLElBQUksQ0FBQyxRQUFTLENBQUMsV0FBVyxDQUFDO1FBQ2xFLENBQUMsRUFBRSxLQUFJLENBQUMsQ0FBQztRQUNULEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxzREFBZSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQStCLElBQUksQ0FBQyxRQUFTLENBQUMsY0FBYyxDQUFDO1FBQ3JFLENBQUMsRUFBRSxLQUFJLENBQUMsQ0FBQztRQUNULElBQUksSUFBSSxHQUFHLEtBQUksQ0FBQztRQUNjLEtBQUk7YUFDL0IsUUFBUyxDQUFDLDBCQUEwQixHQUFHO1lBQ3hDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzlCLENBQUMsQ0FBQztRQUNGLEtBQUksQ0FBQyxhQUFhLEdBQUc7WUFDbkIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hCLENBQUMsQ0FBQztRQUNGLEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxVQUFTLElBQVM7WUFDeEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUM7UUFDRixLQUFJLENBQUMsZUFBZSxHQUFHLHNEQUFlLENBQUM7WUFDckMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFJLENBQUMsa0JBQWtCLEdBQUcsc0RBQWUsQ0FBQztZQUN4QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUNILEtBQUksQ0FBQyxjQUFjLEdBQUcsc0RBQWUsQ0FBQztZQUNwQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUNILEtBQUksQ0FBQywwQkFBMEIsR0FBRyxvREFBYSxDQUNmLEtBQUksQ0FBQyxRQUFTLENBQUMsd0JBQXdCLENBQ3RFLENBQUM7UUFDSSxLQUFJLENBQUMsUUFBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUksQ0FBQyxNQUFNLENBQUM7UUFDdkMsS0FBSSxDQUFDLFFBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUMzRCxLQUFJLENBQUMsUUFBUyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsS0FBSSxDQUFDLGlCQUFpQixDQUFDO1FBQzdELEtBQUksQ0FBQyxRQUFTLENBQUMsZUFBZSxDQUFDLEdBQUcsS0FBSSxDQUFDLGFBQWEsQ0FBQztRQUNyRCxLQUFJLENBQUMsUUFBUyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsS0FBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzNELEtBQUksQ0FBQyxRQUFTLENBQUMsaUJBQWlCLENBQUMsR0FBRyxLQUFJLENBQUMsZUFBZSxDQUFDO1FBQ3pELEtBQUksQ0FBQyxRQUFTLENBQUMsb0JBQW9CLENBQUMsR0FBRyxLQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDL0QsS0FBSSxDQUFDLFFBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEtBQUksQ0FBQyxjQUFjLENBQUM7UUFDdkQsS0FBSSxDQUFDLFFBQVMsQ0FDbEIsNEJBQTRCLENBQzdCLEdBQUcsS0FBSSxDQUFDLDBCQUEwQixDQUFDO1FBQzlCLEtBQUksQ0FBQyxRQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsS0FBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3pCLEtBQUk7YUFDL0IsUUFBUyxDQUFDLHNCQUFzQixHQUFHO1lBQ3BDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUM7UUFDNEIsS0FBSTthQUMvQixRQUFTLENBQUMsbUJBQW1CLEdBQUc7WUFDakMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztRQUM0QixLQUFJO2FBQy9CLFFBQVMsQ0FBQywyQkFBMkIsR0FBRztZQUN6QyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMvQixDQUFDLENBQUM7O0lBQ0osQ0FBQztJQUNTLDJEQUFtQixHQUE3QjtRQUNFLE1BQU0sQ0FBQyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUNPLHVEQUFlLEdBQXZCLFVBQXdCLFFBQWEsRUFBRSxHQUFRO1FBQzdDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDbEMsSUFBSSxFQUFFLEdBQUcsNERBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4RCxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUNoQixJQUFJLElBQUksR0FBdUIsR0FBRyxDQUFDO1FBQ25DLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxRCwrQ0FBUSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUU7Z0JBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksT0FBTyxHQUFHO1lBQ1osSUFBSSxFQUFFLElBQUk7WUFDVixZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDM0IsV0FBVyxFQUFFLEVBQUU7WUFDZixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07U0FDcEIsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUNTLG9EQUFZLEdBQXRCO1FBQ0UsaUJBQU0sWUFBWSxXQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUNTLGtEQUFVLEdBQXBCO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFDUyw2REFBcUIsR0FBL0I7UUFDRSxJQUFJLENBQUMsMEJBQTBCLENBQ0ssSUFBSSxDQUFDLFFBQVMsQ0FBQyx3QkFBd0IsQ0FDMUUsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDUyxtREFBVyxHQUFyQjtRQUNFLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ1Msc0RBQWMsR0FBeEI7UUFDRSxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNTLG9EQUFZLEdBQXRCO1FBQ0UsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDUyx1REFBZSxHQUF6QjtRQUNFLElBQUksSUFBSSxHQUFxQyxJQUFJLENBQUMsUUFBUyxDQUFDLFdBQVcsQ0FBQztRQUN4RSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ1MsNERBQW9CLEdBQTlCO1FBQ0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNTLDhDQUFNLEdBQWhCLGNBQW9CLENBQUM7SUFDWCxpREFBUyxHQUFuQixVQUFvQixHQUErQixJQUFHLENBQUM7SUFDN0MscURBQWEsR0FBdkIsY0FBMkIsQ0FBQztJQUM5QixvQ0FBQztBQUFELENBQUMsQ0FwSWtELHdFQUFtQixHQW9JckU7O0FBRUQ7SUFBNEMseUZBQTJCO0lBQ3JFLGdDQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLDZCQUE2QixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUMxQyxDQUFDO0lBQ0gsNkJBQUM7QUFBRCxDQUFDLENBTDJDLDZGQUEyQixHQUt0RTs7QUFFRCwrREFBVSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixFQUFFO0lBQ2hELE1BQU0sQ0FBQyxJQUFJLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLENBQUMsQ0FBQyxDQUFDO0FBRUgseUVBQWUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUUsY0FBSTtJQUM5RCxJQUFJLENBQUMsR0FBRyxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQyxDQUFDLElBQUksR0FBRyx5RUFBZSxDQUFDLFdBQVcsQ0FBQztJQUNyQyxxR0FBK0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRCxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ1gsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQ3BLa0Q7QUFDVjtBQUNVO0FBQ0Y7QUFFbkQ7SUFBa0MsK0VBQWlCO0lBQ2pELHNCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLHdFQUFtQixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUNoQyxDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQUFDLENBTGlDLHlFQUFpQixHQUtsRDs7QUFFRCwrREFBVSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRTtJQUN0QyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDOUIsQ0FBQyxDQUFDLENBQUM7QUFFSCx5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsY0FBSTtJQUNwRCxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7QUNsQkksSUFBSSxVQUFVLEdBQUcsbUJBQU8sQ0FBQyxHQUEyRCxDQUFDLENBQUM7QUFFN0Y7SUFDRTtJQUFlLENBQUM7SUFFVCxvQ0FBTyxHQUFkLFVBQWUsT0FBZSxFQUFFLEVBQVUsRUFBRSxJQUFZO1FBQ3RELEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsSUFBSTtZQUNQLElBQUksQ0FBQyxJQUFJO2dCQUNULDJCQUEyQjtnQkFDM0IsRUFBRTtnQkFDRixHQUFHO2dCQUNILE9BQU87Z0JBQ1AsV0FBVyxDQUFDO0lBQ2hCLENBQUM7SUFDTSx3Q0FBVyxHQUFsQixVQUNFLFdBQW1CLEVBQ25CLEVBQVUsRUFDVixZQUEyQjtRQUEzQixrREFBMkI7UUFFM0IsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDekMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDWixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDO1FBQ1QsQ0FBQztRQUNELEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUNwQixJQUFJLFFBQVEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksU0FBUyxHQUFHLFdBQVcsQ0FBQztRQUM1QixHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUk7WUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFDUyxrQ0FBSyxHQUFmLFVBQWdCLEVBQVUsRUFBRSxZQUFvQjtRQUM5QyxJQUFJLE1BQU0sR0FBRyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDakIsTUFBTSxJQUFJLEdBQUcsR0FBRyxZQUFZLENBQUM7UUFDL0IsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxzQkFBYyxvQ0FBSTthQUFsQjtZQUNFLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDcEIsQ0FBQzthQUNELFVBQW1CLEtBQWE7WUFDOUIsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUNyQixDQUFDOzs7T0FIQTtJQUlILHlCQUFDO0FBQUQsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoRHFFO0FBQzlCO0FBQ3NCO0FBQ0U7QUFDMUI7QUFFdEM7SUFBQTtRQUNVLFdBQU0sR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO0lBa0NuQyxDQUFDO0lBakNRLCtCQUFXLEdBQWxCLFVBQW1CLE1BQVcsRUFBRSxJQUFZLEVBQUUsS0FBVTtRQUN0RCxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQ1IsT0FBTyxLQUFLLEtBQUssUUFBUTtZQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFDNUIsQ0FBQyxDQUFDLENBQUM7WUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFDTSw0QkFBUSxHQUFmLFVBQWdCLE9BQVksRUFBRSxNQUFXO1FBQ3ZDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2pELElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDNUQsQ0FBQztRQUNILENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7SUFDSCxDQUFDO0lBQ00sa0NBQWMsR0FBckIsVUFBc0IsU0FBaUI7UUFDckMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2pFLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0gsZ0JBQUM7QUFBRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0g7SUFBcUMsa0ZBQUk7SUFpQ3ZDO1FBQUEsWUFDRSxpQkFBTyxTQUNSO1FBZE8saUJBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsb0JBQWMsR0FBWSxLQUFLLENBQUM7UUFDOUIsa0JBQVksR0FBVyxFQUFFLENBQUM7UUFDMUIsbUJBQWEsR0FBVyxFQUFFLENBQUM7UUFPOUIsV0FBSyxHQUFnQixJQUFJLENBQUM7O0lBSWpDLENBQUM7SUFsQ0Qsc0JBQWtCLG1DQUFnQjthQUFsQztZQUNFLE1BQU0sQ0FBQywyREFBUSxDQUFDLDBCQUEwQixDQUFDO1FBQzdDLENBQUM7YUFDRCxVQUFtQyxHQUFZO1lBQzdDLDJEQUFRLENBQUMsMEJBQTBCLEdBQUcsR0FBRyxDQUFDO1FBQzVDLENBQUM7OztPQUhBO0lBU2Msb0NBQW9CLEdBQW5DLFVBQW9DLEdBQW9CO1FBQ3RELElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDdkIsSUFBSSxHQUFHLEdBQUcsZUFBZSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDdkIsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUMxQixHQUFHLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBZ0JNLDZCQUFHLEdBQVYsVUFBVyxhQUFvQztRQUFwQyxvREFBb0M7UUFDN0MsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0IsTUFBTSxDQUFDO1FBQ1QsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUM3QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFDRCxzQkFBVyxzQ0FBUzthQUFwQjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzdCLENBQUM7OztPQUFBO0lBQ0Qsc0JBQVcsbURBQXNCO2FBQWpDO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3hDLENBQUM7OztPQUFBO0lBQ1MsZ0RBQXNCLEdBQWhDO1FBQ0UsTUFBTSxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ08sK0NBQXFCLEdBQTdCLFVBQThCLFlBQWlCO1FBQzdDLElBQUksS0FBSyxHQUFlLEVBQUUsQ0FBQztRQUMzQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1lBQzlCLEtBQUssR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNPLHVDQUFhLEdBQXJCLFVBQXNCLGFBQTZCO1FBQ2pELEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDbEIsSUFBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLGFBQWEsQ0FDcEMsSUFBSSxDQUFDLEdBQUcsRUFDUixLQUFLLEVBQ0wsMkRBQVEsQ0FBQywwQkFBMEIsQ0FDcEMsQ0FBQztZQUNGLElBQUksS0FBSyxHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQ3JDLElBQUksQ0FBQyxJQUFJLEVBQ1QsS0FBSyxFQUNMLDJEQUFRLENBQUMsMEJBQTBCLENBQ3BDLENBQUM7WUFDRixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hFLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUMxQixDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ04sSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDbEMsQ0FBQztRQUNILENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUM3QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFDUyx1Q0FBYSxHQUF2QixVQUF3QixRQUFhO1FBQ25DLElBQUksY0FBYyxDQUFDO1FBQ25CLEVBQUUsQ0FBQyxDQUNELENBQUMsQ0FBQyxRQUFRO1lBQ1YsT0FBTyxRQUFRLENBQUMsT0FBTyxLQUFLLFVBQVU7WUFDdEMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUM1QixDQUFDLENBQUMsQ0FBQztZQUNELElBQUksTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7WUFDN0IsY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sSUFBSSxDQUFDO2dCQUNILGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7WUFBQyxLQUFLLENBQUMsQ0FBQyxJQUFELENBQUM7Z0JBQ1AsY0FBYyxHQUFHLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztxQkFDOUIsS0FBSyxDQUFDLElBQUksQ0FBQztxQkFDWCxHQUFHLENBQUMsVUFBQyxDQUFNLElBQUssUUFBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBWCxDQUFXLENBQUM7cUJBQzVCLE1BQU0sQ0FBQyxVQUFDLENBQU0sSUFBSyxRQUFDLENBQUMsQ0FBQyxFQUFILENBQUcsQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBQ1MscUNBQVcsR0FBckI7UUFDRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLEdBQUcsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLG1DQUFtQyxDQUFDLENBQUM7UUFDMUUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLEdBQUcsQ0FBQyxNQUFNLEdBQUc7WUFDWCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUM1QixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ04sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxPQUFPLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDL0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7WUFDMUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBQ00saUNBQU8sR0FBZDtRQUNFLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUNELHNCQUFXLG9DQUFPO2FBQWxCO1lBQ0UsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN2RSxDQUFDOzs7T0FBQTtJQUNNLGtEQUF3QixHQUEvQjtRQUNFLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzVDLElBQUksR0FBRyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDOUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ08sK0NBQXFCLEdBQTdCLFVBQThCLFlBQW9CO1FBQ2hELE1BQU0sQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO0lBQy9CLENBQUM7SUFDTyw2Q0FBbUIsR0FBM0I7UUFDRSxJQUFJLFVBQVUsR0FBRywrREFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDOUQsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsRUFBRSxDQUFDLENBQ0QsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPO2dCQUM5QixVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU07Z0JBQzdCLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVztnQkFDbEMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxVQUN6QixDQUFDO2dCQUNDLFFBQVEsQ0FBQztZQUNYLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ00saUNBQU8sR0FBZCxVQUFlLElBQVM7UUFDdEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNsQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3JDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNwRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNqRCxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQU8sSUFBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RSxDQUFDO0lBQ0gsQ0FBQztJQUNNLGlDQUFPLEdBQWQ7UUFDRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM5QixJQUFJLEdBQUcsR0FBUSxFQUFFLENBQUM7UUFDbEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3BDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2QyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDdEQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3RELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2pELEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLEVBQUUsQ0FBQyxDQUFPLElBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0IsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFTLElBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDRCxzQkFBVyxnQ0FBRzthQUFkO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUMsQ0FBQzthQUNELFVBQWUsR0FBVztZQUN4QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7OztPQUhBO0lBSUQsc0JBQVcsaUNBQUk7YUFBZjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLENBQUM7YUFDRCxVQUFnQixHQUFXO1lBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDckMsQ0FBQzs7O09BSEE7SUFJRCxzQkFBVyxzQ0FBUzthQUFwQjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELENBQUM7YUFDRCxVQUFxQixHQUFXO1lBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsQ0FBQzs7O09BSEE7SUFJRCxzQkFBVyxzQ0FBUzthQUFwQjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELENBQUM7YUFDRCxVQUFxQixHQUFXO1lBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsQ0FBQzs7O09BSEE7SUFJRCxzQkFBVywrQ0FBa0I7YUFBN0I7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVELENBQUM7YUFDRCxVQUE4QixHQUFZO1lBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNuRCxDQUFDOzs7T0FIQTtJQUlELHNCQUFXLDBDQUFhO2FBQXhCO1lBQ0UsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDcEMsSUFBSSxJQUFJLEdBQUcsK0RBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNwRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQzlCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksYUFBYSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDbkQsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkIsQ0FBQzs7O09BQUE7SUFDTSwrQkFBSyxHQUFaO1FBQ0UsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2pELEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLEVBQUUsQ0FBQyxDQUFPLElBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBTyxJQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xFLENBQUM7SUFDSCxDQUFDO0lBQ1MsZ0NBQU0sR0FBaEIsVUFBaUIsTUFBVztRQUMxQixJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsRUFBRSxDQUFDLENBQUMsYUFBYSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0MsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzlDLElBQUksU0FBUyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7b0JBQUMsUUFBUSxDQUFDO2dCQUN6QixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQjtvQkFDckMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUM7b0JBQ3RDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM3QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLElBQUksR0FBRyxJQUFJLDZEQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUMxQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxvRUFBb0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFELENBQUM7UUFDSCxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztZQUM5QixLQUFLLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsZUFBZSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQ08sNkNBQW1CLEdBQTNCLFVBQTRCLElBQWUsRUFBRSxTQUFjO1FBQ3pELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzVDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUN6QixTQUFTLEVBQ1QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDbkMsQ0FBQztZQUNGLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLElBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNPLDRDQUFrQixHQUExQixVQUEyQixZQUFvQjtRQUM3QyxFQUFFLENBQUMsQ0FBTyxJQUFLLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDeEQsTUFBTSxDQUFPLElBQUssQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUMvRCxFQUFFLENBQUMsQ0FBTyxJQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFBQyxNQUFNLENBQU8sSUFBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUNPLGlDQUFPLEdBQWYsVUFBZ0IsTUFBYyxFQUFFLFFBQWdCO1FBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSwrREFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ08sNENBQWtCLEdBQTFCLFVBQTJCLE1BQVc7UUFDcEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzNCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDdkMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUMzQixDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ08sbUNBQVMsR0FBakI7UUFDRSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEQsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ08sa0NBQVEsR0FBaEIsVUFBaUIsSUFBUztRQUN4QixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDdkIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxNQUFNLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDM0MsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDbkMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNPLGtDQUFRLEdBQWhCLFVBQWlCLElBQVM7UUFDeEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3RELE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ08sc0NBQVksR0FBcEIsVUFBcUIsSUFBUyxFQUFFLFFBQWdCO1FBQzlDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN2QixFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckQsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDekIsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0Qsc0JBQVksb0NBQU87YUFBbkI7WUFDRSxNQUFNLENBQUMsQ0FDTCxJQUFJLENBQUMsWUFBWTtnQkFDakIsR0FBRztnQkFDSCxJQUFJLENBQUMsYUFBYTtnQkFDbEIsR0FBRztnQkFDSCxJQUFJLENBQUMsU0FBUztnQkFDZCxHQUFHO2dCQUNILElBQUksQ0FBQyxTQUFTLENBQ2YsQ0FBQztRQUNKLENBQUM7OztPQUFBO0lBeFVjLDJCQUFXLEdBQTZCLEVBQUUsQ0FBQztJQXlVNUQsc0JBQUM7Q0FBQSxDQWhWb0MsbURBQUksR0FnVnhDO0FBaFYyQjtBQWlWNUIsK0RBQVUsQ0FBQyxRQUFRLENBQ2pCLGNBQWMsRUFDZDtJQUNFLEtBQUs7SUFDTCxNQUFNO0lBQ04sV0FBVztJQUNYLFdBQVc7SUFDWCxFQUFFLElBQUksRUFBRSw0QkFBNEIsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO0NBQ3ZELEVBQ0Q7SUFDRSxNQUFNLENBQUMsSUFBSSxlQUFlLEVBQUUsQ0FBQztBQUMvQixDQUFDLENBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7QUMzWWtFO0FBRXBFO0lBQ0ksK0JBQW1CLEVBQVUsRUFBUyxJQUFZO1FBQS9CLE9BQUUsR0FBRixFQUFFLENBQVE7UUFBUyxTQUFJLEdBQUosSUFBSSxDQUFRO0lBQUcsQ0FBQztJQUMxRCw0QkFBQztBQUFELENBQUM7O0FBRUQ7SUFBQTtJQXVCQSxDQUFDO0lBcEJVLDBDQUFlLEdBQXRCLFVBQXVCLElBQVk7UUFDL0IsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVNLDBDQUFlLEdBQXRCLFVBQXVCLElBQVk7UUFDL0IsSUFBSSxDQUFDO1lBQ0QsTUFBTSxDQUFDLG1HQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDVCxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksa0ZBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxxQkFBcUIsQ0FDM0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUN2QixDQUFDLENBQUMsT0FBTyxDQUNaLENBQUM7WUFDTixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCxzQkFBVyxtQ0FBSzthQUFoQjtZQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQy9CLENBQUM7OztPQUFBO0lBQ0wsdUJBQUM7QUFBRCxDQUFDOzs7Ozs7Ozs7OztBQzlCcUM7QUFDdEM7O0dBRUc7QUFDSDtJQU9FO0lBQWUsQ0FBQztJQU5oQixzQkFBa0IsNkJBQVU7YUFBNUI7WUFDRSxNQUFNLENBQUMsMkRBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNuQyxDQUFDO2FBQ0QsVUFBNkIsR0FBVztZQUN0QywyREFBUSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztRQUNsQyxDQUFDOzs7T0FIQTtJQUtNLG9DQUFVLEdBQWpCLFVBQ0UsUUFBZ0IsRUFDaEIsTUFBaUU7UUFFakUsSUFBSSxHQUFHLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUMvQixHQUFHLENBQUMsSUFBSSxDQUNOLEtBQUssRUFDTCxlQUFlLENBQUMsVUFBVSxHQUFHLHNCQUFzQixHQUFHLFFBQVEsQ0FDL0QsQ0FBQztRQUNGLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztRQUMxRSxHQUFHLENBQUMsTUFBTSxHQUFHO1lBQ1gsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDO1FBQ0YsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2IsQ0FBQztJQUNNLHFEQUEyQixHQUFsQyxVQUNFLFFBQWdCLEVBQ2hCLFFBQWdCLEVBQ2hCLE1BS1M7UUFFVCxJQUFJLEdBQUcsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxJQUFJLENBQ04sS0FBSyxFQUNMLGVBQWUsQ0FBQyxVQUFVO1lBQ3hCLG9DQUFvQztZQUNwQyxRQUFRO1lBQ1IsWUFBWTtZQUNaLFFBQVEsQ0FDWCxDQUFDO1FBQ0YsR0FBRyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO1FBQzFFLEdBQUcsQ0FBQyxNQUFNLEdBQUc7WUFDWCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMvQyxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNyRCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFDO1FBQ0YsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2IsQ0FBQztJQUNNLG9DQUFVLEdBQWpCLFVBQ0UsTUFBYyxFQUNkLE1BQVksRUFDWixZQUFzRSxFQUN0RSxRQUF1QixFQUN2QixrQkFBbUM7UUFEbkMsMENBQXVCO1FBQ3ZCLCtEQUFtQztRQUVuQyxJQUFJLEdBQUcsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUM7UUFDeEQsR0FBRyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3hFLElBQUksSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3BFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUFPLElBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDakQsRUFBRSxDQUFDLENBQUMsa0JBQWtCLENBQUM7WUFBTyxJQUFLLENBQUMsb0JBQW9CLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDakUsSUFBSSxhQUFhLEdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBTyxHQUFHO1lBQ3pCLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUMxQixZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUM7UUFDRixHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFDTSxrQ0FBUSxHQUFmLFVBQ0UsTUFBYyxFQUNkLElBQVUsRUFDVixVQUFxRDtRQUVyRCxJQUFJLEdBQUcsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sR0FBRztZQUN6QixFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDeEIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDO1FBQ0YsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLFVBQVUsR0FBRyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEUsSUFBSSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUM5QixRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5QixRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFDTSxtQ0FBUyxHQUFoQixVQUNFLFFBQWdCLEVBQ2hCLElBQVksRUFDWixXQUtTO1FBRVQsSUFBSSxHQUFHLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUMvQixJQUFJLElBQUksR0FBRyxXQUFXLEdBQUcsUUFBUSxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDcEQsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLFVBQVUsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDbkUsR0FBRyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO1FBQzFFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixHQUFHLENBQUMsTUFBTSxHQUFHO1lBQ1gsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztZQUNoQixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDVixHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztvQkFDdEMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2hCLENBQUM7WUFDSCxDQUFDO1lBQ0QsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQztRQUNGLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNiLENBQUM7SUFDTSxxQ0FBVyxHQUFsQixVQUNFLFFBQWdCLEVBQ2hCLFFBQWdCLEVBQ2hCLGFBQXdFO1FBRXhFLElBQUksR0FBRyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFDL0IsSUFBSSxJQUFJLEdBQUcsV0FBVyxHQUFHLFFBQVEsR0FBRyxZQUFZLEdBQUcsUUFBUSxDQUFDO1FBQzVELEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxVQUFVLEdBQUcsZUFBZSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3JFLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztRQUMxRSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsR0FBRyxDQUFDLE1BQU0sR0FBRztZQUNYLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztZQUNsQixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNwQyxDQUFDO1lBQ0QsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDO1FBQ0YsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2IsQ0FBQztJQUNILHNCQUFDO0FBQUQsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUM5SXlDO0FBRUw7QUFJckM7OztHQUdHO0FBQ0g7SUFBb0MsaUZBQVU7SUFLNUMsd0JBQVksSUFBaUI7UUFBakIsZ0NBQWlCO1FBQTdCLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBTVo7UUFMQyxLQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxFQUFFLEtBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLElBQUksR0FBRyxLQUFJLENBQUM7UUFDaEIsS0FBSSxDQUFDLHNDQUFzQyxDQUFDLFNBQVMsRUFBRTtZQUNyRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQzs7SUFDTCxDQUFDO0lBQ00sZ0NBQU8sR0FBZDtRQUNFLE1BQU0sQ0FBQyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUNELDhDQUFxQixHQUFyQjtRQUNFLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUNELHFDQUFZLEdBQVo7UUFDRSxpQkFBTSxZQUFZLFdBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ0Qsc0JBQVcsbUNBQU87YUFBbEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELENBQUM7YUFDRCxVQUFtQixHQUFXO1lBQzVCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEQsQ0FBQzs7O09BSEE7SUFJRCxzQkFBVyxzQ0FBVTthQUFyQjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsQ0FBQzs7O09BQUE7SUFDRCxzQkFBVyxnQ0FBSTthQUFmO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUNELFVBQWdCLEdBQVc7WUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyQyxDQUFDOzs7T0FIQTtJQUlTLHlDQUFnQixHQUExQjtRQUNFLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUN0QyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1lBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDbkUsQ0FBQztJQUNNLG9DQUFXLEdBQWxCO1FBQ0UsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsMEJBQTBCO1FBQzFCLElBQUksS0FBSyxHQUFHLDJCQUEyQixDQUFDO1FBQ3hDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdkIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQztRQUNmLE9BQU8sQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3hDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzFELFVBQVUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQ3pCLENBQUM7WUFDRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ04sSUFBSSxDQUFDLElBQUksQ0FDUCxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQy9ELENBQUM7WUFDSixDQUFDO1lBQ0QsVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN6QyxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFDTSw0Q0FBbUIsR0FBMUIsVUFBMkIsR0FBVztRQUNwQyxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNwQyxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEUsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ1MsMkNBQWtCLEdBQTVCLFVBQTZCLFFBQWtCO1FBQzdDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ1MsMENBQWlCLEdBQTNCLFVBQTRCLFFBQWtCO1FBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFDUyxxQ0FBWSxHQUF0QixVQUF1QixPQUFpQixFQUFFLEtBQWE7UUFDckQsaUJBQU0sWUFBWSxZQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNTLHdDQUFlLEdBQXpCLFVBQTBCLE9BQWlCO1FBQ3pDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRCxpQkFBTSxlQUFlLFlBQUMsT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELDRDQUFtQixHQUFuQixVQUFvQixHQUFhLEVBQUUsTUFBZ0IsRUFBRSxXQUFtQixJQUFHLENBQUM7SUFDcEUsNENBQW1CLEdBQTNCLFVBQTRCLE9BQWlCO1FBQzNDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUNuQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFDTywyQ0FBa0IsR0FBMUIsVUFBMkIsSUFBWSxFQUFFLFFBQXVCO1FBQXZCLDBDQUF1QjtRQUM5RCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDMUUsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2hDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDckMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEQsSUFBSSxJQUFJLEdBQVEsSUFBSSxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztZQUNyQixDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNNLDhDQUFxQixHQUE1QixVQUE2QixPQUFpQjtRQUM1QyxNQUFNLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyx3QkFBd0IsR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUM1RSxDQUFDO0lBMUhNLHVDQUF3QixHQUFHLFVBQVUsQ0FBQztJQTJIL0MscUJBQUM7Q0FBQSxDQTVIbUMsMERBQVUsR0E0SDdDO0FBNUgwQjtBQThIM0IsK0RBQVUsQ0FBQyxRQUFRLENBQ2pCLFdBQVcsRUFDWCxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUMvRDtJQUNFLE1BQU0sQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDO0FBQzlCLENBQUMsRUFDRCxPQUFPLENBQ1IsQ0FBQzs7Ozs7Ozs7QUMvSUY7QUFBQSxvREFBb0Q7QUFDcEQsd0RBQXdEO0FBRWpELElBQUksY0FBYyxHQUFHO0lBQzFCLFlBQVksRUFBRSxVQUFVO0lBQ3hCLFlBQVksRUFBRSxNQUFNO0lBQ3BCLFlBQVksRUFBRSxVQUFVO0lBQ3hCLGVBQWUsRUFBRSxPQUFPO0lBQ3hCLGFBQWEsRUFBRSxrQkFBa0I7SUFDakMsWUFBWSxFQUFFLE1BQU07SUFDcEIsaUJBQWlCLEVBQUUsWUFBWTtJQUMvQixZQUFZLEVBQUUsaUJBQWlCO0lBQy9CLHFCQUFxQixFQUFFLDRCQUE0QjtJQUNuRCxXQUFXLEVBQUUscURBQXFEO0lBQ2xFLGdCQUFnQixFQUFFLHNDQUFzQztJQUN4RCxzQkFBc0IsRUFDcEIsK0RBQStEO0lBQ2pFLGFBQWEsRUFBRSxtQkFBbUI7SUFDbEMsY0FBYyxFQUFFLFdBQVc7SUFDM0IsS0FBSyxFQUFFLE9BQU87SUFDZCxhQUFhLEVBQUUsNkJBQTZCO0lBQzVDLG9CQUFvQixFQUFFLHNDQUFzQztJQUM1RCxzQkFBc0IsRUFBRSxzQ0FBc0M7SUFDOUQsWUFBWSxFQUFFLDhCQUE4QjtJQUM1QyxhQUFhLEVBQUUsdUNBQXVDO0lBQ3RELGFBQWEsRUFBRSx3Q0FBd0M7SUFDdkQsZ0JBQWdCLEVBQUUsMERBQTBEO0lBQzVFLGdCQUFnQixFQUFFLG1DQUFtQztJQUNyRCxjQUFjLEVBQUUsc0NBQXNDO0lBQ3RELGNBQWMsRUFBRSwwQ0FBMEM7SUFDMUQsYUFBYSxFQUNYLHVFQUF1RTtJQUN6RSxVQUFVLEVBQUUsNENBQTRDO0lBQ3hELFVBQVUsRUFBRSw0Q0FBNEM7SUFDeEQsWUFBWSxFQUFFLHNDQUFzQztJQUNwRCxpQkFBaUIsRUFBRSwyQ0FBMkM7SUFDOUQsZUFBZSxFQUFFLHVDQUF1QztJQUN4RCxrQkFBa0IsRUFDaEIscUVBQXFFO0lBQ3ZFLGFBQWEsRUFBRSxzQ0FBc0M7SUFDckQsa0JBQWtCLEVBQUUsK0JBQStCO0lBQ25ELGFBQWEsRUFDWCxvRUFBb0U7SUFDdEUsV0FBVyxFQUFFLFlBQVk7SUFDekIsVUFBVSxFQUFFLG1CQUFtQjtJQUMvQixZQUFZLEVBQUUsZ0JBQWdCO0lBQzlCLGFBQWEsRUFBRSxtQ0FBbUM7SUFDbEQsbUJBQW1CLEVBQUUsOEJBQThCO0lBQ25ELFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLFNBQVMsRUFBRSxRQUFRO0lBQ25CLFFBQVEsRUFBRSxTQUFTO0lBQ25CLFdBQVcsRUFBRSxRQUFRO0lBQ3JCLFlBQVksRUFBRSxNQUFNO0lBQ3BCLGFBQWEsRUFBRSxRQUFRO0lBQ3ZCLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFVBQVUsRUFBRSx5Q0FBeUM7SUFDckQsZUFBZSxFQUFFLHNEQUFzRDtJQUN2RSxpQkFBaUIsRUFBRSxzQ0FBc0M7SUFDekQsZUFBZSxFQUFFLFdBQVc7SUFDNUIsUUFBUSxFQUFFLEtBQUs7SUFDZixRQUFRLEVBQUUsS0FBSztJQUNmLGFBQWEsRUFBRSxtREFBbUQ7SUFDbEUsY0FBYyxFQUFFLGtDQUFrQztJQUNsRCxnQkFBZ0IsRUFBRSw4QkFBOEI7SUFDaEQsYUFBYSxFQUNYLGlFQUFpRTtJQUNuRSxjQUFjLEVBQUUseUNBQXlDO0lBQ3pELGdCQUFnQixFQUFFLHFDQUFxQztJQUN2RCxZQUFZLEVBQUUsT0FBTztJQUNyQixZQUFZLEVBQUUsT0FBTztJQUNyQixpQkFBaUIsRUFBRSxrQkFBa0I7Q0FDdEMsQ0FBQztBQUVGLDRKQUE0SjtBQUM1SixvREFBb0Q7QUFDcEQsbURBQW1EOzs7Ozs7Ozs7Ozs7Ozs7O0FDM0VYO0FBQ0Y7QUFDSTtBQUNLO0FBQ1g7QUFFcEM7O0dBRUc7QUFDSDtJQUE0RCwwRkFBUTtJQVdsRSxpQ0FBbUIsSUFBWTtRQUEvQixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQUtaO1FBTmtCLFVBQUksR0FBSixJQUFJLENBQVE7UUFSckIsMEJBQW9CLEdBQWdCLElBQUksQ0FBQztRQUN6Qyx1QkFBaUIsR0FBUyxJQUFJLENBQUM7UUFTdkMsS0FBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsS0FBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsS0FBSSxDQUFDLE9BQU8sR0FBRyxLQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN6QyxLQUFJLENBQUMsSUFBSSxHQUFHLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7SUFDNUMsQ0FBQztJQVZTLG9EQUFrQixHQUE1QjtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQVNNLHlDQUFPLEdBQWQ7UUFDRSxNQUFNLENBQUMsWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxzQkFBVyxxREFBZ0I7YUFBM0I7WUFDRSxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2YsQ0FBQzs7O09BQUE7SUFJRCxzQkFBVywrQ0FBVTtRQUhyQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkQsQ0FBQzthQUNELFVBQXNCLEdBQVk7WUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzQyxDQUFDOzs7T0FIQTtJQU9ELHNCQUFJLDRDQUFPO1FBSFg7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUMsQ0FBQzthQUNELFVBQVksUUFBb0I7WUFDOUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3QyxDQUFDOzs7T0FIQTtJQUlELHNCQUFXLG1EQUFjO2FBQXpCO1lBQ0UsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RFLENBQUM7OztPQUFBO0lBSUQsc0JBQUkseUNBQUk7UUFIUjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxDQUFDO2FBQ0QsVUFBUyxRQUFvQjtZQUMzQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDOzs7T0FKQTtJQUtTLGdEQUFjLEdBQXhCO1FBQ0UsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFLRCxzQkFBVyxnREFBVztRQUp0Qjs7O1dBR0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDL0IsQ0FBQzs7O09BQUE7SUFNRCxzQkFBVyxrREFBYTtRQUp4Qjs7O1dBR0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELENBQUM7YUFDRCxVQUF5QixHQUFXO1lBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUM7OztPQUpBO0lBU0Qsc0JBQVcscURBQWdCO1FBSjNCOzs7V0FHRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDO2FBQ0QsVUFBNEIsR0FBVztZQUNyQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUM7OztPQUpBO0lBS00sOENBQVksR0FBbkIsVUFBb0IsTUFBc0IsRUFBRSxVQUEwQjtRQUNwRSxpQkFBTSxZQUFZLFlBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNTLDZDQUFXLEdBQXJCO1FBQ0UsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN2RCxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUMzQixJQUFJLENBQUMscUJBQXFCLEVBQUUsRUFDNUIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQ2pDLENBQUM7SUFDSixDQUFDO0lBQ1Msa0RBQWdCLEdBQTFCLGNBQThCLENBQUM7SUFDckIsK0NBQWEsR0FBdkI7UUFDRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDUyxtREFBaUIsR0FBM0IsVUFDRSxNQUFzQixFQUN0QixVQUEwQjtRQUUxQixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELFVBQVUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxJQUFJLFVBQVUsQ0FBQztRQUM1RSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ2YsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM5QixDQUFDO1lBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUNELE1BQU0sQ0FBQyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUNPLHNEQUFvQixHQUE1QixVQUNFLE1BQXNCLEVBQ3RCLFVBQTBCO1FBRTFCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYTtZQUMvQixDQUFDLENBQUMsSUFBSSxvRUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNULElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksVUFBVSxHQUFHLDZEQUFTLENBQUMscUJBQXFCLENBQzlDLElBQUksQ0FBQyxJQUFJLEVBQ1QsSUFBSSxDQUFDLFlBQVksRUFDakIsTUFBTSxFQUNOLE1BQU0sRUFDTixVQUFVLENBQ1gsQ0FBQztRQUNGLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUMzQixDQUFDO1FBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBQ08seURBQXVCLEdBQS9CLFVBQ0UsTUFBc0IsRUFDdEIsVUFBMEI7UUFFMUIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFDbEMsQ0FBQyxDQUFDLElBQUksb0VBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7WUFDNUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNULElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksVUFBVSxHQUFHLDZEQUFTLENBQUMscUJBQXFCLENBQzlDLElBQUksQ0FBQyxPQUFPLEVBQ1AsSUFBSSxDQUFDLGVBQWUsRUFDekIsTUFBTSxFQUNOLE1BQU0sRUFDTixVQUFVLENBQ1gsQ0FBQztRQUNGLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDO1FBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBQ00sc0RBQW9CLEdBQTNCO1FBQ0UsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUNqQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQy9ELElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzNFLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDcEIsRUFBRSxDQUFDLENBQ0QsNkRBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztnQkFDbkMsNkRBQVMsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FDNUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0QsRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQztvQkFBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUMxQixNQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDTixTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLENBQUM7UUFDRCxpQkFBTSxvQkFBb0IsV0FBRSxDQUFDO0lBQy9CLENBQUM7SUFDUyw0REFBMEIsR0FBcEM7UUFDRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxPQUFPLEdBQUcseURBQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzVCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2IsT0FBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxDQUFDO1FBQ0gsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLHlEQUFPLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUMxRCxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztJQUN2QixDQUFDO0lBQ1MsNENBQVUsR0FBcEIsVUFBcUIsR0FBUTtRQUMzQixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztJQUNsQixDQUFDO0lBQ0gsOEJBQUM7QUFBRCxDQUFDLENBMU0yRCwyREFBUSxHQTBNbkU7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQ2pCLFlBQVksRUFDWjtJQUNFLDRCQUE0QjtJQUM1Qix5QkFBeUI7SUFDekIsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtDQUM5QyxFQUNELFNBQVMsRUFDVCxVQUFVLENBQ1gsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUMvTmtEO0FBQ1Y7QUFDSjtBQUd0Qzs7R0FFRztBQUNIO0lBQTBDLHVGQUFRO0lBQ2hELDhCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixLQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxFQUFFLEtBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzs7SUFDcEQsQ0FBQztJQUNNLHNDQUFPLEdBQWQ7UUFDRSxNQUFNLENBQUMsU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxvREFBcUIsR0FBckIsVUFBc0IsVUFBa0I7UUFDdEMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFJRCxzQkFBVyxpREFBZTtRQUgxQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN4QixDQUFDOzs7T0FBQTtJQUNELHNCQUFXLDBDQUFRO2FBQW5CO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDeEIsQ0FBQzs7O09BQUE7SUFDRCx5REFBMEIsR0FBMUI7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQU1ELHNCQUFXLDhDQUFZO1FBTHZCOzs7O1dBSUc7YUFDSDtZQUNFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzQyxDQUFDO2FBQ0QsVUFBd0IsR0FBUTtZQUM5QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDcEIsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNOLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEUsQ0FBQztRQUNILENBQUM7OztPQVBBO0lBV0Qsc0JBQVcsOENBQVk7UUFIdkI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7YUFDRCxVQUF3QixHQUFRO1lBQzlCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUM7Z0JBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQztZQUMvQixFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDO2dCQUFDLEdBQUcsR0FBRyxPQUFPLENBQUM7WUFDakMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNqQyxDQUFDOzs7T0FOQTtJQU9NLDhDQUFlLEdBQXRCO1FBQ0UsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxlQUFlLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3RELE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLE1BQU07WUFDaEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBTUQsc0JBQVcsdUNBQUs7UUFMaEI7Ozs7V0FJRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCxDQUFDO2FBQ0QsVUFBaUIsR0FBVztZQUMxQixJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLENBQUM7OztPQUhBO0lBSUQsc0JBQUksMENBQVE7YUFBWjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsQ0FBQzs7O09BQUE7SUFDRCxzQkFBSSxpREFBZTthQUFuQjtZQUNFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3hELENBQUM7OztPQUFBO0lBSUQsc0JBQVcsMkNBQVM7UUFIcEI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUMsQ0FBQzthQUNELFVBQXFCLEdBQVk7WUFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxDQUFDOzs7T0FIQTtJQU9ELHNCQUFXLDJDQUFTO1FBSHBCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLENBQUM7YUFDRCxVQUFxQixHQUFRO1lBQzNCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyw0Q0FBVTtRQUhyQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QyxDQUFDO2FBQ0QsVUFBc0IsR0FBUTtZQUM1QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLENBQUM7OztPQUhBO0lBSU8sMkNBQVksR0FBcEI7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2hELENBQUM7SUFDTyw0Q0FBYSxHQUFyQjtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDbkQsQ0FBQztJQUNTLDhDQUFlLEdBQXpCO1FBQ0UsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUM7WUFBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUMxRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQztZQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksZUFBZSxDQUFDO1lBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDOUQsQ0FBQztJQUNILDJCQUFDO0FBQUQsQ0FBQyxDQWpIeUMsMkRBQVEsR0FpSGpEOztBQUVELCtEQUFVLENBQUMsUUFBUSxDQUNqQixTQUFTLEVBQ1Q7SUFDRTtRQUNFLElBQUksRUFBRSx1QkFBdUI7UUFDN0IsZUFBZSxFQUFFLHFCQUFxQjtRQUN0QyxPQUFPLEVBQUUsZUFBZTtRQUN4QixPQUFPLEVBQUUsQ0FBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQztLQUM1QztJQUNELEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUU7SUFDekQsbUJBQW1CO0lBQ25CLFdBQVc7SUFDWCxZQUFZO0NBQ2IsRUFDRDtJQUNFLE1BQU0sQ0FBQyxJQUFJLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RDLENBQUMsRUFDRCxVQUFVLENBQ1gsQ0FBQztBQUVGLHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxjQUFJO0lBQ3ZELE1BQU0sQ0FBQyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ2pKdUM7QUFDVTtBQUNTO0FBQ3pCO0FBQ0k7QUFDYTtBQUdyRDs7R0FFRztBQUNIO0lBQTJDLHdGQUFvQjtJQUc3RCwrQkFBbUIsSUFBWTtRQUEvQixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQTBCWjtRQTNCa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUZ2QixtQkFBYSxHQUFjLElBQUksNkRBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRCx3QkFBa0IsR0FBYyxJQUFJLDZEQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7UUFHakUsSUFBSSxZQUFZLEdBQUcsS0FBSSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxLQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEUsWUFBWSxDQUFDLGlCQUFpQixHQUFHLFVBQVMsSUFBSTtZQUM1QyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQywwRUFBa0IsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEUsQ0FBQyxDQUFDO1FBQ0YsS0FBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsS0FBSSxDQUFDO1FBQ25DLEtBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTVDLElBQUksaUJBQWlCLEdBQUcsS0FBSSxDQUFDLHVCQUF1QixDQUNsRCxlQUFlLEVBQ2YsS0FBSSxFQUNKLElBQUksQ0FDTCxDQUFDO1FBQ0YsaUJBQWlCLENBQUMsaUJBQWlCLEdBQUcsVUFBUyxJQUFJO1lBQ2pELE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzNFLENBQUMsQ0FBQztRQUNGLEtBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLEtBQUksQ0FBQztRQUNuQyxLQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRWpELElBQUksSUFBSSxHQUFHLEtBQUksQ0FBQztRQUNoQixLQUFJLENBQUMsd0NBQXdDLENBQzNDLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsZUFBZSxDQUFDLEVBQ3hEO1lBQ0UsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDakMsQ0FBQyxDQUNGLENBQUM7O0lBQ0osQ0FBQztJQUNTLDBDQUFVLEdBQXBCO1FBQ0UsaUJBQU0sVUFBVSxXQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFDUyxzREFBc0IsR0FBaEM7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDN0IsQ0FBQztJQUtELHNCQUFXLGdEQUFhO1FBSnhCOzs7V0FHRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUNqQyxDQUFDOzs7T0FBQTtJQUtELHNCQUFXLDJDQUFRO1FBSm5COzs7V0FHRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDNUIsQ0FBQzs7O09BQUE7SUFJRCxzQkFBVywyQ0FBUTtRQUhuQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FDbEMsVUFBVSxFQUNWLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FDN0MsQ0FBQztRQUNKLENBQUM7YUFDRCxVQUFvQixHQUFXO1lBQzdCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakQsQ0FBQzs7O09BSEE7SUFJRCxzQkFBSSw4Q0FBVzthQUFmO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxDQUFDOzs7T0FBQTtJQUlELHNCQUFXLGdEQUFhO1FBSHhCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUNsQyxlQUFlLEVBQ2YsMEVBQWtCLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQ2xELENBQUM7UUFDSixDQUFDO2FBQ0QsVUFBeUIsR0FBVztZQUNsQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELENBQUM7OztPQUhBO0lBSUQsc0JBQUksbURBQWdCO2FBQXBCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNwRCxDQUFDOzs7T0FBQTtJQUlELHNCQUFXLCtDQUFZO1FBSHZCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0RCxDQUFDO2FBQ0QsVUFBd0IsR0FBWTtZQUNsQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLENBQUM7OztPQUhBO0lBUUQsc0JBQVcsZ0RBQWE7UUFKeEI7OztXQUdHO2FBQ0g7WUFDRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQzlDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDckQsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7WUFDOUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEMsSUFBSSxhQUFhLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUMvQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFBQyxhQUFhLEVBQUUsQ0FBQztZQUN6RCxNQUFNLENBQUMsYUFBYSxLQUFLLFlBQVksQ0FBQztRQUN4QyxDQUFDO2FBQ0QsVUFBeUIsR0FBWTtZQUNuQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNSLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ04sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDOzs7T0FQQTtJQVFEOzs7O09BSUc7SUFDSSwrQ0FBZSxHQUF0QjtRQUNFLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzNDLENBQUM7SUFDRDs7T0FFRztJQUNJLHlDQUFTLEdBQWhCO1FBQ0UsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3BELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsRUFBRSxDQUFDLENBQ0QsSUFBSSxLQUFLLElBQUksQ0FBQyxRQUFRO2dCQUN0QixJQUFJLEtBQUssSUFBSSxDQUFDLFNBQVM7Z0JBQ3ZCLElBQUksS0FBSyxJQUFJLENBQUMsYUFDaEIsQ0FBQztnQkFDQyxRQUFRLENBQUM7WUFDWCxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUlELHNCQUFXLDBDQUFPO1FBSGxCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRCxDQUFDO2FBQ0QsVUFBbUIsR0FBWTtZQUM3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7OztPQUhBO0lBSUQ7OztPQUdHO0lBQ0ksOENBQWMsR0FBckIsVUFBc0IsSUFBZTtRQUNuQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQzNELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDN0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUM5QyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxFQUFFLENBQUMsQ0FBQyx5REFBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNoRSxDQUFDO1FBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDUywyQ0FBVyxHQUFyQixVQUFzQixRQUFhO1FBQ2pDLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkIsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQzdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUN2QixFQUFFLENBQUMsQ0FBQyx5REFBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUN0RCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNqQixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakQsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25ELEVBQUUsQ0FBQyxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZCLEVBQUUsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzdDLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxDQUFDO1lBQ0gsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNOLEVBQUUsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3RCLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDcEMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxpQkFBTSxXQUFXLFlBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUNPLGdEQUFnQixHQUF4QixVQUF5QixHQUFRO1FBQy9CLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNwQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7SUFDUyxxREFBcUIsR0FBL0I7UUFDRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxpQkFBTSxxQkFBcUIsV0FBRSxDQUFDO0lBQzlFLENBQUM7SUFDUyxtREFBbUIsR0FBN0IsVUFBOEIsS0FBdUI7UUFDbkQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDdEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELGlCQUFNLG1CQUFtQixZQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBQ1MsbURBQW1CLEdBQTdCLFVBQThCLFVBQW1CO1FBQy9DLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDOUIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUNoQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDcEMsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdkMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNYLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQztvQkFBQyxHQUFHLElBQUksSUFBSSxDQUFDO2dCQUNyQixHQUFHLElBQUksTUFBTSxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDUyx3REFBd0IsR0FBbEM7UUFDRSxJQUFJLENBQUMsK0JBQStCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNTLHVEQUF1QixHQUFqQztRQUNFLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ08sK0RBQStCLEdBQXZDLFVBQXdDLGFBQXNCO1FBQzVELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDakIsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO29CQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztnQkFDcEIsQ0FBQztnQkFBQyxJQUFJLENBQUMsQ0FBQztvQkFDTixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3BCLENBQUM7WUFDSCxDQUFDO1lBQ0QsTUFBTSxDQUFDO1FBQ1QsQ0FBQztRQUNELElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNsQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxFQUFFLENBQUMsQ0FDRCxDQUFDLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2RCxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2pELENBQUMsQ0FBQyxDQUFDO2dCQUNELFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsQ0FBQztRQUNILENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDMUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztRQUN4QixDQUFDO0lBQ0gsQ0FBQztJQUNNLGdEQUFnQixHQUF2QixVQUF3QixRQUF1QixFQUFFLElBQW1CO1FBQTVDLDBDQUF1QjtRQUFFLGtDQUFtQjtRQUNsRSxJQUFJLElBQUksR0FBRyxpQkFBTSxnQkFBZ0IsV0FBRSxDQUFDO1FBQ3BDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsSUFBSSxVQUFVLElBQUksUUFBUSxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFlBQVksQ0FBQztRQUM5QixDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFDTSwrQ0FBZSxHQUF0QjtRQUNFLE1BQU0sQ0FBQyx5REFBTyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDUyx5REFBeUIsR0FBbkM7UUFDRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUNTLDJDQUFXLEdBQXJCLFVBQXNCLEdBQVE7UUFDNUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUM5QyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ1MsNkNBQWEsR0FBdkIsVUFBd0IsR0FBUTtRQUM5QixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLENBQUMsaUJBQU0sYUFBYSxZQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2YsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDcEMsSUFBSSxVQUFVLEdBQUcsNkRBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNOLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNTLHlEQUF5QixHQUFuQyxVQUFvQyxHQUFRO1FBQzFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDMUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDcEMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7WUFDL0MsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztnQkFDakMsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNoQixDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ1Msc0RBQXNCLEdBQWhDLFVBQWlDLEdBQVE7UUFDdkMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUNwQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN0QixJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ3pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQzlCLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ2hCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ1MsK0NBQWUsR0FBekIsVUFBMEIsR0FBUSxFQUFFLFlBQTZCO1FBQTdCLG1EQUE2QjtRQUMvRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDbEUsTUFBTSxDQUFDLGlCQUFNLGVBQWUsWUFBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVNLHVDQUFPLEdBQWQ7UUFDRSxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFDSCw0QkFBQztBQUFELENBQUMsQ0E5VDBDLGtGQUFvQixHQThUOUQ7O0FBQ0QsK0RBQVUsQ0FBQyxRQUFRLENBQ2pCLFVBQVUsRUFDVjtJQUNFLHNCQUFzQjtJQUN0QixpQkFBaUI7SUFDakIsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixFQUFFLGFBQWEsRUFBRTtJQUMxRCxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUscUJBQXFCLEVBQUUsa0JBQWtCLEVBQUU7Q0FDckUsRUFDRDtJQUNFLE1BQU0sQ0FBQyxJQUFJLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLENBQUMsRUFDRCxjQUFjLENBQ2YsQ0FBQztBQUNGLHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxjQUFJO0lBQ3hELElBQUksQ0FBQyxHQUFHLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQyxDQUFDLE9BQU8sR0FBRyx5RUFBZSxDQUFDLGNBQWMsQ0FBQztJQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ1gsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQzNWbUM7QUFDSTtBQUNVO0FBRWhCO0FBRXBDOztHQUVHO0FBQ0g7SUFBMEMsdUZBQVE7SUFDaEQsOEJBQW1CLElBQVk7UUFBL0IsWUFDRSxrQkFBTSxJQUFJLENBQUMsU0FFWjtRQUhrQixVQUFJLEdBQUosSUFBSSxDQUFRO1FBRTdCLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLEVBQUUsS0FBSSxDQUFDLENBQUM7O0lBQ3BELENBQUM7SUFNRCxzQkFBVywyQ0FBUztRQUxwQjs7OztXQUlHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELENBQUM7YUFDRCxVQUFxQixHQUFXO1lBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsQ0FBQzs7O09BSEE7SUFJTSwyQ0FBWSxHQUFuQjtRQUNFLE1BQU0sQ0FBQyx5REFBTyxDQUFDLFlBQVksQ0FDekIsSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzdDLENBQUM7SUFDSixDQUFDO0lBSUQsc0JBQVcsNkNBQVc7UUFIdEI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEQsQ0FBQzthQUNELFVBQXVCLEdBQVc7WUFDaEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwRCxDQUFDOzs7T0FIQTtJQUlELHNCQUFJLGdEQUFjO2FBQWxCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRCxDQUFDOzs7T0FBQTtJQUlELHNCQUFXLHNDQUFJO1FBSGY7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7YUFDRCxVQUFnQixHQUFXO1lBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDckMsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyxzQ0FBSTtRQUhmOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO2FBQ0QsVUFBZ0IsR0FBVztZQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7OztPQUhBO0lBSU0sc0NBQU8sR0FBZDtRQUNFLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELHNDQUFPLEdBQVA7UUFDRSxNQUFNLENBQUMsaUJBQU0sT0FBTyxXQUFFLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUNILDJCQUFDO0FBQUQsQ0FBQyxDQTFEeUMsMkRBQVEsR0EwRGpEOztBQUNELCtEQUFVLENBQUMsUUFBUSxDQUNqQixTQUFTLEVBQ1Q7SUFDRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDekMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7SUFDcEMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUU7SUFDbkMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLHFCQUFxQixFQUFFLGdCQUFnQixFQUFFO0NBQ2pFLEVBQ0Q7SUFDRSxNQUFNLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN0QyxDQUFDLEVBQ0QsVUFBVSxDQUNYLENBQUM7QUFDRix5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsY0FBSTtJQUN2RCxNQUFNLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ25GdUM7QUFDSjtBQUV0Qzs7R0FFRztBQUNIO0lBQXdDLHFGQUFRO0lBQzlDLDRCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBQ1o7UUFGa0IsVUFBSSxHQUFKLElBQUksQ0FBUTs7SUFFL0IsQ0FBQztJQUNNLG9DQUFPLEdBQWQ7UUFDRSxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFDSCx5QkFBQztBQUFELENBQUMsQ0FQdUMsMkRBQVEsR0FPL0M7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQ2pCLE9BQU8sRUFDUCxFQUFFLEVBQ0Y7SUFDRSxNQUFNLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQyxDQUFDLEVBQ0QsVUFBVSxDQUNYLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdEJvQztBQUNJO0FBQ1U7QUFDUjtBQUNrQjtBQUNUO0FBRXJEOztHQUVHO0FBQ0g7SUFBdUMsb0ZBQVE7SUFhN0MsMkJBQW1CLElBQVk7UUFBL0IsWUFDRSxrQkFBTSxJQUFJLENBQUMsU0FDWjtRQUZrQixVQUFJLEdBQUosSUFBSSxDQUFRO1FBWnZCLGlCQUFXLEdBQVksS0FBSyxDQUFDO1FBQ3JDOzs7O1dBSUc7UUFDSSxvQkFBYyxHQUdqQixJQUFJLG9EQUFLLEVBQXlELENBQUM7UUFDaEUsa0JBQVksR0FBVSxFQUFFLENBQUM7UUFDekIsa0JBQVksR0FBRyxPQUFPLENBQUM7O0lBRzlCLENBQUM7SUFDTSxtQ0FBTyxHQUFkO1FBQ0UsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBSUQsc0JBQVcsMENBQVc7UUFIdEI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BELENBQUM7YUFDRCxVQUF1QixHQUFZO1lBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUMsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyw0Q0FBYTtRQUh4Qjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkQsQ0FBQzthQUNELFVBQXlCLEdBQVk7WUFDbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM5QyxDQUFDOzs7T0FIQTtJQU9ELHNCQUFXLDBDQUFXO1FBSHRCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzlDLENBQUM7YUFDRCxVQUF1QixHQUFXO1lBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUMsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyx5Q0FBVTtRQUhyQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QyxDQUFDO2FBQ0QsVUFBc0IsR0FBVztZQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLENBQUM7OztPQUhBO0lBT0Qsc0JBQVcsNENBQWE7UUFIeEI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDaEQsQ0FBQzthQUNELFVBQXlCLEdBQVc7WUFDbEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM5QyxDQUFDOzs7T0FIQTtJQVNELHNCQUFXLDhDQUFlO1FBTDFCOzs7O1dBSUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEQsQ0FBQzthQUNELFVBQTJCLEdBQVk7WUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2hELENBQUM7OztPQUhBO0lBT0Qsc0JBQVcsNENBQWE7UUFIeEI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELENBQUM7YUFDRCxVQUF5QixHQUFZO1lBQ25DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUMsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyxpREFBa0I7UUFIN0I7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0QsQ0FBQzthQUNELFVBQThCLEdBQVk7WUFDeEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELENBQUM7OztPQUhBO0lBT0Qsc0JBQVcsc0NBQU87UUFIbEI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7YUFDRCxVQUFtQixHQUFXO1lBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEMsQ0FBQzs7O09BSEE7SUFPRCxzQkFBSSxpREFBa0I7UUFIdEI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQywwRUFBa0IsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEQsQ0FBQzs7O09BQUE7SUFJRCxzQkFBSSxnREFBaUI7UUFIckI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQywwRUFBa0IsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUMzRCxDQUFDOzs7T0FBQTtJQUlELHNCQUFJLHlDQUFVO1FBSGQ7O1dBRUc7YUFDSDtZQUNFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQUMsTUFBTSxDQUFDLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN6RSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQUMsTUFBTSxDQUFDLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN0RSxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ2IsQ0FBQzs7O09BQUE7SUFDRDs7T0FFRztJQUNJLGlDQUFLLEdBQVosVUFBYSxZQUF5QjtRQUF0QyxpQkFRQztRQVBDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBQyxNQUFNLEVBQUUsSUFBSTtZQUMvRCxFQUFFLENBQUMsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDekIsS0FBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7Z0JBQ3ZCLEtBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUNqQixDQUFDLENBQUMsWUFBWSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRDs7T0FFRztJQUNJLHNDQUFVLEdBQWpCLFVBQWtCLE9BQXlCO1FBQTNDLGlCQWdCQztRQWZDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUNwQixJQUFJLENBQUMsSUFBSSxFQUNULElBQUksQ0FBQyxLQUFLLEVBQ1YsT0FBTyxDQUFDLElBQUksRUFDWixVQUFDLE1BQU0sRUFBRSxJQUFJO1lBQ1gsRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLElBQUksUUFBUSxHQUFHLEtBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQzFCLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM1QixLQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBQyxJQUFJLFFBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLElBQUksRUFBdkIsQ0FBdUIsQ0FBQyxDQUFDO2dCQUM3RCxDQUFDO2dCQUFDLElBQUksQ0FBQyxDQUFDO29CQUNOLEtBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO2dCQUN6QixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUNEOzs7T0FHRztJQUNJLHFDQUFTLEdBQWhCLFVBQWlCLEtBQWE7UUFBOUIsaUJBa0RDO1FBakRDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDakIsTUFBTSxDQUFDO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsTUFBTSxDQUFDO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0IsSUFBSSxhQUFhLEdBQUc7WUFDbEIsSUFBSSxPQUFPLEdBQWUsRUFBRSxDQUFDO1lBQzdCLEVBQUUsQ0FBQyxDQUFDLEtBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLGNBQUk7b0JBQ2hCLElBQUksVUFBVSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7b0JBQ2xDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsV0FBQzt3QkFDbkIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7NEJBQ3ZCLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUU7eUJBQ2pFLENBQUMsQ0FBQzt3QkFDSCxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDOzRCQUNwQyxLQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ2xELENBQUM7b0JBQ0gsQ0FBQyxDQUFDO29CQUNGLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNOLEtBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQUMsTUFBTSxFQUFFLElBQUk7b0JBQ3JELEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDO3dCQUN2QixLQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUM3QixDQUFDO29CQUNELEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO3dCQUN6QixLQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQyxDQUFNOzRCQUNkLE1BQU0sQ0FBQztnQ0FDTCxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJO2dDQUNqQixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJO2dDQUNqQixPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87NkJBQ25CLENBQUM7d0JBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQztRQUNGLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFDTSwyQ0FBZSxHQUF0QixVQUF1QixRQUFhO1FBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFDUyw0Q0FBZ0IsR0FBMUIsVUFBMkIsUUFBYTtRQUF4QyxpQkFtREM7UUFsREMsaUJBQU0sZ0JBQWdCLFlBQUMsUUFBUSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxLQUFLLEdBQ1AsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUN4QyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDOUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXO2dCQUNoQixDQUFDLENBQUMsU0FBUztnQkFDWCxDQUFDLENBQUMsUUFBUTtZQUNaLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDZCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUMzQyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUNyQyxDQUFDLENBQUMsUUFBUTtZQUNWLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtnQkFDVixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVULEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBSztnQkFDckIsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUM7Z0JBQ3JDLEtBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7b0JBQzNDO3dCQUNFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTt3QkFDaEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO3dCQUNoQixPQUFPLEVBQUUsT0FBTztxQkFDakI7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDO2dCQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFLO2dCQUNyQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQztnQkFDckMsS0FBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBQyxNQUFNLEVBQUUsSUFBSTtvQkFDdEQsRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7d0JBQ3pCLEtBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7NEJBQzNDO2dDQUNFLE9BQU8sRUFBRSxJQUFJO2dDQUNiLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtnQ0FDaEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJOzZCQUNqQjt5QkFDRixDQUFDLENBQUM7d0JBQ0gsRUFBRSxDQUFDLENBQUMsS0FBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7NEJBQ2xELEtBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQzlCLENBQUM7b0JBQ0gsQ0FBQztvQkFBQyxJQUFJLENBQUMsQ0FBQzt3QkFDTixLQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUM3QixDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUNTLDRDQUFnQixHQUExQixVQUEyQixNQUEwQjtRQUNuRCxpQkFBTSxnQkFBZ0IsWUFBQyxNQUFNLENBQUMsQ0FBQztRQUMvQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxJQUFJLENBQ1QsSUFBSSxrRUFBa0IsQ0FDcEIsMEVBQWtCLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxFQUM3QyxJQUFJLENBQ0wsQ0FDRixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFDUyx3Q0FBWSxHQUF0QixVQUF1QixLQUFhO1FBQ2xDLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQzFCLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUMzQixDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNPLHNDQUFVLEdBQWxCLFVBQW1CLEtBQWE7UUFBaEMsaUJBUUM7UUFQQyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFJO1lBQ3hCLEVBQUUsQ0FBQyxDQUFDLEtBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELEtBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksK0RBQWUsQ0FBQyxLQUFJLENBQUMsT0FBTyxFQUFFLEtBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM1QyxDQUFDO0lBQ08sdUNBQVcsR0FBbkIsVUFBb0IsSUFJbkI7UUFDQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDeEIsSUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4RSxNQUFNLEdBQUcsTUFBTSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN4QyxJQUFJLE1BQU0sR0FDUixNQUFNLEtBQUssV0FBVztZQUN0QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUNNLHdDQUFZLEdBQW5CLFVBQ0UsT0FPQztRQVBEO1lBTUUsWUFBWSxFQUFFLElBQUk7U0FDbkI7UUFFRCxJQUFJLGlCQUFpQixHQUFHLGlCQUFNLFlBQVksWUFBQyxPQUFPLENBQUMsQ0FBQztRQUNwRCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDakMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25FLGlCQUFpQixDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQUMsU0FBUyxFQUFFLEtBQUs7Z0JBQ25ELE1BQU0sQ0FBQztvQkFDTCxJQUFJLEVBQUUsS0FBSztvQkFDWCxLQUFLLEVBQUUsTUFBTTtvQkFDYixLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxTQUFTO29CQUM1RCxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTO29CQUM3RCxTQUFTLEVBQUUsVUFBQyxHQUFRO3dCQUNsQixjQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUc7b0JBQW5ELENBQW1EO29CQUNyRCxNQUFNLEVBQUUsS0FBSztpQkFDZCxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxDQUFDLGlCQUFpQixDQUFDO0lBQzNCLENBQUM7SUFDSCx3QkFBQztBQUFELENBQUMsQ0FoVnNDLDJEQUFRLEdBZ1Y5Qzs7QUFDRCwrREFBVSxDQUFDLFFBQVEsQ0FDakIsTUFBTSxFQUNOO0lBQ0UsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtJQUM5Qyx1QkFBdUI7SUFDdkIsRUFBRSxJQUFJLEVBQUUsNEJBQTRCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtJQUNyRCxhQUFhO0lBQ2IsWUFBWTtJQUNaLGVBQWU7SUFDZixFQUFFLElBQUksRUFBRSx5QkFBeUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO0lBQ2xELEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDakQsZ0JBQWdCO0NBQ2pCLEVBQ0Q7SUFDRSxNQUFNLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuQyxDQUFDLEVBQ0QsVUFBVSxDQUNYLENBQUM7QUFDRix5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsY0FBSTtJQUNwRCxNQUFNLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUMvV21EO0FBQ1o7QUFDVTtBQUdwRDs7R0FFRztBQUNIO0lBQXVDLG9GQUFnQjtJQUNyRCwyQkFBbUIsSUFBWTtRQUEvQixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQU1aO1FBUGtCLFVBQUksR0FBSixJQUFJLENBQVE7UUFFN0IsSUFBSSxPQUFPLEdBQUcsS0FBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxLQUFJLENBQUMsQ0FBQztRQUN6RCxJQUFJLElBQUksR0FBRyxLQUFJLENBQUM7UUFDaEIsT0FBTyxDQUFDLGlCQUFpQixHQUFHLFVBQVMsR0FBVztZQUM5QyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDNUQsQ0FBQyxDQUFDOztJQUNKLENBQUM7SUFDTSxtQ0FBTyxHQUFkO1FBQ0UsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBSUQsc0JBQVcsbUNBQUk7UUFIZjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkQsQ0FBQzthQUNELFVBQWdCLEdBQVc7WUFDekIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM3QyxDQUFDOzs7T0FIQTtJQUlELHNCQUFJLHNDQUFPO2FBQVg7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLENBQUM7OztPQUFBO0lBQ0Qsc0JBQVcsNENBQWE7YUFBeEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3RFLENBQUM7OztPQUFBO0lBQ0gsd0JBQUM7QUFBRCxDQUFDLENBM0JzQywyRUFBZ0IsR0EyQnREOztBQUNELCtEQUFVLENBQUMsUUFBUSxDQUNqQixNQUFNLEVBQ04sQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFDekQ7SUFDRSxNQUFNLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuQyxDQUFDLEVBQ0QsVUFBVSxDQUNYLENBQUM7QUFDRix5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsY0FBSTtJQUNwRCxNQUFNLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUM5Q3VDO0FBQ1U7QUFDUztBQUU3RDs7R0FFRztBQUNIO0lBQThDLDJGQUFvQjtJQUNoRSxrQ0FBbUIsSUFBWTtRQUEvQixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQUVaO1FBSGtCLFVBQUksR0FBSixJQUFJLENBQVE7UUFFN0IsS0FBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7O0lBQ3BCLENBQUM7SUFDTSwwQ0FBTyxHQUFkO1FBQ0UsTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBQ0QsNkRBQTBCLEdBQTFCO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFLRCxzQkFBVyxpREFBVztRQUh0Qjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckQsQ0FBQzthQUNELFVBQXVCLFFBQWlCO1lBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDakQsQ0FBQzs7O09BSEE7SUFLTSx1REFBb0IsR0FBM0I7UUFDRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNyQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUNqQixFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sQ0FBQztZQUNULENBQUM7WUFDRCxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFDbEIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3BDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN4QyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixDQUFDO1lBQ0gsQ0FBQztZQUNELEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDMUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNOLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO1lBQ3hCLENBQUM7UUFDSCxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixpQkFBTSxvQkFBb0IsV0FBRSxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBS0Qsc0JBQVcsK0NBQVM7UUFIcEI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELENBQUM7YUFDRCxVQUFxQixRQUFpQjtZQUNwQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLENBQUM7OztPQUhBO0lBSVMsK0NBQVksR0FBdEI7UUFDRSxNQUFNLENBQUMsaUJBQU0sWUFBWSxXQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQztJQUN2RSxDQUFDO0lBSUQsc0JBQVcsaURBQVc7UUFIdEI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELENBQUM7YUFDRCxVQUF1QixHQUFXO1lBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUMsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyxnREFBVTtRQUhyQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEQsQ0FBQzthQUNELFVBQXNCLEdBQVc7WUFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzQyxDQUFDOzs7T0FIQTtJQU9ELHNCQUFXLDhDQUFRO1FBSG5COztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN0RCxDQUFDO2FBQ0QsVUFBb0IsR0FBVztZQUM3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7OztPQUhBO0lBT0Qsc0JBQVcsaURBQVc7UUFIdEI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELENBQUM7YUFDRCxVQUF1QixHQUFXO1lBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDMUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLENBQUM7UUFDSCxDQUFDOzs7T0FOQTtJQU9ILCtCQUFDO0FBQUQsQ0FBQyxDQWxHNkMsa0ZBQW9CLEdBa0dqRTs7QUFFRCwrREFBVSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztBQUV4RSwrREFBVSxDQUFDLFFBQVEsQ0FDakIsYUFBYSxFQUNiO0lBQ0UsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDcEMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDckMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtJQUMxQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO0lBQzFDLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDaEQ7UUFDRSxJQUFJLEVBQUUsYUFBYTtRQUNuQixPQUFPLEVBQUUsT0FBTztRQUNoQixPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDO0tBQzVCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsVUFBVTtRQUNoQixPQUFPLEVBQUUsU0FBUztRQUNsQixPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUM7S0FDOUM7SUFDRCxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFO0lBQzVDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7Q0FDNUMsRUFDRDtJQUNFLE1BQU0sQ0FBQyxJQUFJLHdCQUF3QixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFDLENBQUMsRUFDRCxjQUFjLENBQ2YsQ0FBQztBQUNGLCtEQUFVLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRTtJQUNwQyxJQUFJLEVBQUUsbUJBQW1CO0lBQ3pCLE9BQU8sRUFBRSxLQUFLO0NBQ2YsQ0FBQyxDQUFDO0FBQ0gsK0RBQVUsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFO0lBQ3BDLElBQUksRUFBRSxpQkFBaUI7SUFDdkIsT0FBTyxFQUFFLENBQUM7SUFDVixPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztDQUM1QixDQUFDLENBQUM7QUFDSCwrREFBVSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUU7SUFDcEMsSUFBSSxFQUFFLHFCQUFxQjtJQUMzQixPQUFPLEVBQUUsS0FBSztDQUNmLENBQUMsQ0FBQztBQUNILCtEQUFVLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRTtJQUNwQyxJQUFJLEVBQUUsMEJBQTBCO0NBQ2pDLENBQUMsQ0FBQztBQUVILHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxjQUFJO0lBQzNELElBQUksQ0FBQyxHQUFHLElBQUksd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsNkNBQTZDO0lBQzdDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1SmlDO0FBQ0k7QUFDZTtBQUNEO0FBRUQ7QUFDSjtBQUNHO0FBQ3VCO0FBQ2Y7QUFFdEI7QUFNdEM7SUFLRSx3QkFDRSxJQUFlLEVBQ1IsUUFBZ0IsRUFDdkIsSUFBaUIsRUFDakIsS0FBVTtRQUZILGFBQVEsR0FBUixRQUFRLENBQVE7UUFJdkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUNELHNCQUFXLGdDQUFJO2FBQWY7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsQ0FBQzs7O09BQUE7SUFDRCxzQkFBVyxnQ0FBSTthQUFmO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3hCLENBQUM7OztPQUFBO0lBQ0Qsc0JBQVcsbUNBQU87YUFBbEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDM0IsQ0FBQzs7O09BQUE7SUFDRCxzQkFBVyxpQ0FBSzthQUFoQjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3ZCLENBQUM7YUFDRCxVQUFpQixRQUFhO1lBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQ3pCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsQ0FBQzs7O09BTEE7SUFNUyx1Q0FBYyxHQUF4QixjQUE0QixDQUFDO0lBQy9CLHFCQUFDO0FBQUQsQ0FBQzs7QUFPRDtJQUVFLHNCQUEwQixVQUE2QjtRQUE3QixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUQvQyxXQUFNLEdBQTZCLEVBQUUsQ0FBQztJQUNZLENBQUM7SUFDM0Qsc0JBQVcsaUNBQU87YUFBbEI7WUFDRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUM5QyxDQUFDOzs7T0FBQTtJQUNNLGtDQUFXLEdBQWxCLFVBQW1CLEdBQVEsRUFBRSxNQUFXLEVBQUUsR0FBVztRQUNuRCxHQUFHLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsTUFBTSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFELEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQzVCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDUixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDN0MsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDdEMsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbkMsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ2QsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDaEMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzlDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDMUIsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ00seUNBQWtCLEdBQXpCLFVBQTBCLE1BQVcsRUFBRSxHQUFXO1FBQ2hELElBQUksQ0FBQyxXQUFXLENBQUMsNERBQVEsQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUNNLHFDQUFjLEdBQXJCLFVBQXNCLEdBQVEsRUFBRSxNQUFXO1FBQ3pDLEdBQUcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxNQUFNLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ2pDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDbkMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUMzQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQ00sNENBQXFCLEdBQTVCLFVBQTZCLE1BQVcsRUFBRSxHQUFXO1FBQ25ELE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLDREQUFRLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNNLDRDQUFxQixHQUE1QixVQUE2QixHQUFRLEVBQUUsTUFBVztRQUNoRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRCxFQUFFLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUNuRCxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyw0REFBUSxDQUFDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ25ELEVBQUUsQ0FBQyxDQUFDLE9BQU8sTUFBTSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDOUIsTUFBTTtnQkFDSixNQUFNLElBQUksQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07b0JBQ3pDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztvQkFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNiLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ00sa0NBQVcsR0FBbEIsVUFBbUIsR0FBUSxFQUFFLE1BQVc7UUFDdEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFDTSx5Q0FBa0IsR0FBekIsVUFBMEIsTUFBVztRQUNuQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLDREQUFRLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFDTSx5Q0FBa0IsR0FBekIsVUFBMEIsR0FBUSxFQUFFLE1BQVc7UUFDN0MsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUNELHNCQUFXLDhCQUFJO2FBQWY7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFELENBQUM7OztPQUFBO0lBQ0Qsc0JBQVcsaUNBQU87YUFBbEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdELENBQUM7OztPQUFBO0lBQ08sNENBQXFCLEdBQTdCLFVBQThCLEdBQVEsRUFBRSxNQUFrQjtRQUN4RCxFQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzNCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNqRCxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUMxQixDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ00sOEJBQU8sR0FBZDtRQUNFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQzlCLElBQUksR0FBRyxHQUE2QixFQUFFLENBQUM7UUFDdkMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxNQUFNLEdBQTZCLEVBQUUsQ0FBQztZQUMxQyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekMsQ0FBQztZQUNELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDcEIsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ00sOEJBQU8sR0FBZCxVQUFlLEtBQVU7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDbkIsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN0QixFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO2dCQUFDLFFBQVEsQ0FBQztZQUMzQixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdEIsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQztvQkFBQyxRQUFRLENBQUM7Z0JBQzNCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDOUIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ1MsbUNBQVksR0FBdEI7UUFDRSxNQUFNLENBQUMsSUFBSSw2RUFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDSCxtQkFBQztBQUFELENBQUM7O0FBRUQ7O0dBRUc7QUFDSDtJQUNVLHNGQUFrRDtJQUsxRCw2QkFBbUIsSUFBWTtRQUEvQixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQVdaO1FBWmtCLFVBQUksR0FBSixJQUFJLENBQVE7UUFIdkIsbUJBQWEsR0FBRyxLQUFLLENBQUM7UUF1SHRCLDRCQUFzQixHQUFHLElBQUksNkVBQWlCLENBQUMsS0FBSSxDQUFDLENBQUM7UUFsSDNELEtBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxZQUFZLENBQUMsS0FBSSxDQUFDLENBQUM7UUFDekMsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDO1FBQ2hCLEtBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxTQUFTLEVBQUU7WUFDckQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFJLENBQUMsc0NBQXNDLENBQUMsTUFBTSxFQUFFO1lBQ2xELEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQzs7SUFDTCxDQUFDO0lBQ00scUNBQU8sR0FBZDtRQUNFLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUlELHNCQUFXLGlEQUFnQjtRQUgzQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxRCxDQUFDO2FBQ0QsVUFBNEIsR0FBWTtZQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakQsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyx3Q0FBTztRQUhsQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM5QixDQUFDOzs7T0FBQTtJQUlELHNCQUFXLDBDQUFTO1FBSHBCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2RCxDQUFDO2FBQ0QsVUFBcUIsR0FBVztZQUM5QixHQUFHLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUNsQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDOzs7T0FOQTtJQU9ELHFDQUFPLEdBQVA7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBQ0Qsd0NBQVUsR0FBVjtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFDUyw0Q0FBYyxHQUF4QjtRQUNFLElBQUksTUFBTSxHQUFHLElBQUksS0FBSyxFQUFrQixDQUFDO1FBQ3pDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQy9ELEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFBQyxRQUFRLENBQUM7WUFDM0MsTUFBTSxDQUFDLElBQUksQ0FDVCxJQUFJLENBQUMsZUFBZSxDQUNsQixHQUFHLEVBQ0gsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUN4RCxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUNmLENBQ0YsQ0FBQztRQUNKLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxJQUFJLENBQ1QsSUFBSSxDQUFDLGVBQWUsQ0FDbEIsSUFBSSw2REFBUyxDQUFDLElBQUksQ0FBQyxFQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQzdCLEdBQUcsQ0FDSixDQUNGLENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQztRQUNuQyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFDUyw2Q0FBZSxHQUF6QixVQUNFLEtBQTRCO1FBRTVCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDekMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQztZQUFDLE1BQU0sQ0FBQyx5REFBTyxDQUFDLGNBQWMsQ0FBaUIsS0FBSyxDQUFDLENBQUM7UUFDNUUsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNmLENBQUM7SUFLRCxzQkFBVyw0Q0FBVztRQUp0Qjs7O1dBR0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDL0IsQ0FBQzs7O09BQUE7SUFDRCxzQkFBVyxzQ0FBSzthQUFoQjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3pCLENBQUM7YUFDRCxVQUFpQixLQUFtQjtZQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RSxDQUFDOzs7T0FIQTtJQUlELHNCQUFXLDRDQUFXO2FBQXRCO1lBQ0UsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDN0IsQ0FBQzs7O09BQUE7SUFDTSx5Q0FBVyxHQUFsQixVQUFtQixHQUFRLEVBQUUsTUFBVyxFQUFFLEdBQVc7UUFDbkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ00seUNBQVcsR0FBbEIsVUFBbUIsR0FBUSxFQUFFLE1BQVc7UUFDdEMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ00sZ0RBQWtCLEdBQXpCLFVBQTBCLE1BQVcsRUFBRSxHQUFXO1FBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDTSxnREFBa0IsR0FBekIsVUFBMEIsTUFBVztRQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ00sZ0RBQWtCLEdBQXpCLFVBQTBCLEdBQVEsRUFBRSxNQUFXO1FBQzdDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU0sbURBQXFCLEdBQTVCLFVBQTZCLEdBQVEsRUFBRSxNQUFXO1FBQ2hELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQ2pELENBQUM7SUFDRCx3REFBMEIsR0FBMUI7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUNTLDhDQUFnQixHQUExQixVQUEyQixNQUEwQjtRQUNuRCxpQkFBTSxnQkFBZ0IsWUFBQyxNQUFNLENBQUMsQ0FBQztRQUMvQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxzRUFBc0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBQ0gsQ0FBQztJQUNPLDRDQUFjLEdBQXRCO1FBQ0UsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFDTyxnREFBa0IsR0FBMUI7UUFDRSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDckMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNuQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDdkIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUN4QixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNTLDZDQUFlLEdBQXpCLFVBQ0UsSUFBZSxFQUNmLFFBQWdCLEVBQ2hCLEtBQVU7UUFFVixNQUFNLENBQUMsSUFBSSxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUNTLDhDQUFnQixHQUExQixVQUEyQixRQUFhO1FBQ3RDLGlCQUFNLGdCQUFnQixZQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pDLEVBQUUsQ0FBQyxDQUNELElBQUksQ0FBQyxhQUFhO1lBQ2xCLENBQUMsSUFBSSxDQUFDLG9CQUFvQjtZQUMxQixJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxJQUFJLENBQ3RDLENBQUM7WUFDQyxNQUFNLENBQUM7UUFDVCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNuQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQzNDLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMxRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDbEQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBQ00saURBQW1CLEdBQTFCLFVBQTJCLFVBQW1CO1FBQzVDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNwQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxHQUFHLEdBQTZCLEVBQUUsQ0FBQztRQUN2QyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksTUFBTSxHQUFHLFVBQVU7Z0JBQ3JCLENBQUMsQ0FBQyw2REFBUyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO2dCQUNoRCxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ1IsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUMxQixJQUFJLFFBQVEsR0FBRyw2REFBUyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDekUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNNLDBDQUFZLEdBQW5CLFVBQ0UsT0FPQztRQVJILGlCQTRDQztRQTNDQztZQU1FLFlBQVksRUFBRSxJQUFJO1NBQ25CO1FBRUQsSUFBSSxpQkFBaUIsR0FBRyxpQkFBTSxZQUFZLFlBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUN4QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDcEMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLGlCQUFPO2dCQUM1RCxJQUFJLEdBQUcsR0FBRyxLQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDeEIsVUFBQyxDQUFpQixJQUFLLFFBQUMsQ0FBQyxLQUFLLEtBQUssT0FBTyxFQUFuQixDQUFtQixDQUMzQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNMLElBQUksV0FBVyxHQUFRO29CQUNyQixJQUFJLEVBQUUsT0FBTztvQkFDYixLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSztvQkFDL0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUM7b0JBQ3RCLFlBQVksRUFBRSw2REFBUyxDQUFDLG9CQUFvQixDQUMxQyxLQUFJLENBQUMsY0FBYyxFQUNuQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQ2hCO29CQUNELFNBQVMsRUFBRSxVQUFDLEdBQVE7d0JBQ2xCLGNBQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRztvQkFBbkQsQ0FBbUQ7b0JBQ3JELE1BQU0sRUFBRSxLQUFLO2lCQUNkLENBQUM7Z0JBQ0YsSUFBSSxJQUFJLEdBQUcsNkRBQVMsQ0FBQyxjQUFjLENBQ2pDLEtBQUksQ0FBQyxjQUFjLEVBQ25CLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FDaEIsQ0FBQztnQkFDRixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDWCxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLHFCQUFXO3dCQUM5QyxXQUFXLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQzs0QkFDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDbkMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0lBQ00sK0NBQWlCLEdBQXhCLFVBQXlCLEtBQW9CO1FBQzNDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMxQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDTSwwREFBNEIsR0FBbkMsVUFDRSxPQUFnQyxFQUNoQyxPQUFZO1FBRVosR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDO29CQUNYLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSztvQkFDakMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJO29CQUMxQyxRQUFRLEVBQUUsSUFBSTtpQkFDZixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDTSw4Q0FBZ0IsR0FBdkIsVUFBd0IsUUFBdUIsRUFBRSxJQUFtQjtRQUE1QywwQ0FBdUI7UUFBRSxrQ0FBbUI7UUFDbEUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFBQyxNQUFNLENBQUMsaUJBQU0sZ0JBQWdCLFdBQUUsQ0FBQztRQUMzQyxJQUFJLFFBQVEsR0FBRyxJQUFJLGlGQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNoQyxJQUFJLElBQUksR0FBRyxJQUFJLCtEQUFVLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNNLG1EQUFxQixHQUE1QjtRQUNFLGlCQUFNLHFCQUFxQixXQUFFLENBQUM7UUFDOUIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDakIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFDUyxvREFBc0IsR0FBaEM7UUFDRSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDckMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNuQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUNELE1BQU0sQ0FBQyxpQkFBTSxzQkFBc0IsV0FBRSxDQUFDO0lBQ3hDLENBQUM7SUFDRCxhQUFhO0lBQ2IsZ0RBQWtCLEdBQWxCLFVBQW1CLEdBQW1CO1FBQ3BDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDL0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQzFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDZCxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLENBQUM7WUFDRCxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUNILDBCQUFDO0FBQUQsQ0FBQyxDQTFTUyw0RUFBdUIsR0EwU2hDOztBQUVELCtEQUFVLENBQUMsUUFBUSxDQUNqQixRQUFRLEVBQ1I7SUFDRTtRQUNFLElBQUksRUFBRSxxQkFBcUI7UUFDM0IsU0FBUyxFQUFFO1lBQ1QsTUFBTSxDQUFDLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN2RCxDQUFDO0tBQ0Y7SUFDRDtRQUNFLElBQUksRUFBRSxrQkFBa0I7UUFDeEIsU0FBUyxFQUFFO1lBQ1QsTUFBTSxDQUFDLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwRCxDQUFDO0tBQ0Y7SUFDRCxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFFO0lBQ3ZEO1FBQ0UsSUFBSSxFQUFFLFdBQVc7UUFDakIsT0FBTyxFQUFFLFNBQVM7UUFDbEIsT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQztLQUMvQjtJQUNELDBCQUEwQjtDQUMzQixFQUNEO0lBQ0UsTUFBTSxDQUFDLElBQUksbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDckMsQ0FBQyxFQUNELFlBQVksQ0FDYixDQUFDO0FBRUYseUVBQWUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLGNBQUk7SUFDdEQsSUFBSSxDQUFDLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsSUFBSSxHQUFHLHlFQUFlLENBQUMsV0FBVyxDQUFDO0lBQ3JDLENBQUMsQ0FBQyxPQUFPLEdBQUcseUVBQWUsQ0FBQyxhQUFhLENBQUM7SUFDMUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FDMWZvQztBQUNHO0FBQ0Y7QUFDWTtBQUlwRDtJQUE0Qyx5RkFBMEI7SUFFcEUsZ0NBQ1MsSUFBWSxFQUNuQixJQUFlLEVBQ2YsSUFBeUIsRUFDekIsS0FBVTtRQUpaLFlBTUUsa0JBQU0sSUFBSSxFQUFFLEtBQUssQ0FBQyxTQUduQjtRQVJRLFVBQUksR0FBSixJQUFJLENBQVE7UUFNbkIsS0FBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsS0FBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7SUFDekIsQ0FBQztJQUNELHNCQUFXLDJDQUFPO2FBQWxCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkIsQ0FBQzs7O09BQUE7SUFDRCxzQkFBVyx3Q0FBSTthQUFmO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3hCLENBQUM7OztPQUFBO0lBQ0Qsc0JBQVcsMkNBQU87YUFBbEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDM0IsQ0FBQzs7O09BQUE7SUFDSCw2QkFBQztBQUFELENBQUMsQ0FyQjJDLGdHQUEwQixHQXFCckU7O0FBQ0Q7O0dBRUc7QUFDSDtJQUFpRCw4RkFBK0I7SUFFOUUscUNBQW1CLElBQVk7UUFBL0IsWUFDRSxrQkFBTSxJQUFJLENBQUMsU0FPWjtRQVJrQixVQUFJLEdBQUosSUFBSSxDQUFRO1FBRTdCLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsS0FBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RELElBQUksSUFBSSxHQUFHLEtBQUksQ0FBQztRQUNoQixLQUFJLENBQUMsc0NBQXNDLENBQUMsTUFBTSxFQUFFO1lBQ2xELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7WUFDakMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDOztJQUNMLENBQUM7SUFDTSw2Q0FBTyxHQUFkO1FBQ0UsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFJRCxzQkFBVyxrREFBUztRQUhwQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEQsQ0FBQzthQUNELFVBQXFCLEdBQVc7WUFDOUIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDOzs7T0FIQTtJQUlELHNCQUFXLHFEQUFZO2FBQXZCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRCxDQUFDOzs7T0FBQTtJQUVTLHlEQUFtQixHQUE3QixVQUE4QixVQUFtQjtRQUMvQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDcEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDNUIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDbEMsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUFDLFFBQVEsQ0FBQztZQUNuQixFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNmLElBQUksZUFBZSxHQUFHLDZEQUFTLENBQUMsb0JBQW9CLENBQ2xELElBQUksQ0FBQyxJQUFJLEVBQ1QsUUFBUSxDQUNULENBQUM7Z0JBQ0YsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7b0JBQ3RCLFFBQVEsR0FBRyxlQUFlLENBQUM7Z0JBQzdCLENBQUM7WUFDSCxDQUFDO1lBQ0ssR0FBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUNNLHVEQUFpQixHQUF4QixVQUF5QixLQUFvQjtRQUMzQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFBQyxRQUFRLENBQUM7WUFDbEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1lBQ3hELEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDN0MsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDTSxrRUFBNEIsR0FBbkMsVUFDRSxPQUFnQyxFQUNoQyxPQUFZO1FBRVosSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN4RSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7Z0JBQUMsUUFBUSxDQUFDO1lBQ3pCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1lBQ25ELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBQzdELEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDN0MsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQztvQkFDWCxJQUFJLEVBQUUsVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJO29CQUM5QixJQUFJLEVBQUUsV0FBVyxHQUFHLE1BQU0sQ0FBQyxTQUFTO29CQUNwQyxRQUFRLEVBQUUsSUFBSTtpQkFDZixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDZixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzdDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUM7b0JBQUMsUUFBUSxDQUFDO2dCQUNoQyxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUNYLElBQUksRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUk7b0JBQzFCLElBQUksRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVM7b0JBQy9CLFFBQVEsRUFBRSxJQUFJO2lCQUNmLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNNLDBEQUFvQixHQUEzQjtRQUNFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDakIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUMvRCxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLEVBQUUsQ0FBQyxDQUFDLDZEQUFTLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUM7b0JBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztnQkFDMUIsTUFBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ04sU0FBUyxHQUFHLElBQUksQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUN0QixDQUFDO1FBQ0QsaUJBQU0sb0JBQW9CLFdBQUUsQ0FBQztJQUMvQixDQUFDO0lBQ00sMkRBQXFCLEdBQTVCO1FBQ0UsaUJBQU0scUJBQXFCLFdBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBQ1MsZ0RBQVUsR0FBcEIsVUFBcUIsR0FBUTtRQUMzQixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztJQUNyQixDQUFDO0lBQ1Msa0RBQVksR0FBdEI7UUFDRSxJQUFJLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBMEIsQ0FBQztRQUNqRCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUMvRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDOUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDbkIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUFDLFFBQVEsQ0FBQztZQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFDUyxxREFBZSxHQUF6QixVQUNFLElBQWUsRUFDZixLQUFVO1FBRVYsTUFBTSxDQUFDLElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDSCxrQ0FBQztBQUFELENBQUMsQ0FySWdELHFHQUErQixHQXFJL0U7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQ2pCLGdCQUFnQixFQUNoQjtJQUNFO1FBQ0UsSUFBSSxFQUFFLGtCQUFrQjtLQUN6QjtJQUNELHlCQUF5QjtJQUN6QixFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsY0FBYyxFQUFFO0NBQzdELEVBQ0Q7SUFDRSxNQUFNLENBQUMsSUFBSSwyQkFBMkIsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3QyxDQUFDLEVBQ0Qsb0JBQW9CLENBQ3JCLENBQUM7QUFFRix5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFJO0lBQzlELElBQUksQ0FBQyxHQUFHLElBQUksMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsSUFBSSxHQUFHLHlFQUFlLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLHFHQUErQixDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNMb0M7QUFDRztBQUNVO0FBQ0M7QUFHVztBQUU1QjtBQUNFO0FBRXRDO0lBQTJDLHdGQUEwQjtJQUNuRSwrQkFBbUIsS0FBYSxFQUFFLElBQXlCLEVBQUUsS0FBVTtRQUF2RSxZQUNFLGtCQUFNLElBQUksRUFBRSxLQUFLLENBQUMsU0FFbkI7UUFIa0IsV0FBSyxHQUFMLEtBQUssQ0FBUTtRQUU5QixLQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDOztJQUN6QixDQUFDO0lBQ0Qsc0JBQVcsMENBQU87YUFBbEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNqQixDQUFDOzs7T0FBQTtJQUNILDRCQUFDO0FBQUQsQ0FBQyxDQVIwQyxnR0FBMEIsR0FRcEU7O0FBRUQ7OztHQUdHO0FBQ0g7SUFBZ0QsNkZBQStCO0lBSzdFLG9DQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBS1o7UUFOa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUh2QixnQkFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLG1CQUFhLEdBQVcsQ0FBQyxDQUFDO1FBSWhDLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsRUFBRSxLQUFJLENBQUMsQ0FBQztRQUN4RCxLQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLEVBQUUsS0FBSSxDQUFDLENBQUM7UUFDMUQsS0FBSSxDQUFDLHVCQUF1QixDQUFDLFlBQVksRUFBRSxLQUFJLENBQUMsQ0FBQztRQUNqRCxLQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxFQUFFLEtBQUksQ0FBQyxDQUFDOztJQUN0RCxDQUFDO0lBQ00sNENBQU8sR0FBZDtRQUNFLE1BQU0sQ0FBQyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUNELHNCQUFXLHFEQUFhO2FBQXhCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNkLENBQUM7OztPQUFBO0lBS0Qsc0JBQVcscURBQWE7UUFKeEI7OztXQUdHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RCxDQUFDO2FBQ0QsVUFBeUIsR0FBWTtZQUNuQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLENBQUM7OztPQUhBO0lBUUQsc0JBQVcsK0NBQU87UUFKbEI7OztXQUdHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM5QyxDQUFDO2FBQ0QsVUFBbUIsR0FBVztZQUM1QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7OztPQUhBO0lBU0Qsc0JBQVcsdURBQWU7UUFMMUI7Ozs7V0FJRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2xELENBQUM7YUFDRCxVQUEyQixHQUFRO1lBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRCxDQUFDOzs7T0FIQTtJQVVELHNCQUFXLCtEQUF1QjtRQU5sQzs7Ozs7V0FLRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRSxDQUFDO2FBQ0QsVUFBbUMsR0FBWTtZQUM3QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEQsQ0FBQzs7O09BSEE7SUFJUyx3REFBbUIsR0FBN0I7UUFDRSxNQUFNLENBQUMsQ0FDTCxpQkFBTSxtQkFBbUIsV0FBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUN2RSxDQUFDO0lBQ0osQ0FBQztJQUNTLG9EQUFlLEdBQXpCO1FBQ0UsRUFBRSxDQUFDLENBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3ZDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUN0QyxDQUFDLENBQUMsQ0FBQztZQUNELGlCQUFNLGVBQWUsV0FBRSxDQUFDO1lBQ3hCLE1BQU0sQ0FBQztRQUNULENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUNsRCxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbEIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdkMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO0lBQ3hCLENBQUM7SUFNRCxzQkFBVyxnREFBUTtRQUxuQjs7OztXQUlHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUM1QixDQUFDO2FBQ0QsVUFBb0IsR0FBVztZQUM3QixFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRywyREFBUSxDQUFDLHFCQUFxQixDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUM1RCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ25DLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDO1lBQ3pCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDcEIsQ0FBQztZQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDbkMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdEMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDckMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDeEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsQyxDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDckQsQ0FBQzs7O09BcEJBO0lBMEJELHNCQUFXLG1EQUFXO1FBTHRCOzs7O1dBSUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7YUFDRCxVQUF1QixHQUFXO1lBQ2hDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO2dCQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO1lBQ25ELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO2dCQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO1FBQy9DLENBQUM7OztPQU5BO0lBWUQsc0JBQVcsbURBQVc7UUFMdEI7Ozs7V0FJRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsMkRBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzlFLENBQUM7YUFDRCxVQUF1QixHQUFXO1lBQ2hDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRywyREFBUSxDQUFDLHFCQUFxQixDQUFDO2dCQUN2QyxHQUFHLEdBQUcsMkRBQVEsQ0FBQyxxQkFBcUIsQ0FBQztZQUN2QyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDcEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMxQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztZQUNuRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztnQkFBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztRQUMvQyxDQUFDOzs7T0FUQTtJQWdCRCxzQkFBVyxpREFBUztRQU5wQjs7Ozs7V0FLRzthQUNIO1lBQ0UsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDOUQsQ0FBQzs7O09BQUE7SUFPRCxzQkFBVyxvREFBWTtRQU52Qjs7Ozs7V0FLRzthQUNIO1lBQ0UsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDOUQsQ0FBQzs7O09BQUE7SUFDRDs7T0FFRztJQUNJLDJDQUFNLEdBQWI7UUFDRSxJQUFJLE9BQU8sR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1RCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQy9CLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDckMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDckMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztZQUN4QixDQUFDO1FBQ0gsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLGlCQUFpQixDQUNwQixJQUFJLENBQUMscUJBQXFCLEVBQUUsRUFDNUIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQ2pDLENBQUM7UUFDSixDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDaEIsRUFBRSxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7WUFDckQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ08sdURBQWtCLEdBQTFCLFVBQTJCLFVBQW1CO1FBQzVDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQztRQUNmLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO1lBQ3pDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkQsR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7Z0JBQ1YsR0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pELENBQUM7UUFDSCxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0MsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO2dCQUNWLEdBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlDLENBQUM7UUFDSCxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7WUFDL0MsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLElBQUksUUFBUSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDO29CQUN6QixHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztvQkFDVixHQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNsQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNEOzs7OztPQUtHO0lBQ0ksZ0RBQVcsR0FBbEIsVUFBbUIsS0FBVTtRQUMzQixFQUFFLENBQUMsQ0FDRCxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUM7WUFDeEMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FDaEMsQ0FBQyxDQUFDLENBQUM7WUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBQ00sZ0VBQTJCLEdBQWxDLFVBQW1DLEtBQWE7UUFDOUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN0QyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN0RCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbEMsRUFBRSxDQUFDLENBQUMseURBQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN2RSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDeEMsTUFBTSxDQUFDLENBQUMseURBQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNEOzs7T0FHRztJQUNJLDhDQUFTLEdBQWhCLFVBQWlCLEtBQWE7UUFDNUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQy9CLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDaEQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDaEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLG9CQUFvQjtnQkFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUM7Z0JBQ2xDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNmLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNoQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNyQixHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7WUFDakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDN0IsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDckQsQ0FBQztJQUlELHNCQUFXLHlEQUFpQjtRQUg1Qjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FDbEMsbUJBQW1CLEVBQ25CLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FDOUMsQ0FBQztRQUNKLENBQUM7YUFDRCxVQUE2QixHQUFXO1lBQ3RDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRCxDQUFDOzs7T0FIQTtJQUlELHNCQUFJLDREQUFvQjthQUF4QjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN4RCxDQUFDOzs7T0FBQTtJQU1ELHNCQUFXLDJEQUFtQjtRQUo5Qjs7O1dBR0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQ2xDLHFCQUFxQixFQUNyQiwwRUFBa0IsQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsQ0FDcEQsQ0FBQztRQUNKLENBQUM7YUFDRCxVQUErQixHQUFXO1lBQ3hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM1RCxDQUFDOzs7T0FIQTtJQUlELHNCQUFJLDhEQUFzQjthQUExQjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUMxRCxDQUFDOzs7T0FBQTtJQUlELHNCQUFXLGtEQUFVO1FBSHJCOztXQUVHO2FBQ0g7WUFDRSxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1lBQzVFLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQ2xDLFlBQVksRUFDWiwwRUFBa0IsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQzdDLENBQUM7UUFDSixDQUFDO2FBQ0QsVUFBc0IsR0FBVztZQUMvQixJQUFJLENBQUMsd0JBQXdCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELENBQUM7OztPQUhBO0lBSUQsc0JBQUkscURBQWE7YUFBakI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pELENBQUM7OztPQUFBO0lBTUQsc0JBQVcsc0RBQWM7UUFMekI7Ozs7V0FJRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM1RCxDQUFDO2FBQ0QsVUFBMEIsR0FBVztZQUNuQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0MsQ0FBQzs7O09BSEE7SUFJRCxzQkFBVyxxREFBYTthQUF4QjtZQUNFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ2xDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEtBQUssU0FBUyxDQUFDO2dCQUNwQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxVQUFVLENBQUM7WUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLEtBQUssUUFBUSxDQUFDO1FBQzFDLENBQUM7OztPQUFBO0lBQ0Qsc0JBQVcsd0RBQWdCO2FBQTNCO1lBQ0UsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDbEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLFlBQVksQ0FBQztZQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsS0FBSyxLQUFLLENBQUM7UUFDdkMsQ0FBQzs7O09BQUE7SUFJRCxzQkFBVyxxREFBYTtRQUh4Qjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FDbEMsZUFBZSxFQUNmLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FDMUMsQ0FBQztRQUNKLENBQUM7YUFDRCxVQUF5QixHQUFXO1lBQ2xDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEQsQ0FBQzs7O09BSEE7SUFJRCxzQkFBSSx3REFBZ0I7YUFBcEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3BELENBQUM7OztPQUFBO0lBQ1Msd0RBQW1CLEdBQTdCLFVBQThCLFVBQW1CO1FBQy9DLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNwQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3JELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDNUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUQsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUFDLFFBQVEsQ0FBQztZQUNuQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ00sc0RBQWlCLEdBQXhCLFVBQXlCLEtBQW9CO1FBQzNDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM3QyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEQsQ0FBQztJQUNILENBQUM7SUFDTSxpRUFBNEIsR0FBbkMsVUFDRSxPQUFnQyxFQUNoQyxPQUFZO1FBRVosSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN4RSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0MsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNYLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSTtnQkFDdEMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTO2dCQUNyRCxRQUFRLEVBQUUsSUFBSTthQUNmLENBQUMsQ0FBQztZQUNILEVBQUUsQ0FBQyxDQUFDLFVBQVUsSUFBSSxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDcEMsT0FBTyxDQUFDLElBQUksQ0FBQztvQkFDWCxJQUFJLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJO29CQUMxQixJQUFJLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTO29CQUMvQixRQUFRLEVBQUUsSUFBSTtpQkFDZixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDTSwrREFBMEIsR0FBakM7UUFDRSxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNTLHFEQUFnQixHQUExQixVQUEyQixNQUEwQjtRQUNuRCxpQkFBTSxnQkFBZ0IsWUFBQyxNQUFNLENBQUMsQ0FBQztRQUMvQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxnRUFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQztJQUNILENBQUM7SUFDTSw4Q0FBUyxHQUFoQixVQUFpQixZQUE0QjtRQUE1QixrREFBNEI7UUFDM0MsSUFBSSxTQUFTLEdBQUcsaUJBQU0sU0FBUyxZQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxTQUFTLENBQUM7SUFDL0MsQ0FBQztJQUNPLG1EQUFjLEdBQXRCO1FBQ0UsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ3RFLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQztRQUNoQixJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDcEIsR0FBRyxDQUFDLENBQ0YsSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUNoQixRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFDM0MsUUFBUSxFQUFFLEVBQ1YsQ0FBQztZQUNELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7Z0JBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEMsQ0FBQztRQUNELE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUN4QyxDQUFDO0lBQ08sc0RBQWlCLEdBQXpCO1FBQ0UsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUM5RCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDMUIsSUFBSSxTQUFTLEdBQWUsRUFBRSxDQUFDO1FBQy9CLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQztRQUNoQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMxRCxHQUFHO2dCQUNELElBQUksQ0FBQyxzQkFBc0IsQ0FDekIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUM1QixNQUFNLEVBQ04sU0FBUyxDQUNWLElBQUksR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ08sMkRBQXNCLEdBQTlCLFVBQ0UsR0FBK0IsRUFDL0IsTUFBNEIsRUFDNUIsU0FBcUI7UUFFckIsSUFBSSxRQUFRLEdBQUcsR0FBRyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDbEQsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUMzQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMxQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsUUFBUSxDQUFDLFFBQVEsQ0FDZixJQUFJLG1FQUFtQixDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FDeEQsQ0FBQztnQkFDRixNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFDRCxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ1MsaURBQVksR0FBdEI7UUFDRSxJQUFJLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBeUIsQ0FBQztRQUNoRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDdkMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2hDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNuQixDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ1Msb0RBQWUsR0FBekIsVUFBMEIsS0FBVTtRQUNsQyxNQUFNLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDUyx5REFBb0IsR0FBOUIsVUFBK0IsR0FBUTtRQUNyQyxJQUFJLFdBQVcsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdELEVBQUUsQ0FBQyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDO1FBQ2pDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUM3QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDO0lBQ1MsbURBQWMsR0FBeEI7UUFDRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDcEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNuRCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDMUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ25ELE1BQU0sQ0FBQyxJQUFJLENBQUMseURBQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ1MsbURBQWMsR0FBeEIsVUFDRSxRQUFhLEVBQ2IsR0FBK0I7UUFFL0IsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ25CLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEUsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDaEIsS0FBSyxDQUFDO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUNuQyxDQUFDO0lBRU8sdURBQWtCLEdBQTFCLFVBQTJCLGFBQWtCLEVBQUUsS0FBYTtRQUMxRCxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsYUFBYSxDQUFDLE1BQU07WUFDL0MsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNYLENBQUM7SUFDUyxvREFBZSxHQUF6QixVQUNFLEdBQStCLEVBQy9CLGFBQWtCLEVBQ2xCLE1BQXVCO1FBQXZCLHVDQUF1QjtRQUV2QixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztZQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FDNUIsYUFBYSxFQUNiLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQ3ZDLENBQUM7SUFDSixDQUFDO0lBQ0gsaUNBQUM7QUFBRCxDQUFDLENBcmdCK0MscUdBQStCLEdBcWdCOUU7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQ2pCLGVBQWUsRUFDZjtJQUNFLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDbkQsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRTtJQUN2QyxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO0lBQzFDO1FBQ0UsSUFBSSxFQUFFLG9CQUFvQjtRQUMxQixPQUFPLEVBQUUsMkRBQVEsQ0FBQyxxQkFBcUI7S0FDeEM7SUFDRCxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7SUFDbkI7UUFDRSxJQUFJLEVBQUUscUJBQXFCO1FBQzNCLHFCQUFxQixFQUFFLHdCQUF3QjtLQUNoRDtJQUNELDBCQUEwQjtJQUMxQixpQ0FBaUM7SUFDakMsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLEVBQUU7SUFDakM7UUFDRSxJQUFJLEVBQUUsbUJBQW1CO1FBQ3pCLHFCQUFxQixFQUFFLHNCQUFzQjtLQUM5QztJQUNEO1FBQ0UsSUFBSSxFQUFFLGdCQUFnQjtRQUN0QixPQUFPLEVBQUUsU0FBUztRQUNsQixPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUM7S0FDbkQ7SUFDRCxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFO0lBQzlELEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRTtDQUNyRSxFQUNEO0lBQ0UsTUFBTSxDQUFDLElBQUksMEJBQTBCLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDNUMsQ0FBQyxFQUNELG9CQUFvQixDQUNyQixDQUFDO0FBRUYseUVBQWUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLGNBQUk7SUFDN0QsSUFBSSxDQUFDLEdBQUcsSUFBSSwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVCLHFHQUErQixDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdGtCYTtBQUV3QztBQUNKO0FBQ0U7QUFDRjtBQUloQjtBQVdwQztJQUEyQyx3RkFBSTtJQU83QywrQkFBWSxJQUFnQixFQUFFLEtBQW9CO1FBQXRDLGtDQUFnQjtRQUFFLG9DQUFvQjtRQUFsRCxZQUNFLGlCQUFPLFNBU1I7UUFSQyxLQUFJLENBQUMsV0FBVyxHQUFHLEtBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsS0FBSSxDQUFDLE1BQU0sQ0FBQyw2QkFBNkIsR0FBRztZQUMxQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUFDO1FBQ0YsS0FBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDO1FBQ25DLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDVixLQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNyQixDQUFDOztJQUNILENBQUM7SUFDTSx1Q0FBTyxHQUFkO1FBQ0UsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0lBQzVCLENBQUM7SUFDRCxzQkFBVyxxQ0FBRTthQUFiO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3hCLENBQUM7OztPQUFBO0lBSUQsc0JBQVcsdUNBQUk7UUFIZjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQzFCLENBQUM7YUFDRCxVQUFnQixHQUFXO1lBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUN6QixDQUFDOzs7T0FIQTtJQUlELHNCQUFXLHlDQUFNO2FBQWpCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUIsQ0FBQzs7O09BQUE7SUFDUyw0Q0FBWSxHQUF0QixVQUF1QixJQUFZO1FBQ2pDLE1BQU0sQ0FBQyxJQUFJLHlFQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDTSw4Q0FBYyxHQUFyQjtRQUNFLGlCQUFNLGNBQWMsV0FBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUNELHVDQUFPLEdBQVAsVUFBUSxJQUF1QjtRQUM3QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBSUQsc0JBQVcsNkNBQVU7UUFIckI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUNoQyxDQUFDO2FBQ0QsVUFBc0IsR0FBWTtZQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7UUFDL0IsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyw0Q0FBUztRQUhwQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQy9CLENBQUM7YUFDRCxVQUFxQixHQUFXO1lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUM5QixDQUFDOzs7T0FIQTtJQVFELHNCQUFXLHdDQUFLO1FBSmhCOzs7V0FHRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzNCLENBQUM7YUFDRCxVQUFpQixHQUFXO1lBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUMxQixDQUFDOzs7T0FIQTtJQUlELHNCQUFJLDJDQUFRO2FBQVo7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDOUIsQ0FBQzs7O09BQUE7SUFJRCxzQkFBVyw0Q0FBUztRQUhwQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQy9CLENBQUM7OztPQUFBO0lBTUQsc0JBQVcsNENBQVM7UUFMcEI7Ozs7V0FJRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQy9CLENBQUM7YUFDRCxVQUFxQixHQUFXO1lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUM5QixDQUFDOzs7T0FIQTtJQUlNLDRDQUFZLEdBQW5CO1FBQ0UsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyx5REFBTyxDQUFDLFlBQVksQ0FDekIsSUFBSSxDQUFDLFNBQVMsRUFDZCxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNuQyxDQUFDO0lBQ0osQ0FBQztJQUlELHNCQUFXLDhDQUFXO1FBSHRCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDakMsQ0FBQzthQUNELFVBQXVCLEdBQVc7WUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO1FBQ2hDLENBQUM7OztPQUhBO0lBSUQsc0JBQUksaURBQWM7YUFBbEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7UUFDcEMsQ0FBQzs7O09BQUE7SUFJRCxzQkFBVyxvREFBaUI7UUFINUI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDO1FBQ3ZDLENBQUM7YUFDRCxVQUE2QixHQUFXO1lBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEdBQUcsR0FBRyxDQUFDO1FBQ3RDLENBQUM7OztPQUhBO0lBSUQsc0JBQUksdURBQW9CO2FBQXhCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUM7UUFDMUMsQ0FBQzs7O09BQUE7SUFJRCxzQkFBVyw2Q0FBVTtRQUhyQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ2hDLENBQUM7YUFDRCxVQUFzQixHQUEyQjtZQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7UUFDL0IsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyx3Q0FBSztRQUhoQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdEUsQ0FBQzthQUNELFVBQWlCLEtBQVU7WUFDekIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkQsQ0FBQztRQUNILENBQUM7OztPQUxBO0lBTU0sdUNBQU8sR0FBZDtRQUNFLE1BQU0sQ0FBQyx5REFBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUNNLDhDQUFjLEdBQXJCLFVBQXNCLFFBQWE7UUFDakMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1lBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFDRCxhQUFhO0lBQ2IsNENBQVksR0FBWjtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QseUNBQVMsR0FBVDtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbEQsQ0FBQztJQUNELGdEQUFnQixHQUFoQjtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN6RCxDQUFDO0lBQ0QsYUFBYTtJQUNiLHdDQUFRLEdBQVIsVUFBUyxJQUFZO1FBQ25CLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELHdDQUFRLEdBQVIsVUFBUyxJQUFZLEVBQUUsS0FBVTtRQUMvQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlDLENBQUM7SUFDSCxDQUFDO0lBQ0QsMENBQVUsR0FBVixVQUFXLElBQVk7UUFDckIsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCwwQ0FBVSxHQUFWLFVBQVcsSUFBWSxFQUFFLFFBQWdCLElBQUcsQ0FBQztJQUM3Qyw0Q0FBWSxHQUFaO1FBQ0UsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxpREFBaUIsR0FBakI7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFDRCxxREFBcUIsR0FBckI7UUFDRSxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUNELGlCQUFpQjtJQUNqQixpREFBaUIsR0FBakI7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBQ0Qsc0JBQUksaURBQWM7YUFBbEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNwQixDQUFDO2FBQ0QsVUFBbUIsR0FBUTtZQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNuQixDQUFDOzs7T0FIQTtJQUlELHFEQUFxQixHQUFyQjtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBQ0QseURBQXlCLEdBQXpCO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFDSCw0QkFBQztBQUFELENBQUMsQ0E3TTBDLG1EQUFJLEdBNk05Qzs7QUFFRDs7R0FFRztBQUNIO0lBQStDLDRGQUFRO0lBR3JELG1DQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBV1o7UUFaa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQTBKdkIsaUNBQTJCLEdBQUcsS0FBSyxDQUFDO1FBeEoxQyxJQUFJLElBQUksR0FBRyxLQUFJLENBQUM7UUFDaEIsS0FBSSxDQUFDLEtBQUssR0FBRyxLQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxVQUFTLElBQVM7WUFDMUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztRQUNILEtBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxPQUFPLEVBQUU7WUFDbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUNILEtBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxVQUFVLEVBQUU7WUFDdEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQzs7SUFDTCxDQUFDO0lBQ00sMkNBQU8sR0FBZDtRQUNFLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUNNLGlEQUFhLEdBQXBCLFVBQXFCLEtBQWtCO1FBQ3JDLGlCQUFNLGFBQWEsWUFBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFDRCxzQkFBVyx1REFBZ0I7YUFBM0I7WUFDRSxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2YsQ0FBQzs7O09BQUE7SUFDRCxnREFBWSxHQUFaO1FBQ0UsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsaUJBQU0sWUFBWSxXQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBQ0Qsb0RBQWdCLEdBQWhCLFVBQWlCLFFBQWE7UUFDNUIsaUJBQU0sZ0JBQWdCLFlBQUMsUUFBUSxDQUFDLENBQUM7UUFDakMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRSxDQUFDO0lBQ0gsQ0FBQztJQUNELHdEQUFvQixHQUFwQixVQUFxQixRQUFhO1FBQ2hDLGlCQUFNLG9CQUFvQixZQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEUsQ0FBQztJQUNILENBQUM7SUFDTyx1REFBbUIsR0FBM0I7UUFDRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDVixJQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUlELHNCQUFXLDRDQUFLO1FBSGhCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLENBQUM7YUFDRCxVQUFpQixHQUFpQztZQUNoRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7OztPQUhBO0lBSUQ7Ozs7T0FJRztJQUNJLDJDQUFPLEdBQWQsVUFBZSxJQUFZLEVBQUUsS0FBb0I7UUFBcEIsb0NBQW9CO1FBQy9DLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ00saURBQWEsR0FBcEIsVUFBcUIsSUFBWTtRQUMvQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNNLHFEQUFpQixHQUF4QixVQUF5QixLQUFvQjtRQUMzQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBQ00sZ0VBQTRCLEdBQW5DLFVBQ0UsT0FBZ0MsRUFDaEMsT0FBWTtRQUVaLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJO2dCQUNqQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVM7Z0JBQ2hELFFBQVEsRUFBRSxJQUFJO2FBQ2YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFDTSxvREFBZ0IsR0FBdkIsVUFBd0IsUUFBdUIsRUFBRSxJQUFtQjtRQUE1QywwQ0FBdUI7UUFBRSxrQ0FBbUI7UUFDbEUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFBQyxNQUFNLENBQUMsaUJBQU0sZ0JBQWdCLFdBQUUsQ0FBQztRQUMzQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN2QixJQUFJLElBQUksR0FBRyxJQUFJLCtEQUFVLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNNLGtEQUFjLEdBQXJCO1FBQ0UsaUJBQU0sY0FBYyxXQUFFLENBQUM7UUFDdkIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFDRCw4REFBMEIsR0FBMUI7UUFDRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzVDLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUlELHNCQUFXLCtDQUFRO1FBSG5COztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDO2FBQ0QsVUFBb0IsR0FBVztZQUM3QixFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQy9CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDekMsQ0FBQzs7O09BSkE7SUFRRCxzQkFBVywrQ0FBUTtRQUhuQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQzthQUNELFVBQW9CLEdBQVc7WUFDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN6QyxDQUFDOzs7T0FIQTtJQUlEOztPQUVHO0lBQ0ksMkNBQU8sR0FBZDtRQUNFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDN0IsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN2QixJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDZixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hCLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsS0FBSyxFQUFFLENBQUM7WUFDUixFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDdEIsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFFUyxrREFBYyxHQUF4QjtRQUNFLGlCQUFNLGNBQWMsV0FBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFDUyxrREFBYyxHQUF4QixVQUF5QixJQUFZLEVBQUUsS0FBYTtRQUNsRCxNQUFNLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNTLHNEQUFrQixHQUE1QjtRQUNFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUM3QyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0MsQ0FBQztZQUNELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBQ00sNkNBQVMsR0FBaEIsVUFBaUIsWUFBNEI7UUFBNUIsa0RBQTRCO1FBQzNDLElBQUksR0FBRyxHQUFHLGlCQUFNLFNBQVMsWUFBQyxZQUFZLENBQUMsQ0FBQztRQUN4QyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUM7UUFDNUQsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ00sZ0RBQVksR0FBbkI7UUFDRSxJQUFJLE1BQU0sR0FBRyxpQkFBTSxZQUFZLFdBQUUsQ0FBQztRQUNsQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDakQsRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFDTSwrQ0FBVyxHQUFsQjtRQUNFLGlCQUFNLFdBQVcsV0FBRSxDQUFDO1FBQ3BCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztJQUVELG1CQUFtQjtJQUNuQix3REFBb0IsR0FBcEIsVUFBcUIsSUFBWTtRQUMvQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFDRCx3REFBb0IsR0FBcEIsVUFBcUIsSUFBWSxFQUFFLEtBQVU7UUFDM0MsSUFBSSxDQUFDLDJCQUEyQixHQUFHLElBQUksQ0FBQztRQUN4QyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNkLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDaEIsQ0FBQztRQUNELFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsMkJBQTJCLEdBQUcsS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFDRCw2Q0FBUyxHQUFUO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUNELG9EQUFnQixHQUFoQjtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFDRCxnREFBWSxHQUFaO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyRCxDQUFDO0lBQ0QscURBQWlCLEdBQWpCO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUNELFFBQVE7SUFDUiw4Q0FBVSxHQUFWLFVBQVcsT0FBaUIsRUFBRSxLQUFhLElBQUcsQ0FBQztJQUMvQyxpREFBYSxHQUFiLFVBQWMsT0FBaUI7UUFDN0IsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCw0REFBd0IsR0FBeEI7UUFDRSxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFDRCx5REFBcUIsR0FBckI7UUFDRSxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELHVEQUFtQixHQUFuQixVQUFvQixFQUFZLElBQUcsQ0FBQztJQUN0QyxnQ0FBQztBQUFELENBQUMsQ0E5TzhDLDJEQUFRLEdBOE90RDs7QUFFRCwrREFBVSxDQUFDLFFBQVEsQ0FDakIsa0JBQWtCLEVBQ2xCO0lBQ0UsTUFBTTtJQUNOLG9CQUFvQjtJQUNwQixFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUU7SUFDaEU7UUFDRSxJQUFJLEVBQUUsV0FBVztRQUNqQixPQUFPLEVBQUUsTUFBTTtRQUNmLE9BQU8sRUFBRTtZQUNQLE9BQU87WUFDUCxNQUFNO1lBQ04sVUFBVTtZQUNWLGdCQUFnQjtZQUNoQixPQUFPO1lBQ1AsT0FBTztZQUNQLFFBQVE7WUFDUixVQUFVO1lBQ1YsT0FBTztZQUNQLEtBQUs7WUFDTCxNQUFNO1lBQ04sTUFBTTtZQUNOLEtBQUs7WUFDTCxNQUFNO1NBQ1A7S0FDRjtJQUNELEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUU7SUFDcEQsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ3pDO1FBQ0UsSUFBSSxFQUFFLHdCQUF3QjtRQUM5QixxQkFBcUIsRUFBRSxzQkFBc0I7S0FDOUM7SUFDRDtRQUNFLElBQUksRUFBRSx1QkFBdUI7UUFDN0IsYUFBYSxFQUFFLGlCQUFpQjtRQUNoQyxhQUFhLEVBQUUsV0FBVztLQUMzQjtDQUNGLEVBQ0Q7SUFDRSxNQUFNLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN2QyxDQUFDLENBQ0YsQ0FBQztBQUVGLCtEQUFVLENBQUMsUUFBUSxDQUNqQixjQUFjLEVBQ2Q7SUFDRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUU7SUFDM0QsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRTtJQUN4QyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtDQUNsRSxFQUNEO0lBQ0UsTUFBTSxDQUFDLElBQUkseUJBQXlCLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDM0MsQ0FBQyxFQUNELFVBQVUsQ0FDWCxDQUFDO0FBRUYseUVBQWUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLGNBQUk7SUFDNUQsSUFBSSxDQUFDLEdBQUcsSUFBSSx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25CLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkIsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNoQjRDO0FBWU07QUFFd0I7QUFDdEI7QUFDQztBQUNuQjtBQUNpQjtBQUNGO0FBQ047QUFDUjtBQVd0QztJQU9FLGtDQUFZLElBQStCLEVBQUUsS0FBaUI7UUFDNUQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLDJFQUFnQixFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsR0FBRyxVQUNoQyxTQUFnQztZQUVoQyxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxzQkFBVywyQ0FBSzthQUFoQjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3pCLENBQUM7OztPQUFBO0lBQ00sZ0RBQWEsR0FBcEI7UUFDRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBQ00sMkNBQVEsR0FBZixVQUFnQixJQUFZO1FBQzFCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNqQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFDTSwyQ0FBUSxHQUFmLFVBQWdCLElBQVksRUFBRSxRQUFhO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ00sNkNBQVUsR0FBakIsVUFBa0IsSUFBWTtRQUM1QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyw0REFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDTSw2Q0FBVSxHQUFqQixVQUFrQixJQUFZLEVBQUUsUUFBZ0I7UUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsNERBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUNELCtDQUFZLEdBQVo7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ0Qsb0RBQWlCLEdBQWpCO1FBQ0UsSUFBSSxNQUFNLEdBQTJCLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1FBQ3BFLElBQUksWUFBWSxHQUNkLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUN0QyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRTtZQUM3QyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1QsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQztZQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFDRCx3REFBcUIsR0FBckI7UUFDRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMzQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3pELE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsK0NBQVksR0FBWjtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsNENBQVMsR0FBVDtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbEQsQ0FBQztJQUNELG1EQUFnQixHQUFoQjtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsZ0JBQWdCO0lBQ1Isd0RBQXFCLEdBQTdCLFVBQThCLFNBQWdDO1FBQzVELEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3ZCLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQzFCLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sQ0FBQztRQUNULENBQUM7UUFDRCxJQUFJLFNBQVMsR0FBRyxJQUFJLDRFQUFZLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hFLFNBQVMsQ0FBQyxRQUFRLEdBQUcsU0FBUyxJQUFJLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDO1FBQzVFLFNBQVMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUMxQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDbEMsa0NBQWtDO1FBQ2xDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQ3JDLHdCQUF3QixDQUFDLGdCQUFnQixHQUFHLEdBQUcsRUFDL0MsRUFBRSxDQUNILENBQUM7UUFDRixJQUFJLFNBQVMsR0FBRyxJQUFJLDRFQUFZLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hFLElBQUksUUFBUSxHQUFhLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzdCLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUM3QyxTQUFTLEVBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQzdCLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDUCxNQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUyxDQUFDLGtCQUFrQjtnQkFDckQsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZO2dCQUN2QixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNyQixDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDUixNQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xELENBQUM7UUFDSCxDQUFDO1FBQ0QsU0FBUyxDQUFDLEtBQUssR0FBRyxJQUFJLDRFQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBQ0QsOENBQVcsR0FBWCxVQUFZLElBQVksRUFBRSxrQkFBMkI7UUFDbkQsSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDL0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN0RSxDQUFDO0lBQ0QsZ0RBQWEsR0FBYixVQUFjLElBQVksRUFBRSxrQkFBMkI7UUFDckQsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDbEQsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUM7UUFDeEUsSUFBSSxHQUFHLEdBQUcsRUFBRSxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3RELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckIsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFDRCxHQUFHLENBQUMscUJBQXFCO1lBQ3ZCLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxxQkFBcUIsQ0FBQztRQUNyRCxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQXRIYSx5Q0FBZ0IsR0FBRyxPQUFPLENBQUM7SUFDM0IsMENBQWlCLEdBQUcsWUFBWSxDQUFDO0lBc0hqRCwrQkFBQztDQUFBO0FBekhvQztBQTJIckM7SUFDRSxnREFBbUIsSUFBK0I7UUFBL0IsU0FBSSxHQUFKLElBQUksQ0FBMkI7SUFBRyxDQUFDO0lBQ3RELDZEQUFZLEdBQVo7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELDBEQUFTLEdBQVQ7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBQ0QsaUVBQWdCLEdBQWhCO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFDSCw2Q0FBQztBQUFELENBQUM7O0FBRUQ7OztHQUdHO0FBQ0g7SUFBK0MsNEZBQVE7SUFZckQsbUNBQW1CLElBQVk7UUFBL0IsWUFDRSxrQkFBTSxJQUFJLENBQUMsU0F3Qlo7UUF6QmtCLFVBQUksR0FBSixJQUFJLENBQVE7UUFUdkIsdUJBQWlCLEdBQVcsQ0FBQyxDQUFDO1FBRzlCLHVCQUFpQixHQUFXLENBQUMsQ0FBQyxDQUFDO1FBc1YvQix1QkFBaUIsR0FBWSxLQUFLLENBQUM7UUE5VXpDLEtBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUIsS0FBSSxDQUFDLGFBQWEsR0FBRyxLQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUN6RCxLQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7UUFDbkMsS0FBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsR0FBRyxLQUFJLENBQUM7UUFFN0MsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDO1FBQ2hCLEtBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEdBQUcsVUFBUyxPQUFPO1lBQ2pELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUFDO1FBQ0YsS0FBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsR0FBRyxVQUFTLE9BQU87WUFDcEQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztRQUVGLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsRUFBRSxLQUFJLENBQUMsQ0FBQztRQUN4RCxLQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLEVBQUUsS0FBSSxDQUFDLENBQUM7UUFDMUQsS0FBSSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsRUFBRSxLQUFJLENBQUMsQ0FBQztRQUNuRCxLQUFJLENBQUMsdUJBQXVCLENBQUMsaUJBQWlCLEVBQUUsS0FBSSxDQUFDLENBQUM7UUFDdEQsS0FBSSxDQUFDLHVCQUF1QixDQUFDLGVBQWUsRUFBRSxLQUFJLENBQUMsQ0FBQztRQUNwRCxLQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxFQUFFLEtBQUksQ0FBQyxDQUFDO1FBQ3BELEtBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxhQUFhLEVBQUU7WUFDekQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDOztJQUNMLENBQUM7SUFDTSxpREFBYSxHQUFwQixVQUFxQixLQUFrQjtRQUNyQyxpQkFBTSxhQUFhLFlBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUNPLHFFQUFpQyxHQUF6QztRQUNFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3RDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUNPLGdFQUE0QixHQUFwQyxVQUFxQyxPQUFpQjtRQUNwRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDSCxPQUFTLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVMsT0FBTyxFQUFFLE9BQU87WUFDcEUsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ0QsT0FBUyxDQUFDLGtCQUFrQixHQUFHLFVBQVMsT0FBTztnQkFDaEUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLENBQUMsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBQ08sb0VBQWdDLEdBQXhDLFVBQXlDLE9BQVksRUFBRSxPQUFZO1FBQ2pFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztZQUN6RSxNQUFNLENBQUM7UUFDVCxJQUFJLFFBQVEsR0FBRywrREFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3RCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDekIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdkMsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6RCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFVLFFBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELFFBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUNuRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDTSwyQ0FBTyxHQUFkO1FBQ0UsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBQ0Qsc0JBQVcsdURBQWdCO2FBQTNCO1lBQ0UsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNmLENBQUM7OztPQUFBO0lBQ00saURBQWEsR0FBcEIsVUFBcUIsT0FBaUI7UUFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFRRCxzQkFBVywrQ0FBUTtRQU5uQjs7Ozs7V0FLRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDNUIsQ0FBQzs7O09BQUE7SUFDTSw0Q0FBUSxHQUFmO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQU9ELHNCQUFXLHVEQUFnQjtRQU4zQjs7Ozs7V0FLRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ2hDLENBQUM7OztPQUFBO0lBT0Qsc0JBQVcsb0RBQWE7UUFOeEI7Ozs7O1dBS0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUM3QixDQUFDO2FBQ0QsVUFBeUIsUUFBZ0I7WUFDdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO1FBQ2pDLENBQUM7OztPQUhBO0lBSUQsc0JBQUksdURBQWdCO2FBQXBCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ2hDLENBQUM7OztPQUFBO0lBUUQsc0JBQVcsMERBQW1CO1FBUDlCOzs7Ozs7V0FNRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ25DLENBQUM7YUFDRCxVQUErQixRQUFnQjtZQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7UUFDdkMsQ0FBQzs7O09BSEE7SUFJRCxzQkFBSSw2REFBc0I7YUFBMUI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7UUFDdEMsQ0FBQzs7O09BQUE7SUFFRCxzQkFBYyw0Q0FBSzthQUFuQjtZQUNFLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNiLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDNUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hDLENBQUM7WUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ2IsQ0FBQzs7O09BQUE7SUFNRCxzQkFBVyw2Q0FBTTtRQUxqQjs7OztXQUlHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7OztPQUFBO0lBUUQsc0JBQVcsbURBQVk7UUFQdkI7Ozs7OztXQU1HO2FBQ0g7WUFDRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7Z0JBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLENBQUM7WUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNoQyxDQUFDO2FBQ0QsVUFBd0IsR0FBVztZQUNqQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztZQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ3RELENBQUM7OztPQUxBO0lBYUQsc0JBQVcsbURBQVk7UUFQdkI7Ozs7OztXQU1HO2FBQ0g7WUFDRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQzlCLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDMUQsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsQ0FBQzs7O09BQUE7SUFLRCxzQkFBVyxvREFBYTtRQUp4Qjs7O1dBR0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELENBQUM7YUFDRCxVQUF5QixHQUFZO1lBQ25DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUMsQ0FBQzs7O09BSEE7SUFRRCxzQkFBVyw4Q0FBTztRQUpsQjs7O1dBR0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLENBQUM7YUFDRCxVQUFtQixHQUFXO1lBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEMsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyx3REFBaUI7UUFINUI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQ2xDLG1CQUFtQixFQUNuQiwwRUFBa0IsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQzlDLENBQUM7UUFDSixDQUFDO2FBQ0QsVUFBNkIsR0FBVztZQUN0QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUQsQ0FBQzs7O09BSEE7SUFJRCxzQkFBSSwyREFBb0I7YUFBeEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDeEQsQ0FBQzs7O09BQUE7SUFLRCxzQkFBVywwREFBbUI7UUFKOUI7OztXQUdHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUNsQyxxQkFBcUIsRUFDckIsMEVBQWtCLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLENBQ3BELENBQUM7UUFDSixDQUFDO2FBQ0QsVUFBK0IsR0FBVztZQUN4QyxJQUFJLENBQUMsd0JBQXdCLENBQUMscUJBQXFCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUQsQ0FBQzs7O09BSEE7SUFJRCxzQkFBSSw2REFBc0I7YUFBMUI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDMUQsQ0FBQzs7O09BQUE7SUFPRCxzQkFBVyxvREFBYTtRQU54Qjs7Ozs7V0FLRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FDbEMsZUFBZSxFQUNmLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FDN0MsQ0FBQztRQUNKLENBQUM7YUFDRCxVQUF5QixHQUFXO1lBQ2xDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEQsQ0FBQzs7O09BSEE7SUFJRCxzQkFBSSx1REFBZ0I7YUFBcEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3BELENBQUM7OztPQUFBO0lBT0Qsc0JBQVcsb0RBQWE7UUFOeEI7Ozs7O1dBS0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQ2xDLGVBQWUsRUFDZiwwRUFBa0IsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQzdDLENBQUM7UUFDSixDQUFDO2FBQ0QsVUFBeUIsR0FBVztZQUNsQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELENBQUM7OztPQUhBO0lBSUQsc0JBQUksdURBQWdCO2FBQXBCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNwRCxDQUFDOzs7T0FBQTtJQUlELHNCQUFXLG1EQUFZO1FBSHZCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUNsQyxjQUFjLEVBQ2QsMEVBQWtCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUN6QyxDQUFDO1FBQ0osQ0FBQzthQUNELFVBQXdCLEtBQWE7WUFDbkMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RCxDQUFDOzs7T0FIQTtJQUlELHNCQUFJLHNEQUFlO2FBQW5CO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNuRCxDQUFDOzs7T0FBQTtJQUlELHNCQUFXLHNEQUFlO1FBSDFCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUNsQyxpQkFBaUIsRUFDakIsMEVBQWtCLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUM1QyxDQUFDO1FBQ0osQ0FBQzthQUNELFVBQTJCLEdBQVc7WUFDcEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hELENBQUM7OztPQUhBO0lBSUQsc0JBQUkseURBQWtCO2FBQXRCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3RELENBQUM7OztPQUFBO0lBSUQsc0JBQVcsMkRBQW9CO1FBSC9COztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsQ0FDTCxJQUFJLENBQUMsVUFBVSxJQUFJLGFBQWEsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLG1CQUFtQixDQUMzRSxDQUFDO1FBQ0osQ0FBQzs7O09BQUE7SUFJRCxzQkFBVyw4REFBdUI7UUFIbEM7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxDQUNMLElBQUksQ0FBQyxVQUFVLElBQUksZ0JBQWdCO2dCQUNuQyxJQUFJLENBQUMsVUFBVSxJQUFJLG1CQUFtQixDQUN2QyxDQUFDO1FBQ0osQ0FBQzs7O09BQUE7SUFNRCxzQkFBVywwREFBbUI7UUFMOUI7Ozs7V0FJRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLENBQUM7OztPQUFBO0lBT0Qsc0JBQVcsMERBQW1CO1FBTjlCOzs7OztXQUtHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUMzRSxDQUFDOzs7T0FBQTtJQUlELHNCQUFXLHFEQUFjO1FBSHpCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsQ0FDTCxJQUFJLENBQUMsbUJBQW1CO2dCQUN4QixDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQ2hELENBQUM7UUFDSixDQUFDOzs7T0FBQTtJQUNNLHVEQUFtQixHQUExQixVQUEyQixhQUE4QjtRQUE5QixxREFBOEI7UUFDdkQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUNqRSxDQUFDO0lBSU8sZ0VBQTRCLEdBQXBDO1FBQ0UsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDTywrREFBMkIsR0FBbkM7UUFDRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQztZQUN0QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztZQUN2QyxJQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBQ1MsZ0RBQVksR0FBdEI7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQjtZQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQjtZQUMzQixDQUFDLENBQUMsaUJBQU0sWUFBWSxXQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNTLGdEQUFZLEdBQXRCLFVBQXVCLFFBQWE7UUFDbEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxRQUFRLENBQUM7UUFDdkMsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04saUJBQU0sWUFBWSxZQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBVUQsc0JBQVcsaURBQVU7UUFUckI7Ozs7Ozs7O1dBUUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFlBQVk7Z0JBQ2hELENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCO2dCQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDekIsQ0FBQzthQUNELFVBQXNCLEdBQVc7WUFDL0IsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDcEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsR0FBRyxDQUFDO2dCQUM3QixNQUFNLENBQUM7WUFDVCxDQUFDO1lBQ0QsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQzNELElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUM7b0JBQy9ELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQzt3QkFDbEMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNqQixDQUFDO29CQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNOLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDbkIsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUNELEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3BELENBQUM7OztPQXpCQTtJQW1DRCxzQkFBVyxrREFBVztRQVR0Qjs7Ozs7Ozs7V0FRRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDekQsQ0FBQzthQUNELFVBQXVCLEdBQVc7WUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM1QyxDQUFDOzs7T0FIQTtJQUlPLDhEQUEwQixHQUFsQztRQUNFLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUN6QixJQUFJLENBQUMsWUFBWTtZQUNmLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUNqQixDQUFDLENBQUMsSUFBSSxzQ0FBc0MsQ0FBQyxJQUFJLENBQUMsQ0FDckQsQ0FBQztJQUNKLENBQUM7SUFDTyx1REFBbUIsR0FBM0I7UUFDRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFBQyxRQUFRLENBQUM7WUFDckMsS0FBSyxDQUFDLGFBQWEsQ0FBMkIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVELENBQUM7SUFDSCxDQUFDO0lBQ08sa0RBQWMsR0FBdEI7UUFDRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQzNELEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQzdCLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxlQUFlLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7WUFDN0MsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUNPLDZEQUF5QixHQUFqQztRQUNFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkIsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoRCxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDNUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUU7WUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDbkMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxLQUFLLENBQUM7SUFDekMsQ0FBQztJQU1ELHNCQUFXLG9EQUFhO1FBTHhCOzs7O1dBSUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7YUFDRCxVQUF5QixHQUFXO1lBQ2xDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNyQixFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDdEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1QyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFBQyxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQztZQUN2RCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztnQkFBQyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztRQUNuRCxDQUFDOzs7T0FQQTtJQWFELHNCQUFXLG9EQUFhO1FBTHhCOzs7O1dBSUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQzFCLGVBQWUsRUFDZiw0REFBUSxDQUFDLHNCQUFzQixDQUNoQyxDQUFDO1FBQ0osQ0FBQzthQUNELFVBQXlCLEdBQVc7WUFDbEMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDckIsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLDREQUFRLENBQUMsc0JBQXNCLENBQUM7Z0JBQ3hDLEdBQUcsR0FBRyw0REFBUSxDQUFDLHNCQUFzQixDQUFDO1lBQ3hDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzVDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2dCQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDO1lBQ3ZELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO2dCQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1FBQ25ELENBQUM7OztPQVRBO0lBY0Qsc0JBQVcsb0RBQWE7UUFKeEI7OztXQUdHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0RCxDQUFDO2FBQ0QsVUFBeUIsR0FBWTtZQUNuQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLENBQUM7OztPQUhBO0lBUUQsc0JBQVcsdURBQWdCO1FBSjNCOzs7V0FHRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RCxDQUFDO2FBQ0QsVUFBNEIsR0FBWTtZQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakQsQ0FBQzs7O09BSEE7SUFTRCxzQkFBVyw0REFBcUI7UUFMaEM7Ozs7V0FJRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNuRSxDQUFDO2FBQ0QsVUFBaUMsS0FBYTtZQUM1QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQzs7O09BSEE7SUFRRCxzQkFBVywwREFBbUI7UUFKOUI7OztXQUdHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdELENBQUM7YUFDRCxVQUErQixHQUFXO1lBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNsRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVELENBQUM7UUFDSCxDQUFDOzs7T0FOQTtJQVlELHNCQUFXLDBEQUFtQjtRQUw5Qjs7OztXQUlHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVELENBQUM7YUFDRCxVQUErQixHQUFZO1lBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ3RELENBQUM7OztPQUpBO0lBUUQsc0JBQVcsaURBQVU7UUFIckI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELENBQUM7YUFDRCxVQUFzQixHQUFXO1lBQy9CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUNwRCxDQUFDOzs7T0FKQTtJQVNELHNCQUFXLHVEQUFnQjtRQUozQjs7O1dBR0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQztRQUNuQyxDQUFDOzs7T0FBQTtJQUNNLG1EQUFlLEdBQXRCLFVBQXVCLEtBQWE7UUFDbEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM5QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUNkLFVBQVUsRUFDVixJQUFJLENBQUMsbUJBQW1CLElBQUksS0FBSyxDQUNsQyxDQUFDO1lBQ0YsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLFVBQVUsSUFBSSxPQUFPLENBQUM7WUFDeEIsQ0FBQztRQUNILENBQUM7UUFDRCxpQkFBTSxlQUFlLFlBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDekUsQ0FBQztJQUNPLHdEQUFvQixHQUE1QixVQUNFLEtBQWlCLEVBQ2pCLEtBQWEsRUFDYixTQUFrQjtRQUVsQixFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDZixLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNYLENBQUM7UUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBUUQsc0JBQVcsa0RBQVc7UUFOdEI7Ozs7O1dBS0c7YUFDSDtZQUNFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUMxRCxNQUFNLENBQUMsQ0FDTCxJQUFJLENBQUMsYUFBYTtnQkFDbEIsQ0FBQyxJQUFJLENBQUMsVUFBVTtnQkFDaEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUNyQyxDQUFDO1FBQ0osQ0FBQzs7O09BQUE7SUFPRCxzQkFBVyxxREFBYztRQU56Qjs7Ozs7V0FLRzthQUNIO1lBQ0UsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztnQkFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQzFELE1BQU0sQ0FBQyxDQUNMLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQ3JCLENBQUMsSUFBSSxDQUFDLFVBQVU7Z0JBQ2hCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FDckMsQ0FBQztRQUNKLENBQUM7OztPQUFBO0lBQ1MsaURBQWEsR0FBdkI7UUFDRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDbkMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDcEMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksd0JBQXdCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztZQUNyQyxDQUFDO1FBQ0gsQ0FBQztRQUNELFVBQUksQ0FBQyxNQUFNLEVBQUMsTUFBTSxZQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sU0FBSyxNQUFNLEdBQUU7UUFDckQsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDOztJQUNwRCxDQUFDO0lBTUQsc0JBQVcsd0RBQWlCO1FBTDVCOzs7O1dBSUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNwRCxDQUFDO2FBQ0QsVUFBNkIsR0FBUTtZQUNuQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEQsQ0FBQzs7O09BSEE7SUFVRCxzQkFBVyxnRUFBeUI7UUFOcEM7Ozs7O1dBS0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkUsQ0FBQzthQUNELFVBQXFDLEdBQVk7WUFDL0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDJCQUEyQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFELENBQUM7OztPQUhBO0lBSVMsdURBQW1CLEdBQTdCO1FBQ0UsTUFBTSxDQUFDLENBQ0wsaUJBQU0sbUJBQW1CLFdBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUN6RSxDQUFDO0lBQ0osQ0FBQztJQUNTLG1EQUFlLEdBQXpCO1FBQ0UsRUFBRSxDQUFDLENBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDekMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQ3RDLENBQUMsQ0FBQyxDQUFDO1lBQ0QsaUJBQU0sZUFBZSxXQUFFLENBQUM7WUFDeEIsTUFBTSxDQUFDO1FBQ1QsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3BELElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNsQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztJQUN4QixDQUFDO0lBQ00sMkNBQU8sR0FBZDtRQUNFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM3QyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUM3QyxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFDTyw4Q0FBVSxHQUFsQixVQUFtQixHQUFRO1FBQ3pCLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDckIsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzdDLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDhDQUFVLEdBQWpCO1FBQ0UsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNuQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDL0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNwQixDQUFDO1FBQ0QsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQ0Q7Ozs7O09BS0c7SUFDSSw0Q0FBUSxHQUFmO1FBQ0UsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzFCLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN4QixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9DLEVBQUUsQ0FBQyxDQUNELENBQUMsQ0FBQyxRQUFRO2dCQUNWLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO2dCQUN2QixRQUFRLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUMxQixDQUFDLENBQUMsQ0FBQztnQkFDRCxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7UUFDSCxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQ0QsSUFBSSxDQUFDLHlCQUF5QjtZQUM5QixDQUFDLENBQUMsUUFBUTtZQUNWLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQ3ZCLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNuQixRQUFRLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUMxQixDQUFDLENBQUMsQ0FBQztZQUNELFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FDWixRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFDN0IsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQzlCLENBQUM7UUFDSixDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztRQUN4QixDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ08sNkNBQVMsR0FBakIsVUFBa0IsR0FBUSxFQUFFLElBQVM7UUFDbkMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNyQixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBQ0Q7Ozs7Ozs7O09BUUc7SUFDSSxpREFBYSxHQUFwQixVQUFxQixLQUFVO1FBQzdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUNqQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksaURBQWEsR0FBcEI7UUFDRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3hFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksaURBQWEsR0FBcEI7UUFDRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUNEOzs7OztPQUtHO0lBQ0ksK0NBQVcsR0FBbEIsVUFBbUIsS0FBVTtRQUMzQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkIsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3JFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDbEQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDTyxpREFBYSxHQUFyQixVQUFzQixHQUFRO1FBQzVCLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDekQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN2QixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQztnQkFBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDO0lBQ00sa0RBQWMsR0FBckI7UUFDRSxpQkFBTSxjQUFjLFdBQUUsQ0FBQztRQUN2QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUNNLHdEQUFvQixHQUEzQjtRQUNFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFDTSwrQ0FBVyxHQUFsQjtRQUNFLGlCQUFNLFdBQVcsV0FBRSxDQUFDO1FBQ3BCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBQ00sd0RBQW9CLEdBQTNCLFVBQTRCLElBQVksRUFBRSxLQUFhO1FBQ3JELEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ08sK0RBQTJCLEdBQW5DLFVBQW9DLEtBQWE7UUFDL0MsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixLQUFLLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM3QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3JCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzdELEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3BCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN0QixHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLEVBQUUsQ0FBQyxDQUNELENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQztnQkFDN0IsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FDN0MsQ0FBQyxDQUFDLENBQUM7Z0JBQ0QsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2QsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUNNLDhEQUEwQixHQUFqQyxVQUNFLElBQVksRUFDWixVQUFrQjtRQUVsQixNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQ3RDLENBQUMsQ0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLCtCQUErQixDQUNuRCxJQUFJLENBQUMsU0FBUyxFQUNkLElBQUksRUFDSixVQUFVLENBQ1g7WUFDSCxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1gsQ0FBQztJQUNNLHFEQUFpQixHQUF4QixVQUF5QixLQUFvQjtRQUMzQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztRQUNoQyxJQUFJLFVBQVUsR0FBZSxFQUFFLENBQUM7UUFDaEMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFDeEMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztJQUNNLGdFQUE0QixHQUFuQyxVQUNFLE9BQWdDLEVBQ2hDLE9BQVk7UUFFWixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUMsT0FBTztZQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ1YsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7UUFDcEMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUM7UUFDOUMsSUFBSSxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQW9CLENBQUM7UUFDOUMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFDeEMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDWCxJQUFJLEVBQUUsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO2dCQUNwQyxJQUFJLEVBQUUsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO2dCQUNwQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVE7YUFDaEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDZixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDMUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUM7b0JBQUMsUUFBUSxDQUFDO2dCQUMvQyxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUNYLElBQUksRUFBRSxRQUFRLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7b0JBQ2xDLElBQUksRUFBRSxRQUFRLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7b0JBQ2xDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtpQkFDaEMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ00sb0RBQWdCLEdBQXZCLFVBQXdCLFFBQXVCLEVBQUUsSUFBbUI7UUFBNUMsMENBQXVCO1FBQUUsa0NBQW1CO1FBQ2xFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDLGlCQUFNLGdCQUFnQixZQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2IsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQ0QsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDM0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNTLHFEQUFpQixHQUEzQjtRQUNFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDckMsQ0FBQztRQUNELGlCQUFNLGlCQUFpQixXQUFFLENBQUM7SUFDNUIsQ0FBQztJQUNNLGdEQUFZLEdBQW5CO1FBQ0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN6QyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQzNDLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztRQUN6QyxpQkFBTSxZQUFZLFdBQUUsQ0FBQztJQUN2QixDQUFDO0lBQ00sb0RBQWdCLEdBQXZCO1FBQ0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2pDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDcEMsQ0FBQztRQUNELGlCQUFNLGdCQUFnQixXQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNNLGdEQUFZLEdBQW5CLFVBQW9CLE1BQXNCLEVBQUUsVUFBMEI7UUFDcEUsaUJBQU0sWUFBWSxZQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDTyxrREFBYyxHQUF0QjtRQUNFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxDQUNmLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUM1QixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FDakMsQ0FBQztJQUNKLENBQUM7SUFDUyxzREFBa0IsR0FBNUIsVUFDRSxNQUFzQixFQUN0QixVQUEwQjtRQUUxQixJQUFJLFNBQVMsR0FBNkIsRUFBRSxDQUFDO1FBQzdDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLFlBQVksTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN2QyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3RCxTQUFTLENBQUMsd0JBQXdCLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxXQUFXLENBQUM7WUFDbkUsU0FBUyxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUNELHFEQUFpQixHQUFqQixVQUFrQixJQUFZO1FBQzVCLGlCQUFNLGlCQUFpQixZQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQzlCLHdCQUF3QixDQUFDLGdCQUFnQixDQUMxQyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFDTSw2Q0FBUyxHQUFoQixVQUFpQixZQUE0QjtRQUE1QixrREFBNEI7UUFDM0MsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNqRCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQztZQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDeEQsTUFBTSxDQUFDLGlCQUFNLFNBQVMsWUFBQyxZQUFZLENBQUMsSUFBSSxhQUFhLENBQUM7UUFDeEQsQ0FBQztJQUNILENBQUM7SUFDTSx5REFBcUIsR0FBNUI7UUFDRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDekMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3ZDLENBQUM7UUFDSCxDQUFDO1FBQ0QsaUJBQU0scUJBQXFCLFdBQUUsQ0FBQztJQUNoQyxDQUFDO0lBQ00sZ0RBQVksR0FBbkI7UUFDRSxJQUFJLE1BQU0sR0FBRyxpQkFBTSxZQUFZLFdBQUUsQ0FBQztRQUNsQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDekMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzFDLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDekMsRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2pDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUNTLHVEQUFtQixHQUE3QixVQUE4QixVQUFtQjtRQUMvQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDcEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNyRCxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakUsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUFDLFFBQVEsQ0FBQztZQUNuQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLHdEQUFvQixHQUE1QixVQUNFLFVBQWtCLEVBQ2xCLEdBQVEsRUFDUixVQUFtQjtRQUVuQixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDckIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqRCxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsUUFBUSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDOUQsQ0FBQztZQUNELEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNmLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2xELENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTyxvREFBZ0IsR0FBeEIsVUFBeUIsWUFBcUI7UUFDNUMsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDekIsSUFBSSxTQUFTLEdBQWUsRUFBRSxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDakQsUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksUUFBUSxDQUFDO1lBQ3BFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUM7WUFDRCxHQUFHLEdBQUcsUUFBUSxJQUFJLEdBQUcsQ0FBQztRQUN4QixDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDTyxxREFBaUIsR0FBekIsVUFBMEIsS0FBaUIsRUFBRSxTQUFxQjtRQUNoRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2hDLElBQUksUUFBUSxHQUFhLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNsRCxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQzNCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxQixRQUFRLENBQUMsUUFBUSxDQUNmLElBQUksbUVBQW1CLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUN4RCxDQUFDO2dCQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDUyxrREFBYyxHQUF4QjtRQUNFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ2hELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEMsSUFBSSwrREFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2QyxLQUFLLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUMzQixLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUM1QixJQUFJLHdCQUF3QixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNTLGdFQUE0QixHQUF0QztRQUNFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3hDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixLQUFLLENBQUMsMEJBQTBCLEdBQUc7WUFDakMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO1FBQ2pELENBQUMsQ0FBQztRQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ08sb0VBQWdDLEdBQXhDO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxTQUFTO1lBQzVDLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCO1lBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBQ1Msd0RBQW9CLEdBQTlCO1FBQ0UsTUFBTSxDQUFDLElBQUksMERBQVUsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFDTyw2REFBeUIsR0FBakM7UUFDRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDM0MsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNyQixJQUFJLGFBQWEsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9ELEVBQUUsQ0FBQyxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7SUFDbEMsQ0FBQztJQUNNLG9EQUFnQixHQUF2QixVQUF3QixRQUFhO1FBQ25DLGlCQUFNLGdCQUFnQixZQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ2pDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDSCxDQUFDO0lBQ00sd0RBQW9CLEdBQTNCLFVBQTRCLFFBQWE7UUFDdkMsaUJBQU0sb0JBQW9CLFlBQUMsUUFBUSxDQUFDLENBQUM7UUFDckMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBQ08sOERBQTBCLEdBQWxDLFVBQW1DLEtBQWlCO1FBQ2xELElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDaEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xELENBQUMsQ0FBQyx1QkFBdUIsQ0FDdkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsR0FBRyw0REFBUSxDQUFDLGFBQWEsQ0FBQyxDQUNsRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFDTywyREFBdUIsR0FBL0IsVUFBZ0MsS0FBaUI7UUFDL0MsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNoQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQixDQUFDLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7SUFDUyw2Q0FBUyxHQUFuQjtRQUNFLGlCQUFNLFNBQVMsV0FBRSxDQUFDO1FBQ2xCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUNELDJCQUEyQjtJQUMzQixnREFBWSxHQUFaLFVBQWEsSUFBaUI7UUFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxvREFBZ0IsR0FBaEIsVUFBaUIsSUFBaUI7UUFDaEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN2QixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDeEIsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDdkUsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDdkIsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3pCLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQztZQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDM0UsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBQ0Qsb0RBQWdCLEdBQWhCLFVBQWlCLElBQWlCLEVBQUUsSUFBWSxFQUFFLEdBQVE7UUFDeEQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN2QixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7WUFBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNwQyxJQUFJLE1BQU0sR0FBRyx5REFBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2QsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMzQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQixDQUFDO1FBQ0gsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDNUIsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxzQkFBc0IsQ0FDcEUsSUFBSSxDQUNMLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7UUFDcEIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUNsQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNoQixJQUFJLE9BQU8sR0FBRztnQkFDWixRQUFRLEVBQUUsSUFBSTtnQkFDZCxLQUFLLEVBQTZCLElBQUssQ0FBQyxLQUFLO2dCQUM3QyxJQUFJLEVBQUUsSUFBSTtnQkFDVixTQUFTLEVBQUUsS0FBSztnQkFDaEIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQ3hCLEtBQUssRUFBRSxHQUFHO2FBQ1gsQ0FBQztZQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsNEJBQTRCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBQ0QsNkNBQVMsR0FBVDtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFDRCwrQ0FBVyxHQUFYO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUNNLGdEQUFZLEdBQW5CLFVBQ0UsT0FPQztRQVBEO1lBTUUsWUFBWSxFQUFFLElBQUk7U0FDbkI7UUFFRCxJQUFJLGlCQUFpQixHQUFHLGlCQUFNLFlBQVksWUFBQyxPQUFPLENBQUMsQ0FBQztRQUNwRCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDaEMsaUJBQWlCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUN0QyxVQUFDLEtBQWlCLEVBQUUsS0FBYTtnQkFDL0IsSUFBSSxhQUFhLEdBQVE7b0JBQ3ZCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUs7b0JBQ3pCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxJQUFJLE9BQU87b0JBQzdCLEtBQUssRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFO29CQUN2QixZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtvQkFDOUIsU0FBUyxFQUFFLFVBQUMsR0FBUTt3QkFDbEIsY0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO29CQUFuRCxDQUFtRDtvQkFDckQsTUFBTSxFQUFFLElBQUk7b0JBQ1osSUFBSSxFQUFFLEtBQUssQ0FBQyxTQUFTO3lCQUNsQixHQUFHLENBQUMsVUFBQyxRQUFrQixJQUFLLGVBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQTlCLENBQThCLENBQUM7eUJBQzNELE1BQU0sQ0FBQyxVQUFDLENBQU0sSUFBSyxRQUFDLENBQUMsQ0FBQyxFQUFILENBQUcsQ0FBQztpQkFDM0IsQ0FBQztnQkFDRixDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLHFCQUFXO29CQUM5QyxhQUFhLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxHQUFTLEtBQU0sQ0FDcEQsV0FBVyxDQUFDLFlBQVksQ0FDekIsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQztnQkFDSCxNQUFNLENBQUMsYUFBYSxDQUFDO1lBQ3ZCLENBQUMsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0lBQ0gsZ0NBQUM7QUFBRCxDQUFDLENBOXVDOEMsMkRBQVEsR0E4dUN0RDs7QUFFRCwrREFBVSxDQUFDLFFBQVEsQ0FDakIsY0FBYyxFQUNkO0lBQ0U7UUFDRSxJQUFJLEVBQUUsa0JBQWtCO1FBQ3hCLGVBQWUsRUFBRSxXQUFXO1FBQzVCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsbUJBQW1CLEVBQUUsS0FBSztLQUMzQjtJQUNELEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixFQUFFO0lBQ3pFO1FBQ0UsSUFBSSxFQUFFLDBCQUEwQjtRQUNoQyxxQkFBcUIsRUFBRSx3QkFBd0I7S0FDaEQ7SUFDRCxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO0lBQ2hELEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7SUFDbkQ7UUFDRSxJQUFJLEVBQUUsbUJBQW1CO1FBQ3pCLE9BQU8sRUFBRSxDQUFDO1FBQ1YsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztLQUM1QztJQUNELEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUU7SUFDNUM7UUFDRSxJQUFJLEVBQUUsc0JBQXNCO1FBQzVCLE9BQU8sRUFBRSw0REFBUSxDQUFDLHNCQUFzQjtLQUN6QztJQUNELDhCQUE4QjtJQUM5QixtQ0FBbUM7SUFDbkM7UUFDRSxJQUFJLEVBQUUsYUFBYTtRQUNuQixPQUFPLEVBQUUsU0FBUztRQUNsQixPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUM7S0FDL0Q7SUFDRCxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7SUFDbkI7UUFDRSxJQUFJLEVBQUUscUJBQXFCO1FBQzNCLHFCQUFxQixFQUFFLHdCQUF3QjtLQUNoRDtJQUNELEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFO0lBQ2pDO1FBQ0UsSUFBSSxFQUFFLG1CQUFtQjtRQUN6QixxQkFBcUIsRUFBRSxzQkFBc0I7S0FDOUM7SUFDRCxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUU7SUFDbEUsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUU7SUFDeEUsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixFQUFFO0lBQ3BFLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRTtJQUNwRTtRQUNFLElBQUksRUFBRSxxQkFBcUI7UUFDM0IsT0FBTyxFQUFFLEtBQUs7UUFDZCxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQztLQUN4QztJQUNELEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7SUFDOUM7UUFDRSxJQUFJLEVBQUUsWUFBWTtRQUNsQixPQUFPLEVBQUUsTUFBTTtRQUNmLE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUM7S0FDeEU7SUFDRDtRQUNFLElBQUksRUFBRSx1QkFBdUI7UUFDN0IsT0FBTyxFQUFFLFNBQVM7UUFDbEIsT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDO0tBQzlDO0NBQ0YsRUFDRDtJQUNFLE1BQU0sQ0FBQyxJQUFJLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzNDLENBQUMsRUFDRCxVQUFVLENBQ1gsQ0FBQztBQUNGLHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxjQUFJO0lBQzVELE1BQU0sQ0FBQyxJQUFJLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUNuK0N1QztBQUNVO0FBQ1M7QUFDUjtBQUVyRDs7R0FFRztBQUNIO0lBQTZDLDBGQUFvQjtJQUMvRCxpQ0FBbUIsSUFBWTtRQUEvQixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQUNaO1FBRmtCLFVBQUksR0FBSixJQUFJLENBQVE7O0lBRS9CLENBQUM7SUFDTSx5Q0FBTyxHQUFkO1FBQ0UsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBQ1Msd0RBQXNCLEdBQWhDO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFJRCxzQkFBVyxvREFBZTtRQUgxQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6RCxDQUFDO2FBQ0QsVUFBMkIsR0FBWTtZQUNyQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEQsQ0FBQzs7O09BSEE7SUFJRCxzQkFBVyx1REFBa0I7YUFBN0I7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbEQsQ0FBQzs7O09BQUE7SUFDRCxzQkFBVyx1REFBa0I7YUFBN0I7WUFDRSxNQUFNLENBQUMsMEVBQWtCLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RELENBQUM7OztPQUFBO0lBQ0QsNERBQTBCLEdBQTFCO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFDSCw4QkFBQztBQUFELENBQUMsQ0E1QjRDLGtGQUFvQixHQTRCaEU7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQ2pCLFlBQVksRUFDWixDQUFDLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUNyRDtJQUNFLE1BQU0sQ0FBQyxJQUFJLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3pDLENBQUMsRUFDRCxjQUFjLENBQ2YsQ0FBQztBQUVGLHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxjQUFJO0lBQzFELElBQUksQ0FBQyxHQUFHLElBQUksdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyx5RUFBZSxDQUFDLGNBQWMsQ0FBQztJQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ1gsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuRHFDO0FBQ0Y7QUFDSTtBQUNVO0FBRWQ7QUFFdEM7O0dBRUc7QUFDSDtJQUF5QyxzRkFBUTtJQUsvQyw2QkFBbUIsSUFBWTtRQUEvQixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQWdDWjtRQWpDa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixLQUFJLENBQUMsS0FBSyxHQUFHLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QyxJQUFJLElBQUksR0FBRyxLQUFJLENBQUM7UUFDaEIsS0FBSSxDQUFDLHNDQUFzQyxDQUFDLE9BQU8sRUFBRTtZQUNuRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxVQUFTLE1BQVcsRUFBRSxPQUFZO1lBQzNELEVBQUUsQ0FBQyxDQUNELE9BQU8sQ0FBQyxJQUFJLElBQUksU0FBUztnQkFDekIsT0FBTyxDQUFDLElBQUksSUFBSSxTQUFTO2dCQUN6QixPQUFPLENBQUMsSUFBSSxJQUFJLFVBQ2xCLENBQUMsQ0FBQyxDQUFDO2dCQUNELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7WUFDcEQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSwwQkFBMEIsR0FBRyxLQUFJLENBQUMsdUJBQXVCLENBQzNELG9CQUFvQixFQUNwQixLQUFJLEVBQ0osSUFBSSxDQUNMLENBQUM7UUFDRixJQUFJLDBCQUEwQixHQUFHLEtBQUksQ0FBQyx1QkFBdUIsQ0FDM0Qsb0JBQW9CLEVBQ3BCLEtBQUksRUFDSixJQUFJLENBQ0wsQ0FBQztRQUNGLDBCQUEwQixDQUFDLGlCQUFpQixHQUFHLFVBQVMsSUFBSTtZQUMxRCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDO1FBQ0YsMEJBQTBCLENBQUMsaUJBQWlCLEdBQUcsVUFBUyxJQUFJO1lBQzFELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNsQyxDQUFDLENBQUM7O0lBQ0osQ0FBQztJQUNNLDBDQUFZLEdBQW5CO1FBQ0UsaUJBQU0sWUFBWSxXQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBT0Qsc0JBQVcsMkNBQVU7UUFOckI7Ozs7O1dBS0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7YUFDRCxVQUFzQixHQUFlO1lBQ25DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQzs7O09BSEE7SUFVRCxzQkFBVyx3Q0FBTztRQU5sQjs7Ozs7V0FLRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQzthQUNELFVBQW1CLEdBQVc7WUFDNUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDaEUsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNyQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7OztPQUxBO0lBWUQsc0JBQVcsd0NBQU87UUFObEI7Ozs7O1dBS0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7YUFDRCxVQUFtQixHQUFXO1lBQzVCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ2hFLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QyxDQUFDOzs7T0FMQTtJQVlELHNCQUFXLHlDQUFRO1FBTm5COzs7OztXQUtHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDO2FBQ0QsVUFBb0IsR0FBVztZQUM3QixFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDdEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFDL0QsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNwQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7OztPQU5BO0lBT1MsaURBQW1CLEdBQTdCLFVBQThCLFVBQW1CO1FBQy9DLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDOUIsSUFBSSxHQUFHLEdBQUcsNkRBQVMsQ0FBQyxvQkFBb0IsQ0FDdEMsSUFBSSxDQUFDLGlCQUFpQixFQUN0QixJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7UUFDRixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUNELHNCQUFJLGtEQUFpQjthQUFyQjtZQUNFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUN2RCxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ3pCLE9BQ0UsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPO2dCQUNyQixHQUFHLENBQUMsTUFBTSxHQUFHLDJEQUFRLENBQUMsMkJBQTJCLEVBQ2pELENBQUM7Z0JBQ0QsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLDZEQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDekIsQ0FBQztZQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDYixDQUFDOzs7T0FBQTtJQUNNLHFDQUFPLEdBQWQ7UUFDRSxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFDRCx3REFBMEIsR0FBMUI7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNNLDRDQUFjLEdBQXJCO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFDTSwwQ0FBWSxHQUFuQjtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBSUQsc0JBQVcsbURBQWtCO1FBSDdCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDN0QsQ0FBQzthQUNELFVBQThCLEdBQVc7WUFDdkMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNELENBQUM7OztPQUhBO0lBSUQsc0JBQUksc0RBQXFCO2FBQXpCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3pELENBQUM7OztPQUFBO0lBSUQsc0JBQVcsbURBQWtCO1FBSDdCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDN0QsQ0FBQzthQUNELFVBQThCLEdBQVc7WUFDdkMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNELENBQUM7OztPQUhBO0lBSUQsc0JBQUksc0RBQXFCO2FBQXpCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3pELENBQUM7OztPQUFBO0lBQ0gsMEJBQUM7QUFBRCxDQUFDLENBM0p3QywyREFBUSxHQTJKaEQ7O0FBQ0QsK0RBQVUsQ0FBQyxRQUFRLENBQ2pCLFFBQVEsRUFDUjtJQUNFLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7SUFDN0M7UUFDRSxJQUFJLEVBQUUsYUFBYTtRQUNuQixxQkFBcUIsRUFBRSxnQkFBZ0I7UUFDdkMsTUFBTSxFQUFFLEtBQUs7S0FDZDtJQUNEO1FBQ0UsSUFBSSxFQUFFLHdCQUF3QjtLQUMvQjtJQUNELEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUU7SUFDdEMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRTtJQUN0QyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO0lBQ3ZDO1FBQ0UsSUFBSSxFQUFFLG9CQUFvQjtRQUMxQixlQUFlLEVBQUUsd0JBQXdCO1FBQ3pDLHFCQUFxQixFQUFFLHVCQUF1QjtLQUMvQztJQUNEO1FBQ0UsSUFBSSxFQUFFLG9CQUFvQjtRQUMxQixlQUFlLEVBQUUsd0JBQXdCO1FBQ3pDLHFCQUFxQixFQUFFLHVCQUF1QjtLQUMvQztDQUNGLEVBQ0Q7SUFDRSxNQUFNLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNyQyxDQUFDLEVBQ0QsVUFBVSxDQUNYLENBQUM7QUFDRix5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsY0FBSTtJQUN0RCxNQUFNLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2QyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ3ZNcUQ7QUFDZDtBQUcxQzs7R0FFRztBQUNIO0lBQXNDLG1GQUFRO0lBQzVDLDBCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBQ1o7UUFGa0IsVUFBSSxHQUFKLElBQUksQ0FBUTs7SUFFL0IsQ0FBQztJQUNNLGtDQUFPLEdBQWQ7UUFDRSxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFDRCxzQkFBVyxzQ0FBUTthQUFuQjtZQUNFLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDZixDQUFDOzs7T0FBQTtJQUNELHNCQUFXLHNDQUFRO2FBQW5CO1lBQ0UsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNmLENBQUM7OztPQUFBO0lBQ00sMkNBQWdCLEdBQXZCO1FBQ0UsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxzQkFBVyx3Q0FBVTthQUFyQjtZQUNFLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDZixDQUFDOzs7T0FBQTtJQUNNLHVDQUFZLEdBQW5CO1FBQ0UsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDTSxxREFBMEIsR0FBakM7UUFDRSxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNNLDRDQUFpQixHQUF4QixVQUF5QixLQUFvQixJQUFHLENBQUM7SUFDMUMsdURBQTRCLEdBQW5DLFVBQ0UsT0FBZ0MsRUFDaEMsT0FBWSxJQUNYLENBQUM7SUFDRywyQ0FBZ0IsR0FBdkIsVUFBd0IsUUFBdUIsRUFBRSxJQUFtQjtRQUE1QywwQ0FBdUI7UUFBRSxrQ0FBbUI7UUFDbEUsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFDSCx1QkFBQztBQUFELENBQUMsQ0FqQ3FDLDJEQUFRLEdBaUM3Qzs7QUFDRCwrREFBVSxDQUFDLFFBQVEsQ0FDakIsVUFBVSxFQUNWO0lBQ0UsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDakMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDdkMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDckMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDcEMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDeEMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDekMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDdEMsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtJQUM3QyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtJQUNwQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtDQUN2QyxFQUNEO0lBQ0UsTUFBTSxDQUFDLElBQUksZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEMsQ0FBQyxFQUNELFVBQVUsQ0FDWCxDQUFDOzs7Ozs7Ozs7O0FDM0RtRDtBQUNyRDtJQXlnQkU7UUFsRVEsVUFBSyxHQUFrQixJQUFJLENBQUM7UUFtRWxDLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUMxRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixJQUFJLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQ3BDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FDcEMsQ0FBQztnQkFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQTFFTSx1QkFBUyxHQUFoQixVQUFpQixZQUFvQjtRQUNuQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckQsRUFBRSxDQUFDLENBQ0QsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDN0IsUUFBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssWUFDckQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0QsTUFBTSxDQUFnQixRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSx5QkFBVyxHQUFsQixVQUFtQixZQUFvQjtRQUNyQyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLEtBQUssQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDO1FBQ3hCLHVEQUF1RDtRQUN2RCx3Q0FBd0M7UUFDeEMsc0VBQXNFO1FBQ3RFLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9DLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sQ0FBZ0IsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNwQyxDQUFDO0lBRWEsd0JBQVUsR0FBeEIsVUFDRSxTQUE2QixFQUM3QixhQUFrQztRQURsQyxpREFBNkI7UUFDN0IsMERBQWtDO1FBRWxDLElBQUksUUFBYSxDQUFDO1FBQ2xCLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLG1CQUFtQixDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRSxRQUFRLEdBQVMsYUFBYyxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQztZQUN4RCwwRUFBUyxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7UUFDcEMsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sUUFBUSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7WUFDbEMsMEVBQVMsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQ3JDLENBQUM7UUFFRCxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLE9BQUssR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUMsQ0FBQztZQUMvRCxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ1gsT0FBSyxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLE9BQUssR0FDUCxhQUFhLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztvQkFDcEMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFdkMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQVE7b0JBQ3BDLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDckMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFLLENBQUMsQ0FBQyxPQUFPLENBQ3hCLDJCQUFpQjt3QkFDZixRQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUNoQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLEVBQ3pDLE9BQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUN6QixDQUFDO29CQUhGLENBR0UsQ0FDTCxDQUFDO29CQUNGLE9BQUssQ0FBQyxVQUFVLENBQ2QsYUFBYSxHQUFHLFFBQVEsR0FBRyxLQUFLLEdBQUcsV0FBVyxHQUFHLElBQUksRUFDckQsQ0FBQyxDQUNGLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFnQk0sd0NBQWdCLEdBQXZCLFVBQXdCLEtBQW9CO1FBQzFDLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBUTtnQkFDaEQsWUFBSyxDQUFDLFVBQVUsQ0FDZCxRQUFRLEdBQUcsS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxFQUN4RCxDQUFDLENBQ0Y7WUFIRCxDQUdDLENBQ0YsQ0FBQztZQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBUTtnQkFDL0MsS0FBSyxDQUFDLFVBQVUsQ0FDZCxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUs7b0JBQ2pDLEtBQUs7b0JBQ0wsUUFBUTtvQkFDUixLQUFLO29CQUNMLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSztvQkFDbkMsTUFBTSxFQUNSLENBQUMsQ0FDRixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQXhpQmMsbUNBQXFCLEdBQUcsVUFBVSxDQUFDO0lBRXBDLG9CQUFNLEdBQThCO1FBQ2hELHVCQUF1QjtRQUN2QixrRUFBa0U7UUFDbEUseUNBQXlDO1FBQ3pDLGtGQUFrRjtRQUNsRixxQ0FBcUM7UUFDckMseUZBQXlGO1FBQ3pGLG1DQUFtQztRQUNuQywyRkFBMkY7UUFFM0YsZUFBZSxFQUFFLHlCQUF5QjtRQUUxQyxpQkFBaUIsRUFBRSwwQkFBMEI7UUFFN0MsNEJBQTRCLEVBQUUsK0JBQStCO1FBQzdELCtGQUErRixFQUM3RiwwQ0FBMEM7UUFDNUMscUNBQXFDLEVBQUUsaUJBQWlCO1FBQ3hELHVHQUF1RyxFQUNyRyx3QkFBd0I7UUFFMUIsa0VBQWtFLEVBQ2hFLG9DQUFvQztRQUN0Qyw2Q0FBNkMsRUFDM0MscUNBQXFDO1FBRXZDLFNBQVMsRUFBRSxjQUFjO1FBQ3pCLGtCQUFrQixFQUFFLGFBQWE7UUFDakMsNkJBQTZCLEVBQUUsYUFBYTtRQUM1QyxVQUFVLEVBQUUsNkRBQTZEO1FBQ3pFLFdBQVcsRUFBRSxhQUFhO1FBQzFCLGVBQWUsRUFBRSxtREFBbUQ7UUFDcEUsaUJBQWlCLEVBQUUsNkNBQTZDO1FBQ2hFLDZCQUE2QixFQUFFLG9CQUFvQjtRQUNuRCw2QkFBNkIsRUFBRSxvQkFBb0I7UUFDbkQsMEJBQTBCLEVBQUUsK0NBQStDO1FBQzNFLHVCQUF1QixFQUFFLCtDQUErQztRQUN4RSxtQ0FBbUMsRUFBRSx1QkFBdUI7UUFDNUQsK0NBQStDLEVBQUUsd0JBQXdCO1FBQ3pFLDZCQUE2QixFQUMzQiw2REFBNkQ7UUFDL0QsYUFBYSxFQUFFLHFCQUFxQjtRQUNwQyxxQkFBcUIsRUFBRSxjQUFjO1FBQ3JDLHVCQUF1QixFQUFFLHFCQUFxQjtRQUM5QyxzQkFBc0IsRUFBRSxpQ0FBaUM7UUFDekQsd0JBQXdCLEVBQUUsa0JBQWtCO1FBQzVDLGdEQUFnRCxFQUFFLHdCQUF3QjtRQUMxRSw0Q0FBNEMsRUFBRSx3QkFBd0I7UUFDdEUsMEVBQTBFLEVBQ3hFLHFCQUFxQjtRQUN2QixxREFBcUQsRUFBRSxvQkFBb0I7UUFDM0UsdURBQXVELEVBQ3JELG9CQUFvQjtRQUN0QixzREFBc0QsRUFDcEQsb0JBQW9CO1FBQ3RCLG1CQUFtQixFQUFFLHNDQUFzQztRQUMzRCxpQ0FBaUMsRUFBRSxjQUFjO1FBRWpELGFBQWEsRUFBRSwyQ0FBMkM7UUFDMUQsd0JBQXdCLEVBQUUsa0JBQWtCO1FBQzVDLDRCQUE0QixFQUFFLGtDQUFrQztRQUNoRSxvQ0FBb0MsRUFDbEMsMnhCQUEyeEI7UUFDN3hCLGdEQUFnRCxFQUM5Qyw0QkFBNEI7UUFFOUIsb0RBQW9ELEVBQ2xELHdCQUF3QjtRQUMxQixvQkFBb0IsRUFDbEIsMEdBQTBHO1FBQzVHLHdCQUF3QixFQUN0QixzR0FBc0c7UUFDeEcsMEJBQTBCLEVBQUUsc0JBQXNCO1FBQ2xELG1CQUFtQixFQUFFLGtDQUFrQztRQUV2RCxtQkFBbUIsRUFBRSxrQkFBa0I7UUFFdkMsZ0JBQWdCLEVBQUUsa0JBQWtCO1FBQ3BDLHNCQUFzQixFQUFFLGNBQWM7UUFFdEMsc0JBQXNCLEVBQ3BCLHlHQUF5RztRQUMzRyxzQkFBc0IsRUFDcEIsd0dBQXdHO1FBQzFHLHNCQUFzQixFQUNwQiw4R0FBOEc7UUFDaEgsc0JBQXNCLEVBQ3BCLHdHQUF3RztRQUMxRyxzQkFBc0IsRUFDcEIsd0dBQXdHO1FBRTFHLHlCQUF5QixFQUN2QiwwSEFBMEg7UUFDNUgseUJBQXlCLEVBQ3ZCLDRHQUE0RztRQUM5Ryx5QkFBeUIsRUFDdkIsa0hBQWtIO1FBQ3BILHlCQUF5QixFQUN2Qiw0R0FBNEc7UUFDOUcseUJBQXlCLEVBQ3ZCLDRHQUE0RztRQUU5RywyQkFBMkIsRUFBRSxxQkFBcUI7UUFFbEQsbUNBQW1DLEVBQ2pDLGdJQUFnSTtRQUNsSSxvRkFBb0YsRUFDbEYsaUJBQWlCO1FBRW5CLHlDQUF5QyxFQUN2QywyREFBMkQ7UUFFN0QsU0FBUyxFQUFFLDhEQUE4RDtRQUV6RSx5QkFBeUIsRUFBRSxzQkFBc0I7UUFFakQsOEJBQThCLEVBQzVCLDZEQUE2RDtRQUUvRCxxREFBcUQsRUFBRSxpQkFBaUI7UUFFeEUsa0ZBQWtGLEVBQ2hGLHdEQUF3RDtLQUMzRCxDQUFDO0lBRVksbUJBQUssR0FBd0Q7UUFDekUsK0JBQStCLEVBQUU7WUFDL0IsS0FBSyxFQUFFLGNBQWM7WUFDckIsS0FBSyxFQUFFLDJDQUEyQztTQUNuRDtRQUNELCtCQUErQixFQUFFO1lBQy9CLEtBQUssRUFBRSxjQUFjO1lBQ3JCLEtBQUssRUFBRSwyQ0FBMkM7U0FDbkQ7UUFDRCwrQkFBK0IsRUFBRTtZQUMvQixLQUFLLEVBQUUsY0FBYztZQUNyQixLQUFLLEVBQUUsMkNBQTJDO1NBQ25EO1FBQ0QsK0JBQStCLEVBQUU7WUFDL0IsS0FBSyxFQUFFLGNBQWM7WUFDckIsS0FBSyxFQUFFLDJDQUEyQztTQUNuRDtRQUNELCtCQUErQixFQUFFO1lBQy9CLEtBQUssRUFBRSxjQUFjO1lBQ3JCLEtBQUssRUFBRSwyQ0FBMkM7U0FDbkQ7UUFFRCxnRUFBZ0UsRUFBRTtZQUNoRSxLQUFLLEVBQUUseUNBQXlDO1lBQ2hELEtBQUssRUFBRSwyQkFBMkI7U0FDbkM7UUFDRCw0RUFBNEUsRUFBRTtZQUM1RSxLQUFLLEVBQUUsY0FBYztZQUNyQixLQUFLLEVBQUUsMkJBQTJCO1NBQ25DO1FBQ0QsdVFBQXVRLEVBQUU7WUFDdlEsS0FBSyxFQUFFLGlCQUFpQjtZQUN4QixLQUFLLEVBQUUsMkJBQTJCO1NBQ25DO1FBQ0QsNEVBQTRFLEVBQUU7WUFDNUUsS0FBSyxFQUFFLGlCQUFpQjtZQUN4QixLQUFLLEVBQUUsMkJBQTJCO1NBQ25DO1FBQ0Qsa0ZBQWtGLEVBQUU7WUFDbEYsS0FBSyxFQUFFLGdCQUFnQjtZQUN2QixLQUFLLEVBQUUsMkJBQTJCO1NBQ25DO1FBQ0QsZ1BBQWdQLEVBQUU7WUFDaFAsS0FBSyxFQUFFLGlCQUFpQjtZQUN4QixLQUFLLEVBQUUsMkJBQTJCO1NBQ25DO1FBQ0Qsd0dBQXdHLEVBQUU7WUFDeEcsS0FBSyxFQUFFLHlCQUF5QjtZQUNoQyxLQUFLLEVBQUUsMkJBQTJCO1NBQ25DO1FBQ0QsMkZBQTJGLEVBQUU7WUFDM0YsS0FBSyxFQUFFLDJDQUEyQztZQUNsRCxLQUFLLEVBQUUsMkJBQTJCO1NBQ25DO1FBQ0QsNkpBQTZKLEVBQUU7WUFDN0osS0FBSyxFQUFFLHlDQUF5QztZQUNoRCxLQUFLLEVBQUUsMkJBQTJCO1NBQ25DO1FBQ0QsNkJBQTZCLEVBQUU7WUFDN0IsS0FBSyxFQUFFLGtCQUFrQjtZQUN6QixLQUFLLEVBQUUsMkJBQTJCO1NBQ25DO1FBQ0QsNEJBQTRCLEVBQUU7WUFDNUIsS0FBSyxFQUFFLGdCQUFnQjtZQUN2QixLQUFLLEVBQUUsNEJBQTRCO1NBQ3BDO1FBQ0Qsc0NBQXNDLEVBQUU7WUFDdEMsS0FBSyxFQUFFLG1CQUFtQjtZQUMxQixLQUFLLEVBQUUsNEJBQTRCO1NBQ3BDO1FBQ0QsMkNBQTJDLEVBQUU7WUFDM0MsS0FBSyxFQUFFLG9CQUFvQjtZQUMzQixLQUFLLEVBQUUsMkJBQTJCO1NBQ25DO0tBQ0YsQ0FBQztJQUVZLHlCQUFXLEdBQWlEO1FBQ3hFLE9BQU8sRUFBRTtZQUNQLDBCQUEwQixFQUFFLFNBQVM7WUFDckMsa0NBQWtDLEVBQUUsU0FBUztZQUU3QyxhQUFhLEVBQUUsU0FBUztZQUN4QixtQkFBbUIsRUFBRSxTQUFTO1lBQzlCLHdCQUF3QixFQUFFLE9BQU87WUFDakMsMEJBQTBCLEVBQUUsT0FBTztZQUNuQyxhQUFhLEVBQUUsU0FBUztZQUN4QixlQUFlLEVBQUUsU0FBUztZQUMxQixlQUFlLEVBQUUsU0FBUztZQUUxQixjQUFjLEVBQUUsU0FBUztZQUN6Qix5QkFBeUIsRUFBRSxTQUFTO1NBQ3JDO1FBQ0QsTUFBTSxFQUFFO1lBQ04sMEJBQTBCLEVBQUUsU0FBUztZQUNyQyxrQ0FBa0MsRUFBRSxTQUFTO1lBRTdDLGFBQWEsRUFBRSxTQUFTO1lBQ3hCLG1CQUFtQixFQUFFLFNBQVM7WUFDOUIsd0JBQXdCLEVBQUUsT0FBTztZQUNqQywwQkFBMEIsRUFBRSxPQUFPO1lBQ25DLGFBQWEsRUFBRSxTQUFTO1lBQ3hCLGVBQWUsRUFBRSxTQUFTO1lBQzFCLGVBQWUsRUFBRSxTQUFTO1lBRTFCLGNBQWMsRUFBRSxTQUFTO1lBQ3pCLHlCQUF5QixFQUFFLFNBQVM7U0FDckM7UUFDRCxRQUFRLEVBQUU7WUFDUiwwQkFBMEIsRUFBRSxTQUFTO1lBQ3JDLGtDQUFrQyxFQUFFLFNBQVM7WUFFN0MsYUFBYSxFQUFFLFNBQVM7WUFDeEIsbUJBQW1CLEVBQUUsU0FBUztZQUM5Qix3QkFBd0IsRUFBRSxPQUFPO1lBQ2pDLDBCQUEwQixFQUFFLE9BQU87WUFDbkMsYUFBYSxFQUFFLFNBQVM7WUFDeEIsZUFBZSxFQUFFLFNBQVM7WUFDMUIsZUFBZSxFQUFFLFNBQVM7WUFFMUIsY0FBYyxFQUFFLFNBQVM7WUFDekIseUJBQXlCLEVBQUUsU0FBUztTQUNyQztRQUNELFFBQVEsRUFBRTtZQUNSLDBCQUEwQixFQUFFLFNBQVM7WUFDckMsa0NBQWtDLEVBQUUsU0FBUztZQUU3QyxhQUFhLEVBQUUsU0FBUztZQUN4QixtQkFBbUIsRUFBRSxTQUFTO1lBQzlCLHdCQUF3QixFQUFFLE9BQU87WUFDakMsMEJBQTBCLEVBQUUsT0FBTztZQUNuQyxhQUFhLEVBQUUsU0FBUztZQUN4QixlQUFlLEVBQUUsU0FBUztZQUMxQixlQUFlLEVBQUUsU0FBUztZQUUxQixjQUFjLEVBQUUsU0FBUztZQUN6Qix5QkFBeUIsRUFBRSxTQUFTO1NBQ3JDO1FBQ0QsS0FBSyxFQUFFO1lBQ0wsMEJBQTBCLEVBQUUsU0FBUztZQUNyQyxrQ0FBa0MsRUFBRSxTQUFTO1lBRTdDLGFBQWEsRUFBRSxTQUFTO1lBQ3hCLG1CQUFtQixFQUFFLFNBQVM7WUFDOUIsd0JBQXdCLEVBQUUsT0FBTztZQUNqQywwQkFBMEIsRUFBRSxPQUFPO1lBQ25DLGFBQWEsRUFBRSxTQUFTO1lBQ3hCLGVBQWUsRUFBRSxTQUFTO1lBQzFCLGVBQWUsRUFBRSxTQUFTO1lBRTFCLGNBQWMsRUFBRSxTQUFTO1lBQ3pCLHlCQUF5QixFQUFFLFNBQVM7U0FDckM7UUFDRCxNQUFNLEVBQUU7WUFDTiwwQkFBMEIsRUFBRSxTQUFTO1lBQ3JDLGtDQUFrQyxFQUFFLFNBQVM7WUFFN0MsYUFBYSxFQUFFLFNBQVM7WUFDeEIsbUJBQW1CLEVBQUUsU0FBUztZQUM5Qix3QkFBd0IsRUFBRSxPQUFPO1lBQ2pDLDBCQUEwQixFQUFFLE9BQU87WUFDbkMsYUFBYSxFQUFFLE1BQU07WUFDckIsZUFBZSxFQUFFLE1BQU07WUFDdkIsZUFBZSxFQUFFLFNBQVM7WUFFMUIsY0FBYyxFQUFFLFNBQVM7WUFDekIseUJBQXlCLEVBQUUsU0FBUztTQUNyQztRQUNELFdBQVcsRUFBRTtZQUNYLDBCQUEwQixFQUFFLFNBQVM7WUFDckMsa0NBQWtDLEVBQUUsU0FBUztZQUU3QyxhQUFhLEVBQUUsU0FBUztZQUN4QixtQkFBbUIsRUFBRSxTQUFTO1lBQzlCLHdCQUF3QixFQUFFLE9BQU87WUFDakMsMEJBQTBCLEVBQUUsT0FBTztZQUNuQyxhQUFhLEVBQUUsTUFBTTtZQUNyQixlQUFlLEVBQUUsTUFBTTtZQUN2QixlQUFlLEVBQUUsU0FBUztZQUUxQixjQUFjLEVBQUUsU0FBUztZQUN6Qix5QkFBeUIsRUFBRSxTQUFTO1NBQ3JDO0tBQ0YsQ0FBQztJQUNZLHNCQUFRLEdBQThCO1FBQ2xELGlCQUFpQixFQUFFLHFEQUFxRDtRQUV4RSxvQkFBb0IsRUFBRSw4QkFBOEI7UUFFcEQsOERBQThELEVBQzVELCtEQUErRDtRQUNqRSwwRUFBMEUsRUFDeEUsc0NBQXNDO1FBRXhDLDRCQUE0QixFQUFFLHVCQUF1QjtRQUNyRCxtQ0FBbUMsRUFDakMsNkNBQTZDO1FBQy9DLCtCQUErQixFQUFFLHFCQUFxQjtRQUN0RCwwQkFBMEIsRUFDeEIsc0VBQXNFO1FBQ3hFLDhCQUE4QixFQUFFLGtDQUFrQztRQUNsRSxrQ0FBa0MsRUFBRSxnQ0FBZ0M7UUFFcEUsc0NBQXNDLEVBQUUsOEJBQThCO1FBQ3RFLHFEQUFxRCxFQUNuRCwyQ0FBMkM7UUFDN0Msc0RBQXNELEVBQ3BELHFEQUFxRDtRQUV2RCxtQ0FBbUMsRUFDakMsOEZBQThGO1FBQ2hHLGlDQUFpQyxFQUMvQiw4RkFBOEY7UUFDaEcsd0NBQXdDLEVBQ3RDLDhGQUE4RjtRQUNoRyxvQ0FBb0MsRUFDbEMsOEZBQThGO1FBQ2hHLHdCQUF3QixFQUN0Qiw4RkFBOEY7UUFDaEcsMEJBQTBCLEVBQ3hCLDhGQUE4RjtRQUNoRyxvSkFBb0osRUFDbEosaUdBQWlHO1FBQ25HLDBKQUEwSixFQUN4SixnQ0FBZ0M7UUFDbEMsb0dBQW9HLEVBQ2xHLDZDQUE2QztRQUMvQyx5Q0FBeUMsRUFBRSw0QkFBNEI7UUFDdkUsdUNBQXVDLEVBQUUsNEJBQTRCO1FBQ3JFLDhDQUE4QyxFQUM1Qyw0QkFBNEI7UUFDOUIsMENBQTBDLEVBQUUsNEJBQTRCO1FBQ3hFLHlLQUF5SyxFQUN2SyxrQ0FBa0M7UUFDcEMsOEJBQThCLEVBQUUsNEJBQTRCO1FBQzVELGdDQUFnQyxFQUFFLDRCQUE0QjtRQUU5RCxvQ0FBb0MsRUFDbEMsMkNBQTJDO1FBQzdDLDRDQUE0QyxFQUMxQyxnQ0FBZ0M7UUFFbEMsaUVBQWlFLEVBQy9ELHNHQUFzRztRQUN4RywwREFBMEQsRUFDeEQsOEJBQThCO1FBQ2hDLGdFQUFnRSxFQUM5RCxrQ0FBa0M7UUFFcEMsc0NBQXNDLEVBQUUsOEJBQThCO1FBQ3RFLCtDQUErQyxFQUM3Qyw4QkFBOEI7UUFDaEMsOENBQThDLEVBQzVDLDhCQUE4QjtRQUVoQyx1Q0FBdUMsRUFDckMscUVBQXFFO1FBRXZFLGtDQUFrQyxFQUFFLHFCQUFxQjtRQUV6RCx5Q0FBeUMsRUFBRSwrQkFBK0I7UUFFMUUsbUNBQW1DLEVBQUUsdUJBQXVCO0tBQzdELENBQUM7SUFFWSwrQkFBaUIsR0FBOEI7UUFDM0QseUNBQXlDLEVBQUUsK0JBQStCO1FBQzFFLDRCQUE0QixFQUFFLHVCQUF1QjtRQUNyRCxnQ0FBZ0MsRUFBRSxxQ0FBcUM7UUFDdkUsb0JBQW9CLEVBQUUsYUFBYTtRQUNuQyx3QkFBd0IsRUFDdEIsbURBQW1EO1FBQ3JELDZCQUE2QixFQUFFLGtCQUFrQjtRQUNqRCwyQkFBMkIsRUFBRSxxQ0FBcUM7S0FDbkUsQ0FBQztJQUVZLHVDQUF5QixHQUE4QjtRQUNuRSx3RUFBd0UsRUFDdEUsaUdBQWlHO1FBQ25HLGdFQUFnRSxFQUM5RCxvQkFBb0I7UUFFdEIsK0RBQStELEVBQzdELGVBQWU7UUFFakIsc0dBQXNHLEVBQ3BHLDRCQUE0QjtRQUM5QixrSEFBa0gsRUFDaEgsNEJBQTRCO1FBQzlCLDZHQUE2RyxFQUMzRyxxQkFBcUI7UUFDdkIseUhBQXlILEVBQ3ZILHFCQUFxQjtRQUV2Qiw4RUFBOEUsRUFDNUUsNEJBQTRCO1FBQzlCLDBGQUEwRixFQUN4Riw0QkFBNEI7UUFDOUIsNkVBQTZFLEVBQzNFLGdDQUFnQztRQUNsQyx5RkFBeUYsRUFDdkYsZ0NBQWdDO1FBQ2xDLHVEQUF1RCxFQUNyRCwrREFBK0Q7UUFDakUsdURBQXVELEVBQ3JELCtEQUErRDtRQUNqRSx5REFBeUQsRUFDdkQsK0RBQStEO1FBQ2pFLHlEQUF5RCxFQUN2RCwrREFBK0Q7UUFDakUsc0VBQXNFLEVBQ3BFLCtEQUErRDtRQUNqRSwwSEFBMEgsRUFDeEgsK0RBQStEO1FBQ2pFLHNJQUFzSSxFQUNwSSxzQ0FBc0M7UUFDeEMseUNBQXlDLEVBQUUsZ0NBQWdDO1FBRTNFLDJEQUEyRCxFQUN6RCxxQkFBcUI7UUFFdkIsZ0VBQWdFLEVBQzlELGlDQUFpQztRQUNuQyw2Q0FBNkMsRUFBRSxhQUFhO1FBQzVELGlEQUFpRCxFQUMvQyxtREFBbUQ7S0FDdEQsQ0FBQztJQWtFWSxxQkFBTyxHQUFHLElBQUksQ0FBQztJQW1DL0Isb0JBQUM7Q0FBQTtBQTFpQnlCOzs7Ozs7Ozs7Ozs7O0FDREk7QUFDUztBQUd2Qzs7R0FFRztBQUNIO0lBQXVDLG9GQUFJO0lBVXpDLDJCQUFZLE9BQVksRUFBRSxZQUFnQztRQUFoQyxrREFBZ0M7UUFBMUQsWUFDRSxpQkFBTyxTQWNSO1FBV0Q7O1dBRUc7UUFDSSw0QkFBc0IsR0FBVyxDQUFDLENBQUM7UUEzQnhDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDakIsS0FBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7UUFDbEMsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sS0FBSSxDQUFDLFdBQVcsR0FBRyxLQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxLQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbkMsRUFBRSxDQUFDLENBQUMsV0FBVyxLQUFLLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNwQyxLQUFJLENBQUMsYUFBYSxHQUFtQixRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFDRCxJQUFJLElBQUksR0FBRyxLQUFJLENBQUM7UUFDaEIsS0FBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVMsTUFBTSxFQUFFLE9BQU87WUFDakQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7O0lBQ0wsQ0FBQztJQUNNLG1DQUFPLEdBQWQ7UUFDRSxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFLRCxzQkFBVyxxQ0FBTTtRQUpqQjs7O1dBR0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzFCLENBQUM7OztPQUFBO0lBVUQsc0JBQVcsd0NBQVM7UUFMcEI7Ozs7V0FJRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkQsQ0FBQzthQUNELFVBQXFCLEdBQVk7WUFDL0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDeEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDO2dCQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ2pFLENBQUM7OztPQUxBO0lBTUQ7Ozs7T0FJRztJQUNJLGdDQUFJLEdBQVg7UUFDRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLGdDQUFJLEdBQVg7UUFDRSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBTUQsc0JBQVcseUNBQVU7UUFMckI7Ozs7V0FJRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEQsQ0FBQzthQUNELFVBQXNCLEdBQVk7WUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN6QyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUM7Z0JBQzFELElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ25DLENBQUM7OztPQUxBO0lBU0Qsc0JBQVcsb0NBQUs7UUFIaEI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUMzQixDQUFDO2FBQ0QsVUFBaUIsS0FBYTtZQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDNUIsQ0FBQzs7O09BSEE7SUFJRCxzQkFBSSx1Q0FBUTthQUFaO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQzlCLENBQUM7OztPQUFBO0lBQ0Q7O09BRUc7SUFDSSxrQ0FBTSxHQUFiO1FBQ0UsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ0Q7O09BRUc7SUFDSSxvQ0FBUSxHQUFmO1FBQ0UsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQ1Msd0NBQVksR0FBdEIsVUFBdUIsT0FBWTtRQUNqQyxNQUFNLENBQUMsSUFBSSw0REFBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDUywwQ0FBYyxHQUF4QixVQUF5QixLQUFjO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFDUyw0Q0FBZ0IsR0FBMUI7UUFDRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQzVDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQy9CLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztZQUNoQixJQUFJLE9BQU8sR0FBUSxJQUFJLENBQUM7WUFDeEIsSUFBSSxJQUFJLEdBQUc7Z0JBQ1QsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQzdCLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDO1lBQ0YsT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN6RSxDQUFDO0lBQ0gsQ0FBQztJQUNTLGlEQUFxQixHQUEvQjtRQUNFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBaklhLG1DQUFpQixHQUFHLGdCQUFnQixDQUFDO0lBa0lyRCx3QkFBQztDQUFBLENBbklzQyxtREFBSSxHQW1JMUM7QUFuSTZCOzs7Ozs7Ozs7OztBQ1BDO0FBRXhCLElBQUksb0JBQW9CLEdBQUc7SUFDaEMsVUFBVSxFQUFFLFVBQVMsSUFBZTtRQUNsQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELFlBQVksRUFBRSxVQUFTLE9BQWU7UUFDcEMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0YsQ0FBQztBQUVGO0lBQUE7UUFRVSxvQkFBZSxHQUFHLENBQUMsQ0FBQztRQUNwQixZQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDZCxZQUFPLEdBQTBCLElBQUksb0RBQUssRUFBa0IsQ0FBQztJQTZCdEUsQ0FBQztJQXJDQyxzQkFBa0IsdUJBQVE7YUFBMUI7WUFDRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixXQUFXLENBQUMsYUFBYSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEQsQ0FBQztZQUNELE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDO1FBQ25DLENBQUM7OztPQUFBO0lBSU0sMkJBQUssR0FBWixVQUFhLElBQXNCO1FBQW5DLGlCQVVDO1FBVlksa0NBQXNCO1FBQ2pDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsb0JBQW9CLENBQUMsVUFBVSxDQUFDO2dCQUM3QyxLQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFDTSwwQkFBSSxHQUFYLFVBQVksSUFBc0I7UUFBdEIsa0NBQXNCO1FBQ2hDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25ELG9CQUFvQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUNNLDZCQUFPLEdBQWQ7UUFBQSxpQkFNQztRQUxDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztZQUM3QyxLQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBckNjLHlCQUFhLEdBQWdCLElBQUksQ0FBQztJQXNDbkQsa0JBQUM7Q0FBQTtBQXZDdUI7Ozs7Ozs7Ozs7QUNYa0I7QUFFbkMsSUFBSSxtQkFBbUIsR0FBRztJQUMvQixJQUFJLEVBQUUsMEJBQTBCO0lBQ2hDLE1BQU0sRUFBRSwyQkFBMkI7SUFDbkMsSUFBSSxFQUFFLDRCQUE0QjtJQUNsQyxTQUFTLEVBQUUsMENBQTBDO0lBQ3JELE1BQU0sRUFBRSwwQkFBMEI7SUFDbEMsZ0JBQWdCLEVBQUUsRUFBRTtJQUNwQixhQUFhLEVBQUUsRUFBRTtJQUNqQixVQUFVLEVBQUU7UUFDVixRQUFRLEVBQUUscUJBQXFCO1FBQy9CLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsSUFBSSxFQUFFLGlCQUFpQjtRQUN2QixLQUFLLEVBQUUsa0JBQWtCO0tBQzFCO0lBQ0QsUUFBUSxFQUFFLG9DQUFvQztJQUM5QyxXQUFXLEVBQUUsY0FBYztJQUMzQixJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUUsRUFBRTtRQUNSLEtBQUssRUFBRSxFQUFFO1FBQ1QsV0FBVyxFQUFFLEVBQUU7S0FDaEI7SUFDRCxTQUFTLEVBQUUsRUFBRTtJQUNiLGVBQWUsRUFBRSxPQUFPO0lBQ3hCLEdBQUcsRUFBRSxRQUFRO0lBQ2IsUUFBUSxFQUFFO1FBQ1IsUUFBUSxFQUFFLFNBQVM7UUFDbkIsUUFBUSxFQUFFLG1CQUFtQjtRQUM3QixhQUFhLEVBQUUsY0FBYztRQUM3QixLQUFLLEVBQUUsRUFBRTtRQUNULE1BQU0sRUFBRSxVQUFVO1FBQ2xCLFdBQVcsRUFBRSxPQUFPO1FBQ3BCLE9BQU8sRUFBRSxjQUFjO1FBQ3ZCLFFBQVEsRUFBRSxFQUFFO1FBQ1osYUFBYSxFQUFFLEVBQUU7UUFDakIsUUFBUSxFQUFFLFdBQVc7UUFDckIsTUFBTSxFQUFFLEVBQUU7S0FDWDtJQUNELEtBQUssRUFBRTtRQUNMLEtBQUssRUFBRSxZQUFZO1FBQ25CLFdBQVcsRUFBRSx3QkFBd0I7UUFDckMsU0FBUyxFQUFFLGdCQUFnQjtLQUM1QjtJQUNELEtBQUssRUFBRTtRQUNMLElBQUksRUFBRSxvQkFBb0I7UUFDMUIsSUFBSSxFQUFFLHNDQUFzQztRQUM1QyxJQUFJLEVBQUUsRUFBRTtRQUNSLFdBQVcsRUFBRSxtQkFBbUI7UUFDaEMsY0FBYyxFQUFFLHNCQUFzQjtLQUN2QztJQUNELE9BQU8sRUFBRTtRQUNQLElBQUksRUFBRSw4QkFBOEI7UUFDcEMsSUFBSSxFQUFFLEVBQUU7UUFDUixLQUFLLEVBQUUsRUFBRTtRQUNULGlCQUFpQixFQUFFLG1CQUFtQjtLQUN2QztJQUNELFFBQVEsRUFBRTtRQUNSLElBQUksRUFBRSw2QkFBNkI7UUFDbkMsSUFBSSxFQUFFLFVBQVU7UUFDaEIsV0FBVyxFQUFFLEVBQUU7UUFDZixZQUFZLEVBQUUsRUFBRTtRQUNoQixpQkFBaUIsRUFBRSxtQkFBbUI7UUFDdEMsS0FBSyxFQUFFLGtDQUFrQztRQUN6QyxNQUFNLEVBQUUsb0JBQW9CO0tBQzdCO0lBQ0QsT0FBTyxFQUFFLGNBQWM7SUFDdkIsUUFBUSxFQUFFO1FBQ1IsSUFBSSxFQUFFLEVBQUU7UUFDUixPQUFPLEVBQUUsY0FBYztRQUN2QixLQUFLLEVBQUUsNEJBQTRCO0tBQ3BDO0lBQ0QsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtJQUNsQixNQUFNLEVBQUU7UUFDTixJQUFJLEVBQUUsbUJBQW1CO1FBQ3pCLEtBQUssRUFBRSxjQUFjO1FBQ3JCLFFBQVEsRUFBRSxrQkFBa0I7UUFDNUIsZ0JBQWdCLEVBQUUsaUNBQWlDO1FBQ25ELFNBQVMsRUFBRSxtQkFBbUI7S0FDL0I7SUFDRCxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0lBQ2pDLGFBQWEsRUFBRTtRQUNiLElBQUksRUFBRSxPQUFPO1FBQ2IsTUFBTSxFQUFFLFFBQVE7UUFDaEIsU0FBUyxFQUFFLEVBQUU7UUFDYixZQUFZLEVBQUUsRUFBRTtRQUNoQixPQUFPLEVBQUUsRUFBRTtRQUNYLFVBQVUsRUFBRSxFQUFFO0tBQ2Y7SUFDRCxZQUFZLEVBQUU7UUFDWixJQUFJLEVBQUUsRUFBRTtRQUNSLE1BQU0sRUFBRSxRQUFRO1FBQ2hCLFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLEVBQUU7UUFDZCxTQUFTLEVBQUUsRUFBRTtRQUNiLFlBQVksRUFBRSxFQUFFO0tBQ2pCO0lBQ0QsWUFBWSxFQUFFO1FBQ1osSUFBSSxFQUFFLE9BQU87UUFDYixTQUFTLEVBQUUsRUFBRTtRQUNiLFNBQVMsRUFBRSxpQ0FBaUM7S0FDN0M7SUFDRCxVQUFVLEVBQUU7UUFDVixJQUFJLEVBQUUscUJBQXFCO1FBQzNCLElBQUksRUFBRSxPQUFPO1FBQ2IsS0FBSyxFQUFFLEVBQUU7UUFDVCxXQUFXLEVBQUUsRUFBRTtRQUNmLFlBQVksRUFBRSxFQUFFO1FBQ2hCLGlCQUFpQixFQUFFLFFBQVE7UUFDM0IsS0FBSyxFQUFFLG9DQUFvQztRQUMzQyxXQUFXLEVBQUUsOEJBQThCO1FBQzNDLE1BQU0sRUFBRSxvQkFBb0I7S0FDN0I7SUFDRCxXQUFXLEVBQUU7UUFDWCxJQUFJLEVBQUUsV0FBVztRQUNqQixJQUFJLEVBQUUsYUFBYTtRQUNuQixLQUFLLEVBQUUsbUJBQW1CO1FBQzFCLFdBQVcsRUFBRSwwQkFBMEI7UUFDdkMsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixRQUFRLEVBQUUsa0JBQWtCO1FBQzVCLFdBQVcsRUFBRSx1QkFBdUI7S0FDckM7SUFDRCxNQUFNLEVBQUU7UUFDTixJQUFJLEVBQUUsV0FBVztRQUNqQixJQUFJLEVBQUUsK0JBQStCO1FBQ3JDLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE9BQU8sRUFBRSxzQkFBc0I7UUFDL0IsUUFBUSxFQUFFLHVCQUF1QjtRQUNqQyxPQUFPLEVBQUUsc0JBQXNCO0tBQ2hDO0lBQ0QsSUFBSSxFQUFFLGNBQWM7SUFDcEIsVUFBVSxFQUFFLGNBQWM7SUFDMUIsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFLFdBQVc7UUFDakIsZ0JBQWdCLEVBQUUsdUJBQXVCO1FBQ3pDLE9BQU8sRUFBRSxtQkFBbUI7UUFDNUIsWUFBWSxFQUFFLHlCQUF5QjtRQUN2QyxTQUFTLEVBQUUsaUJBQWlCO1FBQzVCLFVBQVUsRUFBRSxrQkFBa0I7S0FDL0I7SUFDRCxRQUFRLEVBQUU7UUFDUixJQUFJLEVBQUUsRUFBRTtRQUNSLE1BQU0sRUFBRSxrQkFBa0I7UUFDMUIsS0FBSyxFQUFFLG9CQUFvQjtRQUMzQixPQUFPLEVBQUUscUJBQXFCO1FBQzlCLGVBQWUsRUFBRSxFQUFFO0tBQ3BCO0lBQ0QsTUFBTSxFQUFFO1FBQ04sSUFBSSxFQUFFLGVBQWU7UUFDckIsSUFBSSxFQUFFLFlBQVk7UUFDbEIsTUFBTSxFQUFFO1lBQ04sSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxLQUFLLEVBQUUsV0FBVztZQUNsQixNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLGNBQWMsRUFBRSwyQ0FBMkM7WUFDM0QsZUFBZSxFQUFFLDZDQUE2QztTQUMvRDtLQUNGO0NBQ0YsQ0FBQztBQUNJLCtEQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7QUMvSlY7QUFFbkMsSUFBSSwyQkFBMkIsR0FBRztJQUN2QyxJQUFJLEVBQUUsa0NBQWtDO0lBQ3hDLE1BQU0sRUFBRSxlQUFlO0lBQ3ZCLElBQUksRUFBRSxZQUFZO0lBQ2xCLFNBQVMsRUFBRSwwQkFBMEI7SUFDckMsTUFBTSxFQUFFLGNBQWM7SUFDdEIsZ0JBQWdCLEVBQUUsRUFBRTtJQUNwQixhQUFhLEVBQUUsRUFBRTtJQUNqQixVQUFVLEVBQUU7UUFDVixRQUFRLEVBQUUsaUNBQWlDO1FBQzNDLElBQUksRUFBRSw2QkFBNkI7UUFDbkMsSUFBSSxFQUFFLDZCQUE2QjtRQUNuQyxLQUFLLEVBQUUsOEJBQThCO0tBQ3RDO0lBQ0QsUUFBUSxFQUFFLG9DQUFvQztJQUM5QyxXQUFXLEVBQUUsY0FBYztJQUMzQixJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUUsRUFBRTtRQUNSLEtBQUssRUFBRSxFQUFFO1FBQ1QsV0FBVyxFQUFFLEVBQUU7S0FDaEI7SUFDRCxTQUFTLEVBQUUsRUFBRTtJQUNiLGVBQWUsRUFBRSxPQUFPO0lBQ3hCLEdBQUcsRUFBRSxRQUFRO0lBQ2IsUUFBUSxFQUFFO1FBQ1IsUUFBUSxFQUFFLG9CQUFvQjtRQUM5QixRQUFRLEVBQUUsc0JBQXNCO1FBQ2hDLGFBQWEsRUFBRSxjQUFjO1FBQzdCLEtBQUssRUFBRSxFQUFFO1FBQ1QsTUFBTSxFQUFFLFVBQVU7UUFDbEIsV0FBVyxFQUFFLE9BQU87UUFDcEIsT0FBTyxFQUFFLGNBQWM7UUFDdkIsUUFBUSxFQUFFLEVBQUU7UUFDWixhQUFhLEVBQUUsRUFBRTtRQUNqQixRQUFRLEVBQUUsV0FBVztRQUNyQixNQUFNLEVBQUUsRUFBRTtLQUNYO0lBQ0QsS0FBSyxFQUFFO1FBQ0wsS0FBSyxFQUFFLFlBQVk7UUFDbkIsV0FBVyxFQUFFLHdCQUF3QjtRQUNyQyxTQUFTLEVBQUUsZ0JBQWdCO0tBQzVCO0lBQ0QsS0FBSyxFQUFFO1FBQ0wsSUFBSSxFQUFFLG9CQUFvQjtRQUMxQixJQUFJLEVBQUUsc0NBQXNDO1FBQzVDLElBQUksRUFBRSxFQUFFO1FBQ1IsV0FBVyxFQUFFLG1CQUFtQjtRQUNoQyxjQUFjLEVBQUUsc0JBQXNCO0tBQ3ZDO0lBRUQsT0FBTyxFQUFFO1FBQ1AsSUFBSSxFQUFFLDhCQUE4QjtRQUNwQyxJQUFJLEVBQUUsRUFBRTtRQUNSLEtBQUssRUFBRSxFQUFFO1FBQ1QsaUJBQWlCLEVBQUUsbUJBQW1CO0tBQ3ZDO0lBQ0QsUUFBUSxFQUFFO1FBQ1IsSUFBSSxFQUFFLHFCQUFxQjtRQUMzQixJQUFJLEVBQUUsVUFBVTtRQUNoQixXQUFXLEVBQUUsRUFBRTtRQUNmLFlBQVksRUFBRSxFQUFFO1FBQ2hCLGlCQUFpQixFQUFFLG1CQUFtQjtRQUN0QyxLQUFLLEVBQUUsa0NBQWtDO1FBQ3pDLE1BQU0sRUFBRSxvQkFBb0I7S0FDN0I7SUFDRCxPQUFPLEVBQUUsY0FBYztJQUN2QixRQUFRLEVBQUU7UUFDUixJQUFJLEVBQUUsRUFBRTtRQUNSLE9BQU8sRUFBRSxjQUFjO1FBQ3ZCLEtBQUssRUFBRSw0QkFBNEI7S0FDcEM7SUFDRCxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO0lBQ2xCLE1BQU0sRUFBRTtRQUNOLElBQUksRUFBRSxtQkFBbUI7UUFDekIsR0FBRyxFQUFFLFlBQVk7UUFDakIsS0FBSyxFQUFFLDJCQUEyQjtRQUNsQyxRQUFRLEVBQUUsa0JBQWtCO1FBQzVCLGdCQUFnQixFQUFFLGlDQUFpQztRQUNuRCxTQUFTLEVBQUUsbUJBQW1CO1FBQzlCLFNBQVMsRUFBRSxjQUFjO0tBQzFCO0lBQ0QsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFO0lBQzFELGFBQWEsRUFBRTtRQUNiLElBQUksRUFBRSxPQUFPO1FBQ2IsTUFBTSxFQUFFLGlCQUFpQjtRQUN6QixTQUFTLEVBQUUsWUFBWTtRQUN2QixTQUFTLEVBQUUsRUFBRTtRQUNiLFlBQVksRUFBRSxFQUFFO1FBQ2hCLE9BQU8sRUFBRSxFQUFFO1FBQ1gsVUFBVSxFQUFFLEVBQUU7S0FDZjtJQUNELFlBQVksRUFBRTtRQUNaLElBQUksRUFBRSxFQUFFO1FBQ1IsTUFBTSxFQUFFLGlCQUFpQjtRQUN6QixVQUFVLEVBQUUsRUFBRTtRQUNkLFVBQVUsRUFBRSxFQUFFO1FBQ2QsU0FBUyxFQUFFLEVBQUU7UUFDYixZQUFZLEVBQUUsRUFBRTtLQUNqQjtJQUNELFlBQVksRUFBRTtRQUNaLElBQUksRUFBRSxPQUFPO1FBQ2IsU0FBUyxFQUFFLEVBQUU7UUFDYixHQUFHLEVBQUUsWUFBWTtRQUNqQixTQUFTLEVBQUUsaUNBQWlDO0tBQzdDO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsSUFBSSxFQUFFLEVBQUU7UUFDUixJQUFJLEVBQUUsT0FBTztRQUNiLEtBQUssRUFBRSxFQUFFO1FBQ1QsV0FBVyxFQUFFLEVBQUU7UUFDZixZQUFZLEVBQUUsK0JBQStCO1FBQzdDLGlCQUFpQixFQUFFLFFBQVE7UUFDM0IsS0FBSyxFQUFFLG9DQUFvQztRQUMzQyxXQUFXLEVBQUUsOENBQThDO1FBQzNELE1BQU0sRUFBRSxvQkFBb0I7S0FDN0I7SUFDRCxXQUFXLEVBQUU7UUFDWCxJQUFJLEVBQUUsV0FBVztRQUNqQixJQUFJLEVBQUUsYUFBYTtRQUNuQixLQUFLLEVBQUUsbUJBQW1CO1FBQzFCLFdBQVcsRUFBRSwwQkFBMEI7UUFDdkMsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixRQUFRLEVBQUUsa0JBQWtCO1FBQzVCLFdBQVcsRUFBRSx1QkFBdUI7S0FDckM7SUFDRCxNQUFNLEVBQUU7UUFDTixJQUFJLEVBQUUsV0FBVztRQUNqQixJQUFJLEVBQUUsK0JBQStCO1FBQ3JDLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE9BQU8sRUFBRSxzQkFBc0I7UUFDL0IsUUFBUSxFQUFFLHVCQUF1QjtRQUNqQyxPQUFPLEVBQUUsc0JBQXNCO0tBQ2hDO0lBQ0QsSUFBSSxFQUFFLGNBQWM7SUFDcEIsVUFBVSxFQUFFLGNBQWM7SUFDMUIsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFLG1DQUFtQztRQUN6QyxnQkFBZ0IsRUFBRSxFQUFFO1FBQ3BCLE9BQU8sRUFBRSxtQkFBbUI7UUFDNUIsWUFBWSxFQUFFLHlCQUF5QjtRQUN2QyxTQUFTLEVBQUUsaUJBQWlCO1FBQzVCLFVBQVUsRUFBRSxrQkFBa0I7S0FDL0I7SUFDRCxRQUFRLEVBQUU7UUFDUixJQUFJLEVBQUUsRUFBRTtRQUNSLE1BQU0sRUFBRSxrQkFBa0I7UUFDMUIsS0FBSyxFQUFFLG9CQUFvQjtRQUMzQixPQUFPLEVBQUUscUJBQXFCO1FBQzlCLGVBQWUsRUFBRSxFQUFFO0tBQ3BCO0lBQ0QsTUFBTSxFQUFFO1FBQ04sSUFBSSxFQUFFLGVBQWU7UUFDckIsSUFBSSxFQUFFLFlBQVk7UUFDbEIsTUFBTSxFQUFFO1lBQ04sSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxLQUFLLEVBQUUsV0FBVztZQUNsQixNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLGNBQWMsRUFBRSwyQ0FBMkM7WUFDM0QsZUFBZSxFQUFFLDZDQUE2QztTQUMvRDtLQUNGO0NBQ0YsQ0FBQztBQUNJLCtEQUFVLENBQUMsbUJBQW1CLENBQUMsR0FBRywyQkFBMkIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BLakM7QUFDRztBQUNGO0FBQ0Y7QUFDQztBQUNEO0FBQ0U7QUFDRDtBQUNFO0FBQ0Y7QUFDRDtBQUNDO0FBQ0c7QUFDQTtBQUNDO0FBQ0g7QUFDQztBQUNGO0FBQ0M7QUFDRztBQUNEO0FBQ0Y7QUFDRDtBQUNJO0FBQ0Y7QUFDRDtBQUNXO0FBQ1g7QUFDQTtBQUNBO0FBQ1k7QUFDVjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQy9CdEM7QUFBQSxTQUFTO0FBQ2dCO0FBRWxCLElBQUksT0FBZSxDQUFDO0FBQzNCLE9BQU8sR0FBRyxLQUFHLFFBQXFCLENBQUM7QUFFSztBQUNBO0FBVWY7QUFDbUI7QUFDa0M7QUFPekQ7QUFDMEQ7QUFDbkI7QUFDSjtBQUNDO0FBSS9CO0FBQzhCO0FBQ0U7QUFDQztBQWFqQztBQU9pQjtBQUlKO0FBSUQ7QUFLUDtBQUlNO0FBQ3NDO0FBQzFCO0FBQ1Y7QUFDRztBQUNnQjtBQUNBO0FBSXZCO0FBQzZCO0FBQ0Y7QUFDRTtBQUNRO0FBQ2hCO0FBQ0E7QUFDWTtBQUNSO0FBQ1E7QUFDWjtBQUNNO0FBQ1E7QUFJakM7QUFDVztBQUNMO0FBU3BCO0FBQ2dDO0FBQ0c7QUFFRjtBQUNJO0FBQ1k7QUFJbkM7QUFFZTtBQUVwRCxnREFBZ0Q7QUFDaEQsMkVBQTJFOzs7Ozs7Ozs7Ozs7Ozs7QUM5SDVDO0FBQ3FCO0FBRWhCO0FBQ3BDLElBQUksVUFBVSxHQUFHLG1CQUFPLENBQUMsR0FBbUUsQ0FBQyxDQUFDO0FBRTlGO0lBQWtDLCtFQUFpQjtJQUlqRCxzQkFBWSxPQUFtQixFQUFFLFlBQWdDO1FBQXJELHdDQUFtQjtRQUFFLGtEQUFnQztRQUFqRSxZQUNFLGtCQUFNLE9BQU8sRUFBRSxZQUFZLENBQUMsU0FjN0I7UUFiQyxLQUFJLENBQUMsVUFBVSxHQUFHLG9EQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsS0FBSSxDQUFDLGFBQWEsR0FBRyxvREFBYSxDQUFDLEtBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELElBQUksSUFBSSxHQUFHLEtBQUksQ0FBQztRQUNoQixLQUFJLENBQUMsdUJBQXVCLEdBQUc7WUFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUM7UUFDRixLQUFJLENBQUMsc0JBQXNCLEdBQUc7WUFDNUIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFDO1FBQ0YsS0FBSSxDQUFDLFFBQVEsR0FBRztZQUNkLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QixDQUFDLENBQUM7O0lBQ0osQ0FBQztJQUNTLG1DQUFZLEdBQXRCLFVBQXVCLE9BQVk7UUFDakMsTUFBTSxDQUFDLElBQUkseURBQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQ1MsNENBQXFCLEdBQS9CO1FBQ0UsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUNELHNCQUFjLGtDQUFRO2FBQXRCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzdFLENBQUM7YUFDRCxVQUF1QixLQUFhO1lBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzdCLENBQUM7OztPQUhBO0lBSVMsdUNBQWdCLEdBQTFCO1FBQ0UsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM3QyxtREFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNqQyx1REFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzNDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsTUFBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLENBQUM7SUFDSCxDQUFDO0lBQ1MseUNBQWtCLEdBQTVCO1FBQ0UsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBQ0Qsc0JBQVcsNkJBQUc7YUFBZDtZQUNFLE1BQU0sQ0FBTyxJQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7OztPQUFBO0lBQ08scUNBQWMsR0FBdEI7UUFDRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDTyxtQ0FBWSxHQUFwQjtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3RCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZTtZQUN4QyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUM1QyxDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQUFDLENBMURpQyx3RUFBaUIsR0EwRGxEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoRThCO0FBQ2U7QUFFSDtBQUVBO0FBQ087QUFFbEQ7SUFBK0IsNEVBQWM7SUFJM0MsbUJBQVksSUFBaUI7UUFBakIsZ0NBQWlCO1FBQTdCLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBUVo7UUFQQyxLQUFJLENBQUMsYUFBYSxHQUFHLG9EQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN2RCxJQUFJLGdFQUFlLENBQUMsS0FBSSxDQUFDLENBQUM7UUFDMUIsS0FBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksSUFBSSxHQUFHLEtBQUksQ0FBQztRQUNoQixLQUFJLENBQUMsb0JBQW9CLEdBQUcsVUFBUyxFQUFPLEVBQUUsR0FBUTtZQUNwRCxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUM7O0lBQ0osQ0FBQztJQUNTLDhCQUFVLEdBQXBCLGNBQXdCLENBQUM7SUFDZixzQ0FBa0IsR0FBNUIsVUFBNkIsUUFBa0I7UUFDN0MsTUFBTSxDQUFDLENBQ0wsOERBQThEO1lBQzlELFFBQVEsQ0FBQyxJQUFJO1lBQ2Isa0VBQWtFO1lBQ2xFLFFBQVEsQ0FBQyxJQUFJO1lBQ2IsMkJBQTJCLENBQzVCLENBQUM7SUFDSixDQUFDO0lBQ08sc0NBQWtCLEdBQTFCLFVBQTJCLFFBQWEsRUFBRSxHQUFRO1FBQ2hELEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUN6QixJQUFJLEVBQUUsR0FBRyw0REFBYSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQztJQUNILENBQUM7SUFDSCxnQkFBQztBQUFELENBQUMsQ0EvQjhCLGtFQUFjLEdBK0I1Qzs7QUFFRCwrREFBVSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRTtJQUMzQyxNQUFNLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztBQUN6QixDQUFDLENBQUMsQ0FBQztBQUNIOzs7O0VBSUU7QUFDRixvREFBYSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7SUFDaEMsU0FBUyxFQUFFO1FBQ1QsZUFBZSxFQUFFLFVBQVMsTUFBVyxFQUFFLGFBQWtCO1lBQ3ZELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztZQUNoQixJQUFJLFFBQVEsR0FBRyxnREFBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7WUFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztZQUN2QyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLFFBQVEsQ0FBQyxzQkFBc0IsR0FBRztnQkFDaEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO29CQUFDLE1BQU0sQ0FBQztnQkFDbkMsbURBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZDLHVEQUFnQixDQUFDLEVBQUUsUUFBUSxZQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM3QywrQ0FBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLENBQUMsQ0FBQztZQUNGLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHO2dCQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN4QixDQUFDLENBQUM7WUFDRixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRztnQkFDcEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztvQkFBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUMxQixDQUFDLENBQUM7WUFDRixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxVQUFTLEtBQVU7Z0JBQzFDLElBQUksS0FBSyxHQUFHLDJCQUEyQixDQUFDO2dCQUN4QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztnQkFDakMsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDMUIsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ2pCLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDN0MsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ1IsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLGFBQWEsR0FBRztnQkFDbkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztnQkFDOUIsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDakMsQ0FBQyxDQUFDO1lBQ0YsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVMsV0FBbUI7Z0JBQ2xFLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzVDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7Z0JBQzNDLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUM1RCxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDcEMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUMvQyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7b0JBQ2QsRUFBRSxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7d0JBQ3pCLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDMUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN4RCxDQUFDO29CQUNELEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixDQUFDO2dCQUNELE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQzNCLENBQUMsQ0FBQztZQUNGLElBQUksTUFBTSxHQUFHO2dCQUNYLGFBQWEsRUFBRSxJQUFJO2dCQUNuQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsT0FBTyxFQUFFLElBQUk7YUFDZCxDQUFDO1lBQ0YsSUFBSSxRQUFRLEdBQUcsVUFBUyxhQUFrQixFQUFFLFFBQWE7Z0JBQ3ZELEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFBQyxNQUFNLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLENBQUMsQ0FBQztZQUNGLElBQUksUUFBUSxHQUFHLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsWUFBRSxDQUFDO1FBQ3RCLENBQUM7S0FDRjtJQUNELFFBQVEsRUFBRSxhQUFhO0NBQ3hCLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ3hId0Q7QUFDaEI7QUFDVTtBQUNGO0FBR25EO0lBQWdELDZGQUFtQjtJQUNqRSxvQ0FBbUIsUUFBa0I7UUFBckMsWUFDRSxrQkFBTSxRQUFRLENBQUMsU0FDaEI7UUFGa0IsY0FBUSxHQUFSLFFBQVEsQ0FBVTs7SUFFckMsQ0FBQztJQUNILGlDQUFDO0FBQUQsQ0FBQyxDQUorQyx3RUFBbUIsR0FJbEU7O0FBRUQ7SUFBcUMsa0ZBQW9CO0lBQ3ZELHlCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLDBCQUEwQixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUN2QyxDQUFDO0lBQ00sb0NBQVUsR0FBakIsVUFBa0IsR0FBUSxFQUFFLE1BQVc7UUFDckMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNsQyxJQUFJLFNBQVMsR0FBUyxJQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUUsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0gsc0JBQUM7QUFBRCxDQUFDLENBVm9DLCtFQUFvQixHQVV4RDs7QUFFRCwrREFBVSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsRUFBRTtJQUN6QyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDakMsQ0FBQyxDQUFDLENBQUM7QUFFSCx5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsY0FBSTtJQUN2RCxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL0I0QjtBQUMyQztBQUMvQjtBQUNVO0FBQ1E7QUFHN0Q7SUFBMEMsOEZBQStCO0lBQ3ZFLHFDQUFZLFFBQWtCO2VBQzVCLGtCQUFNLFFBQVEsQ0FBQztJQUNqQixDQUFDO0lBQ1MsZ0RBQVUsR0FBcEI7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7SUFDckMsQ0FBQztJQUNILGtDQUFDO0FBQUQsQ0FBQyxDQVB5QywrRkFBK0IsR0FPeEU7QUFFRDtJQUFzQyxtRkFBcUI7SUFHekQsMEJBQW1CLElBQVk7UUFBL0IsWUFDRSxrQkFBTSxJQUFJLENBQUMsU0FTWjtRQVZrQixVQUFJLEdBQUosSUFBSSxDQUFRO1FBRHZCLDJCQUFxQixHQUFHLEtBQUssQ0FBQztRQUdwQyxJQUFJLDJCQUEyQixDQUFDLEtBQUksQ0FBQyxDQUFDO1FBQ3RDLEtBQUksQ0FBQyxhQUFhLEdBQUcsb0RBQWEsQ0FBQyxLQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkQsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDO1FBQ2hCLEtBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFVBQVMsUUFBYTtZQUNqRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQ3ZDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDL0IsSUFBSTtnQkFBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7O0lBQ0wsQ0FBQztJQUNTLHlDQUFjLEdBQXhCO1FBQ0UsaUJBQU0sY0FBYyxXQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNTLGtEQUF1QixHQUFqQztRQUNFLGlCQUFNLHVCQUF1QixXQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNTLDRDQUFpQixHQUEzQjtRQUNFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztJQUNyQyxDQUFDO0lBQ0QsdUNBQVksR0FBWixVQUFhLElBQVM7UUFDcEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLGdEQUFnRDtRQUN0RSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBRXJDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDckIsU0FBUztnQkFDUCxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUM7b0JBQ2pCLENBQUMsQ0FBQyx1QkFBdUI7b0JBQ3pCLENBQUMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNyQyxDQUFDO1FBRUQsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQztRQUV2QyxNQUFNLENBQUMsU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDSCx1QkFBQztBQUFELENBQUMsQ0EzQ3FDLGlGQUFxQixHQTJDMUQ7O0FBRUQsK0RBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUU7SUFDMUMsTUFBTSxDQUFDLElBQUksZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDLENBQUM7QUFDSCx5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsY0FBSTtJQUN4RCxJQUFJLENBQUMsR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxPQUFPLEdBQUcseUVBQWUsQ0FBQyxjQUFjLENBQUM7SUFDM0MsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUNuRXdDO0FBQ1U7QUFDTTtBQUNSO0FBRW5EO0lBQXFDLGtGQUFvQjtJQUN2RCx5QkFBbUIsSUFBWTtRQUEvQixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQUVaO1FBSGtCLFVBQUksR0FBSixJQUFJLENBQVE7UUFFN0IsSUFBSSx3RUFBbUIsQ0FBQyxLQUFJLENBQUMsQ0FBQzs7SUFDaEMsQ0FBQztJQUNILHNCQUFDO0FBQUQsQ0FBQyxDQUxvQywrRUFBb0IsR0FLeEQ7O0FBRUQsK0RBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUU7SUFDekMsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2pDLENBQUMsQ0FBQyxDQUFDO0FBQ0gseUVBQWUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLGNBQUk7SUFDdkQsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUNqQjBEO0FBQ2xCO0FBQ1U7QUFDbUI7QUFFeEU7SUFBc0MsbUZBQXFCO0lBQ3pELDBCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLDZGQUE2QixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUMxQyxDQUFDO0lBQ0gsdUJBQUM7QUFBRCxDQUFDLENBTHFDLGlGQUFxQixHQUsxRDs7QUFFRCwrREFBVSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRTtJQUMxQyxNQUFNLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQyxDQUFDLENBQUMsQ0FBQztBQUNILHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxjQUFJO0lBQ3hELElBQUksQ0FBQyxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLE9BQU8sR0FBRyx5RUFBZSxDQUFDLGNBQWMsQ0FBQztJQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ1gsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FDbkJvRDtBQUNaO0FBQ1E7QUFHbkQ7SUFBbUMsZ0ZBQWtCO0lBQ25ELHVCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLHdFQUFtQixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUNoQyxDQUFDO0lBQ0gsb0JBQUM7QUFBRCxDQUFDLENBTGtDLDJFQUFrQixHQUtwRDs7QUFFRCwrREFBVSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRTtJQUN2QyxNQUFNLENBQUMsSUFBSSxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDL0IsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2Y0QjtBQUNrQztBQUN0QjtBQUNVO0FBQ0Y7QUFHbkQ7SUFBbUQsZ0dBQW1CO0lBRXBFLHVDQUFtQixRQUFrQjtRQUFyQyxZQUNFLGtCQUFNLFFBQVEsQ0FBQyxTQU1oQjtRQVBrQixjQUFRLEdBQVIsUUFBUSxDQUFVO1FBRW5DLEtBQUksQ0FBQyxjQUFjLEdBQUcsb0RBQWEsQ0FBQyxLQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFELEtBQUksQ0FBQyxRQUFTLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxLQUFJLENBQUMsY0FBYyxDQUFDO1FBQzdELGtEQUFXLENBQUM7WUFDVixLQUFJLENBQUMsY0FBYyxDQUFDLEtBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7O0lBQ0wsQ0FBQztJQUNILG9DQUFDO0FBQUQsQ0FBQyxDQVZrRCx3RUFBbUIsR0FVckU7O0FBRUQ7SUFBd0MscUZBQXVCO0lBQzdELDRCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLDZCQUE2QixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUMxQyxDQUFDO0lBQ0gseUJBQUM7QUFBRCxDQUFDLENBTHVDLHFGQUF1QixHQUs5RDs7QUFFRCwrREFBVSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRTtJQUM1QyxNQUFNLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUMsQ0FBQztBQUNILHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxjQUFJO0lBQzFELE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvQjRCO0FBQ1k7QUFDVTtBQUNBO0FBQ0Y7QUFHbkQ7SUFBNkMsMEZBQW1CO0lBVzlELGlDQUFZLFFBQWtCO1FBQTlCLFlBQ0Usa0JBQU0sUUFBUSxDQUFDLFNBeUJoQjtRQXBDRCxhQUFPLEdBQUcsb0RBQWEsQ0FBUyxPQUFPLENBQUMsQ0FBQztRQUN6QyxnQkFBVSxHQUFHLGtEQUFXLENBQUMsY0FBTSxZQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssUUFBUSxFQUEzQixDQUEyQixDQUFDLENBQUM7UUFDNUQsWUFBTSxHQUFHLGtEQUFXLENBQUM7WUFDbkIsRUFBRSxDQUFDLENBQUMsS0FBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdEIsTUFBTSxDQUFxQixLQUFJLENBQUMsUUFBUyxDQUFDLFlBQVksQ0FBQztZQUN6RCxDQUFDO1lBQ0QsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO1FBQ0gsa0JBQVksR0FBRyxvREFBYSxFQUFVLENBQUM7UUFJckMsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDO1FBQ1YsS0FBSSxDQUFDLFFBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3ZDLEtBQUksQ0FBQyxRQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsS0FBSSxDQUFDLFVBQVUsQ0FBQztRQUMvQyxLQUFJLENBQUMsUUFBUyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEtBQUksQ0FBQyxZQUFZLENBQUM7UUFDekQsSUFBSSxXQUFXLEdBQUcsVUFBQyxLQUFVO1lBQzNCLEtBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEIsS0FBSSxDQUFDLFlBQVksQ0FBcUIsS0FBSSxDQUFDLFFBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUM7UUFDa0IsS0FBSSxDQUFDLFFBQVMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQUMsTUFBTSxFQUFFLE9BQU87WUFDcEUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUNHLEtBQUksQ0FBQyxRQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBQyxJQUFTLEVBQUUsS0FBVTtZQUN2RCxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUM7UUFDSSxLQUFJLENBQUMsUUFBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFVBQUMsSUFBUyxFQUFFLEtBQVU7WUFDdEQsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQzNDLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkMsS0FBSSxDQUFDLFFBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQyxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNuQixDQUFDLENBQUM7UUFDSSxLQUFJLENBQUMsUUFBUyxDQUFDLGNBQWMsQ0FBQyxHQUFHLFVBQUMsSUFBUyxFQUFFLEtBQVU7WUFDdkMsS0FBSSxDQUFDLFFBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDOztJQUNKLENBQUM7SUFDTywwQ0FBUSxHQUFoQixVQUFpQixHQUFRO1FBQ3ZCLEVBQUUsQ0FBQyxDQUFDLENBQU8sTUFBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3pDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDdkQsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2YsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFDRCxHQUFHLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNLLElBQUksQ0FBQyxRQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDSCw4QkFBQztBQUFELENBQUMsQ0FoRDRDLHdFQUFtQixHQWdEL0Q7O0FBRUQ7SUFBa0MsK0VBQWlCO0lBQ2pELHNCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLHVCQUF1QixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUNwQyxDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQUFDLENBTGlDLHlFQUFpQixHQUtsRDs7QUFFRCwrREFBVSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRTtJQUN0QyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDOUIsQ0FBQyxDQUFDLENBQUM7QUFDSCx5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsY0FBSTtJQUNwRCxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQ3BFd0M7QUFDVTtBQUNGO0FBQ0U7QUFFckQ7SUFBa0MsK0VBQWlCO0lBQ2pELHNCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLHdFQUFtQixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUNoQyxDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQUFDLENBTGlDLHlFQUFpQixHQUtsRDs7QUFFRCwrREFBVSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRTtJQUN0QyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDOUIsQ0FBQyxDQUFDLENBQUM7QUFDSCx5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsY0FBSTtJQUNwRCxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQ2pCZ0U7QUFDeEI7QUFDVTtBQUNxQjtBQUUxRTtJQUF5QyxzRkFBd0I7SUFDL0QsNkJBQW1CLElBQVk7UUFBL0IsWUFDRSxrQkFBTSxJQUFJLENBQUMsU0FDWjtRQUZrQixVQUFJLEdBQUosSUFBSSxDQUFROztJQUUvQixDQUFDO0lBQ0QsZ0RBQWtCLEdBQWxCO1FBQ0UsaUJBQU0sa0JBQWtCLFdBQUUsQ0FBQztRQUMzQixJQUFJLCtGQUErQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFDRCwwQ0FBWSxHQUFaLFVBQWEsSUFBUztRQUNwQixJQUFJLFNBQVMsR0FDWCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUk7WUFDcEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUM7Z0JBQ2xCLENBQUMsQ0FBQywwQkFBMEI7Z0JBQzVCLENBQUMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqRSxTQUFTLElBQUksVUFBVSxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDcEQsU0FBUyxJQUFJLFVBQVUsQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNILDBCQUFDO0FBQUQsQ0FBQyxDQXpCd0MsdUZBQXdCLEdBeUJoRTs7QUFFRCwrREFBVSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsRUFBRTtJQUM3QyxNQUFNLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNyQyxDQUFDLENBQUMsQ0FBQztBQUVILHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxjQUFJO0lBQzNELElBQUksQ0FBQyxHQUFHLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsNkNBQTZDO0lBQzdDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3pDNEI7QUFLSDtBQUN1QjtBQUNSO0FBQ1U7QUFFaEI7QUFFckM7SUFBK0IsNEVBQWM7SUFJM0MsbUJBQ0UsSUFBZSxFQUNSLFFBQWdCLEVBQ3ZCLElBQWlCLEVBQ2pCLEtBQVU7UUFKWixZQU1FLGtCQUFNLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxTQVVuQztRQWRRLGNBQVEsR0FBUixRQUFRLENBQVE7UUFMakIscUJBQWUsR0FBRyxLQUFLLENBQUM7UUFVOUIsS0FBSSxDQUFDLE9BQU8sR0FBRyxvREFBYSxDQUFDLEtBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxJQUFJLElBQUksR0FBRyxLQUFJLENBQUM7UUFDaEIsS0FBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBUyxRQUFhO1lBQzNDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7Z0JBQUMsSUFBSSxDQUFDO1lBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSSxDQUFDLFdBQVcsR0FBRyxVQUFTLE1BQVc7WUFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDOztJQUNKLENBQUM7SUFDUyxrQ0FBYyxHQUF4QjtRQUNFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLEVBQUUsQ0FBQyxDQUFDLENBQUMseURBQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUNILGdCQUFDO0FBQUQsQ0FBQyxDQTVCOEIsd0VBQWMsR0E0QjVDOztBQUNEO0lBQW9DLGlGQUFtQjtJQUdyRCx3QkFBbUIsSUFBWTtRQUEvQixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQUlaO1FBTGtCLFVBQUksR0FBSixJQUFJLENBQVE7UUFFN0IsSUFBSSx3RUFBbUIsQ0FBQyxLQUFJLENBQUMsQ0FBQztRQUM5QixLQUFJLENBQUMsYUFBYSxHQUFHLG9EQUFhLENBQUMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxvREFBYSxDQUFDLEtBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzs7SUFDN0QsQ0FBQztJQUNTLHlDQUFnQixHQUExQjtRQUNFLGlCQUFNLGdCQUFnQixXQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ1Msc0NBQWEsR0FBdkI7UUFDRSxpQkFBTSxhQUFhLFdBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDTSxxQ0FBWSxHQUFuQjtRQUNFLGlCQUFNLFlBQVksV0FBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBQ1Msd0NBQWUsR0FBekIsVUFDRSxJQUFlLEVBQ2YsUUFBZ0IsRUFDaEIsS0FBVTtRQUVWLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ00sbUNBQVUsR0FBakIsVUFBa0IsR0FBUSxFQUFFLE1BQVc7UUFDckMsSUFBSSxTQUFTLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDOUMsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsV0FBVztZQUN0QyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0I7WUFDbEMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNkLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXO1lBQzlCLENBQUMsQ0FBTyxJQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRO1lBQ2pDLENBQUMsQ0FBTyxJQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDakMsSUFBSSxTQUFTLEdBQUcsU0FBUyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNILHFCQUFDO0FBQUQsQ0FBQyxDQXpDbUMsNkVBQW1CLEdBeUN0RDs7QUFFRCwrREFBVSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRTtJQUN4QyxNQUFNLENBQUMsSUFBSSxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEMsQ0FBQyxDQUFDLENBQUM7QUFDSCx5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsY0FBSTtJQUN0RCxJQUFJLENBQUMsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDLENBQUMsSUFBSSxHQUFHLHlFQUFlLENBQUMsV0FBVyxDQUFDO0lBQ3JDLENBQUMsQ0FBQyxPQUFPLEdBQUcseUVBQWUsQ0FBQyxhQUFhLENBQUM7SUFDMUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQzNGd0M7QUFDVTtBQUV1QjtBQUNMO0FBRVU7QUFHakY7SUFBc0QsbUdBQTZCO0lBQ2pGLDBDQUFZLFFBQWtCO2VBQzVCLGtCQUFNLFFBQVEsQ0FBQztJQUNqQixDQUFDO0lBQ1MscURBQVUsR0FBcEI7UUFDRSxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNTLHNEQUFXLEdBQXJCO1FBQ0UsTUFBTSxDQUF5QixJQUFJLENBQUMsUUFBUyxDQUFDLGFBQWEsQ0FBQztJQUM5RCxDQUFDO0lBQ1MseURBQWMsR0FBeEI7UUFDRSxNQUFNLENBQXlCLElBQUksQ0FBQyxRQUFTLENBQUMsZ0JBQWdCLENBQUM7SUFDakUsQ0FBQztJQUNTLHVEQUFZLEdBQXRCO1FBQ0UsTUFBTSxDQUFDLENBQ0wsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVU7WUFDRCxJQUFJLENBQUMsUUFBUyxDQUFDLFlBQVksQ0FDcEQsQ0FBQztJQUNKLENBQUM7SUFDUyx3REFBYSxHQUF2QjtRQUNFLHVCQUF1QjtRQUN2QixJQUFJLElBQUksR0FBMkIsSUFBSSxDQUFDLFFBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFFLElBQUksT0FBTyxHQUEyQixJQUFJLENBQUMsUUFBUyxDQUFDLE9BQU8sQ0FBQztRQUM3RCxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ1MsaURBQU0sR0FBaEI7UUFDMEIsSUFBSSxDQUFDLFFBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBQ1Msb0RBQVMsR0FBbkIsVUFBb0IsR0FBMEI7UUFDNUMsSUFBSSxJQUFJLEdBQTJCLElBQUksQ0FBQyxRQUFTLENBQUMsV0FBVyxDQUFDO1FBQzlELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNTLElBQUksQ0FBQyxRQUFTLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELENBQUM7SUFDSCxDQUFDO0lBQ0gsdUNBQUM7QUFBRCxDQUFDLENBcENxRCxpR0FBNkIsR0FvQ2xGOztBQUVEO0lBQTJDLHdGQUEwQjtJQUVuRSwrQkFBbUIsSUFBWTtRQUEvQixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQUVaO1FBSGtCLFVBQUksR0FBSixJQUFJLENBQVE7UUFFN0IsSUFBSSxnQ0FBZ0MsQ0FBQyxLQUFJLENBQUMsQ0FBQzs7SUFDN0MsQ0FBQztJQUNILDRCQUFDO0FBQUQsQ0FBQyxDQU4wQywyRkFBMEIsR0FNcEU7O0FBRUQsK0RBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLEVBQUU7SUFDL0MsTUFBTSxDQUFDLElBQUkscUJBQXFCLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkMsQ0FBQyxDQUFDLENBQUM7QUFFSCx5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsY0FBSTtJQUM3RCxJQUFJLENBQUMsR0FBRyxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDZixxR0FBK0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRCxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ1gsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEU0QjtBQUlHO0FBRWlCO0FBQ0Y7QUFFTjtBQUNVO0FBRXJEO0lBQXNDLG1GQUFxQjtJQUN6RCwwQkFBbUIsSUFBZ0IsRUFBRSxLQUFvQjtRQUF0QyxrQ0FBZ0I7UUFBRSxvQ0FBb0I7UUFBekQsWUFDRSxrQkFBTSxJQUFJLEVBQUUsS0FBSyxDQUFDLFNBQ25CO1FBRmtCLFVBQUksR0FBSixJQUFJLENBQVk7O0lBRW5DLENBQUM7SUFDUyx1Q0FBWSxHQUF0QixVQUF1QixJQUFZO1FBQ2pDLE1BQU0sQ0FBQyxJQUFJLHNFQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNILHVCQUFDO0FBQUQsQ0FBQyxDQVBxQyxxRkFBcUIsR0FPMUQ7O0FBRUQ7SUFBcUQsa0dBQW1CO0lBRXRFLHlDQUFZLFFBQWtCO1FBQTlCLFlBQ0Usa0JBQU0sUUFBUSxDQUFDLFNBV2hCO1FBVkMsS0FBSSxDQUFDLE1BQU0sR0FBRyx5REFBa0IsQ0FDRixLQUFJLENBQUMsUUFBUyxDQUFDLE9BQU8sRUFBRSxDQUNyRCxDQUFDO1FBQ0ksS0FBSSxDQUFDLFFBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFJLENBQUMsTUFBTSxDQUFDO1FBQzdDLEtBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksSUFBSSxHQUFHLEtBQUksQ0FBQztRQUNZLEtBQUk7YUFDN0IsUUFBUyxDQUFDLHVCQUF1QixHQUFHO1lBQ3JDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzNCLENBQUMsQ0FBQzs7SUFDSixDQUFDO0lBQ1MsMkRBQWlCLEdBQTNCO1FBQ0UsSUFBSSxDQUFDLE1BQU0sQ0FBNkIsSUFBSSxDQUFDLFFBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFDSCxzQ0FBQztBQUFELENBQUMsQ0FsQm9ELHdFQUFtQixHQWtCdkU7O0FBRUQ7SUFBMEMsdUZBQXlCO0lBQ2pFLDhCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLCtCQUErQixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUM1QyxDQUFDO0lBQ1MsNkNBQWMsR0FBeEIsVUFBeUIsSUFBWSxFQUFFLEtBQWE7UUFDbEQsTUFBTSxDQUFDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDSCwyQkFBQztBQUFELENBQUMsQ0FSeUMseUZBQXlCLEdBUWxFOztBQUVELCtEQUFVLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLEVBQUU7SUFDbEQsTUFBTSxDQUFDLElBQUksZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDLENBQUM7QUFFSCwrREFBVSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsRUFBRTtJQUM5QyxNQUFNLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN0QyxDQUFDLENBQUMsQ0FBQztBQUVILHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxjQUFJO0lBQzVELElBQUksQ0FBQyxHQUFHLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25CLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoRTRCO0FBQ1M7QUFDRztBQUNVO0FBQ0Y7QUFJakI7QUFHRDtBQUVqQztJQUFxRCxrR0FBbUI7SUFpQnRFLHlDQUFZLFFBQWtCO1FBQTlCLFlBQ0Usa0JBQU0sUUFBUSxDQUFDLFNBK0ZoQjtRQTlGQyxLQUFJLENBQUMsUUFBUSxHQUFHLG9EQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDO1FBQ2hCLEtBQUksQ0FBQyxlQUFlLEdBQUc7WUFDckIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xCLENBQUMsQ0FBQztRQUNGLEtBQUksQ0FBQyxrQkFBa0IsR0FBRyxVQUFTLElBQVM7WUFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUM7UUFDRixLQUFJLENBQUMsZ0JBQWdCLEdBQUc7WUFDQyxJQUFJLENBQUMsUUFBUyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hELENBQUMsQ0FBQztRQUNGLEtBQUksQ0FBQyxnQkFBZ0IsR0FBRztZQUNDLElBQUksQ0FBQyxRQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDeEQsQ0FBQyxDQUFDO1FBRUYsS0FBSSxDQUFDLGFBQWEsR0FBRyxzREFBZSxDQUFDO1lBQ25DLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQXdCLElBQUksQ0FBQyxRQUFTLENBQUMsV0FBVyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSSxDQUFDLGdCQUFnQixHQUFHLHNEQUFlLENBQUM7WUFDdEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBd0IsSUFBSSxDQUFDLFFBQVMsQ0FBQyxjQUFjLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFJLENBQUMsY0FBYyxHQUFHLHNEQUFlLENBQUM7WUFDcEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBd0IsSUFBSSxDQUFDLFFBQVMsQ0FBQyxtQkFBbUIsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztRQUNILEtBQUksQ0FBQyxjQUFjLEdBQUcsc0RBQWUsQ0FBQztZQUNwQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUF3QixJQUFJLENBQUMsUUFBUyxDQUFDLG1CQUFtQixDQUFDO1FBQ25FLENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSSxDQUFDLFNBQVMsR0FBRyxzREFBZSxDQUFDO1lBQy9CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQXdCLElBQUksQ0FBQyxRQUFTLENBQUMsY0FBYyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSSxDQUFDLE9BQU8sR0FBRyxzREFBZSxDQUFDO1lBQzdCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQXdCLElBQUksQ0FBQyxRQUFTLENBQUMsWUFBWSxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSSxDQUFDLFFBQVEsR0FBRyxzREFBZSxDQUFDO1lBQzlCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQXdCLElBQUksQ0FBQyxRQUFTLENBQUMsZ0JBQWdCLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFJLENBQUMsZUFBZSxHQUFHLHNEQUFlLENBQUM7WUFDckMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBd0IsSUFBSSxDQUFDLFFBQVMsQ0FBQyxvQkFBb0IsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztRQUNILEtBQUksQ0FBQyxrQkFBa0IsR0FBRyxzREFBZSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQXdCLElBQUksQ0FBQyxRQUFTLENBQUMsdUJBQXVCLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7UUFFSCxLQUFJLENBQUMsWUFBWSxHQUFHLG9EQUFhLENBQ1IsSUFBSSxDQUFDLFFBQVMsQ0FBQyxZQUFZLENBQ25ELENBQUM7UUFDRixLQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxVQUFTLFFBQWE7WUFDekIsSUFBSSxDQUFDLFFBQVMsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSSxDQUFDLFVBQVUsR0FBRyxzREFBZSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQXdCLElBQUksQ0FBQyxRQUFTLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUMsQ0FBQztRQUVHLEtBQUksQ0FBQyxRQUFTLENBQUMsaUJBQWlCLENBQUMsR0FBRyxLQUFJLENBQUMsZUFBZSxDQUFDO1FBQ3pELEtBQUksQ0FBQyxRQUFTLENBQUMsb0JBQW9CLENBQUMsR0FBRyxLQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDL0QsS0FBSSxDQUFDLFFBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUMzRCxLQUFJLENBQUMsUUFBUyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsS0FBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzNELEtBQUksQ0FBQyxRQUFTLENBQUMsZUFBZSxDQUFDLEdBQUcsS0FBSSxDQUFDLGFBQWEsQ0FBQztRQUNyRCxLQUFJLENBQUMsUUFBUyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsS0FBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzNELEtBQUksQ0FBQyxRQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSSxDQUFDLE9BQU8sQ0FBQztRQUN6QyxLQUFJLENBQUMsUUFBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUksQ0FBQyxRQUFRLENBQUM7UUFDM0MsS0FBSSxDQUFDLFFBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEtBQUksQ0FBQyxlQUFlLENBQUM7UUFDekQsS0FBSSxDQUFDLFFBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUMvRCxLQUFJLENBQUMsUUFBUyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQztRQUN2RCxLQUFJLENBQUMsUUFBUyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQztRQUN2RCxLQUFJLENBQUMsUUFBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEtBQUksQ0FBQyxTQUFTLENBQUM7UUFDN0MsS0FBSSxDQUFDLFFBQVMsQ0FBQyxjQUFjLENBQUMsR0FBRyxLQUFJLENBQUMsWUFBWSxDQUFDO1FBQ25ELEtBQUksQ0FBQyxRQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsS0FBSSxDQUFDLFVBQVUsQ0FBQztRQUUvQyxLQUFJLENBQUMsUUFBUyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsVUFBUyxFQUFPLEVBQUUsR0FBUTtZQUNyRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQztRQUNxQixLQUFJO2FBQ3hCLFFBQVMsQ0FBQyx5QkFBeUIsR0FBRztZQUN2QyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUM7UUFDcUIsS0FBSTthQUN4QixRQUFTLENBQUMseUJBQXlCLEdBQUc7WUFDdkMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDO1FBQ3FCLEtBQUk7YUFDeEIsUUFBUyxDQUFDLDJCQUEyQixHQUFHO1lBQ3pDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQy9CLENBQUMsQ0FBQzs7SUFDSixDQUFDO0lBQ1MsNkRBQW1CLEdBQTdCO1FBQ0UsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUNTLDZEQUFtQixHQUE3QjtRQUNFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFDUywrREFBcUIsR0FBL0I7UUFDRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsWUFBWSxDQUF3QixJQUFJLENBQUMsUUFBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFDUyxrREFBUSxHQUFsQjtRQUN5QixJQUFJLENBQUMsUUFBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFDUyxxREFBVyxHQUFyQixVQUFzQixHQUFRO1FBQzVCLElBQUksQ0FBQyxHQUF5QixJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzVDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUN4QixHQUFHLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUN2QixDQUFDO1FBQ0QsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBQ08sMERBQWdCLEdBQXhCLFVBQXlCLFFBQWEsRUFBRSxHQUFRO1FBQzlDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3BELElBQUksRUFBRSxHQUFHLDREQUFhLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDSCxzQ0FBQztBQUFELENBQUMsQ0EzSW9ELHdFQUFtQixHQTJJdkU7O0FBRUQ7SUFBMEMsdUZBQXlCO0lBQ2pFLDhCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLCtCQUErQixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUM1QyxDQUFDO0lBQ1MsbURBQW9CLEdBQTlCO1FBQ0UsTUFBTSxDQUFDLElBQUksc0RBQUssRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFDSCwyQkFBQztBQUFELENBQUMsQ0FSeUMseUZBQXlCLEdBUWxFOztBQUVELCtEQUFVLENBQUMsb0JBQW9CLENBQUMsY0FBYyxFQUFFO0lBQzlDLE1BQU0sQ0FBQyxJQUFJLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RDLENBQUMsQ0FBQyxDQUFDO0FBRUgseUVBQWUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLGNBQUk7SUFDNUQsTUFBTSxDQUFDLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEMsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQ3pLOEQ7QUFDdEI7QUFDVTtBQUNxQjtBQUUxRTtJQUF3QyxxRkFBdUI7SUFDN0QsNEJBQW1CLElBQVk7UUFBL0IsWUFDRSxrQkFBTSxJQUFJLENBQUMsU0FFWjtRQUhrQixVQUFJLEdBQUosSUFBSSxDQUFRO1FBRTdCLElBQUksK0ZBQStCLENBQUMsS0FBSSxDQUFDLENBQUM7O0lBQzVDLENBQUM7SUFDRCx5Q0FBWSxHQUFaLFVBQWEsSUFBUztRQUNwQixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztRQUVyQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLFNBQVM7Z0JBQ1AsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDO29CQUNqQixDQUFDLENBQUMseUJBQXlCO29CQUMzQixDQUFDLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDckMsQ0FBQztRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFDLFNBQVMsSUFBSSxVQUFVLENBQUM7UUFDdkQsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0gseUJBQUM7QUFBRCxDQUFDLENBbEJ1QyxxRkFBdUIsR0FrQjlEOztBQUVELCtEQUFVLENBQUMsb0JBQW9CLENBQUMsWUFBWSxFQUFFO0lBQzVDLE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BDLENBQUMsQ0FBQyxDQUFDO0FBRUgseUVBQWUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLGNBQUk7SUFDMUQsSUFBSSxDQUFDLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDLENBQUMsT0FBTyxHQUFHLHlFQUFlLENBQUMsY0FBYyxDQUFDO0lBQzNDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsQzRCO0FBQ29CO0FBQ007QUFDZDtBQUNVO0FBR3JEO0lBQXdDLDRGQUFtQjtJQUl6RCxtQ0FBWSxRQUFrQjtRQUE5QixZQUNFLGtCQUFNLFFBQVEsQ0FBQyxTQWdCaEI7UUFmQyxLQUFJLENBQUMsbUJBQW1CLEdBQUcseURBQWtCLENBQUMsS0FBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDMUQsS0FBSSxDQUFDLFFBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUN2RSxJQUFJLElBQUksR0FBRyxLQUFJLENBQUM7UUFDaEIsS0FBSSxDQUFDLFFBQVEsR0FBRyxVQUFTLEdBQVE7WUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUN0QyxDQUFDLENBQUM7UUFDSSxLQUFJLENBQUMsUUFBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUksQ0FBQyxRQUFRLENBQUM7UUFDaEMsS0FBSSxDQUFDLFFBQVMsQ0FBQyx5QkFBeUIsR0FBRztZQUMxRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUM7UUFDSSxLQUFJLENBQUMsUUFBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFVBQUMsR0FBUTtZQUMxQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDeEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxLQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ3hFLENBQUMsQ0FBQzs7SUFDSixDQUFDO0lBQ1MsdURBQW1CLEdBQTdCO1FBQ0UsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDTyw2Q0FBUyxHQUFqQjtRQUNFLE1BQU0sQ0FBa0IsSUFBSSxDQUFDLFFBQVMsQ0FBQyxpQkFBaUIsQ0FBQztJQUMzRCxDQUFDO0lBQ0gsZ0NBQUM7QUFBRCxDQUFDLENBNUJ1Qyx3RUFBbUIsR0E0QjFEO0FBRUQ7SUFBb0MsaUZBQW1CO0lBQ3JELHdCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLHlCQUF5QixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUN0QyxDQUFDO0lBQ0gscUJBQUM7QUFBRCxDQUFDLENBTG1DLDZFQUFtQixHQUt0RDs7QUFFRCwrREFBVSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRTtJQUN4QyxNQUFNLENBQUMsSUFBSSxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEMsQ0FBQyxDQUFDLENBQUM7QUFFSCx5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsY0FBSTtJQUN0RCxNQUFNLENBQUMsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7QUNsREgsZ1BBQWdQLHNKQUFzSixtTjs7Ozs7O0FDQXRZLGlHQUFpRyxxQkFBcUIsU0FBUyxPQUFPLCtKQUErSix3Q0FBd0MscUlBQXFJLDhDQUE4QywyRUFBMkUsK0JBQStCLDJFQUEyRSwyRUFBMkUsd0xBQXdMLCtGQUErRiwrQzs7Ozs7O0FDQXZoQyxpTEFBaUwsb1JBQW9SLHdDQUF3QyxnRUFBZ0UsOENBQThDLHlVQUF5VSxpQ0FBaUMsZ0hBQWdILHFCQUFxQixhQUFhLHlFQUF5RSxvS0FBb0ssaUNBQWlDLGtVQUFrVSwyQkFBMkIsc1VBQXNVLDJCQUEyQixpS0FBaUsseUJBQXlCLGFBQWEsMkVBQTJFLHFSQUFxUiwyQkFBMkIsK05BQStOLDJCQUEyQixzc0RBQXNzRCwrQkFBK0IsMmQ7Ozs7OztBQ0Fwa0osMk5BQTJOLDRFQUE0RSwrUEFBK1Asc0RBQXNELDZHQUE2Ryx1RUFBdUUsb09BQW9PLHNEQUFzRCxrSDs7Ozs7O0FDQTFpQyw4TkFBOE4sd0NBQXdDLGlJQUFpSSw4Q0FBOEMscUVBQXFFLGtDQUFrQyxpRDs7Ozs7O0FDQTVoQiwrRkFBK0YscUJBQXFCLFNBQVMsT0FBTyxtTEFBbUwsd0NBQXdDLHdJQUF3SSw4QkFBOEIseUhBQXlILDhDQUE4QywyRUFBMkUsOENBQThDLHdGQUF3RiwrQkFBK0Isb0NBQW9DLGtDQUFrQyx1RTs7Ozs7O0FDQWwrQix1S0FBdUssMEJBQTBCLHFMOzs7Ozs7QUNBak0sOE9BQThPLHdGQUF3RiwrQ0FBK0Msd0NBQXdDLHFSQUFxUiwrQ0FBK0MsNEY7Ozs7OztBQ0FqdUIsdUtBQXVLLCtDQUErQyx1RkFBdUYsaUZBQWlGLDhUQUE4VCwrREFBK0QsaWZBQWlmLHFHQUFxRyxnUEFBZ1AscUdBQXFHLGtaQUFrWiw0Q0FBNEMsaU5BQWlOLGdDQUFnQywyREFBMkQsRUFBRSxzRDs7Ozs7O0FDQWw1RSw2SEFBNkgscU5BQXFOLDZFOzs7Ozs7QUNBbFYscU5BQXFOLG1FQUFtRSx1WEFBdVgsNkJBQTZCLDJYQUEyWCxnQ0FBZ0MsMkRBQTJELEVBQUUsVUFBVSw4Q0FBOEMsd0M7Ozs7OztBQ0E1ckMsc0c7Ozs7OztBQ0FBLHVKQUF1SiwyQkFBMkIsMlBBQTJQLDZDQUE2Qyw4RTs7Ozs7O0FDQTFkLG9MOzs7Ozs7QUNBQSxnUUFBZ1Esb0xBQW9MLFVBQVUsMEJBQTBCLGdaQUFnWiw4QkFBOEIsOEJBQThCLGdUQUFnVCxvQ0FBb0MsMkJBQTJCLCtEQUErRCxnS0FBZ0ssK0VBQStFLGdjOzs7Ozs7QUNBamtELHVMOzs7Ozs7QUNBQSwwS0FBMEssK0NBQStDLHNDQUFzQyxnRkFBZ0YsMktBQTJLLHNCQUFzQix5TUFBeU0sb1JBQW9SLG9LQUFvSyxVQUFVLCtCQUErQixxTEFBcUwsb0tBQW9LLFVBQVUsK0JBQStCLDRKQUE0Six1QkFBdUIsb0w7Ozs7OztBQ0EvdUQsNEhBQTRILCtDQUErQyxrWEFBa1gsdUNBQXVDLG1PQUFtTywwQ0FBMEMsMktBQTJLLDJDQUEyQyx3UkFBd1IsMkJBQTJCLHVCQUF1QixFQUFFLEVBQUUsOENBQThDLCtFQUErRSxxTUFBcU0sc0NBQXNDLDJMQUEyTCxrSkFBa0osMm9COzs7Ozs7QUNBMWlFLHFmQUFxZixtREFBbUQscVhBQXFYLDJDQUEyQyw4Q0FBOEMsd0NBQXdDLHVUQUF1VCxtQ0FBbUMsc0dBQXNHLDJDQUEyQyx5SEFBeUgsa0dBQWtHLDh4QkFBOHhCLHFEQUFxRCwwTkFBME4sNkVBQTZFLG9vQkFBb29CLG1DQUFtQyx1REFBdUQsMkNBQTJDLGlLQUFpSyxxREFBcUQsdUxBQXVMLGdEQUFnRCwwR0FBMEcsMkNBQTJDLGtEQUFrRCx3Q0FBd0MsbUhBQW1ILG1DQUFtQyxtREFBbUQsa0hBQWtILG1RQUFtUSxvSEFBb0gsNFlBQTRZLG1DQUFtQywwbEM7Ozs7OztBQ0FwM0ssOElBQThJLG9DQUFvQyxxQ0FBcUMsd0JBQXdCLCtHQUErRyw2Q0FBNkMsbU5BQW1OLG9EQUFvRCxpSEFBaUgsd0VBQXdFLGtOQUFrTixvREFBb0QsdUk7Ozs7OztBQ0FqbEMsbUpBQW1KLFdBQVcsa0ZBQWtGLHlCQUF5QixxREFBcUQsZ1BBQWdQLGdQQUFnUCwwTTs7Ozs7O0FDQTl4Qix3TUFBd00sd0JBQXdCLCtCQUErQiw4RkFBOEYsaXNCQUFpc0IsZ0ZBQWdGLG1IQUFtSCwyR0FBMkcsd1lBQXdZLGdGQUFnRix1Rjs7Ozs7O0FDQXB5RCx5S0FBeUssK0NBQStDLHVGQUF1RixpRkFBaUYsNFRBQTRULCtEQUErRCwycUJBQTJxQix3SEFBd0gsNFhBQTRYLDRDQUE0QyxpTkFBaU4sZ0NBQWdDLDJEQUEyRCxzRDs7Ozs7O0FDQWx2RSxpVEFBaVQsc0JBQXNCLHdHQUF3RyxVQUFVLDJCQUEyQixnTUFBZ00sOERBQThELHlMQUF5TCw2Q0FBNkMsaVBBQWlQLDhEQUE4RCwrTkFBK04sZ0NBQWdDLHNCQUFzQixFQUFFLGtDOzs7Ozs7QUNBOS9DLHFJQUFxSSxzT0FBc08scUU7Ozs7OztBQ0EzVyw0SEFBNEgsc0dBQXNHLFNBQVMsZ0JBQWdCLGtDQUFrQyxzQ0FBc0MsdUZBQXVGLGlEQUFpRCxtR0FBbUcsd0NBQXdDLGdMQUFnTCxpREFBaUQsaUhBQWlILCtGQUErRixrSkFBa0osdURBQXVELHdFQUF3RSxnQ0FBZ0MsdUNBQXVDLEVBQUUsc09BQXNPLGlEQUFpRCxxS0FBcUssaURBQWlELDJGOzs7Ozs7QUNBOTBELG9MQUFvTCw2RkFBNkYsK0RBQStELHdDQUF3QyxzSUFBc0ksOENBQThDLHlDOzs7Ozs7QUNBNWlCLHdGQUF3Rix1QkFBdUIsb0hBQW9ILHNFQUFzRSw2RUFBNkUsMEZBQTBGLG1JOzs7Ozs7QUNBaGQseUlBQXlJLG1JQUFtSSw4RTs7Ozs7O0FDQTVRLHlJOzs7Ozs7QUNBQSxpL0I7Ozs7OztBQ0FBLCtDQUErQyxhQUFhLGFBQWEsZ0JBQWdCLDRKQUE0SixpQkFBaUIsNlRBQTZULGlCQUFpQix1UTs7Ozs7Ozs7OztBQ0FwbEI7QUFBQSxzQ0FBc0M7QUFDdEMsMENBQTBDO0FBQzFDLGdDQUFnQztBQUNoQywwQ0FBMEM7QUFDMUMsOENBQThDO0FBQzlDLGlDQUFpQztBQUNqQyw0Q0FBNEM7QUFDNUMsdUJBQXVCO0FBR3ZCLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsOERBQThEO0FBRWpEOztBQVVVO0FBMEN2QjtJQUFpQyw4RUFBSztJQWlHcEMscUJBQVksT0FBZSxFQUFFLFFBQXVCLEVBQUUsS0FBb0IsRUFBRSxRQUFvQjtRQUFoRyxZQUNFLGlCQUFPLFNBVVI7UUFUQyxLQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixLQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixLQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixLQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixLQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQztRQUUxQixFQUFFLENBQUMsQ0FBQyxPQUFRLEtBQWEsQ0FBQyxpQkFBaUIsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzFELEtBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdEQsQ0FBQzs7SUFDSCxDQUFDO0lBM0dhLHdCQUFZLEdBQTFCLFVBQTJCLFFBQXVCLEVBQUUsS0FBb0I7UUFDdEUsYUFBYSxFQUFVO1lBQ3JCLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyRCxDQUFDO1FBRUQsdUJBQXVCLENBQVM7WUFDOUIsTUFBTSxDQUFDLENBQUM7aUJBQ0wsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7aUJBQ3RCLE9BQU8sQ0FBQyxJQUFJLEVBQUcsTUFBTSxDQUFDO2lCQUN0QixPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztpQkFDckIsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7aUJBQ3JCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO2lCQUNyQixPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztpQkFDckIsT0FBTyxDQUFDLGNBQWMsRUFBYSxVQUFDLEVBQUUsSUFBSyxhQUFNLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFoQixDQUFnQixDQUFFO2lCQUM3RCxPQUFPLENBQUMsdUJBQXVCLEVBQUUsVUFBQyxFQUFFLElBQUssWUFBSyxHQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBaEIsQ0FBZ0IsQ0FBRSxDQUFDO1FBQ2pFLENBQUM7UUFFRCxxQkFBcUIsQ0FBUztZQUM1QixNQUFNLENBQUMsQ0FBQztpQkFDTCxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztpQkFDdEIsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7aUJBQ3JCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO2lCQUNyQixPQUFPLENBQUMsSUFBSSxFQUFHLEtBQUssQ0FBQztpQkFDckIsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7aUJBQ3JCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO2lCQUNyQixPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztpQkFDckIsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7aUJBQ3JCLE9BQU8sQ0FBQyxjQUFjLEVBQWEsVUFBQyxFQUFFLElBQUssYUFBTSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBaEIsQ0FBZ0IsQ0FBRTtpQkFDN0QsT0FBTyxDQUFDLHVCQUF1QixFQUFFLFVBQUMsRUFBRSxJQUFLLFlBQUssR0FBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQWhCLENBQWdCLENBQUUsQ0FBQztRQUNqRSxDQUFDO1FBRUQsNkJBQTZCLFdBQXdCO1lBQ25ELE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixLQUFLLFNBQVM7b0JBQ1osTUFBTSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDdkQsS0FBSyxPQUFPO29CQUNWLElBQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQUMsSUFBSTt3QkFDOUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDOzRCQUN4QixDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQVcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBVyxDQUFDOzRCQUN2RSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN4QixDQUFDLENBQUMsQ0FBQztvQkFFSCxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLEdBQUcsR0FBRyxDQUFDO2dCQUN0RSxLQUFLLEtBQUs7b0JBQ1IsTUFBTSxDQUFDLGVBQWUsQ0FBQztnQkFDekIsS0FBSyxLQUFLO29CQUNSLE1BQU0sQ0FBQyxjQUFjLENBQUM7Z0JBQ3hCLEtBQUssT0FBTztvQkFDVixNQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztZQUNuQyxDQUFDO1FBQ0gsQ0FBQztRQUVELDBCQUEwQixTQUF3QjtZQUNoRCxJQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLENBQUM7WUFDTixJQUFJLENBQUMsQ0FBQztZQUVOLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVwQixFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUNoRCxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzVDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ2xDLENBQUMsRUFBRSxDQUFDO29CQUNOLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUMxQixDQUFDO1lBRUQsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLEtBQUssQ0FBQztvQkFDSixNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV6QixLQUFLLENBQUM7b0JBQ0osTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVwRDtvQkFDRSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDOzBCQUN2QyxPQUFPOzBCQUNQLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzlDLENBQUM7UUFDSCxDQUFDO1FBRUQsdUJBQXVCLE1BQXFCO1lBQzFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFDdkUsQ0FBQztRQUVELE1BQU0sQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsT0FBTyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUM7SUFDL0YsQ0FBQztJQW9CSCxrQkFBQztBQUFELENBQUMsQ0E3R2dDLEtBQUssR0E2R3JDOztBQU9ELG1CQUFtQixLQUFhLEVBQUUsT0FBdUI7SUFDdkQsT0FBTyxHQUFHLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRS9DLElBQU0sVUFBVSxHQUFRLEVBQUUsQ0FBQztJQUUzQixJQUFNLHNCQUFzQixHQUF3QixFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxDQUFDO0lBQ3hGLElBQUkscUJBQXFCLEdBQWMsbUJBQW1CLENBQUM7SUFFM0QsSUFBTSxNQUFNLEdBQUcsVUFBUyxJQUFTLEVBQUUsSUFBUztRQUN4QyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUM7SUFDSixJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDcEIsSUFBTSxNQUFNLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25ELElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQztJQUNwQixJQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEQsSUFBTSxNQUFNLEdBQUcsY0FBa0IsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRCxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDcEIsSUFBTSxNQUFNLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25ELElBQU0sTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNyQixJQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbkQsSUFBTSxPQUFPLEdBQUcsY0FBa0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxJQUFNLE9BQU8sR0FBRyxVQUFTLElBQVMsRUFBRSxJQUFTO1FBQ3pDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQyxDQUFDO0lBQ0osSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLElBQU0sT0FBTyxHQUFHLHNCQUFzQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDckIsSUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BELElBQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQztJQUM5QixJQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUQsSUFBTSxPQUFPLEdBQUcsY0FBa0IsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDckIsSUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BELElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQztJQUNyQixJQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEQsSUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUM7SUFDakMsSUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0QsSUFBTSxPQUFPLEdBQUcsY0FBa0IsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdELElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQztJQUNyQixJQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEQsSUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLElBQU0sT0FBTyxHQUFHLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxJQUFNLE9BQU8sR0FBRyxRQUFRLENBQUM7SUFDekIsSUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZELElBQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUN4QixJQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEQsSUFBTSxPQUFPLEdBQUcsY0FBa0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDckIsSUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BELElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQztJQUNyQixJQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEQsSUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDO0lBQzVCLElBQU0sT0FBTyxHQUFHLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxRCxJQUFNLE9BQU8sR0FBRyxVQUFVLENBQUM7SUFDM0IsSUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pELElBQU0sT0FBTyxHQUFHLGNBQWtCLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkQsSUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLElBQU0sT0FBTyxHQUFHLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxJQUFNLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDdkIsSUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3JELElBQU0sT0FBTyxHQUFHLGNBQWtCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsSUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLElBQU0sT0FBTyxHQUFHLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxJQUFNLE9BQU8sR0FBRyxTQUFTLENBQUM7SUFDMUIsSUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hELElBQU0sT0FBTyxHQUFHLGNBQWtCLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsSUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLElBQU0sT0FBTyxHQUFHLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxJQUFNLE9BQU8sR0FBRyxjQUFrQixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUUsQ0FBQyxDQUFDO0lBQ3BELElBQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQztJQUNwQixJQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkQsSUFBTSxPQUFPLEdBQUcsY0FBa0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxJQUFNLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDcEIsSUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25ELElBQU0sT0FBTyxHQUFHLGNBQWtCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsSUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLElBQU0sT0FBTyxHQUFHLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxJQUFNLE9BQU8sR0FBRyxjQUFrQixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xELElBQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQztJQUNwQixJQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkQsSUFBTSxPQUFPLEdBQUcsY0FBa0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxJQUFNLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDcEIsSUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25ELElBQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUN4QixJQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEQsSUFBTSxPQUFPLEdBQUcsY0FBa0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDckIsSUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BELElBQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQztJQUMzQixJQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekQsSUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDO0lBQzFCLElBQU0sT0FBTyxHQUFHLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4RCxJQUFNLE9BQU8sR0FBRyxjQUFrQixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELElBQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQztJQUM5QixJQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUQsSUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDO0lBQzdCLElBQU0sT0FBTyxHQUFHLHNCQUFzQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzRCxJQUFNLE9BQU8sR0FBRyxjQUFrQixNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFELElBQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUN4QixJQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEQsSUFBTSxPQUFPLEdBQUcsY0FBaUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRCxJQUFNLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDeEIsSUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RELElBQU0sT0FBTyxHQUFHLGNBQWlCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsSUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLElBQU0sT0FBTyxHQUFHLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxJQUFNLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDcEIsSUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25ELElBQU0sT0FBTyxHQUFHLFVBQVMsSUFBUyxJQUFTLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUQsSUFBTSxPQUFPLEdBQUcsVUFBUyxJQUFTLEVBQUUsTUFBVyxJQUFTLE1BQU0sQ0FBQyxJQUFJLHFFQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BHLElBQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQztJQUNwQixJQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkQsSUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzFCLElBQU0sUUFBUSxHQUFHLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4RCxJQUFNLFFBQVEsR0FBRyxVQUFTLElBQVMsSUFBUyxNQUFNLENBQUMsSUFBSSxrRUFBWSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RixJQUFNLFFBQVEsR0FBRyxVQUFTLElBQVMsRUFBRSxFQUFPLElBQVMsTUFBTSxDQUFDLElBQUksa0VBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUYsSUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLElBQU0sUUFBUSxHQUFHLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2RCxJQUFNLFFBQVEsR0FBRyxjQUFrQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELElBQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUM1QixJQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUQsSUFBTSxRQUFRLEdBQUcsY0FBa0IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RCxJQUFNLFFBQVEsR0FBRyxXQUFXLENBQUM7SUFDN0IsSUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVELElBQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQztJQUN4QixJQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkQsSUFBTSxRQUFRLEdBQUcsY0FBa0IsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxJQUFNLFFBQVEsR0FBRyxVQUFTLEtBQVUsSUFBUyxNQUFNLENBQUMsSUFBSSwyREFBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLElBQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQztJQUNyQixJQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEQsSUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO0lBQ3JCLElBQU0sUUFBUSxHQUFHLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRCxJQUFNLFFBQVEsR0FBRyxVQUFTLEtBQVUsSUFBUyxNQUFNLENBQUMsSUFBSSw4REFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNFLElBQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQztJQUNyQixJQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEQsSUFBTSxRQUFRLEdBQUcsVUFBUyxLQUFVLElBQVMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDdEIsSUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JELElBQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQztJQUNyQixJQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFD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LEVBQUUsNkRBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyIsImZpbGUiOiIuL3BhY2thZ2VzL3N1cnZleS1rbm9ja291dC9zdXJ2ZXkua28uanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJrbm9ja291dFwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIlN1cnZleVwiLCBbXCJrbm9ja291dFwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJTdXJ2ZXlcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJrbm9ja291dFwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiU3VydmV5XCJdID0gZmFjdG9yeShyb290W1wia29cIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV82X18pIHtcbnJldHVybiBcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTQ5KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBhYmZmNDNkMzkwNzQ2ZDhkOTYwNSIsImV4cG9ydCB2YXIgX19hc3NpZ24gPVxuICAoPGFueT5PYmplY3QpW1wiYXNzaWduXCJdIHx8XG4gIGZ1bmN0aW9uKHRhcmdldDogYW55KSB7XG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgZm9yICh2YXIgcCBpbiBzKVxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0YXJnZXRbcF0gPSBzW3BdO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKHRoaXNDbGFzczogYW55LCBiYXNlQ2xhc3M6IGFueSkge1xuICBmb3IgKHZhciBwIGluIGJhc2VDbGFzcylcbiAgICBpZiAoYmFzZUNsYXNzLmhhc093blByb3BlcnR5KHApKSB0aGlzQ2xhc3NbcF0gPSBiYXNlQ2xhc3NbcF07XG4gIGZ1bmN0aW9uIF9fKCkge1xuICAgIHRoaXMuY29uc3RydWN0b3IgPSB0aGlzQ2xhc3M7XG4gIH1cbiAgdGhpc0NsYXNzLnByb3RvdHlwZSA9XG4gICAgYmFzZUNsYXNzID09PSBudWxsXG4gICAgICA/IE9iamVjdC5jcmVhdGUoYmFzZUNsYXNzKVxuICAgICAgOiAoKF9fLnByb3RvdHlwZSA9IGJhc2VDbGFzcy5wcm90b3R5cGUpLCBuZXcgKDxhbnk+X18pKCkpO1xufVxuXG5kZWNsYXJlIHZhciBSZWZsZWN0OmFueTtcblxuZXhwb3J0IHZhciBfX2RlY29yYXRlID0gZnVuY3Rpb24oXG4gIGRlY29yYXRvcnM6IGFueSxcbiAgdGFyZ2V0OiBhbnksXG4gIGtleTogYW55LFxuICBkZXNjOiBhbnlcbikge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgciA9XG4gICAgICBjIDwgM1xuICAgICAgICA/IHRhcmdldFxuICAgICAgICA6IGRlc2MgPT09IG51bGxcbiAgICAgICAgICA/IChkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkpXG4gICAgICAgICAgOiBkZXNjLFxuICAgIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZVxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgaWYgKChkID0gZGVjb3JhdG9yc1tpXSkpXG4gICAgICAgIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9lbnRyaWVzL2NodW5rcy9oZWxwZXJzLnRzIiwiaW1wb3J0IHsgSGVscGVycywgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElPYmplY3Qge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBjbGFzcyBKc29uT2JqZWN0UHJvcGVydHkgaW1wbGVtZW50cyBJT2JqZWN0IHtcbiAgcHVibGljIHN0YXRpYyBnZXRJdGVtVmFsdWVzRGVmYXVsdFZhbHVlOiAodmFsOiBhbnkpID0+IGFueTtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBwcml2YXRlIHN0YXRpYyBtZXJnYWJsZVZhbHVlcyA9IFtcbiAgICBcInR5cGVWYWx1ZVwiLFxuICAgIFwiY2hvaWNlc1ZhbHVlXCIsXG4gICAgXCJiYXNlVmFsdWVcIixcbiAgICBcInJlYWRPbmx5VmFsdWVcIixcbiAgICBcInZpc2libGVWYWx1ZVwiLFxuICAgIFwiaXNTZXJpYWxpemFibGVcIixcbiAgICBcImlzTGlnaHRTZXJpYWxpemFibGVcIixcbiAgICBcImlzRHluYW1pY0Nob2ljZXNcIixcbiAgICBcImlzTG9jYWxpemFibGVWYWx1ZVwiLFxuICAgIFwiY2xhc3NOYW1lXCIsXG4gICAgXCJhbHRlcm5hdGl2ZU5hbWVcIixcbiAgICBcImxheW91dFwiLFxuICAgIFwiY2xhc3NOYW1lUGFydFwiLFxuICAgIFwiYmFzZUNsYXNzTmFtZVwiLFxuICAgIFwiZGVmYXVsdFZhbHVlXCIsXG4gICAgXCJzZXJpYWxpemF0aW9uUHJvcGVydHlcIixcbiAgICBcIm9uR2V0VmFsdWVcIixcbiAgICBcIm9uU2V0VmFsdWVcIixcbiAgICBcImRlcGVuZGVkUHJvcGVydGllc1wiLFxuICAgIFwidmlzaWJsZUlmXCJcbiAgXTtcbiAgcHJpdmF0ZSB0eXBlVmFsdWU6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgY2hvaWNlc1ZhbHVlOiBBcnJheTxhbnk+ID0gbnVsbDtcbiAgcHJpdmF0ZSBiYXNlVmFsdWU6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgaXNSZXF1aXJlZFZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZE9ubHlWYWx1ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZpc2libGVWYWx1ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlzTG9jYWxpemFibGVWYWx1ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNob2ljZXNmdW5jOiAob2JqOiBhbnksIGNob2ljZXNDYWxsYmFjazogYW55KSA9PiBBcnJheTxhbnk+ID0gbnVsbDtcbiAgcHJpdmF0ZSBkZXBlbmRlZFByb3BlcnRpZXM6IEFycmF5PHN0cmluZz4gPSBudWxsO1xuICBwdWJsaWMgaXNTZXJpYWxpemFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBwdWJsaWMgaXNMaWdodFNlcmlhbGl6YWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBpc0R5bmFtaWNDaG9pY2VzOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBjbGFzc05hbWU6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBhbHRlcm5hdGl2ZU5hbWU6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBjbGFzc05hbWVQYXJ0OiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgYmFzZUNsYXNzTmFtZTogc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIGRlZmF1bHRWYWx1ZVZhbHVlOiBhbnkgPSBudWxsO1xuICBwdWJsaWMgc2VyaWFsaXphdGlvblByb3BlcnR5OiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgbGF5b3V0OiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgb25HZXRWYWx1ZTogKG9iajogYW55KSA9PiBhbnkgPSBudWxsO1xuICBwdWJsaWMgb25TZXRWYWx1ZTogKG9iajogYW55LCB2YWx1ZTogYW55LCBqc29uQ29udjogSnNvbk9iamVjdCkgPT4gYW55ID0gbnVsbDtcbiAgcHVibGljIHZpc2libGVJZjogKG9iajogYW55KSA9PiBib29sZWFuID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBpc1JlcXVpcmVkOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICB0aGlzLmlzUmVxdWlyZWRWYWx1ZSA9IGlzUmVxdWlyZWQ7XG4gIH1cbiAgcHVibGljIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHlwZVZhbHVlID8gdGhpcy50eXBlVmFsdWUgOiBcInN0cmluZ1wiO1xuICB9XG4gIHB1YmxpYyBzZXQgdHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIml0ZW12YWx1ZXNcIikgdmFsdWUgPSBcIml0ZW12YWx1ZVtdXCI7XG4gICAgdGhpcy50eXBlVmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy50eXBlVmFsdWUuaW5kZXhPZihcIltdXCIpID09PSB0aGlzLnR5cGVWYWx1ZS5sZW5ndGggLSAyKSB7XG4gICAgICB0aGlzLmlzQXJyYXkgPSB0cnVlO1xuICAgICAgdGhpcy5jbGFzc05hbWUgPSB0aGlzLnR5cGVWYWx1ZS5zdWJzdHIoMCwgdGhpcy50eXBlVmFsdWUubGVuZ3RoIC0gMik7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBpc0FycmF5ID0gZmFsc2U7XG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1JlcXVpcmVkVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBpc1JlcXVpcmVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuaXNSZXF1aXJlZFZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzVG9Vc2VHZXRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vbkdldFZhbHVlIHx8IHRoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5O1xuICB9XG4gIHB1YmxpYyBnZXQgZGVmYXVsdFZhbHVlKCkge1xuICAgIHZhciByZXN1bHQ6IGFueSA9IHRoaXMuZGVmYXVsdFZhbHVlVmFsdWU7XG4gICAgaWYgKFxuICAgICAgISFKc29uT2JqZWN0UHJvcGVydHkuZ2V0SXRlbVZhbHVlc0RlZmF1bHRWYWx1ZSAmJlxuICAgICAgSnNvbk9iamVjdC5tZXRhRGF0YS5pc0Rlc2NlbmRhbnRPZih0aGlzLmNsYXNzTmFtZSwgXCJpdGVtdmFsdWVcIilcbiAgICApIHtcbiAgICAgIHJlc3VsdCA9IEpzb25PYmplY3RQcm9wZXJ0eS5nZXRJdGVtVmFsdWVzRGVmYXVsdFZhbHVlKFxuICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZVZhbHVlIHx8IFtdXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHB1YmxpYyBzZXQgZGVmYXVsdFZhbHVlKG5ld1ZhbHVlKSB7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWVWYWx1ZSA9IG5ld1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBpc0RlZmF1bHRWYWx1ZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRWYWx1ZSkpXG4gICAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWUgPT0gdmFsdWU7XG4gICAgcmV0dXJuIChcbiAgICAgICh2YWx1ZSA9PT0gZmFsc2UgJiYgdGhpcy50eXBlID09IFwiYm9vbGVhblwiKSB8fFxuICAgICAgdmFsdWUgPT09IFwiXCIgfHxcbiAgICAgIEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlKVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldFZhbHVlKG9iajogYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5vbkdldFZhbHVlKSByZXR1cm4gdGhpcy5vbkdldFZhbHVlKG9iaik7XG4gICAgaWYgKHRoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5KVxuICAgICAgcmV0dXJuIG9ialt0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV0uZ2V0SnNvbigpO1xuICAgIHJldHVybiBvYmpbdGhpcy5uYW1lXTtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvcGVydHlWYWx1ZShvYmo6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNMb2NhbGl6YWJsZSkgcmV0dXJuIG9ialt0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV0udGV4dDtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZShvYmopO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzVG9Vc2VTZXRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vblNldFZhbHVlIHx8IHRoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5O1xuICB9XG4gIHB1YmxpYyBzZXRWYWx1ZShvYmo6IGFueSwgdmFsdWU6IGFueSwganNvbkNvbnY6IEpzb25PYmplY3QpIHtcbiAgICBpZiAodGhpcy5vblNldFZhbHVlKSB7XG4gICAgICB0aGlzLm9uU2V0VmFsdWUob2JqLCB2YWx1ZSwganNvbkNvbnYpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHkpXG4gICAgICAgIG9ialt0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV0uc2V0SnNvbih2YWx1ZSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG9ialt0aGlzLm5hbWVdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRPYmpUeXBlKG9ialR5cGU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5jbGFzc05hbWVQYXJ0KSByZXR1cm4gb2JqVHlwZTtcbiAgICByZXR1cm4gb2JqVHlwZS5yZXBsYWNlKHRoaXMuY2xhc3NOYW1lUGFydCwgXCJcIik7XG4gIH1cbiAgcHVibGljIGdldENsYXNzTmFtZShjbGFzc05hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGNsYXNzTmFtZSkgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NOYW1lUGFydCAmJiBjbGFzc05hbWUuaW5kZXhPZih0aGlzLmNsYXNzTmFtZVBhcnQpIDwgMFxuICAgICAgPyBjbGFzc05hbWUgKyB0aGlzLmNsYXNzTmFtZVBhcnRcbiAgICAgIDogY2xhc3NOYW1lO1xuICB9XG4gIC8qKlxuICAgKiBEZXByaWNhdGVkLCBwbGVhc2UgdXNlIGdldENob2ljZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlcygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDaG9pY2VzKG51bGwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzQ2hvaWNlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmNob2ljZXNWYWx1ZSB8fCAhIXRoaXMuY2hvaWNlc2Z1bmM7XG4gIH1cbiAgcHVibGljIGdldENob2ljZXMob2JqOiBhbnksIGNob2ljZXNDYWxsYmFjazogYW55ID0gbnVsbCk6IEFycmF5PGFueT4ge1xuICAgIGlmICh0aGlzLmNob2ljZXNWYWx1ZSAhPSBudWxsKSByZXR1cm4gdGhpcy5jaG9pY2VzVmFsdWU7XG4gICAgaWYgKHRoaXMuY2hvaWNlc2Z1bmMgIT0gbnVsbCkgcmV0dXJuIHRoaXMuY2hvaWNlc2Z1bmMob2JqLCBjaG9pY2VzQ2FsbGJhY2spO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBzZXRDaG9pY2VzKHZhbHVlOiBBcnJheTxhbnk+LCB2YWx1ZUZ1bmM6ICgpID0+IEFycmF5PGFueT4pIHtcbiAgICB0aGlzLmNob2ljZXNWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuY2hvaWNlc2Z1bmMgPSB2YWx1ZUZ1bmM7XG4gIH1cbiAgcHVibGljIGdldEJhc2VWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5iYXNlVmFsdWUpIHJldHVybiBcIlwiO1xuICAgIGlmICh0eXBlb2YgdGhpcy5iYXNlVmFsdWUgPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdGhpcy5iYXNlVmFsdWUoKTtcbiAgICByZXR1cm4gdGhpcy5iYXNlVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldEJhc2VWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuYmFzZVZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZE9ubHlWYWx1ZSAhPSBudWxsID8gdGhpcy5yZWFkT25seVZhbHVlIDogZmFsc2U7XG4gIH1cbiAgcHVibGljIHNldCByZWFkT25seSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnJlYWRPbmx5VmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGlzVmlzaWJsZShsYXlvdXQ6IHN0cmluZywgb2JqOiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgbGV0IGlzTGF5b3V0ID0gIXRoaXMubGF5b3V0IHx8IHRoaXMubGF5b3V0ID09IGxheW91dDtcbiAgICBpZiAoIXRoaXMudmlzaWJsZSB8fCAhaXNMYXlvdXQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoISF0aGlzLnZpc2libGVJZiAmJiAhIW9iaikgcmV0dXJuIHRoaXMudmlzaWJsZUlmKG9iaik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVWYWx1ZSAhPSBudWxsID8gdGhpcy52aXNpYmxlVmFsdWUgOiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnZpc2libGVWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzTG9jYWxpemFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2NhbGl6YWJsZVZhbHVlICE9IG51bGwgPyB0aGlzLmlzTG9jYWxpemFibGVWYWx1ZSA6IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNMb2NhbGl6YWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzTG9jYWxpemFibGVWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgbWVyZ2VXaXRoKHByb3A6IEpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIHZhciB2YWx1ZXNOYW1lcyA9IEpzb25PYmplY3RQcm9wZXJ0eS5tZXJnYWJsZVZhbHVlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlc05hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLm1lcmdlVmFsdWUocHJvcCwgdmFsdWVzTmFtZXNbaV0pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgYWRkRGVwZW5kZWRQcm9wZXJ0eShuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuZGVwZW5kZWRQcm9wZXJ0aWVzKSB7XG4gICAgICB0aGlzLmRlcGVuZGVkUHJvcGVydGllcyA9IFtdO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXBlbmRlZFByb3BlcnRpZXMuaW5kZXhPZihuYW1lKSA8IDApIHtcbiAgICAgIHRoaXMuZGVwZW5kZWRQcm9wZXJ0aWVzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXREZXBlbmRlZFByb3BlcnRpZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuICEhdGhpcy5kZXBlbmRlZFByb3BlcnRpZXMgPyB0aGlzLmRlcGVuZGVkUHJvcGVydGllcyA6IFtdO1xuICB9XG4gIHByaXZhdGUgbWVyZ2VWYWx1ZShwcm9wOiBKc29uT2JqZWN0UHJvcGVydHksIHZhbHVlTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXNbdmFsdWVOYW1lXSA9PSBudWxsICYmIHByb3BbdmFsdWVOYW1lXSAhPSBudWxsKSB7XG4gICAgICB0aGlzW3ZhbHVlTmFtZV0gPSBwcm9wW3ZhbHVlTmFtZV07XG4gICAgfVxuICB9XG59XG5leHBvcnQgY2xhc3MgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ge1xuICBwcml2YXRlIHN0YXRpYyBwcm9wZXJ0aWVzOiBJT2JqZWN0ID0ge307XG4gIHByaXZhdGUgc3RhdGljIHBhcmVudENsYXNzZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgcHVibGljIHN0YXRpYyBhZGRQcm9wZXJ0eShjbGFzc05hbWU6IHN0cmluZywgcHJvcGVydHk6IGFueSkge1xuICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBwcm9wcyA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnByb3BlcnRpZXM7XG4gICAgaWYgKCFwcm9wc1tjbGFzc05hbWVdKSB7XG4gICAgICBwcm9wc1tjbGFzc05hbWVdID0gW107XG4gICAgfVxuICAgIHByb3BzW2NsYXNzTmFtZV0ucHVzaChwcm9wZXJ0eSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyByZW1vdmVQcm9wZXJ0eShjbGFzc05hbWU6IHN0cmluZywgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcHJvcHMgPSBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5wcm9wZXJ0aWVzO1xuICAgIGlmICghcHJvcHNbY2xhc3NOYW1lXSkgcmV0dXJuO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gcHJvcHNbY2xhc3NOYW1lXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwcm9wZXJ0aWVzW2ldLm5hbWUgPT0gcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHByb3BzW2NsYXNzTmFtZV0uc3BsaWNlKGksIDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIHN0YXRpYyBhZGRDbGFzcyhjbGFzc05hbWU6IHN0cmluZywgcGFyZW50Q2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAocGFyZW50Q2xhc3NOYW1lKSB7XG4gICAgICBwYXJlbnRDbGFzc05hbWUgPSBwYXJlbnRDbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucGFyZW50Q2xhc3Nlc1tjbGFzc05hbWVdID0gcGFyZW50Q2xhc3NOYW1lO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0UHJvcGVydGllcyhjbGFzc05hbWU6IHN0cmluZyk6IEFycmF5PGFueT4ge1xuICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgcHJvcHMgPSBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5wcm9wZXJ0aWVzO1xuICAgIHdoaWxlIChjbGFzc05hbWUpIHtcbiAgICAgIHZhciBwcm9wZXJ0aWVzID0gcHJvcHNbY2xhc3NOYW1lXTtcbiAgICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHJlcy5wdXNoKHByb3BlcnRpZXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbGFzc05hbWUgPSBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5wYXJlbnRDbGFzc2VzW2NsYXNzTmFtZV07XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzKG9iajogYW55KSB7XG4gICAgaWYgKCFvYmogfHwgIW9iai5nZXRUeXBlKSByZXR1cm47XG4gICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uY3JlYXRlUHJvcGVydGllc0NvcmUob2JqLCBvYmouZ2V0VHlwZSgpKTtcbiAgfVxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzQ29yZShvYmo6IGFueSwgY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgcHJvcHMgPSBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5wcm9wZXJ0aWVzO1xuICAgIGlmIChwcm9wc1tjbGFzc05hbWVdKSB7XG4gICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0aWVzSW5PYmoob2JqLCBwcm9wc1tjbGFzc05hbWVdKTtcbiAgICB9XG4gICAgdmFyIHBhcmVudENsYXNzID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucGFyZW50Q2xhc3Nlc1tjbGFzc05hbWVdO1xuICAgIGlmIChwYXJlbnRDbGFzcykge1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uY3JlYXRlUHJvcGVydGllc0NvcmUob2JqLCBwYXJlbnRDbGFzcyk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVByb3BlcnRpZXNJbk9iaihvYmo6IGFueSwgcHJvcGVydGllczogYW55W10pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnR5SW5PYmoob2JqLCBwcm9wZXJ0aWVzW2ldKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUHJvcGVydHlJbk9iaihvYmo6IGFueSwgcHJvcDogSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgaWYgKG9ialtwcm9wLm5hbWVdIHx8IG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wLm5hbWUpKSByZXR1cm47XG4gICAgaWYgKFxuICAgICAgcHJvcC5pc0xvY2FsaXphYmxlICYmXG4gICAgICBwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSAmJlxuICAgICAgIW9ialtwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV0gJiZcbiAgICAgIG9iai5jcmVhdGVDdXN0b21Mb2NhbGl6YWJsZU9ialxuICAgICkge1xuICAgICAgb2JqLmNyZWF0ZUN1c3RvbUxvY2FsaXphYmxlT2JqKHByb3AubmFtZSk7XG4gICAgICB2YXIgbG9jRGVzYyA9IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gb2JqLmdldExvY2FsaXphYmxlU3RyaW5nKHByb3AubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSwgbG9jRGVzYyk7XG4gICAgICB2YXIgZGVzYyA9IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gb2JqLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChwcm9wLm5hbWUsIHByb3AuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbih2OiBhbnkpIHtcbiAgICAgICAgICBvYmouc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KHByb3AubmFtZSwgdik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLm5hbWUsIGRlc2MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZGVmYXVsdFZhbHVlID0gcHJvcC5kZWZhdWx0VmFsdWU7XG4gICAgICBpZiAoXG4gICAgICAgIEpzb25PYmplY3QubWV0YURhdGEuaXNEZXNjZW5kYW50T2YocHJvcC5jbGFzc05hbWUsIFwiaXRlbXZhbHVlXCIpICYmXG4gICAgICAgIHR5cGVvZiBvYmouY3JlYXRlTmV3QXJyYXkgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgKSB7XG4gICAgICAgIG9iai5jcmVhdGVOZXdBcnJheShwcm9wLm5hbWUsIGZ1bmN0aW9uKGl0ZW06IGFueSkge1xuICAgICAgICAgIGl0ZW0ubG9jT3duZXIgPSBvYmo7XG4gICAgICAgIH0pO1xuICAgICAgICBvYmouc2V0UHJvcGVydHlWYWx1ZShwcm9wLm5hbWUsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoISFvYmouZ2V0UHJvcGVydHlWYWx1ZSAmJiAhIW9iai5zZXRQcm9wZXJ0eVZhbHVlKSB7XG4gICAgICAgIHZhciBkZXNjID0ge1xuICAgICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG9iai5nZXRQcm9wZXJ0eVZhbHVlKHByb3AubmFtZSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldDogZnVuY3Rpb24odjogYW55KSB7XG4gICAgICAgICAgICBvYmouc2V0UHJvcGVydHlWYWx1ZShwcm9wLm5hbWUsIHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcC5uYW1lLCBkZXNjKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEpzb25NZXRhZGF0YUNsYXNzIHtcbiAgc3RhdGljIHJlcXVpcmVkU3ltYm9sID0gXCIhXCI7XG4gIHN0YXRpYyB0eXBlU3ltYm9sID0gXCI6XCI7XG4gIHByb3BlcnRpZXM6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4gPSBudWxsO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgIHByb3BlcnRpZXM6IEFycmF5PGFueT4sXG4gICAgcHVibGljIGNyZWF0b3I6IChqc29uPzogYW55KSA9PiBhbnkgPSBudWxsLFxuICAgIHB1YmxpYyBwYXJlbnROYW1lOiBzdHJpbmcgPSBudWxsXG4gICkge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHRoaXMucGFyZW50TmFtZSkge1xuICAgICAgdGhpcy5wYXJlbnROYW1lID0gdGhpcy5wYXJlbnROYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5hZGRDbGFzcyhuYW1lLCB0aGlzLnBhcmVudE5hbWUpO1xuICAgIH1cbiAgICB0aGlzLnByb3BlcnRpZXMgPSBuZXcgQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSB0aGlzLmNyZWF0ZVByb3BlcnR5KHByb3BlcnRpZXNbaV0pO1xuICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1c2gocHJvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBmaW5kKG5hbWU6IHN0cmluZyk6IEpzb25PYmplY3RQcm9wZXJ0eSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLnByb3BlcnRpZXNbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgY3JlYXRlUHJvcGVydHkocHJvcEluZm86IGFueSk6IEpzb25PYmplY3RQcm9wZXJ0eSB7XG4gICAgdmFyIHByb3BlcnR5TmFtZSA9IHR5cGVvZiBwcm9wSW5mbyA9PT0gXCJzdHJpbmdcIiA/IHByb3BJbmZvIDogcHJvcEluZm8ubmFtZTtcbiAgICBpZiAoIXByb3BlcnR5TmFtZSkgcmV0dXJuO1xuICAgIHZhciBwcm9wZXJ0eVR5cGUgPSBudWxsO1xuICAgIHZhciB0eXBlSW5kZXggPSBwcm9wZXJ0eU5hbWUuaW5kZXhPZihKc29uTWV0YWRhdGFDbGFzcy50eXBlU3ltYm9sKTtcbiAgICBpZiAodHlwZUluZGV4ID4gLTEpIHtcbiAgICAgIHByb3BlcnR5VHlwZSA9IHByb3BlcnR5TmFtZS5zdWJzdHJpbmcodHlwZUluZGV4ICsgMSk7XG4gICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIHR5cGVJbmRleCk7XG4gICAgfVxuICAgIHZhciBpc1JlcXVpcmVkID0gdGhpcy5nZXRJc1Byb3BlcnR5TmFtZVJlcXVpcmVkKHByb3BlcnR5TmFtZSk7XG4gICAgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKTtcbiAgICB2YXIgcHJvcCA9IG5ldyBKc29uT2JqZWN0UHJvcGVydHkocHJvcGVydHlOYW1lLCBpc1JlcXVpcmVkKTtcbiAgICBpZiAocHJvcGVydHlUeXBlKSB7XG4gICAgICBwcm9wLnR5cGUgPSBwcm9wZXJ0eVR5cGU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJvcEluZm8gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmIChwcm9wSW5mby50eXBlKSB7XG4gICAgICAgIHByb3AudHlwZSA9IHByb3BJbmZvLnR5cGU7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLmRlZmF1bHQpKSB7XG4gICAgICAgIHByb3AuZGVmYXVsdFZhbHVlID0gcHJvcEluZm8uZGVmYXVsdDtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uaXNTZXJpYWxpemFibGUpKSB7XG4gICAgICAgIHByb3AuaXNTZXJpYWxpemFibGUgPSBwcm9wSW5mby5pc1NlcmlhbGl6YWJsZTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uaXNMaWdodFNlcmlhbGl6YWJsZSkpIHtcbiAgICAgICAgcHJvcC5pc0xpZ2h0U2VyaWFsaXphYmxlID0gcHJvcEluZm8uaXNMaWdodFNlcmlhbGl6YWJsZTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uaXNEeW5hbWljQ2hvaWNlcykpIHtcbiAgICAgICAgcHJvcC5pc0R5bmFtaWNDaG9pY2VzID0gcHJvcEluZm8uaXNEeW5hbWljQ2hvaWNlcztcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby52aXNpYmxlID09PSBmYWxzZSkge1xuICAgICAgICBwcm9wLnZpc2libGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghIXByb3BJbmZvLnZpc2libGVJZikge1xuICAgICAgICBwcm9wLnZpc2libGVJZiA9IHByb3BJbmZvLnZpc2libGVJZjtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5jaG9pY2VzKSB7XG4gICAgICAgIHZhciBjaG9pY2VzRnVuYyA9XG4gICAgICAgICAgdHlwZW9mIHByb3BJbmZvLmNob2ljZXMgPT09IFwiZnVuY3Rpb25cIiA/IHByb3BJbmZvLmNob2ljZXMgOiBudWxsO1xuICAgICAgICB2YXIgY2hvaWNlc1ZhbHVlID1cbiAgICAgICAgICB0eXBlb2YgcHJvcEluZm8uY2hvaWNlcyAhPT0gXCJmdW5jdGlvblwiID8gcHJvcEluZm8uY2hvaWNlcyA6IG51bGw7XG4gICAgICAgIHByb3Auc2V0Q2hvaWNlcyhjaG9pY2VzVmFsdWUsIGNob2ljZXNGdW5jKTtcbiAgICAgIH1cbiAgICAgIGlmICghIXByb3BJbmZvLmJhc2VWYWx1ZSkge1xuICAgICAgICBwcm9wLnNldEJhc2VWYWx1ZShwcm9wSW5mby5iYXNlVmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLm9uR2V0VmFsdWUpIHtcbiAgICAgICAgcHJvcC5vbkdldFZhbHVlID0gcHJvcEluZm8ub25HZXRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5vblNldFZhbHVlKSB7XG4gICAgICAgIHByb3Aub25TZXRWYWx1ZSA9IHByb3BJbmZvLm9uU2V0VmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uaXNMb2NhbGl6YWJsZSkge1xuICAgICAgICBwcm9wSW5mby5zZXJpYWxpemF0aW9uUHJvcGVydHkgPSBcImxvY1wiICsgcHJvcEluZm8ubmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5zZXJpYWxpemF0aW9uUHJvcGVydHkpIHtcbiAgICAgICAgcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHkgPSBwcm9wSW5mby5zZXJpYWxpemF0aW9uUHJvcGVydHk7XG4gICAgICAgIHZhciBzOiBzdHJpbmc7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSAmJlxuICAgICAgICAgIHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5LmluZGV4T2YoXCJsb2NcIikgPT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICBwcm9wLmlzTG9jYWxpemFibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uaXNMb2NhbGl6YWJsZSkge1xuICAgICAgICBwcm9wLmlzTG9jYWxpemFibGUgPSBwcm9wSW5mby5pc0xvY2FsaXphYmxlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmNsYXNzTmFtZSkge1xuICAgICAgICBwcm9wLmNsYXNzTmFtZSA9IHByb3BJbmZvLmNsYXNzTmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5iYXNlQ2xhc3NOYW1lKSB7XG4gICAgICAgIHByb3AuYmFzZUNsYXNzTmFtZSA9IHByb3BJbmZvLmJhc2VDbGFzc05hbWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uY2xhc3NOYW1lUGFydCkge1xuICAgICAgICBwcm9wLmNsYXNzTmFtZVBhcnQgPSBwcm9wSW5mby5jbGFzc05hbWVQYXJ0O1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmFsdGVybmF0aXZlTmFtZSkge1xuICAgICAgICBwcm9wLmFsdGVybmF0aXZlTmFtZSA9IHByb3BJbmZvLmFsdGVybmF0aXZlTmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5sYXlvdXQpIHtcbiAgICAgICAgcHJvcC5sYXlvdXQgPSBwcm9wSW5mby5sYXlvdXQ7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uZGVwZW5kc09uKSB7XG4gICAgICAgIHRoaXMuYWRkRGVwZW5kc09uUHJvcGVydGllcyhwcm9wLCBwcm9wSW5mby5kZXBlbmRzT24pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcDtcbiAgfVxuICBwcml2YXRlIGFkZERlcGVuZHNPblByb3BlcnRpZXMocHJvcDogSnNvbk9iamVjdFByb3BlcnR5LCBkZXBlbmRzT246IGFueSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRlcGVuZHNPbikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwZW5kc09uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuYWRkRGVwZW5kc09uUHJvcGVydHkocHJvcCwgZGVwZW5kc09uW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGREZXBlbmRzT25Qcm9wZXJ0eShwcm9wLCBkZXBlbmRzT24pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZERlcGVuZHNPblByb3BlcnR5KHByb3A6IEpzb25PYmplY3RQcm9wZXJ0eSwgZGVwZW5kc09uOiBzdHJpbmcpIHtcbiAgICB2YXIgcHJvcGVydHkgPSB0aGlzLmZpbmQoZGVwZW5kc09uKTtcbiAgICBpZiAoIXByb3BlcnR5KSB7XG4gICAgICBwcm9wZXJ0eSA9IFNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KHRoaXMucGFyZW50TmFtZSwgZGVwZW5kc09uKTtcbiAgICB9XG4gICAgaWYgKCFwcm9wZXJ0eSkgcmV0dXJuO1xuICAgIHByb3BlcnR5LmFkZERlcGVuZGVkUHJvcGVydHkocHJvcC5uYW1lKTtcbiAgfVxuICBwcml2YXRlIGdldElzUHJvcGVydHlOYW1lUmVxdWlyZWQocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgcHJvcGVydHlOYW1lLmxlbmd0aCA+IDAgJiZcbiAgICAgIHByb3BlcnR5TmFtZVswXSA9PSBKc29uTWV0YWRhdGFDbGFzcy5yZXF1aXJlZFN5bWJvbFxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5nZXRJc1Byb3BlcnR5TmFtZVJlcXVpcmVkKHByb3BlcnR5TmFtZSkpIHJldHVybiBwcm9wZXJ0eU5hbWU7XG4gICAgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnNsaWNlKDEpO1xuICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uTWV0YWRhdGEge1xuICBwcml2YXRlIGNsYXNzZXM6IEhhc2hUYWJsZTxKc29uTWV0YWRhdGFDbGFzcz4gPSB7fTtcbiAgcHJpdmF0ZSBhbHRlcm5hdGl2ZU5hbWVzOiBIYXNoVGFibGU8c3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIGNoaWxkcmVuQ2xhc3NlczogSGFzaFRhYmxlPEFycmF5PEpzb25NZXRhZGF0YUNsYXNzPj4gPSB7fTtcbiAgcHJpdmF0ZSBjbGFzc1Byb3BlcnRpZXM6IEhhc2hUYWJsZTxBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+PiA9IHt9O1xuICBwdWJsaWMgYWRkQ2xhc3MoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHByb3BlcnRpZXM6IEFycmF5PGFueT4sXG4gICAgY3JlYXRvcjogKGpzb24/OiBhbnkpID0+IGFueSA9IG51bGwsXG4gICAgcGFyZW50TmFtZTogc3RyaW5nID0gbnVsbFxuICApOiBKc29uTWV0YWRhdGFDbGFzcyB7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IG5ldyBKc29uTWV0YWRhdGFDbGFzcyhcbiAgICAgIG5hbWUsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgY3JlYXRvcixcbiAgICAgIHBhcmVudE5hbWVcbiAgICApO1xuICAgIHRoaXMuY2xhc3Nlc1tuYW1lXSA9IG1ldGFEYXRhQ2xhc3M7XG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIHBhcmVudE5hbWUgPSBwYXJlbnROYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuQ2xhc3Nlc1twYXJlbnROYW1lXTtcbiAgICAgIGlmICghY2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbkNsYXNzZXNbcGFyZW50TmFtZV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hpbGRyZW5DbGFzc2VzW3BhcmVudE5hbWVdLnB1c2gobWV0YURhdGFDbGFzcyk7XG4gICAgfVxuICAgIHJldHVybiBtZXRhRGF0YUNsYXNzO1xuICB9XG4gIHB1YmxpYyByZW1vdmVDbGFzcyhuYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgbWV0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MobmFtZSk7XG4gICAgaWYgKCFtZXRhQ2xhc3MpIHJldHVybjtcbiAgICBkZWxldGUgdGhpcy5jbGFzc2VzW21ldGFDbGFzcy5uYW1lXTtcbiAgICBpZiAoISFtZXRhQ2xhc3MucGFyZW50TmFtZSkge1xuICAgICAgdmFyIGluZGV4ID0gdGhpcy5jaGlsZHJlbkNsYXNzZXNbbWV0YUNsYXNzLnBhcmVudE5hbWVdLmluZGV4T2YobWV0YUNsYXNzKTtcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW5DbGFzc2VzW21ldGFDbGFzcy5wYXJlbnROYW1lXS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGVDbGFzc0NyZWF0b3JlKG5hbWU6IHN0cmluZywgY3JlYXRvcjogKCkgPT4gYW55KSB7XG4gICAgdGhpcy5vdmVycmlkZUNsYXNzQ3JlYXRvcihuYW1lLCBjcmVhdG9yKTtcbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGVDbGFzc0NyZWF0b3IobmFtZTogc3RyaW5nLCBjcmVhdG9yOiAoKSA9PiBhbnkpIHtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MobmFtZSk7XG4gICAgaWYgKG1ldGFEYXRhQ2xhc3MpIHtcbiAgICAgIG1ldGFEYXRhQ2xhc3MuY3JlYXRvciA9IGNyZWF0b3I7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRQcm9wZXJ0aWVzKGNsYXNzTmFtZTogc3RyaW5nKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIG1ldGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgaWYgKCFtZXRhQ2xhc3MpIHJldHVybiBbXTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuY2xhc3NQcm9wZXJ0aWVzW21ldGFDbGFzcy5uYW1lXTtcbiAgICBpZiAoIXByb3BlcnRpZXMpIHtcbiAgICAgIHByb3BlcnRpZXMgPSBuZXcgQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PigpO1xuICAgICAgdGhpcy5maWxsUHJvcGVydGllcyhtZXRhQ2xhc3MubmFtZSwgcHJvcGVydGllcyk7XG4gICAgICB0aGlzLmNsYXNzUHJvcGVydGllc1ttZXRhQ2xhc3MubmFtZV0gPSBwcm9wZXJ0aWVzO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcGVydGllcztcbiAgfVxuICBwcml2YXRlIGdldER5bmFtaWNQcm9wZXJ0aWVzKG9iajogYW55KTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgaWYgKG9iai5nZXREeW5hbWljUHJvcGVydGllcyAmJiBvYmouZ2V0RHluYW1pY1R5cGUpIHtcbiAgICAgIHZhciBuYW1lcyA9IG9iai5nZXREeW5hbWljUHJvcGVydGllcygpO1xuICAgICAgcmV0dXJuIEpzb25PYmplY3QubWV0YURhdGEuZmluZFByb3BlcnRpZXMob2JqLmdldER5bmFtaWNUeXBlKCksIG5hbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9wZXJ0aWVzQnlPYmoob2JqOiBhbnkpOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICBpZiAoIW9iaiB8fCAhb2JqLmdldFR5cGUpIHJldHVybiBbXTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIHByb3BzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKG9iai5nZXRUeXBlKCkpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcy5wdXNoKHByb3BzW2ldKTtcbiAgICB9XG4gICAgdmFyIGR5bmFtaWNQcm9wcyA9IHRoaXMuZ2V0RHluYW1pY1Byb3BlcnRpZXMob2JqKTtcbiAgICBpZiAoZHluYW1pY1Byb3BzICYmIGR5bmFtaWNQcm9wcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGR5bmFtaWNQcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXMucHVzaChkeW5hbWljUHJvcHNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHVibGljIGZpbmRQcm9wZXJ0eShcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZ1xuICApOiBKc29uT2JqZWN0UHJvcGVydHkge1xuICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0aGlzLmZpbmRQcm9wZXJ0eUNvcmUodGhpcy5nZXRQcm9wZXJ0aWVzKGNsYXNzTmFtZSksIHByb3BlcnR5TmFtZSk7XG4gIH1cbiAgcHVibGljIGZpbmRQcm9wZXJ0aWVzKFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHByb3BlcnR5TmFtZXM6IEFycmF5PHN0cmluZz5cbiAgKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKGNsYXNzTmFtZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHRoaXMuZmluZFByb3BlcnR5Q29yZShwcm9wZXJ0aWVzLCBwcm9wZXJ0eU5hbWVzW2ldKTtcbiAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHByb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgZmluZFByb3BlcnR5Q29yZShcbiAgICBwcm9wZXJ0aWVzOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+LFxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nXG4gICk6IEpzb25PYmplY3RQcm9wZXJ0eSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocHJvcGVydGllc1tpXS5uYW1lID09IHByb3BlcnR5TmFtZSkgcmV0dXJuIHByb3BlcnRpZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVDbGFzcyhuYW1lOiBzdHJpbmcsIGpzb246IGFueSA9IHVuZGVmaW5lZCk6IGFueSB7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKG5hbWUpO1xuICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuIG51bGw7XG4gICAgaWYgKG1ldGFEYXRhQ2xhc3MuY3JlYXRvcikgcmV0dXJuIG1ldGFEYXRhQ2xhc3MuY3JlYXRvcihqc29uKTtcbiAgICB2YXIgcGFyZW50TmFtZSA9IG1ldGFEYXRhQ2xhc3MucGFyZW50TmFtZTtcbiAgICB3aGlsZSAocGFyZW50TmFtZSkge1xuICAgICAgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKHBhcmVudE5hbWUpO1xuICAgICAgaWYgKCFtZXRhRGF0YUNsYXNzKSByZXR1cm4gbnVsbDtcbiAgICAgIHBhcmVudE5hbWUgPSBtZXRhRGF0YUNsYXNzLnBhcmVudE5hbWU7XG4gICAgICBpZiAobWV0YURhdGFDbGFzcy5jcmVhdG9yKVxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDdXN0b21UeXBlKG5hbWUsIG1ldGFEYXRhQ2xhc3MuY3JlYXRvciwganNvbik7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlQ3VzdG9tVHlwZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlYXRvcjogYW55LFxuICAgIGpzb246IGFueSA9IHVuZGVmaW5lZFxuICApOiBhbnkge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlcyA9IGNyZWF0b3IoanNvbik7XG4gICAgdmFyIGN1c3RvbVR5cGVOYW1lID0gbmFtZTtcbiAgICB2YXIgY3VzdG9tVGVtcGxhdGVOYW1lID0gcmVzLmdldFRlbXBsYXRlXG4gICAgICA/IHJlcy5nZXRUZW1wbGF0ZSgpXG4gICAgICA6IHJlcy5nZXRUeXBlKCk7XG4gICAgcmVzLmdldFR5cGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjdXN0b21UeXBlTmFtZTtcbiAgICB9O1xuICAgIHJlcy5nZXRUZW1wbGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGN1c3RvbVRlbXBsYXRlTmFtZTtcbiAgICB9O1xuICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXMocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXRDaGlsZHJlbkNsYXNzZXMoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNhbkJlQ3JlYXRlZDogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEFycmF5PEpzb25NZXRhZGF0YUNsYXNzPiB7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcmVzdWx0OiBBcnJheTxKc29uTWV0YWRhdGFDbGFzcz4gPSBbXTtcbiAgICB0aGlzLmZpbGxDaGlsZHJlbkNsYXNzZXMobmFtZSwgY2FuQmVDcmVhdGVkLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIGdldFJlcXVpcmVkUHJvcGVydGllcyhuYW1lOiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcyhuYW1lKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocHJvcGVydGllc1tpXS5pc1JlcXVpcmVkKSB7XG4gICAgICAgIHJlcy5wdXNoKHByb3BlcnRpZXNbaV0ubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGFkZFByb3BlcnRpZXMoY2xhc3NOYW1lOiBzdHJpbmcsIHByb3BlcnRpZXNJbmZvczogQXJyYXk8YW55Pikge1xuICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXNJbmZvcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hZGRDdXN0b21Qcm9wZXJ0eUNvcmUobWV0YURhdGFDbGFzcywgcHJvcGVydGllc0luZm9zW2ldKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGFkZFByb3BlcnR5KGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wZXJ0eUluZm86IGFueSkge1xuICAgIHRoaXMuYWRkQ3VzdG9tUHJvcGVydHlDb3JlKHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSksIHByb3BlcnR5SW5mbyk7XG4gIH1cbiAgcHJpdmF0ZSBhZGRDdXN0b21Qcm9wZXJ0eUNvcmUoXG4gICAgbWV0YURhdGFDbGFzczogSnNvbk1ldGFkYXRhQ2xhc3MsXG4gICAgcHJvcGVydHlJbmZvOiBhbnlcbiAgKSB7XG4gICAgaWYgKCFtZXRhRGF0YUNsYXNzKSByZXR1cm47XG4gICAgdmFyIHByb3BlcnR5ID0gbWV0YURhdGFDbGFzcy5jcmVhdGVQcm9wZXJ0eShwcm9wZXJ0eUluZm8pO1xuICAgIGlmIChwcm9wZXJ0eSkge1xuICAgICAgdGhpcy5hZGRQcm9wZXJ0eVRvQ2xhc3MobWV0YURhdGFDbGFzcywgcHJvcGVydHkpO1xuICAgICAgdGhpcy5lbXB0eUNsYXNzUHJvcGVydGllc0hhc2gobWV0YURhdGFDbGFzcyk7XG4gICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5hZGRQcm9wZXJ0eShtZXRhRGF0YUNsYXNzLm5hbWUsIHByb3BlcnR5KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHJlbW92ZVByb3BlcnR5KGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICBpZiAoIW1ldGFEYXRhQ2xhc3MpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcHJvcGVydHkgPSBtZXRhRGF0YUNsYXNzLmZpbmQocHJvcGVydHlOYW1lKTtcbiAgICBpZiAocHJvcGVydHkpIHtcbiAgICAgIHRoaXMucmVtb3ZlUHJvcGVydHlGcm9tQ2xhc3MobWV0YURhdGFDbGFzcywgcHJvcGVydHkpO1xuICAgICAgdGhpcy5lbXB0eUNsYXNzUHJvcGVydGllc0hhc2gobWV0YURhdGFDbGFzcyk7XG4gICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5yZW1vdmVQcm9wZXJ0eShcbiAgICAgICAgbWV0YURhdGFDbGFzcy5uYW1lLFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgYWRkUHJvcGVydHlUb0NsYXNzKFxuICAgIG1ldGFEYXRhQ2xhc3M6IEpzb25NZXRhZGF0YUNsYXNzLFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHlcbiAgKSB7XG4gICAgaWYgKG1ldGFEYXRhQ2xhc3MuZmluZChwcm9wZXJ0eS5uYW1lKSAhPSBudWxsKSByZXR1cm47XG4gICAgbWV0YURhdGFDbGFzcy5wcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpO1xuICB9XG4gIHByaXZhdGUgcmVtb3ZlUHJvcGVydHlGcm9tQ2xhc3MoXG4gICAgbWV0YURhdGFDbGFzczogSnNvbk1ldGFkYXRhQ2xhc3MsXG4gICAgcHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eVxuICApIHtcbiAgICB2YXIgaW5kZXggPSBtZXRhRGF0YUNsYXNzLnByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eSk7XG4gICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuO1xuICAgIG1ldGFEYXRhQ2xhc3MucHJvcGVydGllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG4gIHByaXZhdGUgZW1wdHlDbGFzc1Byb3BlcnRpZXNIYXNoKG1ldGFEYXRhQ2xhc3M6IEpzb25NZXRhZGF0YUNsYXNzKSB7XG4gICAgdGhpcy5jbGFzc1Byb3BlcnRpZXNbbWV0YURhdGFDbGFzcy5uYW1lXSA9IG51bGw7XG4gICAgdmFyIGNoaWxkQ2xhc3NlcyA9IHRoaXMuZ2V0Q2hpbGRyZW5DbGFzc2VzKG1ldGFEYXRhQ2xhc3MubmFtZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY2xhc3NQcm9wZXJ0aWVzW2NoaWxkQ2xhc3Nlc1tpXS5uYW1lXSA9IG51bGw7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZmlsbENoaWxkcmVuQ2xhc3NlcyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY2FuQmVDcmVhdGVkOiBib29sZWFuLFxuICAgIHJlc3VsdDogQXJyYXk8SnNvbk1ldGFkYXRhQ2xhc3M+XG4gICkge1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5DbGFzc2VzW25hbWVdO1xuICAgIGlmICghY2hpbGRyZW4pIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWNhbkJlQ3JlYXRlZCB8fCBjaGlsZHJlbltpXS5jcmVhdG9yKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsbENoaWxkcmVuQ2xhc3NlcyhjaGlsZHJlbltpXS5uYW1lLCBjYW5CZUNyZWF0ZWQsIHJlc3VsdCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBmaW5kQ2xhc3MobmFtZTogc3RyaW5nKTogSnNvbk1ldGFkYXRhQ2xhc3Mge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlcyA9IHRoaXMuY2xhc3Nlc1tuYW1lXTtcbiAgICBpZiAoIXJlcykge1xuICAgICAgdmFyIG5ld05hbWUgPSB0aGlzLmFsdGVybmF0aXZlTmFtZXNbbmFtZV07XG4gICAgICBpZiAoISFuZXdOYW1lICYmIG5ld05hbWUgIT0gbmFtZSkgcmV0dXJuIHRoaXMuZmluZENsYXNzKG5ld05hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBpc0Rlc2NlbmRhbnRPZihjbGFzc05hbWU6IHN0cmluZywgYW5jZXN0b3JDbGFzc05hbWU6IHN0cmluZykge1xuICAgIGlmICghY2xhc3NOYW1lIHx8ICFhbmNlc3RvckNsYXNzTmFtZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBhbmNlc3RvckNsYXNzTmFtZSA9IGFuY2VzdG9yQ2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGNsYXNzXyA9IHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgaWYgKCFjbGFzc18pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHBhcmVudENsYXNzID0gY2xhc3NfO1xuICAgIGRvIHtcbiAgICAgIGlmIChwYXJlbnRDbGFzcy5uYW1lID09PSBhbmNlc3RvckNsYXNzTmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHBhcmVudENsYXNzID0gdGhpcy5jbGFzc2VzW3BhcmVudENsYXNzLnBhcmVudE5hbWVdO1xuICAgIH0gd2hpbGUgKCEhcGFyZW50Q2xhc3MpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgYWRkQWx0ZXJOYXRpdmVDbGFzc05hbWUobmFtZTogc3RyaW5nLCBhbHRlcm5hdGl2ZU5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuYWx0ZXJuYXRpdmVOYW1lc1thbHRlcm5hdGl2ZU5hbWUudG9Mb3dlckNhc2UoKV0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcHJpdmF0ZSBmaWxsUHJvcGVydGllcyhuYW1lOiBzdHJpbmcsIGxpc3Q6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4pIHtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKG5hbWUpO1xuICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuO1xuICAgIGlmIChtZXRhRGF0YUNsYXNzLnBhcmVudE5hbWUpIHtcbiAgICAgIHRoaXMuZmlsbFByb3BlcnRpZXMobWV0YURhdGFDbGFzcy5wYXJlbnROYW1lLCBsaXN0KTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhRGF0YUNsYXNzLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYWRkUHJvcGVydHlDb3JlKG1ldGFEYXRhQ2xhc3MucHJvcGVydGllc1tpXSwgbGlzdCwgbGlzdC5sZW5ndGgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZFByb3BlcnR5Q29yZShcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIGxpc3Q6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4sXG4gICAgZW5kSW5kZXg6IG51bWJlclxuICApIHtcbiAgICB2YXIgaW5kZXggPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZEluZGV4OyBpKyspIHtcbiAgICAgIGlmIChsaXN0W2ldLm5hbWUgPT0gcHJvcGVydHkubmFtZSkge1xuICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICBsaXN0LnB1c2gocHJvcGVydHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wZXJ0eS5tZXJnZVdpdGgobGlzdFtpbmRleF0pO1xuICAgICAgbGlzdFtpbmRleF0gPSBwcm9wZXJ0eTtcbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uRXJyb3Ige1xuICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZyA9IFwiXCI7XG4gIHB1YmxpYyBhdDogTnVtYmVyID0gLTE7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0eXBlOiBzdHJpbmcsIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmcpIHt9XG4gIHB1YmxpYyBnZXRGdWxsRGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlICsgKHRoaXMuZGVzY3JpcHRpb24gPyBcIlxcblwiICsgdGhpcy5kZXNjcmlwdGlvbiA6IFwiXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgSnNvblVua25vd25Qcm9wZXJ0eUVycm9yIGV4dGVuZHMgSnNvbkVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHByb3BlcnR5TmFtZTogc3RyaW5nLCBwdWJsaWMgY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIFwidW5rbm93bnByb3BlcnR5XCIsXG4gICAgICBcIlRoZSBwcm9wZXJ0eSAnXCIgK1xuICAgICAgICBwcm9wZXJ0eU5hbWUgK1xuICAgICAgICBcIicgaW4gY2xhc3MgJ1wiICtcbiAgICAgICAgY2xhc3NOYW1lICtcbiAgICAgICAgXCInIGlzIHVua25vd24uXCJcbiAgICApO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRQcm9wZXJ0aWVzKGNsYXNzTmFtZSk7XG4gICAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBcIlRoZSBsaXN0IG9mIGF2YWlsYWJsZSBwcm9wZXJ0aWVzIGFyZTogXCI7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPiAwKSB0aGlzLmRlc2NyaXB0aW9uICs9IFwiLCBcIjtcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiArPSBwcm9wZXJ0aWVzW2ldLm5hbWU7XG4gICAgICB9XG4gICAgICB0aGlzLmRlc2NyaXB0aW9uICs9IFwiLlwiO1xuICAgIH1cbiAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25NaXNzaW5nVHlwZUVycm9yQmFzZSBleHRlbmRzIEpzb25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBiYXNlQ2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHR5cGU6IHN0cmluZyxcbiAgICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHR5cGUsIG1lc3NhZ2UpO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBcIlRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIGF2YWlsYWJsZTogXCI7XG4gICAgdmFyIHR5cGVzID0gSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRDaGlsZHJlbkNsYXNzZXMoYmFzZUNsYXNzTmFtZSwgdHJ1ZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB0aGlzLmRlc2NyaXB0aW9uICs9IFwiLCBcIjtcbiAgICAgIHRoaXMuZGVzY3JpcHRpb24gKz0gXCInXCIgKyB0eXBlc1tpXS5uYW1lICsgXCInXCI7XG4gICAgfVxuICAgIHRoaXMuZGVzY3JpcHRpb24gKz0gXCIuXCI7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uTWlzc2luZ1R5cGVFcnJvciBleHRlbmRzIEpzb25NaXNzaW5nVHlwZUVycm9yQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIGJhc2VDbGFzc05hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgYmFzZUNsYXNzTmFtZSxcbiAgICAgIFwibWlzc2luZ3R5cGVwcm9wZXJ0eVwiLFxuICAgICAgXCJUaGUgcHJvcGVydHkgdHlwZSBpcyBtaXNzaW5nIGluIHRoZSBvYmplY3QuIFBsZWFzZSB0YWtlIGEgbG9vayBhdCBwcm9wZXJ0eTogJ1wiICtcbiAgICAgICAgcHJvcGVydHlOYW1lICtcbiAgICAgICAgXCInLlwiXG4gICAgKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25JbmNvcnJlY3RUeXBlRXJyb3IgZXh0ZW5kcyBKc29uTWlzc2luZ1R5cGVFcnJvckJhc2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHB1YmxpYyBiYXNlQ2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIGJhc2VDbGFzc05hbWUsXG4gICAgICBcImluY29ycmVjdHR5cGVwcm9wZXJ0eVwiLFxuICAgICAgXCJUaGUgcHJvcGVydHkgdHlwZSBpcyBpbmNvcnJlY3QgaW4gdGhlIG9iamVjdC4gUGxlYXNlIHRha2UgYSBsb29rIGF0IHByb3BlcnR5OiAnXCIgK1xuICAgICAgICBwcm9wZXJ0eU5hbWUgK1xuICAgICAgICBcIicuXCJcbiAgICApO1xuICB9XG59XG5leHBvcnQgY2xhc3MgSnNvblJlcXVpcmVkUHJvcGVydHlFcnJvciBleHRlbmRzIEpzb25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBcInJlcXVpcmVkcHJvcGVydHlcIixcbiAgICAgIFwiVGhlIHByb3BlcnR5ICdcIiArXG4gICAgICAgIHByb3BlcnR5TmFtZSArXG4gICAgICAgIFwiJyBpcyByZXF1aXJlZCBpbiBjbGFzcyAnXCIgK1xuICAgICAgICBjbGFzc05hbWUgK1xuICAgICAgICBcIicuXCJcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBKc29uT2JqZWN0IHtcbiAgcHJpdmF0ZSBzdGF0aWMgdHlwZVByb3BlcnR5TmFtZSA9IFwidHlwZVwiO1xuICBwcml2YXRlIHN0YXRpYyBwb3NpdGlvblByb3BlcnR5TmFtZSA9IFwicG9zXCI7XG4gIHByaXZhdGUgc3RhdGljIG1ldGFEYXRhVmFsdWUgPSBuZXcgSnNvbk1ldGFkYXRhKCk7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IG1ldGFEYXRhKCkge1xuICAgIHJldHVybiBKc29uT2JqZWN0Lm1ldGFEYXRhVmFsdWU7XG4gIH1cbiAgcHVibGljIGVycm9ycyA9IG5ldyBBcnJheTxKc29uRXJyb3I+KCk7XG4gIHB1YmxpYyBsaWdodFNlcmlhbGl6aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyB0b0pzb25PYmplY3Qob2JqOiBhbnksIHN0b3JlRGVmYXVsdHMgPSBmYWxzZSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudG9Kc29uT2JqZWN0Q29yZShvYmosIG51bGwsIHN0b3JlRGVmYXVsdHMpO1xuICB9XG4gIHB1YmxpYyB0b09iamVjdChqc29uT2JqOiBhbnksIG9iajogYW55KSB7XG4gICAgaWYgKCFqc29uT2JqKSByZXR1cm47XG4gICAgdmFyIHByb3BlcnRpZXMgPSBudWxsO1xuICAgIHZhciBvYmpUeXBlID0gdW5kZWZpbmVkO1xuICAgIHZhciBuZWVkQWRkRXJyb3JzID0gdHJ1ZTtcbiAgICBpZiAob2JqLmdldFR5cGUpIHtcbiAgICAgIG9ialR5cGUgPSBvYmouZ2V0VHlwZSgpO1xuICAgICAgcHJvcGVydGllcyA9IEpzb25PYmplY3QubWV0YURhdGEuZ2V0UHJvcGVydGllcyhvYmpUeXBlKTtcbiAgICAgIG5lZWRBZGRFcnJvcnMgPVxuICAgICAgICAhIW9ialR5cGUgJiYgIUpzb25PYmplY3QubWV0YURhdGEuaXNEZXNjZW5kYW50T2Yob2JqVHlwZSwgXCJpdGVtdmFsdWVcIik7XG4gICAgfVxuICAgIGlmICghcHJvcGVydGllcykgcmV0dXJuO1xuICAgIGlmIChvYmouc3RhcnRMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgIG9iai5zdGFydExvYWRpbmdGcm9tSnNvbigpO1xuICAgIH1cbiAgICBwcm9wZXJ0aWVzID0gdGhpcy5hZGREeW5hbWljUHJvcGVydGllcyhvYmosIGpzb25PYmosIHByb3BlcnRpZXMpO1xuICAgIGZvciAodmFyIGtleSBpbiBqc29uT2JqKSB7XG4gICAgICBpZiAoa2V5ID09PSBKc29uT2JqZWN0LnR5cGVQcm9wZXJ0eU5hbWUpIGNvbnRpbnVlO1xuICAgICAgaWYgKGtleSA9PT0gSnNvbk9iamVjdC5wb3NpdGlvblByb3BlcnR5TmFtZSkge1xuICAgICAgICBvYmpba2V5XSA9IGpzb25PYmpba2V5XTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcGVydHkgPSB0aGlzLmZpbmRQcm9wZXJ0eShwcm9wZXJ0aWVzLCBrZXkpO1xuICAgICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgICBpZiAobmVlZEFkZEVycm9ycykge1xuICAgICAgICAgIHRoaXMuYWRkTmV3RXJyb3IoXG4gICAgICAgICAgICBuZXcgSnNvblVua25vd25Qcm9wZXJ0eUVycm9yKGtleS50b1N0cmluZygpLCBvYmpUeXBlKSxcbiAgICAgICAgICAgIGpzb25PYmpcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy52YWx1ZVRvT2JqKGpzb25PYmpba2V5XSwgb2JqLCBwcm9wZXJ0eSk7XG4gICAgfVxuICAgIGlmIChvYmouZW5kTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICBvYmouZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCB0b0pzb25PYmplY3RDb3JlKFxuICAgIG9iajogYW55LFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHksXG4gICAgc3RvcmVEZWZhdWx0cyA9IGZhbHNlXG4gICk6IGFueSB7XG4gICAgaWYgKCFvYmogfHwgIW9iai5nZXRUeXBlKSByZXR1cm4gb2JqO1xuICAgIGlmICh0eXBlb2Ygb2JqLmdldERhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG9iai5nZXREYXRhKCk7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsICYmICFwcm9wZXJ0eS5jbGFzc05hbWUpIHtcbiAgICAgICg8YW55PnJlc3VsdClbSnNvbk9iamVjdC50eXBlUHJvcGVydHlOYW1lXSA9IHByb3BlcnR5LmdldE9ialR5cGUoXG4gICAgICAgIG9iai5nZXRUeXBlKClcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucHJvcGVydGllc1RvSnNvbihcbiAgICAgIG9iaixcbiAgICAgIEpzb25PYmplY3QubWV0YURhdGEuZ2V0UHJvcGVydGllcyhvYmouZ2V0VHlwZSgpKSxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHN0b3JlRGVmYXVsdHNcbiAgICApO1xuICAgIHRoaXMucHJvcGVydGllc1RvSnNvbihcbiAgICAgIG9iaixcbiAgICAgIHRoaXMuZ2V0RHluYW1pY1Byb3BlcnRpZXMob2JqKSxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHN0b3JlRGVmYXVsdHNcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBnZXREeW5hbWljUHJvcGVydGllcyhvYmo6IGFueSk6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIGlmIChvYmouZ2V0RHluYW1pY1Byb3BlcnRpZXMgJiYgb2JqLmdldER5bmFtaWNUeXBlKSB7XG4gICAgICB2YXIgbmFtZXMgPSBvYmouZ2V0RHluYW1pY1Byb3BlcnRpZXMoKTtcbiAgICAgIHJldHVybiBKc29uT2JqZWN0Lm1ldGFEYXRhLmZpbmRQcm9wZXJ0aWVzKG9iai5nZXREeW5hbWljVHlwZSgpLCBuYW1lcyk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuICBwcml2YXRlIGFkZER5bmFtaWNQcm9wZXJ0aWVzKFxuICAgIG9iajogYW55LFxuICAgIGpzb25PYmo6IGFueSxcbiAgICBwcm9wZXJ0aWVzOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+XG4gICk6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIGlmICghb2JqLmdldER5bmFtaWNQcm9wZXJ0eU5hbWUpIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIHZhciBkeW5hbWljUHJvcE5hbWUgPSBvYmouZ2V0RHluYW1pY1Byb3BlcnR5TmFtZSgpO1xuICAgIGlmICghZHluYW1pY1Byb3BOYW1lKSByZXR1cm4gcHJvcGVydGllcztcbiAgICBpZiAoanNvbk9ialtkeW5hbWljUHJvcE5hbWVdKSB7XG4gICAgICBvYmpbZHluYW1pY1Byb3BOYW1lXSA9IGpzb25PYmpbZHluYW1pY1Byb3BOYW1lXTtcbiAgICB9XG4gICAgdmFyIGR5bmFtaWNQcm9wZXJ0aWVzID0gdGhpcy5nZXREeW5hbWljUHJvcGVydGllcyhvYmopO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcy5wdXNoKHByb3BlcnRpZXNbaV0pO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGR5bmFtaWNQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaChkeW5hbWljUHJvcGVydGllc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBwcm9wZXJ0aWVzVG9Kc29uKFxuICAgIG9iajogYW55LFxuICAgIHByb3BlcnRpZXM6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4sXG4gICAganNvbjogYW55LFxuICAgIHN0b3JlRGVmYXVsdHMgPSBmYWxzZVxuICApIHtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy52YWx1ZVRvSnNvbihvYmosIGpzb24sIHByb3BlcnRpZXNbaV0sIHN0b3JlRGVmYXVsdHMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgdmFsdWVUb0pzb24oXG4gICAgb2JqOiBhbnksXG4gICAgcmVzdWx0OiBhbnksXG4gICAgcHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eSxcbiAgICBzdG9yZURlZmF1bHRzID0gZmFsc2VcbiAgKSB7XG4gICAgaWYgKFxuICAgICAgcHJvcGVydHkuaXNTZXJpYWxpemFibGUgPT09IGZhbHNlIHx8XG4gICAgICAocHJvcGVydHkuaXNMaWdodFNlcmlhbGl6YWJsZSA9PT0gZmFsc2UgJiYgdGhpcy5saWdodFNlcmlhbGl6aW5nKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB2YXIgdmFsdWUgPSBwcm9wZXJ0eS5nZXRWYWx1ZShvYmopO1xuICAgIGlmICghc3RvcmVEZWZhdWx0cyAmJiBwcm9wZXJ0eS5pc0RlZmF1bHRWYWx1ZSh2YWx1ZSkpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc1ZhbHVlQXJyYXkodmFsdWUpKSB7XG4gICAgICB2YXIgYXJyVmFsdWUgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyVmFsdWUucHVzaCh0aGlzLnRvSnNvbk9iamVjdENvcmUodmFsdWVbaV0sIHByb3BlcnR5LCBzdG9yZURlZmF1bHRzKSk7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IGFyclZhbHVlLmxlbmd0aCA+IDAgPyBhcnJWYWx1ZSA6IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdGhpcy50b0pzb25PYmplY3RDb3JlKHZhbHVlLCBwcm9wZXJ0eSwgc3RvcmVEZWZhdWx0cyk7XG4gICAgfVxuICAgIHZhciBoYXNWYWx1ZSA9XG4gICAgICB0eXBlb2Ygb2JqW1wiZ2V0UHJvcGVydHlWYWx1ZVwiXSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICBvYmpbXCJnZXRQcm9wZXJ0eVZhbHVlXCJdKHByb3BlcnR5Lm5hbWUsIG51bGwpICE9PSBudWxsO1xuICAgIGlmICgoc3RvcmVEZWZhdWx0cyAmJiBoYXNWYWx1ZSkgfHwgIXByb3BlcnR5LmlzRGVmYXVsdFZhbHVlKHZhbHVlKSkge1xuICAgICAgcmVzdWx0W3Byb3BlcnR5Lm5hbWVdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCB2YWx1ZVRvT2JqKHZhbHVlOiBhbnksIG9iajogYW55LCBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjtcbiAgICB0aGlzLnJlbW92ZVBvcyhwcm9wZXJ0eSwgdmFsdWUpO1xuICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsICYmIHByb3BlcnR5Lmhhc1RvVXNlU2V0VmFsdWUpIHtcbiAgICAgIHByb3BlcnR5LnNldFZhbHVlKG9iaiwgdmFsdWUsIHRoaXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1ZhbHVlQXJyYXkodmFsdWUpKSB7XG4gICAgICB0aGlzLnZhbHVlVG9BcnJheSh2YWx1ZSwgb2JqLCBwcm9wZXJ0eS5uYW1lLCBwcm9wZXJ0eSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBuZXdPYmogPSB0aGlzLmNyZWF0ZU5ld09iaih2YWx1ZSwgcHJvcGVydHkpO1xuICAgIGlmIChuZXdPYmoubmV3T2JqKSB7XG4gICAgICB0aGlzLnRvT2JqZWN0KHZhbHVlLCBuZXdPYmoubmV3T2JqKTtcbiAgICAgIHZhbHVlID0gbmV3T2JqLm5ld09iajtcbiAgICB9XG4gICAgaWYgKCFuZXdPYmouZXJyb3IpIHtcbiAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7XG4gICAgICAgIHByb3BlcnR5LnNldFZhbHVlKG9iaiwgdmFsdWUsIHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqW3Byb3BlcnR5Lm5hbWVdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcmVtb3ZlUG9zKHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHksIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXByb3BlcnR5IHx8ICFwcm9wZXJ0eS50eXBlIHx8IHByb3BlcnR5LnR5cGUuaW5kZXhPZihcInZhbHVlXCIpIDwgMClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnJlbW92ZVBvc0Zyb21PYmoodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgcmVtb3ZlUG9zRnJvbU9iaihvYmo6IGFueSkge1xuICAgIGlmICghb2JqKSByZXR1cm47XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5yZW1vdmVQb3NGcm9tT2JqKG9ialtpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIW9ialtKc29uT2JqZWN0LnBvc2l0aW9uUHJvcGVydHlOYW1lXSkge1xuICAgICAgZGVsZXRlIG9ialtKc29uT2JqZWN0LnBvc2l0aW9uUHJvcGVydHlOYW1lXTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlQXJyYXkodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU5ld09iaih2YWx1ZTogYW55LCBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5KTogYW55IHtcbiAgICB2YXIgcmVzdWx0OiBhbnkgPSB7IG5ld09iajogbnVsbCwgZXJyb3I6IG51bGwgfTtcbiAgICB2YXIgY2xhc3NOYW1lID0gdmFsdWVbSnNvbk9iamVjdC50eXBlUHJvcGVydHlOYW1lXTtcbiAgICBpZiAoIWNsYXNzTmFtZSAmJiBwcm9wZXJ0eSAhPSBudWxsICYmIHByb3BlcnR5LmNsYXNzTmFtZSkge1xuICAgICAgY2xhc3NOYW1lID0gcHJvcGVydHkuY2xhc3NOYW1lO1xuICAgIH1cbiAgICBjbGFzc05hbWUgPSBwcm9wZXJ0eS5nZXRDbGFzc05hbWUoY2xhc3NOYW1lKTtcbiAgICByZXN1bHQubmV3T2JqID0gY2xhc3NOYW1lXG4gICAgICA/IEpzb25PYmplY3QubWV0YURhdGEuY3JlYXRlQ2xhc3MoY2xhc3NOYW1lLCB2YWx1ZSlcbiAgICAgIDogbnVsbDtcbiAgICByZXN1bHQuZXJyb3IgPSB0aGlzLmNoZWNrTmV3T2JqZWN0T25FcnJvcnMoXG4gICAgICByZXN1bHQubmV3T2JqLFxuICAgICAgdmFsdWUsXG4gICAgICBwcm9wZXJ0eSxcbiAgICAgIGNsYXNzTmFtZVxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIGNoZWNrTmV3T2JqZWN0T25FcnJvcnMoXG4gICAgbmV3T2JqOiBhbnksXG4gICAgdmFsdWU6IGFueSxcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIGNsYXNzTmFtZTogc3RyaW5nXG4gICk6IEpzb25FcnJvciB7XG4gICAgdmFyIGVycm9yID0gbnVsbDtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICB2YXIgcmVxdWlyZWRQcm9wZXJ0aWVzID0gSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRSZXF1aXJlZFByb3BlcnRpZXMoXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKTtcbiAgICAgIGlmIChyZXF1aXJlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXF1aXJlZFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoIXZhbHVlW3JlcXVpcmVkUHJvcGVydGllc1tpXV0pIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IEpzb25SZXF1aXJlZFByb3BlcnR5RXJyb3IoXG4gICAgICAgICAgICAgIHJlcXVpcmVkUHJvcGVydGllc1tpXSxcbiAgICAgICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcm9wZXJ0eS5iYXNlQ2xhc3NOYW1lKSB7XG4gICAgICAgIGlmICghY2xhc3NOYW1lKSB7XG4gICAgICAgICAgZXJyb3IgPSBuZXcgSnNvbk1pc3NpbmdUeXBlRXJyb3IoXG4gICAgICAgICAgICBwcm9wZXJ0eS5uYW1lLFxuICAgICAgICAgICAgcHJvcGVydHkuYmFzZUNsYXNzTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyb3IgPSBuZXcgSnNvbkluY29ycmVjdFR5cGVFcnJvcihcbiAgICAgICAgICAgIHByb3BlcnR5Lm5hbWUsXG4gICAgICAgICAgICBwcm9wZXJ0eS5iYXNlQ2xhc3NOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHRoaXMuYWRkTmV3RXJyb3IoZXJyb3IsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG4gIHByaXZhdGUgYWRkTmV3RXJyb3IoZXJyb3I6IEpzb25FcnJvciwganNvbk9iajogYW55KSB7XG4gICAgaWYgKGpzb25PYmogJiYganNvbk9ialtKc29uT2JqZWN0LnBvc2l0aW9uUHJvcGVydHlOYW1lXSkge1xuICAgICAgZXJyb3IuYXQgPSBqc29uT2JqW0pzb25PYmplY3QucG9zaXRpb25Qcm9wZXJ0eU5hbWVdLnN0YXJ0O1xuICAgIH1cbiAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yKTtcbiAgfVxuICBwcml2YXRlIHZhbHVlVG9BcnJheShcbiAgICB2YWx1ZTogQXJyYXk8YW55PixcbiAgICBvYmo6IGFueSxcbiAgICBrZXk6IGFueSxcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5XG4gICkge1xuICAgIGlmIChvYmpba2V5XSAmJiB2YWx1ZS5sZW5ndGggPiAwKSBvYmpba2V5XS5zcGxpY2UoMCwgb2JqW2tleV0ubGVuZ3RoKTtcbiAgICBpZiAoIW9ialtrZXldKSBvYmpba2V5XSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3T2JqKHZhbHVlW2ldLCBwcm9wZXJ0eSk7XG4gICAgICBpZiAobmV3VmFsdWUubmV3T2JqKSB7XG4gICAgICAgIGlmICghIXZhbHVlW2ldLm5hbWUpIHtcbiAgICAgICAgICBuZXdWYWx1ZS5uZXdPYmoubmFtZSA9IHZhbHVlW2ldLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgb2JqW2tleV0ucHVzaChuZXdWYWx1ZS5uZXdPYmopO1xuICAgICAgICB0aGlzLnRvT2JqZWN0KHZhbHVlW2ldLCBuZXdWYWx1ZS5uZXdPYmopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFuZXdWYWx1ZS5lcnJvcikge1xuICAgICAgICAgIG9ialtrZXldLnB1c2godmFsdWVbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZmluZFByb3BlcnR5KFxuICAgIHByb3BlcnRpZXM6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4sXG4gICAga2V5OiBhbnlcbiAgKTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICBpZiAoIXByb3BlcnRpZXMpIHJldHVybiBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgaWYgKHByb3AubmFtZSA9PSBrZXkgfHwgcHJvcC5hbHRlcm5hdGl2ZU5hbWUgPT0ga2V5KSByZXR1cm4gcHJvcDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IHZhciBTZXJpYWxpemVyID0gSnNvbk9iamVjdC5tZXRhRGF0YTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9qc29ub2JqZWN0LnRzIiwiaW1wb3J0IHsgZW5nbGlzaFN0cmluZ3MgfSBmcm9tIFwiLi9sb2NhbGl6YXRpb24vZW5nbGlzaFwiO1xuXG5leHBvcnQgdmFyIHN1cnZleUxvY2FsaXphdGlvbiA9IHtcbiAgY3VycmVudExvY2FsZVZhbHVlOiBcIlwiLFxuICBkZWZhdWx0TG9jYWxlVmFsdWU6IFwiZW5cIixcbiAgbG9jYWxlczogPHtbaW5kZXg6IHN0cmluZ106IGFueX0+e30sXG4gIGxvY2FsZU5hbWVzOiA8e1tpbmRleDogc3RyaW5nXTogYW55fT57fSxcbiAgc3VwcG9ydGVkTG9jYWxlczogPEFycmF5PGFueT4+W10sXG4gIGdldCBjdXJyZW50TG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZSA9PT0gdGhpcy5kZWZhdWx0TG9jYWxlVmFsdWVcbiAgICAgID8gXCJcIlxuICAgICAgOiB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZTtcbiAgfSxcbiAgc2V0IGN1cnJlbnRMb2NhbGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZSA9IHZhbDtcbiAgfSxcbiAgZ2V0IGRlZmF1bHRMb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdExvY2FsZVZhbHVlO1xuICB9LFxuICBzZXQgZGVmYXVsdExvY2FsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuZGVmYXVsdExvY2FsZVZhbHVlID0gdmFsO1xuICB9LFxuICBnZXRTdHJpbmc6IGZ1bmN0aW9uKHN0ck5hbWU6IHN0cmluZykge1xuICAgIHZhciBsb2MgPSB0aGlzLmN1cnJlbnRMb2NhbGVcbiAgICAgID8gdGhpcy5sb2NhbGVzW3RoaXMuY3VycmVudExvY2FsZV1cbiAgICAgIDogdGhpcy5sb2NhbGVzW3RoaXMuZGVmYXVsdExvY2FsZV07XG4gICAgaWYgKCFsb2MgfHwgIWxvY1tzdHJOYW1lXSkgbG9jID0gdGhpcy5sb2NhbGVzW3RoaXMuZGVmYXVsdExvY2FsZV07XG4gICAgdmFyIHJlc3VsdCA9IGxvY1tzdHJOYW1lXTtcbiAgICBpZihyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5sb2NhbGVzW1wiZW5cIl1bc3RyTmFtZV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG4gIGdldExvY2FsZXM6IGZ1bmN0aW9uKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICByZXMucHVzaChcIlwiKTtcbiAgICBpZiAodGhpcy5zdXBwb3J0ZWRMb2NhbGVzICYmIHRoaXMuc3VwcG9ydGVkTG9jYWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3VwcG9ydGVkTG9jYWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXMucHVzaCh0aGlzLnN1cHBvcnRlZExvY2FsZXNbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5sb2NhbGVzKSB7XG4gICAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlcy5zb3J0KCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufTtcblxuZXhwb3J0IHZhciBzdXJ2ZXlTdHJpbmdzID0gZW5nbGlzaFN0cmluZ3M7XG4oPGFueT5zdXJ2ZXlMb2NhbGl6YXRpb24pLmxvY2FsZXNbXCJlblwiXSA9IGVuZ2xpc2hTdHJpbmdzO1xuKDxhbnk+c3VydmV5TG9jYWxpemF0aW9uKS5sb2NhbGVOYW1lc1tcImVuXCJdID0gXCJlbmdsaXNoXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc3VydmV5U3RyaW5ncy50cyIsImltcG9ydCB7IEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IElFbGVtZW50IH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcblxuLy9UT0RPIHJlcGxhY2UgY29tcGxldGVseSB3aXRoIEVsZW1lbnRGYWN0b3J5XG5leHBvcnQgY2xhc3MgUXVlc3Rpb25GYWN0b3J5IHtcbiAgcHVibGljIHN0YXRpYyBJbnN0YW5jZTogUXVlc3Rpb25GYWN0b3J5ID0gbmV3IFF1ZXN0aW9uRmFjdG9yeSgpO1xuICBwdWJsaWMgc3RhdGljIGdldCBEZWZhdWx0Q2hvaWNlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9pY2VzX0l0ZW1cIikgKyBcIjFcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9pY2VzX0l0ZW1cIikgKyBcIjJcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9pY2VzX0l0ZW1cIikgKyBcIjNcIlxuICAgIF07XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXQgRGVmYXVsdENvbHVtcygpOiBzdHJpbmdbXSB7XG4gICAgdmFyIGNvbE5hbWUgPSBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibWF0cml4X2NvbHVtblwiKSArIFwiIFwiO1xuICAgIHJldHVybiBbY29sTmFtZSArIFwiMVwiLCBjb2xOYW1lICsgXCIyXCIsIGNvbE5hbWUgKyBcIjNcIl07XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXQgRGVmYXVsdFJvd3MoKTogc3RyaW5nW10ge1xuICAgIHZhciByb3dOYW1lID0gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1hdHJpeF9yb3dcIikgKyBcIiBcIjtcbiAgICByZXR1cm4gW3Jvd05hbWUgKyBcIjFcIiwgcm93TmFtZSArIFwiMlwiXTtcbiAgfVxuICBwcml2YXRlIGNyZWF0b3JIYXNoOiBIYXNoVGFibGU8KG5hbWU6IHN0cmluZykgPT4gUXVlc3Rpb24+ID0ge307XG5cbiAgcHVibGljIHJlZ2lzdGVyUXVlc3Rpb24oXG4gICAgcXVlc3Rpb25UeXBlOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25DcmVhdG9yOiAobmFtZTogc3RyaW5nKSA9PiBRdWVzdGlvblxuICApIHtcbiAgICB0aGlzLmNyZWF0b3JIYXNoW3F1ZXN0aW9uVHlwZV0gPSBxdWVzdGlvbkNyZWF0b3I7XG4gIH1cbiAgcHVibGljIHVucmVnaXN0ZXJFbGVtZW50KGVsZW1lbnRUeXBlOiBzdHJpbmcpIHtcbiAgICBkZWxldGUgdGhpcy5jcmVhdG9ySGFzaFtlbGVtZW50VHlwZV07XG4gIH1cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMuY3JlYXRvckhhc2ggPSB7fTtcbiAgfVxuICBwdWJsaWMgZ2V0QWxsVHlwZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuY3JlYXRvckhhc2gpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuc29ydCgpO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVRdWVzdGlvbihxdWVzdGlvblR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHZhciBjcmVhdG9yID0gdGhpcy5jcmVhdG9ySGFzaFtxdWVzdGlvblR5cGVdO1xuICAgIGlmIChjcmVhdG9yID09IG51bGwpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBjcmVhdG9yKG5hbWUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50RmFjdG9yeSB7XG4gIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IEVsZW1lbnRGYWN0b3J5ID0gbmV3IEVsZW1lbnRGYWN0b3J5KCk7XG4gIHByaXZhdGUgY3JlYXRvckhhc2g6IEhhc2hUYWJsZTwobmFtZTogc3RyaW5nKSA9PiBJRWxlbWVudD4gPSB7fTtcblxuICBwdWJsaWMgcmVnaXN0ZXJFbGVtZW50KFxuICAgIGVsZW1lbnRUeXBlOiBzdHJpbmcsXG4gICAgZWxlbWVudENyZWF0b3I6IChuYW1lOiBzdHJpbmcpID0+IElFbGVtZW50XG4gICkge1xuICAgIHRoaXMuY3JlYXRvckhhc2hbZWxlbWVudFR5cGVdID0gZWxlbWVudENyZWF0b3I7XG4gIH1cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMuY3JlYXRvckhhc2ggPSB7fTtcbiAgfVxuICBwdWJsaWMgdW5yZWdpc3RlckVsZW1lbnQoXG4gICAgZWxlbWVudFR5cGU6IHN0cmluZyxcbiAgICByZW1vdmVGcm9tU2VyaWFsaXplcjogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIGRlbGV0ZSB0aGlzLmNyZWF0b3JIYXNoW2VsZW1lbnRUeXBlXTtcbiAgICBRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UudW5yZWdpc3RlckVsZW1lbnQoZWxlbWVudFR5cGUpO1xuICAgIGlmIChyZW1vdmVGcm9tU2VyaWFsaXplcikge1xuICAgICAgU2VyaWFsaXplci5yZW1vdmVDbGFzcyhlbGVtZW50VHlwZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRBbGxUeXBlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzdWx0ID0gUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLmdldEFsbFR5cGVzKCk7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuY3JlYXRvckhhc2gpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuc29ydCgpO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVFbGVtZW50KGVsZW1lbnRUeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IElFbGVtZW50IHtcbiAgICB2YXIgY3JlYXRvciA9IHRoaXMuY3JlYXRvckhhc2hbZWxlbWVudFR5cGVdO1xuICAgIGlmIChjcmVhdG9yID09IG51bGwpXG4gICAgICByZXR1cm4gUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLmNyZWF0ZVF1ZXN0aW9uKGVsZW1lbnRUeXBlLCBuYW1lKTtcbiAgICByZXR1cm4gY3JlYXRvcihuYW1lKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uZmFjdG9yeS50cyIsImV4cG9ydCBpbnRlcmZhY2UgSGFzaFRhYmxlPFQ+IHtcbiAgW2tleTogc3RyaW5nXTogVDtcbn1cblxuZXhwb3J0IGNsYXNzIEhlbHBlcnMge1xuICAvKipcbiAgICogQSBzdGF0aWMgbWV0aG9kcyB0aGF0IHJldHVybnMgdHJ1ZSBpZiBhIHZhbHVlIHVuZGVyZmluZWQsIG51bGwsIGVtcHR5IHN0cmluZyBvciBlbXB0eSBhcnJheS5cbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzVmFsdWVFbXB0eSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCEhdmFsdWUgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gIXZhbHVlICYmIHZhbHVlICE9PSAwICYmIHZhbHVlICE9PSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzQXJyYXlDb250YWluc0VxdWFsKHg6IGFueSwgeTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHgpIHx8ICFBcnJheS5pc0FycmF5KHkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHgubGVuZ3RoICE9PSB5Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGogPSAwO1xuICAgICAgZm9yICg7IGogPCB5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMoeFtpXSwgeVtqXSkpIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGogPT09IHkubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgaXNBcnJheXNFcXVhbChcbiAgICB4OiBhbnksXG4gICAgeTogYW55LFxuICAgIGlnbm9yZU9yZGVyOiBib29sZWFuID0gZmFsc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHgpIHx8ICFBcnJheS5pc0FycmF5KHkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHgubGVuZ3RoICE9PSB5Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpZ25vcmVPcmRlcikge1xuICAgICAgdmFyIHhTb3J0ZWQgPSBbXTtcbiAgICAgIHZhciB5U29ydGVkID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgeFNvcnRlZC5wdXNoKHhbaV0pO1xuICAgICAgICB5U29ydGVkLnB1c2goeVtpXSk7XG4gICAgICB9XG4gICAgICB4U29ydGVkLnNvcnQoKTtcbiAgICAgIHlTb3J0ZWQuc29ydCgpO1xuICAgICAgeCA9IHhTb3J0ZWQ7XG4gICAgICB5ID0geVNvcnRlZDtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh4W2ldLCB5W2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzVHdvVmFsdWVFcXVhbHMoXG4gICAgeDogYW55LFxuICAgIHk6IGFueSxcbiAgICBpZ25vcmVPcmRlcjogYm9vbGVhbiA9IGZhbHNlXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICh4ID09PSB5KSByZXR1cm4gdHJ1ZTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHgpICYmIHgubGVuZ3RoID09PSAwICYmIHR5cGVvZiB5ID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoeSkgJiYgeS5sZW5ndGggPT09IDAgJiYgdHlwZW9mIHggPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoKHggPT09IHVuZGVmaW5lZCB8fCB4ID09PSBudWxsKSAmJiB5ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoKHkgPT09IHVuZGVmaW5lZCB8fCB5ID09PSBudWxsKSAmJiB4ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gdHJ1ZTtcblxuICAgIGlmICgoeCAmJiAheSkgfHwgKCF4ICYmIHkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCEoeCBpbnN0YW5jZW9mIE9iamVjdCkgJiYgISh5IGluc3RhbmNlb2YgT2JqZWN0KSkgcmV0dXJuIHggPT0geTtcbiAgICBpZiAoISh4IGluc3RhbmNlb2YgT2JqZWN0KSB8fCAhKHkgaW5zdGFuY2VvZiBPYmplY3QpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHhbXCJlcXVhbHNcIl0pIHJldHVybiB4LmVxdWFscyh5KTtcbiAgICBpZiAoISF4LnRvSlNPTiAmJiAhIXkudG9KU09OKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKHgudG9KU09OKCksIHkudG9KU09OKCkpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSAmJiBBcnJheS5pc0FycmF5KHkpKVxuICAgICAgcmV0dXJuIEhlbHBlcnMuaXNBcnJheXNFcXVhbCh4LCB5LCBpZ25vcmVPcmRlcik7XG5cbiAgICBmb3IgKHZhciBwIGluIHgpIHtcbiAgICAgIGlmICgheC5oYXNPd25Qcm9wZXJ0eShwKSkgY29udGludWU7XG4gICAgICBpZiAoIXkuaGFzT3duUHJvcGVydHkocCkpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh4W3BdID09PSB5W3BdKSBjb250aW51ZTtcbiAgICAgIGlmICh0eXBlb2YgeFtwXSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCF0aGlzLmlzVHdvVmFsdWVFcXVhbHMoeFtwXSwgeVtwXSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChwIGluIHkpIHtcbiAgICAgIGlmICh5Lmhhc093blByb3BlcnR5KHApICYmICF4Lmhhc093blByb3BlcnR5KHApKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyByYW5kb21pemVBcnJheTxUPihhcnJheTogQXJyYXk8VD4pOiBBcnJheTxUPiB7XG4gICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgIHZhciBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICB2YXIgdGVtcCA9IGFycmF5W2ldO1xuICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgICAgIGFycmF5W2pdID0gdGVtcDtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0VW5iaW5kVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKCEhdmFsdWUgJiYgdmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIC8vZG8gbm90IHJldHVybiB0aGUgc2FtZSBvYmplY3QgaW5zdGFuY2UhISFcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAvKlxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBsZXQgcmVzID0gbmV3IERhdGUoKTtcbiAgICAgICAgcmVzLnNldFRpbWUodmFsdWUuZ2V0VGltZSgpKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGxldCByZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgcmVzW2ldID0gSGVscGVycy5nZXRVbmJpbmRWYWx1ZSh2YWx1ZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH1cbiAgICAgIGxldCByZXMgPSB7fTtcbiAgICAgIGZvciAodmFyIGF0dHIgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgICAgKDxhbnk+cmVzKVthdHRyXSA9IEhlbHBlcnMuZ2V0VW5iaW5kVmFsdWUodmFsdWVbYXR0cl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgICAgKi9cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0TWF4TGVuZ3RoKG1heExlbmd0aDogbnVtYmVyLCBzdXJ2ZXlMZW5ndGg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKG1heExlbmd0aCA8IDApIHtcbiAgICAgIG1heExlbmd0aCA9IHN1cnZleUxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIG1heExlbmd0aCA+IDAgPyBtYXhMZW5ndGggOiBudWxsO1xuICB9XG59XG5pZiAoISg8YW55PlN0cmluZy5wcm90b3R5cGUpW1wiZm9ybWF0XCJdKSB7XG4gICg8YW55PlN0cmluZy5wcm90b3R5cGUpW1wiZm9ybWF0XCJdID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIHRoaXMucmVwbGFjZSgveyhcXGQrKX0vZywgZnVuY3Rpb24obWF0Y2g6IGFueSwgbnVtYmVyOiBhbnkpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgYXJnc1tudW1iZXJdICE9IFwidW5kZWZpbmVkXCIgPyBhcmdzW251bWJlcl0gOiBtYXRjaDtcbiAgICB9KTtcbiAgfTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9oZWxwZXJzLnRzIiwiaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLCBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElTdXJ2ZXlEYXRhIHtcbiAgZ2V0VmFsdWUobmFtZTogc3RyaW5nKTogYW55O1xuICBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpOiBhbnk7XG4gIGdldENvbW1lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nO1xuICBzZXRDb21tZW50KG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZyk6IGFueTtcbiAgZ2V0QWxsVmFsdWVzKCk6IGFueTtcbiAgZ2V0RmlsdGVyZWRWYWx1ZXMoKTogYW55O1xuICBnZXRGaWx0ZXJlZFByb3BlcnRpZXMoKTogYW55O1xufVxuZXhwb3J0IGludGVyZmFjZSBJVGV4dFByb2Nlc3NvciB7XG4gIHByb2Nlc3NUZXh0KHRleHQ6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKTogc3RyaW5nO1xuICBwcm9jZXNzVGV4dEV4KFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICByZXR1cm5EaXNwbGF5VmFsdWU6IGJvb2xlYW4sXG4gICAgZG9FbmNvZGluZzogYm9vbGVhblxuICApOiBhbnk7XG59XG5leHBvcnQgaW50ZXJmYWNlIElTdXJ2ZXlFcnJvck93bmVyIGV4dGVuZHMgSUxvY2FsaXphYmxlT3duZXIge1xuICBnZXRFcnJvckN1c3RvbVRleHQodGV4dDogc3RyaW5nLCBlcnJvcjogU3VydmV5RXJyb3IpOiBzdHJpbmc7XG59XG5leHBvcnQgaW50ZXJmYWNlIElTdXJ2ZXkgZXh0ZW5kcyBJVGV4dFByb2Nlc3NvciwgSVN1cnZleUVycm9yT3duZXIge1xuICBjdXJyZW50UGFnZTogSVBhZ2U7XG4gIHBhZ2VzOiBBcnJheTxJUGFnZT47XG4gIGlzUGFnZVN0YXJ0ZWQocGFnZTogSVBhZ2UpOiBib29sZWFuO1xuICBwYWdlVmlzaWJpbGl0eUNoYW5nZWQocGFnZTogSVBhZ2UsIG5ld1ZhbHVlOiBib29sZWFuKTogYW55O1xuICBwYW5lbFZpc2liaWxpdHlDaGFuZ2VkKHBhbmVsOiBJUGFuZWwsIG5ld1ZhbHVlOiBib29sZWFuKTogYW55O1xuICBxdWVzdGlvblZpc2liaWxpdHlDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG5ld1ZhbHVlOiBib29sZWFuKTogYW55O1xuICBxdWVzdGlvbnNPcmRlcjogc3RyaW5nO1xuICBxdWVzdGlvbkFkZGVkKFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYXJlbnRQYW5lbDogYW55LFxuICAgIHJvb3RQYW5lbDogYW55XG4gICk6IGFueTtcbiAgcGFuZWxBZGRlZChcbiAgICBwYW5lbDogSUVsZW1lbnQsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYXJlbnRQYW5lbDogYW55LFxuICAgIHJvb3RQYW5lbDogYW55XG4gICk6IGFueTtcbiAgcXVlc3Rpb25SZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBhbnk7XG4gIHBhbmVsUmVtb3ZlZChwYW5lbDogSUVsZW1lbnQpOiBhbnk7XG4gIHF1ZXN0aW9uUmVuYW1lZChcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIG9sZE5hbWU6IHN0cmluZyxcbiAgICBvbGRWYWx1ZU5hbWU6IHN0cmluZ1xuICApOiBhbnk7XG4gIHZhbGlkYXRlUXVlc3Rpb24ocXVlc3Rpb246IElRdWVzdGlvbik6IFN1cnZleUVycm9yO1xuICB2YWxpZGF0ZVBhbmVsKHBhbmVsOiBJUGFuZWwpOiBTdXJ2ZXlFcnJvcjtcbiAgaGFzVmlzaWJsZVF1ZXN0aW9uQnlWYWx1ZU5hbWUodmFsdWVOYW1lOiBzdHJpbmcpOiBib29sZWFuO1xuICBxdWVzdGlvbkNvdW50QnlWYWx1ZU5hbWUodmFsdWVOYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIHByb2Nlc3NIdG1sKGh0bWw6IHN0cmluZyk6IHN0cmluZztcbiAgZ2V0U3VydmV5TWFya2Rvd25IdG1sKGVsZW1lbnQ6IEJhc2UsIHRleHQ6IHN0cmluZyk6IHN0cmluZztcbiAgaXNEaXNwbGF5TW9kZTogYm9vbGVhbjtcbiAgaXNEZXNpZ25Nb2RlOiBib29sZWFuO1xuICBhcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmc6IGJvb2xlYW47XG4gIGlzTG9hZGluZ0Zyb21Kc29uOiBib29sZWFuO1xuXG4gIHJlcXVpcmVkVGV4dDogc3RyaW5nO1xuICBnZXRRdWVzdGlvblRpdGxlVGVtcGxhdGUoKTogc3RyaW5nO1xuICBnZXRVcGRhdGVkUXVlc3Rpb25UaXRsZShxdWVzdGlvbjogSVF1ZXN0aW9uLCB0aXRsZTogc3RyaW5nKTogc3RyaW5nO1xuXG4gIHF1ZXN0aW9uU3RhcnRJbmRleDogc3RyaW5nO1xuICBxdWVzdGlvblRpdGxlTG9jYXRpb246IHN0cmluZztcbiAgcXVlc3Rpb25FcnJvckxvY2F0aW9uOiBzdHJpbmc7XG4gIHN0b3JlT3RoZXJzQXNDb21tZW50OiBib29sZWFuO1xuXG4gIG1heFRleHRMZW5ndGg6IG51bWJlcjtcbiAgbWF4T3RoZXJzTGVuZ3RoOiBudW1iZXI7XG4gIGNsZWFyVmFsdWVPbkRpc2FibGVJdGVtczogYm9vbGVhbjtcblxuICB1cGxvYWRGaWxlcyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZmlsZXM6IEZpbGVbXSxcbiAgICB1cGxvYWRpbmdDYWxsYmFjazogKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkpID0+IGFueVxuICApOiBhbnk7XG4gIGRvd25sb2FkRmlsZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIGNhbGxiYWNrOiAoc3RhdHVzOiBzdHJpbmcsIGRhdGE6IGFueSkgPT4gYW55XG4gICk6IGFueTtcbiAgY2xlYXJGaWxlcyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueSxcbiAgICBmaWxlTmFtZTogc3RyaW5nLFxuICAgIGNsZWFyQ2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZywgZGF0YTogYW55KSA9PiBhbnlcbiAgKTogYW55O1xuICB1cGRhdGVDaG9pY2VzRnJvbVNlcnZlcihcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIGNob2ljZXM6IEFycmF5PGFueT4sXG4gICAgc2VydmVyUmVzdWx0OiBhbnlcbiAgKTogQXJyYXk8YW55PjtcbiAgdXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNzc0NsYXNzZXM6IGFueSk6IGFueTtcbiAgdXBkYXRlUGFuZWxDc3NDbGFzc2VzKHBhbmVsOiBJUGFuZWwsIGNzc0NsYXNzZXM6IGFueSk6IGFueTtcbiAgYWZ0ZXJSZW5kZXJRdWVzdGlvbihxdWVzdGlvbjogSVF1ZXN0aW9uLCBodG1sRWxlbWVudDogYW55KTogYW55O1xuICBhZnRlclJlbmRlclBhbmVsKHBhbmVsOiBJRWxlbWVudCwgaHRtbEVsZW1lbnQ6IGFueSk6IGFueTtcbiAgYWZ0ZXJSZW5kZXJQYWdlKGh0bWxFbGVtZW50OiBhbnkpOiBhbnk7XG5cbiAgZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZUZyb21BcnJheShcbiAgICB2YWx1ZU5hbWU6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaW5kZXg6IG51bWJlclxuICApOiBJUXVlc3Rpb247XG4gIG1hdHJpeFJvd0FkZGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBhbnk7XG4gIG1hdHJpeEJlZm9yZVJvd0FkZGVkKG9wdGlvbnM6IHtcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uO1xuICAgIGNhbkFkZFJvdzogYm9vbGVhbjtcbiAgfSk6IGFueTtcbiAgbWF0cml4Um93UmVtb3ZlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCByb3dJbmRleDogbnVtYmVyLCByb3c6IGFueSk6IGFueTtcbiAgbWF0cml4Q2VsbENyZWF0ZWQocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTogYW55O1xuICBtYXRyaXhBZnRlckNlbGxSZW5kZXIocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTogYW55O1xuICBtYXRyaXhDZWxsVmFsdWVDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSk6IGFueTtcbiAgbWF0cml4Q2VsbFZhbHVlQ2hhbmdpbmcocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTogYW55O1xuICBtYXRyaXhDZWxsVmFsaWRhdGUocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTogU3VydmV5RXJyb3I7XG4gIGR5bmFtaWNQYW5lbEFkZGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBhbnk7XG4gIGR5bmFtaWNQYW5lbFJlbW92ZWQocXVlc3Rpb246IElRdWVzdGlvbiwgcGFuZWxJbmRleDogbnVtYmVyKTogYW55O1xuICBkeW5hbWljUGFuZWxJdGVtVmFsdWVDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSk6IGFueTtcblxuICBkcmFnQW5kRHJvcEFsbG93KG9wdGlvbnM6IGFueSk6IGJvb2xlYW47XG59XG5leHBvcnQgaW50ZXJmYWNlIElTdXJ2ZXlJbXBsIHtcbiAgZ2VTdXJ2ZXlEYXRhKCk6IElTdXJ2ZXlEYXRhO1xuICBnZXRTdXJ2ZXkoKTogSVN1cnZleTtcbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3Nvcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbmRpdGlvblJ1bm5lciB7XG4gIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pik6IGFueTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cnZleUVsZW1lbnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIGlzVmlzaWJsZTogYm9vbGVhbjtcbiAgaXNSZWFkT25seTogYm9vbGVhbjtcbiAgaXNQYWdlOiBib29sZWFuO1xuICBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCk6IGFueTtcbiAgb25TdXJ2ZXlMb2FkKCk6IGFueTtcbiAgb25GaXJzdFJlbmRlcmluZygpOiBhbnk7XG4gIGdldFR5cGUoKTogc3RyaW5nO1xuICBzZXRWaXNpYmxlSW5kZXgodmFsdWU6IG51bWJlcik6IG51bWJlcjtcbiAgbG9jU3Ryc0NoYW5nZWQoKTogYW55O1xufVxuZXhwb3J0IGludGVyZmFjZSBJRWxlbWVudCBleHRlbmRzIElDb25kaXRpb25SdW5uZXIsIElTdXJ2ZXlFbGVtZW50IHtcbiAgdmlzaWJsZTogYm9vbGVhbjtcbiAgcGFyZW50OiBJUGFuZWw7XG4gIHJlbmRlcldpZHRoOiBzdHJpbmc7XG4gIHdpZHRoOiBzdHJpbmc7XG4gIHJpZ2h0SW5kZW50OiBudW1iZXI7XG4gIHN0YXJ0V2l0aE5ld0xpbmU6IGJvb2xlYW47XG4gIGlzUGFuZWw6IGJvb2xlYW47XG4gIGdldFBhbmVsKCk6IElQYW5lbDtcbiAgZ2V0TGF5b3V0VHlwZSgpOiBzdHJpbmc7XG4gIGlzTGF5b3V0VHlwZVN1cHBvcnRlZChsYXlvdXRUeXBlOiBzdHJpbmcpOiBib29sZWFuO1xuICByZW1vdmVFbGVtZW50KGVsOiBJRWxlbWVudCk6IGJvb2xlYW47XG4gIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZyk6IGFueTtcbiAgdXBkYXRlQ3VzdG9tV2lkZ2V0cygpOiBhbnk7XG4gIGNsZWFySW5jb3JyZWN0VmFsdWVzKCk6IGFueTtcbiAgY2xlYXJFcnJvcnMoKTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElRdWVzdGlvbiBleHRlbmRzIElFbGVtZW50LCBJU3VydmV5RXJyb3JPd25lciB7XG4gIGhhc1RpdGxlOiBib29sZWFuO1xuICBpc0VtcHR5KCk6IGJvb2xlYW47XG4gIG9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBhbnkpOiBhbnk7XG4gIHVwZGF0ZVZhbHVlRnJvbVN1cnZleShuZXdWYWx1ZTogYW55KTogYW55O1xuICB1cGRhdGVDb21tZW50RnJvbVN1cnZleShuZXdWYWx1ZTogYW55KTogYW55O1xuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpOiBib29sZWFuO1xuICBjbGVhclVudXNlZFZhbHVlcygpOiBhbnk7XG4gIGdldERpc3BsYXlWYWx1ZShrZXlzQXNUZXh0OiBib29sZWFuKTogYW55O1xuICBnZXRWYWx1ZU5hbWUoKTogc3RyaW5nO1xuICBjbGVhclZhbHVlKCk6IGFueTtcbiAgY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk6IGFueTtcbiAgaXNBbnN3ZXJDb3JyZWN0KCk6IGJvb2xlYW47XG4gIHVwZGF0ZVZhbHVlV2l0aERlZmF1bHRzKCk6IGFueTtcbiAgZ2V0UXVlc3Rpb25Gcm9tQXJyYXkobmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogSVF1ZXN0aW9uO1xuICB2YWx1ZTogYW55O1xufVxuZXhwb3J0IGludGVyZmFjZSBJUGFyZW50RWxlbWVudCB7XG4gIGFkZEVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQsIGluZGV4OiBudW1iZXIpOiBhbnk7XG4gIHJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuO1xuICBpc1JlYWRPbmx5OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQYW5lbCBleHRlbmRzIElTdXJ2ZXlFbGVtZW50LCBJUGFyZW50RWxlbWVudCB7XG4gIGdldENoaWxkcmVuTGF5b3V0VHlwZSgpOiBzdHJpbmc7XG4gIGdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmc7XG4gIHBhcmVudDogSVBhbmVsO1xuICBlbGVtZW50V2lkdGhDaGFuZ2VkKGVsOiBJRWxlbWVudCk6IGFueTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVBhZ2UgZXh0ZW5kcyBJUGFuZWwsIElDb25kaXRpb25SdW5uZXIge1xuICBpc1N0YXJ0ZWQ6IGJvb2xlYW47XG59XG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIGZvciBTdXJ2ZXlKUyBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgQmFzZSB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGNvbW1lbnRQcmVmaXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2V0dGluZ3MuY29tbWVudFByZWZpeDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldCBjb21tZW50UHJlZml4KHZhbDogc3RyaW5nKSB7XG4gICAgc2V0dGluZ3MuY29tbWVudFByZWZpeCA9IHZhbDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUl0ZW1WYWx1ZTogKGl0ZW06IGFueSkgPT4gYW55O1xuICBwdWJsaWMgc3RhdGljIGl0ZW1WYWx1ZUxvY1N0ckNoYW5nZWQ6IChhcnI6IEFycmF5PGFueT4pID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBBIHN0YXRpYyBtZXRob2RzIHRoYXQgcmV0dXJucyB0cnVlIGlmIGEgdmFsdWUgdW5kZXJmaW5lZCwgbnVsbCwgZW1wdHkgc3RyaW5nIG9yIGVtcHR5IGFycmF5LlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBpc1ZhbHVlRW1wdHkodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIElzUHJvcGVydHlFbXB0eSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBcIlwiICYmIHRoaXMuaXNWYWx1ZUVtcHR5KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvcGVydHlIYXNoOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgcHJpdmF0ZSBsb2NhbGl6YWJsZVN0cmluZ3M6IHsgW2luZGV4OiBzdHJpbmddOiBMb2NhbGl6YWJsZVN0cmluZyB9O1xuICBwcml2YXRlIGFycmF5c0luZm86IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfTtcbiAgcHJpdmF0ZSBvblByb3BDaGFuZ2VGdW5jdGlvbnM6IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZnVuYzogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xuICAgIGtleTogc3RyaW5nO1xuICB9PjtcbiAgcHJvdGVjdGVkIGlzTG9hZGluZ0Zyb21Kc29uVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIG9uUHJvcGVydHlDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuXG4gIGdldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlcjogKHByb3BlcnRpZXNIYXNoOiBhbnksIG5hbWU6IHN0cmluZykgPT4gYW55O1xuXG4gIHNldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlcjogKFxuICAgIHByb3BlcnRpZXNIYXNoOiBhbnksXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbDogYW55XG4gICkgPT4gdm9pZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uY3JlYXRlUHJvcGVydGllcyh0aGlzKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGFzIGEgc3RyaW5nIGFzIGl0IHJlcHJlc2VudHMgaW4gdGhlIGpzb24uIEl0IHNob3VsZCBiZSBpbiBsb3djYXNlLlxuICAgKi9cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJiYXNlXCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVsZW1lbnQgdGVtcGxhdGUgbmFtZSB3aXRob3V0IHByZWZpeC4gVHlwaWNhbGx5IGl0IGVxdWFscyB0byBnZXRUeXBlKCkuXG4gICAqIEBzZWUgZ2V0VHlwZVxuICAgKi9cbiAgcHVibGljIGdldFRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VHlwZSgpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyBsb2FkaW5nIGZyb20gSnNvbiBhdCB0aGUgY3VycmVudCBtb21lbnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIHJldHVybiB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uVmFsdWU7XG4gIH1cbiAgc3RhcnRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgdGhpcy5pc0xvYWRpbmdGcm9tSnNvblZhbHVlID0gdHJ1ZTtcbiAgfVxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgdGhpcy5pc0xvYWRpbmdGcm9tSnNvblZhbHVlID0gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplZCB0aGUgY3VycmVudCBvYmplY3QgaW50byBKU09OXG4gICAqL1xuICBwdWJsaWMgdG9KU09OKCk6IGFueSB7XG4gICAgcmV0dXJuIG5ldyBKc29uT2JqZWN0KCkudG9Kc29uT2JqZWN0KHRoaXMpO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBpZiAoISF0aGlzLmFycmF5c0luZm8pIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLmFycmF5c0luZm8pIHtcbiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmFycmF5c0luZm9ba2V5XTtcbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5pc0l0ZW1WYWx1ZXMpIHtcbiAgICAgICAgICB2YXIgYXJyID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKGtleSk7XG4gICAgICAgICAgaWYgKGFyciAmJiAhIUJhc2UuaXRlbVZhbHVlTG9jU3RyQ2hhbmdlZClcbiAgICAgICAgICAgIEJhc2UuaXRlbVZhbHVlTG9jU3RyQ2hhbmdlZChhcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIXRoaXMubG9jYWxpemFibGVTdHJpbmdzKSB7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3MpIHtcbiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKGtleSk7XG4gICAgICAgIGlmIChpdGVtKSBpdGVtLnN0ckNoYW5nZWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGJ5IG5hbWVcbiAgICogQHBhcmFtIG5hbWUgcHJvcGVydHkgbmFtZVxuICAgKi9cbiAgcHVibGljIGdldFByb3BlcnR5VmFsdWUobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IGFueSA9IG51bGwpOiBhbnkge1xuICAgIHZhciByZXMgPSB0aGlzLmdldFByb3BlcnR5VmFsdWVDb3JlKHRoaXMucHJvcGVydHlIYXNoLCBuYW1lKTtcbiAgICBpZiAodGhpcy5Jc1Byb3BlcnR5RW1wdHkocmVzKSAmJiBkZWZhdWx0VmFsdWUgIT0gbnVsbCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBnZXRQcm9wZXJ0eVZhbHVlQ29yZShwcm9wZXJ0aWVzSGFzaDogYW55LCBuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5nZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXIpXG4gICAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXIocHJvcGVydGllc0hhc2gsIG5hbWUpO1xuICAgIGVsc2UgcmV0dXJuIHByb3BlcnRpZXNIYXNoW25hbWVdO1xuICB9XG4gIHB1YmxpYyBnZVZhbHVlRnJvbUhhc2goKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eUhhc2hbXCJ2YWx1ZVwiXTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0UHJvcGVydHlWYWx1ZUNvcmUocHJvcGVydGllc0hhc2g6IGFueSwgbmFtZTogc3RyaW5nLCB2YWw6IGFueSkge1xuICAgIGlmICh0aGlzLnNldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlcilcbiAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyKHByb3BlcnRpZXNIYXNoLCBuYW1lLCB2YWwpO1xuICAgIGVsc2UgcHJvcGVydGllc0hhc2hbbmFtZV0gPSB2YWw7XG4gIH1cbiAgcHVibGljIGl0ZXJhdGVQcm9wZXJ0aWVzSGFzaChmdW5jOiAoaGFzaDogYW55LCBrZXk6IGFueSkgPT4gdm9pZCkge1xuICAgIHZhciBrZXlzOiBhbnlbXSA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnByb3BlcnR5SGFzaCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMuZm9yRWFjaChrZXkgPT4gZnVuYyh0aGlzLnByb3BlcnR5SGFzaCwga2V5KSk7XG4gIH1cbiAgLyoqXG4gICAqIHNldCBwcm9wZXJ0eSB2YWx1ZVxuICAgKiBAcGFyYW0gbmFtZSBwcm9wZXJ0eSBuYW1lXG4gICAqIEBwYXJhbSB2YWwgbmV3IHByb3BlcnR5IHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc2V0UHJvcGVydHlWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbDogYW55KSB7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO1xuICAgIGlmIChvbGRWYWx1ZSAmJiBBcnJheS5pc0FycmF5KG9sZFZhbHVlKSkge1xuICAgICAgaWYgKHRoaXMuaXNUd29WYWx1ZUVxdWFscyhvbGRWYWx1ZSwgdmFsKSkgcmV0dXJuO1xuICAgICAgdmFyIGFycmF5SW5mbyA9IHRoaXMuYXJyYXlzSW5mb1tuYW1lXTtcbiAgICAgIHRoaXMuc2V0QXJyYXkoXG4gICAgICAgIG9sZFZhbHVlLFxuICAgICAgICB2YWwsXG4gICAgICAgIGFycmF5SW5mbyA/IGFycmF5SW5mby5pc0l0ZW1WYWx1ZXMgOiBmYWxzZSxcbiAgICAgICAgYXJyYXlJbmZvID8gYXJyYXlJbmZvLm9uUHVzaCA6IG51bGxcbiAgICAgICk7XG4gICAgICB0aGlzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG9sZFZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZUNvcmUodGhpcy5wcm9wZXJ0eUhhc2gsIG5hbWUsIHZhbCk7XG4gICAgICBpZiAoIXRoaXMuaXNUd29WYWx1ZUVxdWFscyhvbGRWYWx1ZSwgdmFsKSkge1xuICAgICAgICB0aGlzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG9sZFZhbHVlLCB2YWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nLCBvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLm9uUHJvcGVydHlDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIG9sZFZhbHVlOiBvbGRWYWx1ZSxcbiAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZVxuICAgIH0pO1xuICAgIGlmICghdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnNbaV0ubmFtZSA9PSBuYW1lKVxuICAgICAgICB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9uc1tpXS5mdW5jKG5ld1ZhbHVlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBhIHByb3BlcnR5IHZhbHVlIGNoYW5nZWQuXG4gICAqIEBwYXJhbSBuYW1lIHRoZSBwcm9wZXJ0eSBuYW1lXG4gICAqIEBwYXJhbSBmdW5jIHRoZSBmdW5jdGlvbiB3aXRoIG5vIHBhcmFtZXRlcnMgdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBwcm9wZXJ0eSBjaGFuZ2VkLlxuICAgKiBAcGFyYW0ga2V5IGFuIG9wdGlvbmFsIHBhcmFtZXRlci4gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJlZ2lzdGVyZWQgZnVuY3Rpb24gZm9yIHRoaXMgcHJvcGVydHkgd2l0aHQgdGhlIHNhbWUga2V5LCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmdW5jOiBhbnksXG4gICAga2V5OiBzdHJpbmcgPSBudWxsXG4gICkge1xuICAgIGlmICghdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMpIHtcbiAgICAgIHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zID0gW107XG4gICAgfVxuICAgIGlmIChrZXkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9uc1tpXTtcbiAgICAgICAgaWYgKGl0ZW0ubmFtZSA9PSBuYW1lICYmIGl0ZW0ua2V5ID09IGtleSkge1xuICAgICAgICAgIGl0ZW0uZnVuYyA9IGZ1bmM7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zLnB1c2goeyBuYW1lOiBuYW1lLCBmdW5jOiBmdW5jLCBrZXk6IGtleSB9KTtcbiAgfVxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGEgcHJvcGVydHkgdmFsdWUgY2hhbmdlZCBmcm9tIHRoZSBuYW1lcyBsaXN0LlxuICAgKiBAcGFyYW0gbmFtZXMgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyBuYW1lc1xuICAgKiBAcGFyYW0gZnVuYyB0aGUgZnVuY3Rpb24gd2l0aCBubyBwYXJhbWV0ZXJzIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gcHJvcGVydHkgY2hhbmdlZC5cbiAgICogQHBhcmFtIGtleSBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuIElmIHRoZXJlIGlzIGFscmVhZHkgYSByZWdpc3RlcmVkIGZ1bmN0aW9uIGZvciB0aGlzIHByb3BlcnR5IHdpdGh0IHRoZSBzYW1lIGtleSwgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbi5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgIG5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIGZ1bmM6IGFueSxcbiAgICBrZXk6IHN0cmluZyA9IG51bGxcbiAgKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lc1tpXSwgZnVuYywga2V5KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgbm90aWZpY2F0aW9uIG9uIHByb3BlcnR5IHZhbHVlIGNoYW5nZWRcbiAgICogQHBhcmFtIG5hbWUgdGhlIHByb3BlcnR5IG5hbWVcbiAgICogQHBhcmFtIGtleSB0aGUga2V5IHdpdGggd2hpY2ggeW91IGhhdmUgcmVnaXN0ZXJlZCB0aGUgbm90aWZpY2F0aW9uIGZvciB0aGlzIHByb3BlcnR5LiBJdCBjYW4gYmUgbnVsbC5cbiAgICovXG4gIHB1YmxpYyB1blJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBrZXk6IHN0cmluZyA9IG51bGxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnNbaV07XG4gICAgICBpZiAoaXRlbS5uYW1lID09IG5hbWUgJiYgaXRlbS5rZXkgPT0ga2V5KSB7XG4gICAgICAgIHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zLnNwbGljZShpLCAxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogVW5yZWdpc3RlciBub3RpZmljYXRpb24gb24gcHJvcGVydHkgdmFsdWUgY2hhbmdlZCBmb3IgYWxsIHByb3BlcnRpZXMgaW4gdGhlIG5hbWVzIGxpc3QuXG4gICAqIEBwYXJhbSBuYW1lcyB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzIG5hbWVzXG4gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB3aXRoIHdoaWNoIHlvdSBoYXZlIHJlZ2lzdGVyZWQgdGhlIG5vdGlmaWNhdGlvbiBmb3IgdGhpcyBwcm9wZXJ0eS4gSXQgY2FuIGJlIG51bGwuXG4gICAqL1xuICBwdWJsaWMgdW5SZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgIG5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIGtleTogc3RyaW5nID0gbnVsbFxuICApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnVuUmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZXNbaV0sIGtleSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjcmVhdGVDdXN0b21Mb2NhbGl6YWJsZU9iaihuYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgbG9jU3RyID0gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhuYW1lKTtcbiAgICBpZiAobG9jU3RyIHx8ICEoPGFueT50aGlzKS5nZXRMb2NhbGUpIHJldHVybjtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKG5hbWUsIDxJTG9jYWxpemFibGVPd25lcj4oPGFueT50aGlzKSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvd25lcjogSUxvY2FsaXphYmxlT3duZXIsXG4gICAgdXNlTWFya0Rvd246IGJvb2xlYW4gPSBmYWxzZVxuICApOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgdmFyIGxvY1N0ciA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyhvd25lciwgdXNlTWFya0Rvd24pO1xuICAgIGlmICghdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3MpIHtcbiAgICAgIHRoaXMubG9jYWxpemFibGVTdHJpbmdzID0ge307XG4gICAgfVxuICAgIHRoaXMubG9jYWxpemFibGVTdHJpbmdzW25hbWVdID0gbG9jU3RyO1xuICAgIHJldHVybiBsb2NTdHI7XG4gIH1cbiAgcHVibGljIGdldExvY2FsaXphYmxlU3RyaW5nKG5hbWU6IHN0cmluZyk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmxvY2FsaXphYmxlU3RyaW5ncyA/IHRoaXMubG9jYWxpemFibGVTdHJpbmdzW25hbWVdIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZWZhdWx0U3RyOiBzdHJpbmcgPSBcIlwiXG4gICk6IHN0cmluZyB7XG4gICAgdmFyIGxvY1N0ciA9IHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcobmFtZSk7XG4gICAgaWYgKCFsb2NTdHIpIHJldHVybiBcIlwiO1xuICAgIHZhciByZXMgPSBsb2NTdHIudGV4dDtcbiAgICByZXR1cm4gcmVzID8gcmVzIDogZGVmYXVsdFN0cjtcbiAgfVxuICBwdWJsaWMgc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHZhciBsb2NTdHIgPSB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKG5hbWUpO1xuICAgIGlmICghbG9jU3RyKSByZXR1cm47XG4gICAgdmFyIG9sZFZhbHVlID0gbG9jU3RyLnRleHQ7XG4gICAgaWYgKG9sZFZhbHVlID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgIGxvY1N0ci50ZXh0ID0gdmFsdWU7XG4gICAgdGhpcy5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgdmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVJdGVtVmFsdWVzKG5hbWU6IHN0cmluZyk6IEFycmF5PGFueT4ge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5jcmVhdGVOZXdBcnJheShuYW1lLCBmdW5jdGlvbihpdGVtOiBhbnkpIHtcbiAgICAgIGl0ZW0ubG9jT3duZXIgPSBzZWxmO1xuICAgIH0pO1xuICAgIHRoaXMuYXJyYXlzSW5mb1tuYW1lXS5pc0l0ZW1WYWx1ZXMgPSB0cnVlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBub3RpZnlBcnJheUNoYW5nZWQoYXI6IGFueSkge1xuICAgICEhYXIub25BcnJheUNoYW5nZWQgJiYgYXIub25BcnJheUNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3QXJyYXkoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9uUHVzaDogYW55ID0gbnVsbCxcbiAgICBvblJlbW92ZTogYW55ID0gbnVsbFxuICApOiBBcnJheTxhbnk+IHtcbiAgICB2YXIgbmV3QXJyYXkgPSBuZXcgQXJyYXk8YW55PigpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZUNvcmUodGhpcy5wcm9wZXJ0eUhhc2gsIG5hbWUsIG5ld0FycmF5KTtcbiAgICBpZiAoIXRoaXMuYXJyYXlzSW5mbykge1xuICAgICAgdGhpcy5hcnJheXNJbmZvID0ge307XG4gICAgfVxuICAgIHRoaXMuYXJyYXlzSW5mb1tuYW1lXSA9IHsgb25QdXNoOiBvblB1c2gsIGlzSXRlbVZhbHVlczogZmFsc2UgfTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgbmV3QXJyYXkucHVzaCA9IGZ1bmN0aW9uKHZhbHVlKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3QXJyYXkpLnB1c2guY2FsbChuZXdBcnJheSwgdmFsdWUpO1xuICAgICAgaWYgKG9uUHVzaCkgb25QdXNoKHZhbHVlLCBuZXdBcnJheS5sZW5ndGggLSAxKTtcbiAgICAgIHNlbGYucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgbmV3QXJyYXksIG5ld0FycmF5KTtcbiAgICAgIHNlbGYubm90aWZ5QXJyYXlDaGFuZ2VkKG5ld0FycmF5KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBuZXdBcnJheS51bnNoaWZ0ID0gZnVuY3Rpb24odmFsdWUpOiBudW1iZXIge1xuICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXdBcnJheSkudW5zaGlmdC5jYWxsKFxuICAgICAgICBuZXdBcnJheSxcbiAgICAgICAgdmFsdWVcbiAgICAgICk7XG4gICAgICBpZiAob25QdXNoKSBvblB1c2godmFsdWUsIG5ld0FycmF5Lmxlbmd0aCAtIDEpO1xuICAgICAgc2VsZi5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBuZXdBcnJheSwgbmV3QXJyYXkpO1xuICAgICAgc2VsZi5ub3RpZnlBcnJheUNoYW5nZWQobmV3QXJyYXkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIG5ld0FycmF5LnBvcCA9IGZ1bmN0aW9uKCk6IG51bWJlciB7XG4gICAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ld0FycmF5KS5wb3AuY2FsbChuZXdBcnJheSk7XG4gICAgICBpZiAob25SZW1vdmUpIG9uUmVtb3ZlKHJlc3VsdCk7XG4gICAgICBzZWxmLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG5ld0FycmF5LCBuZXdBcnJheSk7XG4gICAgICBzZWxmLm5vdGlmeUFycmF5Q2hhbmdlZChuZXdBcnJheSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgbmV3QXJyYXkuc3BsaWNlID0gZnVuY3Rpb24oXG4gICAgICBzdGFydD86IG51bWJlcixcbiAgICAgIGRlbGV0ZUNvdW50PzogbnVtYmVyLFxuICAgICAgLi4uaXRlbXM6IGFueVtdXG4gICAgKTogYW55W10ge1xuICAgICAgaWYgKCFzdGFydCkgc3RhcnQgPSAwO1xuICAgICAgaWYgKCFkZWxldGVDb3VudCkgZGVsZXRlQ291bnQgPSAwO1xuICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXdBcnJheSkuc3BsaWNlLmNhbGwoXG4gICAgICAgIG5ld0FycmF5LFxuICAgICAgICBzdGFydCxcbiAgICAgICAgZGVsZXRlQ291bnQsXG4gICAgICAgIC4uLml0ZW1zXG4gICAgICApO1xuICAgICAgaWYgKCFpdGVtcykgaXRlbXMgPSBbXTtcbiAgICAgIGlmIChvblJlbW92ZSAmJiByZXN1bHQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBvblJlbW92ZShyZXN1bHRbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob25QdXNoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBvblB1c2goaXRlbXNbaV0sIHN0YXJ0ICsgaSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNlbGYucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgbmV3QXJyYXksIG5ld0FycmF5KTtcbiAgICAgIHNlbGYubm90aWZ5QXJyYXlDaGFuZ2VkKG5ld0FycmF5KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIHJldHVybiBuZXdBcnJheTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0QXJyYXkoXG4gICAgc3JjOiBhbnlbXSxcbiAgICBkZXN0OiBhbnlbXSxcbiAgICBpc0l0ZW1WYWx1ZXM6IGJvb2xlYW4sXG4gICAgb25QdXNoOiBhbnlcbiAgKSB7XG4gICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHNyYykuc3BsaWNlLmNhbGwoc3JjLCAwLCBzcmMubGVuZ3RoKTtcbiAgICAvL3NyYy5zcGxpY2UoMCwgc3JjLmxlbmd0aCk7XG4gICAgLy8gICAgc3JjLmxlbmd0aCA9IDA7XG4gICAgaWYgKCFkZXN0KSB7XG4gICAgICB0aGlzLm5vdGlmeUFycmF5Q2hhbmdlZChzcmMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gZGVzdFtpXTtcbiAgICAgIGlmIChpc0l0ZW1WYWx1ZXMpIHtcbiAgICAgICAgaWYgKCEhQmFzZS5jcmVhdGVJdGVtVmFsdWUpIHtcbiAgICAgICAgICBpdGVtID0gQmFzZS5jcmVhdGVJdGVtVmFsdWUoaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihzcmMpLnB1c2guY2FsbChzcmMsIGl0ZW0pO1xuICAgICAgLy9zcmNbXCJvcmlnaW9uYWxQdXNoXCJdLmFwcGx5KHNyYywgW2l0ZW1dKTtcbiAgICAgIGlmIChvblB1c2gpIG9uUHVzaChzcmNbaV0pO1xuICAgIH1cbiAgICB0aGlzLm5vdGlmeUFycmF5Q2hhbmdlZChzcmMpO1xuICB9XG4gIHByb3RlY3RlZCBpc1R3b1ZhbHVlRXF1YWxzKHg6IGFueSwgeTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh4LCB5KTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFN1cnZleUVycm9yIHtcbiAgcHJpdmF0ZSBsb2NUZXh0VmFsdWU6IExvY2FsaXphYmxlU3RyaW5nO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdGV4dDogc3RyaW5nID0gbnVsbCxcbiAgICBwcm90ZWN0ZWQgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsXG4gICkge31cbiAgcHVibGljIGdldCBsb2NUZXh0KCkge1xuICAgIGlmICghdGhpcy5sb2NUZXh0VmFsdWUpIHtcbiAgICAgIHRoaXMubG9jVGV4dFZhbHVlID0gbmV3IExvY2FsaXphYmxlU3RyaW5nKHRoaXMuZXJyb3JPd25lciwgdHJ1ZSk7XG4gICAgICB0aGlzLmxvY1RleHRWYWx1ZS50ZXh0ID0gdGhpcy5nZXRUZXh0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxvY1RleHRWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0VGV4dCgpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPSB0aGlzLnRleHQ7XG4gICAgaWYgKCFyZXMpIHJlcyA9IHRoaXMuZ2V0RGVmYXVsdFRleHQoKTtcbiAgICBpZiAoISF0aGlzLmVycm9yT3duZXIpIHtcbiAgICAgIHJlcyA9IHRoaXMuZXJyb3JPd25lci5nZXRFcnJvckN1c3RvbVRleHQocmVzLCB0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiYmFzZVwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlFbGVtZW50IGV4dGVuZHMgQmFzZSBpbXBsZW1lbnRzIElTdXJ2ZXlFbGVtZW50IHtcbiAgcHJpdmF0ZSBzdXJ2ZXlJbXBsVmFsdWU6IElTdXJ2ZXlJbXBsO1xuICBwcml2YXRlIHN1cnZleURhdGFWYWx1ZTogSVN1cnZleURhdGE7XG4gIHByaXZhdGUgc3VydmV5VmFsdWU6IElTdXJ2ZXk7XG4gIHByaXZhdGUgdGV4dFByb2Nlc3NvclZhbHVlOiBJVGV4dFByb2Nlc3NvcjtcbiAgcHJpdmF0ZSBzZWxlY3RlZEVsZW1lbnRJbkRlc2lnblZhbHVlOiBTdXJ2ZXlFbGVtZW50ID0gdGhpcztcbiAgcHVibGljIHJlYWRPbmx5Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gIHB1YmxpYyBzdGF0aWMgU2Nyb2xsRWxlbWVudFRvVG9wKGVsZW1lbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFlbGVtZW50SWQpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICAgIGlmICghZWwgfHwgIWVsLnNjcm9sbEludG9WaWV3KSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGVsZW1Ub3AgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgaWYgKGVsZW1Ub3AgPCAwKSBlbC5zY3JvbGxJbnRvVmlldygpO1xuICAgIHJldHVybiBlbGVtVG9wIDwgMDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIEdldEZpcnN0Tm9uVGV4dEVsZW1lbnQoZWxlbWVudHM6IGFueSkge1xuICAgIGlmICghZWxlbWVudHMgfHwgIWVsZW1lbnRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChlbGVtZW50c1tpXS5ub2RlTmFtZSAhPSBcIiN0ZXh0XCIgJiYgZWxlbWVudHNbaV0ubm9kZU5hbWUgIT0gXCIjY29tbWVudFwiKVxuICAgICAgICByZXR1cm4gZWxlbWVudHNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgRm9jdXNFbGVtZW50KGVsZW1lbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFlbGVtZW50SWQpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICAgIGlmIChlbCkge1xuICAgICAgZWwuZm9jdXMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJlcnJvcnNcIik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJpc1JlYWRPbmx5XCIsIGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vblJlYWRPbmx5Q2hhbmdlZCgpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgIHRoaXMuc3VydmV5SW1wbFZhbHVlID0gdmFsdWU7XG4gICAgaWYgKCF0aGlzLnN1cnZleUltcGxWYWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuc3VydmV5RGF0YVZhbHVlID0gdGhpcy5zdXJ2ZXlJbXBsVmFsdWUuZ2VTdXJ2ZXlEYXRhKCk7XG4gICAgdGhpcy5zdXJ2ZXlWYWx1ZSA9IHRoaXMuc3VydmV5SW1wbFZhbHVlLmdldFN1cnZleSgpO1xuICAgIHRoaXMudGV4dFByb2Nlc3NvclZhbHVlID0gdGhpcy5zdXJ2ZXlJbXBsVmFsdWUuZ2V0VGV4dFByb2Nlc3NvcigpO1xuICAgIHRoaXMub25TZXREYXRhKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBzdXJ2ZXlJbXBsKCkge1xuICAgIHJldHVybiB0aGlzLnN1cnZleUltcGxWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGRhdGEoKTogSVN1cnZleURhdGEge1xuICAgIHJldHVybiB0aGlzLnN1cnZleURhdGFWYWx1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3VydmV5IG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIGlmICghIXRoaXMuc3VydmV5VmFsdWUpIHJldHVybiB0aGlzLnN1cnZleVZhbHVlO1xuICAgIGlmICghIXRoaXMuc3VydmV5SW1wbFZhbHVlKSB7XG4gICAgICB0aGlzLnN1cnZleVZhbHVlID0gdGhpcy5zdXJ2ZXlJbXBsVmFsdWUuZ2V0U3VydmV5KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN1cnZleVZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXN0aW9uIGluIGRlc2lnbiBtb2RlIHJpZ2h0IG5vdy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNEZXNpZ25Nb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzRGVzaWduTW9kZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmc7XG4gIH1cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldCBpc1JlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUgdG8gbWFrZSBhbiBlbGVtZW50IHF1ZXN0aW9uL3BhbmVsL3BhZ2UgcmVhZG9ubHkuXG4gICAqIEBzZWUgZW5hYmxlSWZcbiAgICogQHNlZSBpc1JlYWRPbmx5XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZWFkT25seVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCByZWFkT25seSh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSA9PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZWFkT25seVwiLCB2YWwpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNSZWFkT25seVwiLCB0aGlzLmlzUmVhZE9ubHkpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgb25SZWFkT25seUNoYW5nZWQoKSB7XG4gICAgaWYgKCEhdGhpcy5yZWFkT25seUNoYW5nZWRDYWxsYmFjaykge1xuICAgICAgdGhpcy5yZWFkT25seUNoYW5nZWRDYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IGlzTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uVmFsdWUpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LmlzTG9hZGluZ0Zyb21Kc29uIDogZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm5hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBuYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5uYW1lO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5hbWVcIiwgdmFsKTtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24gJiYgISFvbGRWYWx1ZSkge1xuICAgICAgdGhpcy5vbk5hbWVDaGFuZ2VkKG9sZFZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIG9uTmFtZUNoYW5nZWQob2xkVmFsdWU6IHN0cmluZykge31cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGVycm9ycy4gSXQgaXMgY3JlYXRlZCBieSBjYWxsaWcgaGFzRXJyb3JzIGZ1bmN0aW9uc1xuICAgKiBAc2VlIGhhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGdldCBlcnJvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZXJyb3JzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXJyb3JzKHZhbDogQXJyYXk8U3VydmV5RXJyb3I+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZXJyb3JzXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldEVsZW1lbnRzSW5EZXNpZ24oaW5jbHVkZUhpZGRlbjogYm9vbGVhbiA9IGZhbHNlKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZEVsZW1lbnRJbkRlc2lnbigpOiBTdXJ2ZXlFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEVsZW1lbnRJbkRlc2lnblZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRFbGVtZW50SW5EZXNpZ24odmFsOiBTdXJ2ZXlFbGVtZW50KSB7XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRJbkRlc2lnblZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVDdXN0b21XaWRnZXRzKCkge31cblxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge31cbiAgcHVibGljIG9uRmlyc3RSZW5kZXJpbmcoKSB7fVxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5vblN1cnZleUxvYWQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHNldFZpc2libGVJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUGFnZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB0ZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yVmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFByb2Nlc3NlZEh0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWh0bWwgfHwgIXRoaXMudGV4dFByb2Nlc3NvcikgcmV0dXJuIGh0bWw7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByb2Nlc3Nvci5wcm9jZXNzVGV4dChodG1sLCB0cnVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TZXREYXRhKCkge31cbiAgcHJvdGVjdGVkIGdldFBhZ2UocGFyZW50OiBJUGFuZWwpOiBJUGFnZSB7XG4gICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQucGFyZW50KSBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LmdldFR5cGUoKSA9PSBcInBhZ2VcIikgcmV0dXJuIDxJUGFnZT4oPGFueT5wYXJlbnQpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBzZXRQYWdlKHBhcmVudDogSVBhbmVsLCB2YWw6IElQYWdlKSB7XG4gICAgdmFyIG9sZFBhZ2UgPSB0aGlzLmdldFBhZ2UocGFyZW50KTtcbiAgICBpZiAob2xkUGFnZSA9PT0gdmFsKSByZXR1cm47XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUVsZW1lbnQoPElFbGVtZW50Pig8YW55PnRoaXMpKTtcbiAgICBpZiAodmFsKSB7XG4gICAgICB2YWwuYWRkRWxlbWVudCg8SUVsZW1lbnQ+KDxhbnk+dGhpcyksIC0xKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgY29weU9iamVjdChkc3Q6IGFueSwgc3JjOiBhbnkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgICB2YXIgc291cmNlID0gc3JjW2tleV07XG4gICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBzb3VyY2UgPSB7fTtcbiAgICAgICAgdGhpcy5jb3B5T2JqZWN0KHNvdXJjZSwgc3JjW2tleV0pO1xuICAgICAgfVxuICAgICAgZHN0W2tleV0gPSBzb3VyY2U7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjb3B5Q3NzQ2xhc3NlcyhkZXN0OiBhbnksIHNvdXJjZTogYW55KSB7XG4gICAgaWYgKCFzb3VyY2UpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgIGRlc3RbXCJyb290XCJdID0gc291cmNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBTdXJ2ZXlFbGVtZW50LmNvcHlPYmplY3QoZGVzdCwgc291cmNlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50PFQgZXh0ZW5kcyBGdW5jdGlvbiwgT3B0aW9ucz4ge1xuICBwcml2YXRlIGNhbGxiYWNrczogQXJyYXk8VD47XG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFja3MgPT0gbnVsbCB8fCB0aGlzLmNhbGxiYWNrcy5sZW5ndGggPT0gMDtcbiAgfVxuICBwdWJsaWMgZmlyZShzZW5kZXI6IGFueSwgb3B0aW9uczogT3B0aW9ucykge1xuICAgIGlmICh0aGlzLmNhbGxiYWNrcyA9PSBudWxsKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNhbGxSZXN1bHQgPSB0aGlzLmNhbGxiYWNrc1tpXShzZW5kZXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy5jYWxsYmFja3MgPSBbXTtcbiAgfVxuICBwdWJsaWMgYWRkKGZ1bmM6IFQpIHtcbiAgICBpZiAodGhpcy5oYXNGdW5jKGZ1bmMpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuY2FsbGJhY2tzID09IG51bGwpIHtcbiAgICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IEFycmF5PFQ+KCk7XG4gICAgfVxuICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goZnVuYyk7XG4gIH1cbiAgcHVibGljIHJlbW92ZShmdW5jOiBUKSB7XG4gICAgaWYgKHRoaXMuY2FsbGJhY2tzID09IG51bGwpIHJldHVybjtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmNhbGxiYWNrcy5pbmRleE9mKGZ1bmMsIDApO1xuICAgIGlmIChpbmRleCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBoYXNGdW5jKGZ1bmM6IFQpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jYWxsYmFja3MgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmNhbGxiYWNrcy5pbmRleE9mKGZ1bmMsIDApID4gLTE7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9iYXNlLnRzIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzZfXztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJrb1wiLFwiY29tbW9uanMyXCI6XCJrbm9ja291dFwiLFwiY29tbW9uanNcIjpcImtub2Nrb3V0XCIsXCJhbWRcIjpcImtub2Nrb3V0XCJ9XG4vLyBtb2R1bGUgaWQgPSA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFN1cnZleUVsZW1lbnQgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBJbXBsZW1lbnRvckJhc2UgfSBmcm9tIFwiLi9rb2Jhc2VcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uSW1wbGVtZW50b3IgZXh0ZW5kcyBJbXBsZW1lbnRvckJhc2Uge1xuICBwcml2YXRlIGtvRHVtbXk6IGFueTtcbiAga29UZW1wbGF0ZU5hbWU6IGFueTtcbiAga29FbGVtZW50VHlwZTogYW55O1xuICBwcml2YXRlIF9rb1ZhbHVlID0ga28ub2JzZXJ2YWJsZUFycmF5PGFueT4oKTtcbiAgY29uc3RydWN0b3IocHVibGljIHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICB2YXIgaXNTeW5jaHJvbml6aW5nID0gZmFsc2U7XG4gICAgdGhpcy5fa29WYWx1ZS5zdWJzY3JpYmUobmV3VmFsdWUgPT4ge1xuICAgICAgaWYgKCFpc1N5bmNocm9uaXppbmcpIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbi52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLnF1ZXN0aW9uLCBcImtvVmFsdWVcIiwge1xuICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgIGlmICghSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHRoaXMuX2tvVmFsdWUoKSwgdGhpcy5nZXRLb1ZhbHVlKCkpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlzU3luY2hyb25pemluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9rb1ZhbHVlKHRoaXMuZ2V0S29WYWx1ZSgpKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaXNTeW5jaHJvbml6aW5nID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9rb1ZhbHVlO1xuICAgICAgfSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcXVlc3Rpb24uc3VydmV5TG9hZENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uU3VydmV5TG9hZCgpO1xuICAgIH07XG4gICAgdGhpcy5rb1RlbXBsYXRlTmFtZSA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzZWxmLmdldFRlbXBsYXRlTmFtZSgpO1xuICAgIH0pO1xuICAgIHRoaXMua29FbGVtZW50VHlwZSA9IGtvLm9ic2VydmFibGUoXCJzdXJ2ZXktcXVlc3Rpb25cIik7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb0VsZW1lbnRUeXBlXCJdID0gdGhpcy5rb0VsZW1lbnRUeXBlO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29UZW1wbGF0ZU5hbWVcIl0gPSB0aGlzLmtvVGVtcGxhdGVOYW1lO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1widXBkYXRlUXVlc3Rpb25cIl0gPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYudXBkYXRlUXVlc3Rpb24oKTtcbiAgICB9O1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29Dc3NcIl0gPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc2VsZi5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIH0pO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29Sb290Q2xhc3NcIl0gPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc2VsZi5xdWVzdGlvbi5jc3NNYWluUm9vdDtcbiAgICB9KTtcbiAgICBxdWVzdGlvbi5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInZpc2libGVJbmRleFwiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25WaXNpYmxlSW5kZXhDaGFuZ2VkKCk7XG4gICAgfSk7XG4gICAgdGhpcy5rb0R1bW15ID0ga28ub2JzZXJ2YWJsZSgwKTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvUXVlc3Rpb25BZnRlclJlbmRlclwiXSA9IGZ1bmN0aW9uKFxuICAgICAgZWw6IGFueSxcbiAgICAgIGNvbjogYW55XG4gICAgKSB7XG4gICAgICBzZWxmLmtvUXVlc3Rpb25BZnRlclJlbmRlcihlbCwgY29uKTtcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCBnZXRLb1ZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVRdWVzdGlvbigpIHtcbiAgICB0aGlzLnVwZGF0ZUtvRHVtbXkoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25WaXNpYmxlSW5kZXhDaGFuZ2VkKCkge1xuICAgIHRoaXMudXBkYXRlS29EdW1teSgpO1xuICB9XG4gIHByb3RlY3RlZCBvblN1cnZleUxvYWQoKSB7fVxuICBwcm90ZWN0ZWQgZ2V0UXVlc3Rpb25UZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmdldFRlbXBsYXRlKCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUZW1wbGF0ZU5hbWUoKTogc3RyaW5nIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldCAmJlxuICAgICAgIXRoaXMucXVlc3Rpb24uY3VzdG9tV2lkZ2V0LndpZGdldEpzb24uaXNEZWZhdWx0UmVuZGVyXG4gICAgKVxuICAgICAgcmV0dXJuIFwic3VydmV5LXdpZGdldC1cIiArIHRoaXMucXVlc3Rpb24uY3VzdG9tV2lkZ2V0Lm5hbWU7XG4gICAgcmV0dXJuIFwic3VydmV5LXF1ZXN0aW9uLVwiICsgdGhpcy5nZXRRdWVzdGlvblRlbXBsYXRlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldE5vKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb24udmlzaWJsZUluZGV4ID4gLTFcbiAgICAgID8gdGhpcy5xdWVzdGlvbi52aXNpYmxlSW5kZXggKyAxICsgXCIuIFwiXG4gICAgICA6IFwiXCI7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUtvRHVtbXkoKSB7XG4gICAgdGhpcy5rb0R1bW15KHRoaXMua29EdW1teSgpICsgMSk7XG4gICAgdGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5vbkNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQga29RdWVzdGlvbkFmdGVyUmVuZGVyKGVsZW1lbnRzOiBhbnksIGNvbjogYW55KSB7XG4gICAgdmFyIGVsID0gU3VydmV5RWxlbWVudC5HZXRGaXJzdE5vblRleHRFbGVtZW50KGVsZW1lbnRzKTtcbiAgICB2YXIgdEVsID0gZWxlbWVudHNbMF07XG4gICAgaWYgKHRFbC5ub2RlTmFtZSA9PT0gXCIjdGV4dFwiKSB0RWwuZGF0YSA9IFwiXCI7XG4gICAgdEVsID0gZWxlbWVudHNbZWxlbWVudHMubGVuZ3RoIC0gMV07XG4gICAgaWYgKHRFbC5ub2RlTmFtZSA9PT0gXCIjdGV4dFwiKSB0RWwuZGF0YSA9IFwiXCI7XG4gICAgaWYgKGVsICYmIHRoaXMucXVlc3Rpb24uY3VzdG9tV2lkZ2V0KSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldC5hZnRlclJlbmRlcih0aGlzLnF1ZXN0aW9uLCBlbCk7XG4gICAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGVsLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucXVlc3Rpb24uY3VzdG9tV2lkZ2V0LndpbGxVbm1vdW50KHRoaXMucXVlc3Rpb24sIGVsKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb24udHMiLCJpbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0LCBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHtcbiAgQmFzZSxcbiAgU3VydmV5RXJyb3IsXG4gIFN1cnZleUVsZW1lbnQsXG4gIElFbGVtZW50LFxuICBJUXVlc3Rpb24sXG4gIElQYW5lbCxcbiAgSUNvbmRpdGlvblJ1bm5lcixcbiAgSVN1cnZleUltcGwsXG4gIElQYWdlXG59IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IEFuc3dlclJlcXVpcmVkRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgU3VydmV5VmFsaWRhdG9yLCBJVmFsaWRhdG9yT3duZXIsIFZhbGlkYXRvclJ1bm5lciB9IGZyb20gXCIuL3ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgVGV4dFByZVByb2Nlc3NvciwgVGV4dFByZVByb2Nlc3NvclZhbHVlIH0gZnJvbSBcIi4vdGV4dFByZVByb2Nlc3NvclwiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IENvbmRpdGlvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0IH0gZnJvbSBcIi4vcXVlc3Rpb25DdXN0b21XaWRnZXRzXCI7XG5pbXBvcnQgeyBzdXJ2ZXlDc3MgfSBmcm9tIFwiLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG5pbXBvcnQgeyBDdXN0b21XaWRnZXRDb2xsZWN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25DdXN0b21XaWRnZXRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbmRpdGlvbk9iamVjdCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xuICBxdWVzdGlvbjogUXVlc3Rpb247XG59XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIGZvciBhbGwgcXVlc3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb24gZXh0ZW5kcyBTdXJ2ZXlFbGVtZW50XG4gIGltcGxlbWVudHMgSVF1ZXN0aW9uLCBJQ29uZGl0aW9uUnVubmVyLCBJTG9jYWxpemFibGVPd25lciwgSVZhbGlkYXRvck93bmVyIHtcbiAgW2luZGV4OiBzdHJpbmddOiBhbnk7XG4gIHByaXZhdGUgc3RhdGljIFRleHRQcmVwcm9jZXNzb3JWYWx1ZXNNYXAgPSB7XG4gICAgdGl0bGU6IFwicHJvY2Vzc2VkVGl0bGVcIixcbiAgICByZXF1aXJlOiBcInJlcXVpcmVkVGV4dFwiXG4gIH07XG4gIHByaXZhdGUgc3RhdGljIHF1ZXN0aW9uQ291bnRlciA9IDEwMDtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UXVlc3Rpb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInNxX1wiICsgUXVlc3Rpb24ucXVlc3Rpb25Db3VudGVyKys7XG4gIH1cbiAgcHJpdmF0ZSBjb25kaXRpb25SdW5uZXI6IENvbmRpdGlvblJ1bm5lciA9IG51bGw7XG4gIHByaXZhdGUgaXNDdXN0b21XaWRnZXRSZXF1ZXN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBjdXN0b21XaWRnZXRWYWx1ZTogUXVlc3Rpb25DdXN0b21XaWRnZXQ7XG4gIGN1c3RvbVdpZGdldERhdGEgPSB7IGlzTmVlZFJlbmRlcjogdHJ1ZSB9O1xuICBmb2N1c0NhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBzdXJ2ZXlMb2FkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSB0ZXh0UHJlUHJvY2Vzc29yOiBUZXh0UHJlUHJvY2Vzc29yO1xuICBwcml2YXRlIGNvbmRpdGlvbkVuYWJlbFJ1bm5lcjogQ29uZGl0aW9uUnVubmVyO1xuICBwcml2YXRlIGNvbmRpdGlvblJlcXVpcmVkUnVubmVyOiBDb25kaXRpb25SdW5uZXI7XG4gIHZhbHVlQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjb21tZW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICB2YWxpZGF0ZVZhbHVlQ2FsbGJhY2s6ICgpID0+IFN1cnZleUVycm9yO1xuICBxdWVzdGlvblRpdGxlVGVtcGxhdGVDYWxsYmFjazogKCkgPT4gc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmlkID0gUXVlc3Rpb24uZ2V0UXVlc3Rpb25JZCgpO1xuICAgIHRoaXMub25DcmVhdGluZygpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwidmFsaWRhdG9yc1wiLCBmdW5jdGlvbih2YWxpZGF0b3I6IGFueSkge1xuICAgICAgdmFsaWRhdG9yLmVycm9yT3duZXIgPSBzZWxmO1xuICAgIH0pO1xuICAgIHZhciBsb2NUaXRsZVZhbHVlID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIsIHRoaXMsIHRydWUpO1xuICAgIGxvY1RpdGxlVmFsdWUub25SZW5kZXJlZEh0bWxDYWxsYmFjayA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgIHJldHVybiBzZWxmLmZ1bGxUaXRsZTtcbiAgICB9O1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJkZXNjcmlwdGlvblwiLCB0aGlzLCB0cnVlKTtcbiAgICB2YXIgbG9jQ29tbWVudFRleHQgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFxuICAgICAgXCJjb21tZW50VGV4dFwiLFxuICAgICAgdGhpcyxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIGxvY0NvbW1lbnRUZXh0Lm9uR2V0VGV4dENhbGxiYWNrID0gZnVuY3Rpb24odGV4dCkge1xuICAgICAgcmV0dXJuICEhdGV4dCA/IHRleHQgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3RoZXJJdGVtVGV4dFwiKTtcbiAgICB9O1xuXG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInJlcXVpcmVkRXJyb3JUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJ3aWR0aFwiLCBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghIXNlbGYucGFyZW50KSB7XG4gICAgICAgIHNlbGYucGFyZW50LmVsZW1lbnRXaWR0aENoYW5nZWQoc2VsZik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wiaW5kZW50XCIsIFwicmlnaHRJbmRlbnRcIl0sXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5vbkluZGVudENoYW5nZWQoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXRWYWx1ZU5hbWUoKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLnZhbHVlTmFtZSkgcmV0dXJuIHRoaXMudmFsdWVOYW1lLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgaWYgeW91IHdhbnQgdG8gc3RvcmUgdGhlIHF1ZXN0aW9uIHJlc3VsdCBpbiB0aGUgbmFtZSBkaWZmZXJlbnQgZnJvbSB0aGUgcXVlc3Rpb24gbmFtZS5cbiAgICogUXVlc3Rpb24gbmFtZSBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSBzdXJ2ZXkgYW5kIHZhbHVlTmFtZSBjb3VsZCBiZSBub3QgdW5pcXVlLiBJdCBhbGxvd3MgdG8gc2hhcmUgZGF0YSBiZXR3ZWVuIHNldmVyYWwgcXVlc3Rpb25zIHdpdGggdGhlIHNhbWUgdmFsdWVOYW1lLlxuICAgKiBUaGUgbGlicmFyeSBzZXQgdGhlIHZhbHVlIGF1dG9tYXRpY2FsbHkgaWYgdGhlIHF1ZXN0aW9uLm5hbWUgcHJvcGVydHkgaXMgbm90IHZhbGlkLiBGb3IgZXhhbXBsZSwgaWYgaXQgY29udGFpbnMgdGhlIHBlcmlvZCAnLicgc3ltYm9sLlxuICAgKiBJbiB0aGlzIGNhc2UgaWYgeW91IHNldCB0aGUgcXVlc3Rpb24ubmFtZSBwcm9wZXJ0eSB0byAneC55JyB0aGVuIHRoZSB2YWx1ZU5hbWUgYmVjb21lcyAneCB5Jy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsdWVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbHVlTmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHZhciBvbGRWYWx1ZU5hbWUgPSB0aGlzLmdldFZhbHVlTmFtZSgpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZhbHVlTmFtZVwiLCB2YWwpO1xuICAgIHRoaXMub25WYWx1ZU5hbWVDaGFuZ2VkKG9sZFZhbHVlTmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmFsdWVOYW1lQ2hhbmdlZChvbGRWYWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uUmVuYW1lZChcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLm5hbWUsXG4gICAgICAhIW9sZFZhbHVlID8gb2xkVmFsdWUgOiB0aGlzLm5hbWVcbiAgICApO1xuICAgIHRoaXMuaW5pdERhdGFGcm9tU3VydmV5KCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTmFtZUNoYW5nZWQob2xkVmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB0aGlzLnN1cnZleS5xdWVzdGlvblJlbmFtZWQoXG4gICAgICB0aGlzLFxuICAgICAgb2xkVmFsdWUsXG4gICAgICB0aGlzLnZhbHVlTmFtZSA/IHRoaXMudmFsdWVOYW1lIDogb2xkVmFsdWVcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBwYWdlIHdoZXJlIHRoZSBxdWVzdGlvbiBpcyBsb2NhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBwYWdlKCk6IElQYWdlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYWdlKHRoaXMucGFyZW50KTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhZ2UodmFsOiBJUGFnZSkge1xuICAgIHRoaXMuc2V0UGFnZSh0aGlzLnBhcmVudCwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQWx3YXlzIHJldHVybnMgZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXRQYW5lbCgpOiBJUGFuZWwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNGbG93TGF5b3V0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldExheW91dFR5cGUoKSA9PT0gXCJmbG93XCI7XG4gIH1cbiAgcHVibGljIGdldExheW91dFR5cGUoKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLnBhcmVudCkgcmV0dXJuIHRoaXMucGFyZW50LmdldENoaWxkcmVuTGF5b3V0VHlwZSgpO1xuICAgIHJldHVybiBcInJvd1wiO1xuICB9XG4gIGlzTGF5b3V0VHlwZVN1cHBvcnRlZChsYXlvdXRUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbGF5b3V0VHlwZSAhPT0gXCJmbG93XCI7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBnZXQvc2V0IHRoZSBxdWVzdGlvbiB2aXNpYmlsaXR5LlxuICAgKiBAc2VlIHZpc2libGVJZlxuICAgKi9cbiAgcHVibGljIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsID09IHRoaXMudmlzaWJsZSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdmFsKTtcbiAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uVmlzaWJpbGl0eUNoYW5nZWQoPElRdWVzdGlvbj50aGlzLCB0aGlzLnZpc2libGUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgb25WaXNpYmxlQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdGhpcy5pc1Zpc2libGUpO1xuICAgIGlmICghdGhpcy5pc1Zpc2libGUgJiYgdGhpcy5lcnJvcnMgJiYgdGhpcy5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBjaG9vc2UgaG93IG90aGVyIHF1ZXN0aW9uIHZhbHVlcyB3aWxsIGJlIHJlbmRlcmVkIGluIHRpdGxlIGlmIHJlZmVyZW5jZWQgaW4ge30uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHVzZURpc3BsYXlWYWx1ZXNJblRpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ1c2VEaXNwbGF5VmFsdWVzSW5UaXRsZVwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHVzZURpc3BsYXlWYWx1ZXNJblRpdGxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInVzZURpc3BsYXlWYWx1ZXNJblRpdGxlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIElmIGl0IHJldHVybnMgdHJ1ZSB0aGUgUXVlc3Rpb24gYmVjb21lcyB2aXNpYmxlIGFuZCBpZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBRdWVzdGlvbiBiZWNvbWVzIGludmlzaWJsZS4gVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIHZpc2libGUgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogQHNlZSB2aXNpYmxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgdmFsKTtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBxdWVzdGlvbiBpcyB2aXNpYmxlIG9yIHN1cnZleSBpcyBpbiBkZXNpZ24gbW9kZSByaWdodCBub3cuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlIHx8IHRoaXMuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2aXNpYmxlIGluZGV4IG9mIHRoZSBxdWVzdGlvbiBpbiB0aGUgc3VydmV5LiBJdCBjYW4gYmUgZnJvbSAwIHRvIGFsbCB2aXNpYmxlIHF1ZXN0aW9ucyBjb3VudCAtIDFcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJbmRleFwiLCAtMSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcXVlc3Rpb24gbWF5IGhhdmUgYSB0aXRsZSBsb2NhdGVkIG9uIHRoZSBsZWZ0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQWxsb3dUaXRsZUxlZnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBhcyBhIHN0cmluZyBhcyBpdCByZXByZXNlbnRzIGluIHRoZSBqc29uLlxuICAgKi9cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJxdWVzdGlvblwiO1xuICB9XG4gIHByaXZhdGUgcnVuQ29uZGl0aW9ucygpIHtcbiAgICBpZiAodGhpcy5kYXRhICYmICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmICF0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgdGhpcy5ydW5Db25kaXRpb24oXG4gICAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCksXG4gICAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpXG4gICAgICApO1xuICAgICAgdGhpcy5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc2V0U3VydmV5SW1wbCh2YWx1ZTogSVN1cnZleUltcGwpIHtcbiAgICBzdXBlci5zZXRTdXJ2ZXlJbXBsKHZhbHVlKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNEZXNpZ25Nb2RlICYmICF0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gICAgfVxuICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICB9XG4gIHB1YmxpYyBnZXREYXRhRmlsdGVyZWRWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gISF0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0RmlsdGVyZWRWYWx1ZXMoKSA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldERhdGFGaWx0ZXJlZFByb3BlcnRpZXMoKTogYW55IHtcbiAgICByZXR1cm4gISF0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCkgOiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBBIHBhcmVudCBlbGVtZW50LiBJdCBjYW4gYmUgcGFuZWwgb3IgcGFnZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGFyZW50KCk6IElQYW5lbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhcmVudFwiLCBudWxsKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhcmVudCh2YWw6IElQYW5lbCkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInBhcmVudFwiLCB2YWwpO1xuICAgIHRoaXMub25QYXJlbnRDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUGFyZW50Q2hhbmdlZCgpIHt9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBxdWVzdGlvbiBkb2Vzbid0IGhhdmUgYSB0aXRsZSBwcm9wZXJ0eSwgZm9yIGV4YW1wbGU6IFF1ZXN0aW9uSHRtbE1vZGVsLCBvciB0aXRsZUxvY2F0aW9uIHByb3BlcnR5IGVxdWFscyB0byBcImhpZGRlblwiXG4gICAqIEBzZWUgdGl0bGVMb2NhdGlvblxuICAgKi9cbiAgcHVibGljIGdldCBoYXNUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUaXRsZUxvY2F0aW9uKCkgIT09IFwiaGlkZGVuXCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IGRpZmZlcmVudCBmcm9tIFwiZGVmYXVsdFwiIHRvIHNldCB0aGUgc3BlY2lmaWMgcXVlc3Rpb24gdGl0bGUgbG9jYXRpb24gZm9yIHRoaXMgcGFuZWwvcGFnZS5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblRpdGxlTG9jYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgdGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIiwgXCJkZWZhdWx0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGl0bGVMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdmFyIGlzVmlzaWJpbGl0eUNoYW5nZWQgPVxuICAgICAgdGhpcy50aXRsZUxvY2F0aW9uID09IFwiaGlkZGVuXCIgfHwgdmFsdWUgPT0gXCJoaWRkZW5cIjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIiwgdmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gICAgaWYgKGlzVmlzaWJpbGl0eUNoYW5nZWQgJiYgdGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uVmlzaWJpbGl0eUNoYW5nZWQodGhpcywgdGhpcy52aXNpYmxlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgdGl0bGUgbG9jYXRpb24gYmFzZWQgb24gcXVlc3Rpb24gdGl0bGVMb2NhdGlvbiBwcm9wZXJ0eSBhbmQgUXVlc3Rpb25UaXRsZUxvY2F0aW9uIG9mIGl0J3MgcGFyZW50c1xuICAgKiBAc2VlIHRpdGxlTG9jYXRpb25cbiAgICogQHNlZSBQYW5lbE1vZGVsQmFzZS5RdWVzdGlvblRpdGxlTG9jYXRpb25cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5RdWVzdGlvblRpdGxlTG9jYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXRUaXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNGbG93TGF5b3V0KSByZXR1cm4gXCJoaWRkZW5cIjtcbiAgICB2YXIgbG9jYXRpb24gPSB0aGlzLmdldFRpdGxlTG9jYXRpb25Db3JlKCk7XG4gICAgaWYgKGxvY2F0aW9uID09PSBcImxlZnRcIiAmJiAhdGhpcy5pc0FsbG93VGl0bGVMZWZ0KSBsb2NhdGlvbiA9IFwidG9wXCI7XG4gICAgcmV0dXJuIGxvY2F0aW9uO1xuICB9XG4gIHByb3RlY3RlZCBnZXRUaXRsZUxvY2F0aW9uQ29yZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnRpdGxlTG9jYXRpb24gIT09IFwiZGVmYXVsdFwiKSByZXR1cm4gdGhpcy50aXRsZUxvY2F0aW9uO1xuICAgIGlmICghIXRoaXMucGFyZW50KSByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk7XG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXkpIHJldHVybiB0aGlzLnN1cnZleS5xdWVzdGlvblRpdGxlTG9jYXRpb247XG4gICAgcmV0dXJuIFwidG9wXCI7XG4gIH1cbiAgZ2V0IGhhc1RpdGxlT25MZWZ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc1RpdGxlICYmIHRoaXMuZ2V0VGl0bGVMb2NhdGlvbigpID09PSBcImxlZnRcIjtcbiAgfVxuICBnZXQgaGFzVGl0bGVPblRvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNUaXRsZSAmJiB0aGlzLmdldFRpdGxlTG9jYXRpb24oKSA9PT0gXCJ0b3BcIjtcbiAgfVxuICBnZXQgaGFzVGl0bGVPbkJvdHRvbSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNUaXRsZSAmJiB0aGlzLmdldFRpdGxlTG9jYXRpb24oKSA9PT0gXCJib3R0b21cIjtcbiAgfVxuICBnZXQgaGFzVGl0bGVPbkxlZnRUb3AoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmhhc1RpdGxlKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGxvY2F0aW9uID0gdGhpcy5nZXRUaXRsZUxvY2F0aW9uKCk7XG4gICAgcmV0dXJuIGxvY2F0aW9uID09PSBcImxlZnRcIiB8fCBsb2NhdGlvbiA9PT0gXCJ0b3BcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGVycm9yTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5xdWVzdGlvbkVycm9yTG9jYXRpb24gOiBcInRvcFwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBxdWVzdGlvbiBkb2Vzbid0IGhhdmUgYW4gaW5wdXQgZWxlbWVudCwgZm9yIGV4YW1wbGU6IFF1ZXN0aW9uSHRtbE1vZGVsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc0lucHV0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5wdXRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkICsgXCJpXCI7XG4gIH1cbiAgLyoqXG4gICAqIFF1ZXN0aW9uIHRpdGxlLiBVc2Ugc3VydmV5IHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIHRpdGxlIHF1ZXN0aW9uIGlzIHJlbmRlcmVkLiBJZiBpdCBpcyBlbXB0eSwgdGhlbiBxdWVzdGlvbiBuYW1lIHByb3BlcnR5IGlzIHVzZWQuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25UaXRsZVRlbXBsYXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGl0bGVcIiwgdGhpcy5uYW1lKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0aXRsZVwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NUaXRsZSgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ0aXRsZVwiKTtcbiAgfVxuICAvKipcbiAgICogUXVlc3Rpb24gZGVzY3JpcHRpb24uIEl0IHJlbmRlcnMgdW5kZXIgcXVlc3Rpb24gdGl0bGUgYnkgdXNpbmcgc21hbGxlciBmb250LiBVbmxpa2UgdGhlIHRpdGxlLCBkZXNjcmlwdGlvbiBjYW4gYmUgZW1wdHkuXG4gICAqIEBzZWUgdGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJkZXNjcmlwdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlc2NyaXB0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJkZXNjcmlwdGlvblwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NEZXNjcmlwdGlvbigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJkZXNjcmlwdGlvblwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGN1c3RvbSB0ZXh0IHRoYXQgd2lsbCBiZSBzaG93biBvbiByZXF1aXJlZCBlcnJvci4gVXNlIHRoaXMgcHJvcGVydHksIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzaG93IHRoZSBkZWZhdWx0IHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkRXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicmVxdWlyZWRFcnJvclRleHRcIik7XG4gIH1cbiAgcHVibGljIHNldCByZXF1aXJlZEVycm9yVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicmVxdWlyZWRFcnJvclRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUmVxdWlyZWRFcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicmVxdWlyZWRFcnJvclRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBnZXQgb3Igc2V0IHRoZSBjb21tZW50IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb21tZW50VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwiY29tbWVudFRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlckl0ZW1UZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbW1lbnRUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21tZW50VGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NDb21tZW50VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb21tZW50VGV4dFwiKTtcbiAgfVxuICBwcml2YXRlIGdldCBsb2NUaXRsZUh0bWwoKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzID0gdGhpcy5sb2NUaXRsZS50ZXh0T3JIdG1sO1xuICAgIHJldHVybiByZXMgPyByZXMgOiB0aGlzLm5hbWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb3B5IG9mIHF1ZXN0aW9uIGVycm9ycyBzdXJ2ZXkuIEZvciBzb21lIHF1ZXN0aW9ucyBsaWtlIG1hdHJpeCBhbmQgcGFuZWwgZHluYW1pYyBpdCBpbmNsdWRlcyB0aGUgZXJyb3JzIG9mIG5lc3RlZCBxdWVzdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgZ2V0QWxsRXJyb3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLnNsaWNlKCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaW5rIHRvIHRoZSBjdXN0b20gd2lkZ2V0LlxuICAgKi9cbiAgcHVibGljIGdldCBjdXN0b21XaWRnZXQoKTogUXVlc3Rpb25DdXN0b21XaWRnZXQge1xuICAgIGlmICghdGhpcy5pc0N1c3RvbVdpZGdldFJlcXVlc3RlZCAmJiAhdGhpcy5jdXN0b21XaWRnZXRWYWx1ZSkge1xuICAgICAgdGhpcy5pc0N1c3RvbVdpZGdldFJlcXVlc3RlZCA9IHRydWU7XG4gICAgICB0aGlzLnVwZGF0ZUN1c3RvbVdpZGdldCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jdXN0b21XaWRnZXRWYWx1ZTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlQ3VzdG9tV2lkZ2V0KCkge1xuICAgIHRoaXMuY3VzdG9tV2lkZ2V0VmFsdWUgPSBDdXN0b21XaWRnZXRDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1c3RvbVdpZGdldChcbiAgICAgIHRoaXNcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZW5kcmVkIHF1ZXN0aW9uIHRpdGxlLlxuICAgKi9cbiAgcHVibGljIGdldCBwcm9jZXNzZWRUaXRsZSgpIHtcbiAgICB2YXIgcmVzID0gdGhpcy5sb2NUaXRsZS50ZXh0T3JIdG1sO1xuICAgIHJldHVybiByZXMgPyByZXMgOiB0aGlzLm5hbWU7XG4gICAgLy9yZXR1cm4gdGhpcy5nZXRQcm9jZXNzZWRIdG1sKHRoaXMubG9jVGl0bGVIdG1sKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGl0bGUgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgcXVlc3Rpb24gdGVtcGxhdGUuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25UaXRsZVRlbXBsYXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZ1bGxUaXRsZSgpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPSB0aGlzLmNhbGNGdWxsVGl0bGUoKTtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm4gcmVzO1xuICAgIHJldHVybiB0aGlzLnN1cnZleS5nZXRVcGRhdGVkUXVlc3Rpb25UaXRsZSh0aGlzLCByZXMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRRdWVzdGlvblRpdGxlVGVtcGxhdGUoKSB7XG4gICAgaWYgKHRoaXMucXVlc3Rpb25UaXRsZVRlbXBsYXRlQ2FsbGJhY2spXG4gICAgICByZXR1cm4gdGhpcy5xdWVzdGlvblRpdGxlVGVtcGxhdGVDYWxsYmFjaygpO1xuICAgIHJldHVybiAhIXRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkuZ2V0UXVlc3Rpb25UaXRsZVRlbXBsYXRlKCkgOiBudWxsO1xuICB9XG4gIHByaXZhdGUgY2FsY0Z1bGxUaXRsZSgpOiBzdHJpbmcge1xuICAgIHZhciB0aXRsZVRlbXBsYXRlID0gdGhpcy5nZXRRdWVzdGlvblRpdGxlVGVtcGxhdGUoKTtcbiAgICBpZiAodGl0bGVUZW1wbGF0ZSkge1xuICAgICAgaWYgKCF0aGlzLnRleHRQcmVQcm9jZXNzb3IpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3IgPSBuZXcgVGV4dFByZVByb2Nlc3NvcigpO1xuICAgICAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3Iub25Qcm9jZXNzID0gZnVuY3Rpb24oXG4gICAgICAgICAgdGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2VsZi5nZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRleHRQcmVQcm9jZXNzb3IucHJvY2VzcyhcbiAgICAgICAgdGl0bGVUZW1wbGF0ZSxcbiAgICAgICAgdGhpcy51c2VEaXNwbGF5VmFsdWVzSW5UaXRsZVxuICAgICAgKTtcbiAgICB9XG4gICAgdmFyIHJlcXVpcmVUZXh0ID0gdGhpcy5yZXF1aXJlZFRleHQ7XG4gICAgaWYgKHJlcXVpcmVUZXh0KSByZXF1aXJlVGV4dCA9IFwiIFwiICsgcmVxdWlyZVRleHQ7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc2VkVGl0bGUgKyByZXF1aXJlVGV4dDtcbiAgfVxuICAvKipcbiAgICogVGhlIFF1ZXN0aW9uIHJlbmRlcnMgb24gdGhlIG5ldyBsaW5lIGlmIHRoZSBwcm9wZXJ0eSBpcyB0cnVlLiBJZiB0aGUgcHJvcGVydHkgaXMgZmFsc2UsIHRoZSBxdWVzdGlvbiB0cmllcyB0byByZW5kZXIgb24gdGhlIHNhbWUgbGluZS9yb3cgd2l0aCBhIHByZXZpb3VzIHF1ZXN0aW9uL3BhbmVsLlxuICAgKi9cbiAgcHVibGljIGdldCBzdGFydFdpdGhOZXdMaW5lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdGFydFdpdGhOZXdMaW5lXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RhcnRXaXRoTmV3TGluZSh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5zdGFydFdpdGhOZXdMaW5lID09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0YXJ0V2l0aE5ld0xpbmVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbGwgY3NzIGNsYXNzZXMgdGhhdCB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHF1ZXN0aW9uLiBZb3UgbWF5IHVzZSBzdXJ2ZXkudXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzIGV2ZW50IHRvIG92ZXJyaWRlIGNzcyBjbGFzc2VzIGZvciBhIHF1ZXN0aW9uLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnVwZGF0ZVF1ZXN0aW9uQ3NzQ2xhc3Nlc1xuICAgKi9cbiAgcHVibGljIGdldCBjc3NDbGFzc2VzKCk6IGFueSB7XG4gICAgdmFyIHN1cnZleUNzcyA9IHRoaXMuY3NzO1xuICAgIHZhciBjbGFzc2VzID0geyBlcnJvcjoge30gfTtcbiAgICB0aGlzLmNvcHlDc3NDbGFzc2VzKGNsYXNzZXMsIHN1cnZleUNzcy5xdWVzdGlvbik7XG4gICAgdGhpcy5jb3B5Q3NzQ2xhc3NlcyhjbGFzc2VzLmVycm9yLCBzdXJ2ZXlDc3MuZXJyb3IpO1xuICAgIHRoaXMudXBkYXRlQ3NzQ2xhc3NlcyhjbGFzc2VzLCBzdXJ2ZXlDc3MpO1xuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkudXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzKHRoaXMsIGNsYXNzZXMpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NlcztcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc01haW5Sb290KCk6IGFueSB7XG4gICAgdmFyIGNsYXNzZXMgPSB0aGlzLmNzc0NsYXNzZXM7XG4gICAgdmFyIHJlcyA9XG4gICAgICB0aGlzLmlzRmxvd0xheW91dCAmJiAhdGhpcy5pc0Rlc2lnbk1vZGVcbiAgICAgICAgPyBjbGFzc2VzLmZsb3dSb290XG4gICAgICAgIDogY2xhc3Nlcy5tYWluUm9vdDtcbiAgICBpZiAoIXRoaXMuaXNGbG93TGF5b3V0ICYmIHRoaXMuZ2V0VGl0bGVMb2NhdGlvbigpID09IFwibGVmdFwiKSB7XG4gICAgICByZXMgKz0gXCIgXCIgKyBjbGFzc2VzLnRpdGxlTGVmdFJvb3Q7XG4gICAgfVxuICAgIGlmICh0aGlzLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICByZXMgKz0gXCIgXCIgKyBjbGFzc2VzLmhhc0Vycm9yO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFJvb3RDc3MoY2xhc3NlczogYW55KSB7XG4gICAgcmV0dXJuIGNsYXNzZXMucXVlc3Rpb24ucm9vdDtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlQ3NzQ2xhc3NlcyhyZXM6IGFueSwgc3VydmV5Q3NzOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc1JlcXVpcmVkKSB7XG4gICAgICBpZiAoc3VydmV5Q3NzLnF1ZXN0aW9uLnJlcXVpcmVkKSB7XG4gICAgICAgIHJlcy5yb290ICs9IFwiIFwiICsgc3VydmV5Q3NzLnF1ZXN0aW9uLnJlcXVpcmVkO1xuICAgICAgfVxuICAgICAgaWYgKHN1cnZleUNzcy5xdWVzdGlvbi50aXRsZVJlcXVpcmVkKSB7XG4gICAgICAgIHJlcy50aXRsZSArPSBcIiBcIiArIHN1cnZleUNzcy5xdWVzdGlvbi50aXRsZVJlcXVpcmVkO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgb2JqQ3NzID0gc3VydmV5Q3NzW3RoaXMuZ2V0VHlwZSgpXTtcbiAgICBpZiAob2JqQ3NzID09PSB1bmRlZmluZWQgfHwgb2JqQ3NzID09PSBudWxsKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBvYmpDc3MgPT09IFwic3RyaW5nXCIgfHwgb2JqQ3NzIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICByZXMucm9vdCA9IG9iakNzcztcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIga2V5IGluIG9iakNzcykge1xuICAgICAgICByZXNba2V5XSA9IG9iakNzc1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldCBjc3MoKTogYW55IHtcbiAgICByZXR1cm4gc3VydmV5Q3NzLmdldENzcygpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gc2V0IHRoZSBzcGVjaWZpYyB3aWR0aCB0byB0aGUgcXVlc3Rpb24gbGlrZSBjc3Mgc3R5bGUgKCUsIHB4LCBlbSBldGMpLlxuICAgKi9cbiAgcHVibGljIGdldCB3aWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHdpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwid2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHJlbmRlcmVkIHdpZHRoIG9mIHRoZSBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVuZGVyV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyV2lkdGhcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCByZW5kZXJXaWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcldpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCBkaWZmZXJlbnQgZnJvbSAwIHRvIGluY3JlYXNlIHRoZSBsZWZ0IHBhZGRpbmcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGluZGVudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbmRlbnRcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBpbmRlbnQodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbmRlbnRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IGRpZmZlcmVudCBmcm9tIDAgdG8gaW5jcmVhc2UgdGhlIHJpZ2h0IHBhZGRpbmcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJpZ2h0SW5kZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJpZ2h0SW5kZW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgcmlnaHRJbmRlbnQodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyaWdodEluZGVudFwiLCB2YWwpO1xuICB9XG4gIGdldCBwYWRkaW5nTGVmdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYWRkaW50TGVmdFwiLCBcIlwiKTtcbiAgfVxuICBzZXQgcGFkZGluZ0xlZnQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYWRkaW50TGVmdFwiLCB2YWwpO1xuICB9XG4gIGdldCBwYWRkaW5nUmlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZ1JpZ2h0XCIsIFwiXCIpO1xuICB9XG4gIHNldCBwYWRkaW5nUmlnaHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nUmlnaHRcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIG9uSW5kZW50Q2hhbmdlZCgpIHtcbiAgICB0aGlzLnBhZGRpbmdMZWZ0ID0gdGhpcy5nZXRJbmRlbnRTaXplKHRoaXMuaW5kZW50KTtcbiAgICB0aGlzLnBhZGRpbmdSaWdodCA9IHRoaXMuZ2V0SW5kZW50U2l6ZSh0aGlzLnJpZ2h0SW5kZW50KTtcbiAgfVxuICBwcml2YXRlIGdldEluZGVudFNpemUoaW5kZW50OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChpbmRlbnQgPCAxKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gaW5kZW50ICogdGhpcy5jc3NDbGFzc2VzLmluZGVudCArIFwicHhcIjtcbiAgfVxuICAvKipcbiAgICogTW92ZSB0aGUgZm9jdXMgdG8gdGhlIGlucHV0IG9mIHRoaXMgcXVlc3Rpb24uXG4gICAqIEBwYXJhbSBvbkVycm9yIHNldCB0aGlzIHBhcmFtZXRlciB0byB0cnVlLCB0byBmb2N1cyB0aGUgaW5wdXQgd2l0aCB0aGUgZmlyc3QgZXJyb3IsIG90aGVyIHdpc2UgdGhlIGZpcnN0IGlucHV0IHdpbGwgYmUgZm9jdXNlZC5cbiAgICovXG4gIHB1YmxpYyBmb2N1cyhvbkVycm9yOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBTdXJ2ZXlFbGVtZW50LlNjcm9sbEVsZW1lbnRUb1RvcCh0aGlzLmlkKTtcbiAgICB2YXIgaWQgPSAhb25FcnJvclxuICAgICAgPyB0aGlzLmdldEZpcnN0SW5wdXRFbGVtZW50SWQoKVxuICAgICAgOiB0aGlzLmdldEZpcnN0RXJyb3JJbnB1dEVsZW1lbnRJZCgpO1xuICAgIGlmIChTdXJ2ZXlFbGVtZW50LkZvY3VzRWxlbWVudChpZCkpIHtcbiAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuZm9jdXNDYWxsYmFjayk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBmaXJlQ2FsbGJhY2soY2FsbGJhY2s6ICgpID0+IHZvaWQpIHtcbiAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKCk7XG4gIH1cbiAgcHVibGljIGdldE90aGVyc01heExlbmd0aCgpOiBhbnkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnN1cnZleS5tYXhPdGhlcnNMZW5ndGggPiAwID8gdGhpcy5zdXJ2ZXkubWF4T3RoZXJzTGVuZ3RoIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25DcmVhdGluZygpIHt9XG4gIHByb3RlY3RlZCBnZXRGaXJzdElucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRJZDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RFcnJvcklucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpIHtcbiAgICB2YXIgbmFtZSA9IHRleHRWYWx1ZS5uYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgdGV4dFZhbHVlLmlzRXhpc3RzID1cbiAgICAgIE9iamVjdC5rZXlzKFF1ZXN0aW9uLlRleHRQcmVwcm9jZXNzb3JWYWx1ZXNNYXApLmluZGV4T2YobmFtZSkgIT09IC0xIHx8XG4gICAgICAoPGFueT50aGlzKVt0ZXh0VmFsdWUubmFtZV0gIT09IHVuZGVmaW5lZDtcbiAgICB0ZXh0VmFsdWUudmFsdWUgPSAoPGFueT50aGlzKVtcbiAgICAgICg8YW55PlF1ZXN0aW9uLlRleHRQcmVwcm9jZXNzb3JWYWx1ZXNNYXApW25hbWVdIHx8IHRleHRWYWx1ZS5uYW1lXG4gICAgXTtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydENvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0T3RoZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCB0byBtYWtlIHRoZSBxdWVzdGlvbiBhIHJlcXVpcmVkLiBJZiBhIHVzZXIgZG9lc24ndCBhbnN3ZXIgdGhlIHF1ZXN0aW9uIHRoZW4gYSB2YWxpZGF0aW9uIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1JlcXVpcmVkXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzUmVxdWlyZWQodmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuaXNSZXF1aXJlZCA9PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1JlcXVpcmVkXCIsIHZhbCk7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLmxvY1RpdGxlLm9uQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSWYgaXQgcmV0dXJucyB0cnVlIHRoZSBRdWVzdGlvbiBiZWNvbWVzIHJlcXVpcmVkIGFuZCBhbiBlbmQtdXNlciBoYXMgdG8gYW5zd2VyIGl0LlxuICAgKiBJZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBRdWVzdGlvbiB0aGVuIGFuIGVuZC11c2VyIG1heSBub3QgYW5zd2VyIGl0IHRoZSBRdWVzdGlvbiBtYXliZSBlbXB0eS5cbiAgICogVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIGlzUmVxdWlyZWQgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogQHNlZSBpc1JlcXVpcmVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVxdWlyZWRJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVpcmVkSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZXF1aXJlZElmXCIsIHZhbCk7XG4gICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlLCB0byBhZGQgYSBjb21tZW50IGZvciB0aGUgcXVlc3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc0NvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhhc0NvbW1lbnRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaGFzQ29tbWVudCh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMuc3VwcG9ydENvbW1lbnQoKSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhhc0NvbW1lbnRcIiwgdmFsKTtcbiAgICBpZiAodGhpcy5oYXNDb21tZW50KSB0aGlzLmhhc090aGVyID0gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmljYXRvci4gSXQgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlkXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaWQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpZFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzT3RoZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhhc090aGVyXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhhc090aGVyKHZhbDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5zdXBwb3J0T3RoZXIoKSB8fCB0aGlzLmhhc090aGVyID09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhhc090aGVyXCIsIHZhbCk7XG4gICAgaWYgKHRoaXMuaGFzT3RoZXIpIHRoaXMuaGFzQ29tbWVudCA9IGZhbHNlO1xuICAgIHRoaXMuaGFzT3RoZXJDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc090aGVyQ2hhbmdlZCgpIHt9XG4gIC8qKlxuICAgKiBSZXR1bnMgdHJ1ZSBpZiByZWFkT25seSBwcm9wZXJ0eSBpcyB0cnVlIG9yIHN1cnZleSBpcyBpbiBkaXNwbGF5IG1vZGUgb3IgcGFyZW50IHBhbmVsL3BhZ2UgaXMgcmVhZE9ubHkuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubW9kZWxcbiAgICogQHNlZSByZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlYWRPbmx5KCkge1xuICAgIHZhciBpc1BhcmVudFJlYWRPbmx5ID0gISF0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5pc1JlYWRPbmx5O1xuICAgIHZhciBpc1N1cnZleVJlYWRPbmx5ID0gISF0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rpc3BsYXlNb2RlO1xuICAgIHJldHVybiB0aGlzLnJlYWRPbmx5IHx8IGlzUGFyZW50UmVhZE9ubHkgfHwgaXNTdXJ2ZXlSZWFkT25seTtcbiAgfVxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSWYgaXQgcmV0dXJucyBmYWxzZSB0aGUgUXVlc3Rpb24gYmVjb21lcyByZWFkIG9ubHkgYW5kIGFuIGVuZC11c2VyIHdpbGwgbm90IGFibGUgdG8gYW5zd2VyIG9uIHRoZSBxdXN0aW9uLiBUaGUgbGlicmFyeSBydW5zIHRoZSBleHByZXNzaW9uIG9uIHN1cnZleSBzdGFydCBhbmQgb24gY2hhbmdpbmcgYSBxdWVzdGlvbiB2YWx1ZS4gSWYgdGhlIHByb3BlcnR5IGlzIGVtcHR5IHRoZW4gcmVhZE9ubHkgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogQHNlZSByZWFkT25seVxuICAgKiBAc2VlIGlzUmVhZE9ubHlcbiAgICovXG4gIHB1YmxpYyBnZXQgZW5hYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZW5hYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBlbmFibGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImVuYWJsZUlmXCIsIHZhbCk7XG4gICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJ1biB2aXNpYmxlSWYgYW5kIGVuYWJsZUlmIGV4cHJlc3Npb25zLiBJZiB2aXNpYmxlSWYgb3IvYW5kIGVuYWJsZWRJZiBhcmUgbm90IGVtcHR5LCB0aGVuIHRoZSByZXN1bHRzIG9mIHBlcmZvcm1pbmcgdGhlIGV4cHJlc3Npb24gKHRydWUgb3IgZmFsc2UpIHNldCB0byB0aGUgdmlzaWJsZS9yZWFkT25seSBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gdmFsdWVzIFR5cGljYWxseSBzdXJ2ZXkgcmVzdWx0c1xuICAgKiBAc2VlIHZpc2libGVcbiAgICogQHNlZSB2aXNpYmxlSWZcbiAgICogQHNlZSByZWFkT25seVxuICAgKiBAc2VlIGVuYWJsZUlmXG4gICAqL1xuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZykge1xuICAgICAgdGhpcy5ydW5WaXNpYmxlSWZDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgdGhpcy5ydW5FbmFibGVJZkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMucnVuUmVxdWlyZWRJZkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgcnVuVmlzaWJsZUlmQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLnZpc2libGVJZikgcmV0dXJuO1xuICAgIGlmICghdGhpcy5jb25kaXRpb25SdW5uZXIpXG4gICAgICB0aGlzLmNvbmRpdGlvblJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy52aXNpYmxlSWYpO1xuICAgIHRoaXMuY29uZGl0aW9uUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLnZpc2libGVJZjtcbiAgICB0aGlzLnZpc2libGUgPSB0aGlzLmNvbmRpdGlvblJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJ1bkVuYWJsZUlmQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUlmKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmNvbmRpdGlvbkVuYWJlbFJ1bm5lcilcbiAgICAgIHRoaXMuY29uZGl0aW9uRW5hYmVsUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLmVuYWJsZUlmKTtcbiAgICB0aGlzLmNvbmRpdGlvbkVuYWJlbFJ1bm5lci5leHByZXNzaW9uID0gdGhpcy5lbmFibGVJZjtcbiAgICB0aGlzLnJlYWRPbmx5ID0gIXRoaXMuY29uZGl0aW9uRW5hYmVsUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgcnVuUmVxdWlyZWRJZkNvbmRpdGlvbihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICkge1xuICAgIGlmICghdGhpcy5yZXF1aXJlZElmKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmNvbmRpdGlvblJlcXVpcmVkUnVubmVyKVxuICAgICAgdGhpcy5jb25kaXRpb25SZXF1aXJlZFJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy5yZXF1aXJlZElmKTtcbiAgICB0aGlzLmNvbmRpdGlvblJlcXVpcmVkUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLnJlcXVpcmVkSWY7XG4gICAgdGhpcy5pc1JlcXVpcmVkID0gdGhpcy5jb25kaXRpb25SZXF1aXJlZFJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHByb3BlcnR5IHJldHVybnMgdGhlIHF1ZXN0aW9uIG51bWJlci4gSWYgcXVlc3Rpb24gaXMgaW52aXNpYmxlIHRoZW4gaXQgcmV0dXJucyBlbXB0eSBzdHJpbmcuXG4gICAqIElmIHZpc2libGVJbmRleCBpcyAxLCB0aGVuIG5vIGlzIDIsIG9yICdCJyBpZiBzdXJ2ZXkucXVlc3Rpb25TdGFydEluZGV4IGlzICdBJy5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblN0YXJ0SW5kZXhcbiAgICovXG4gIHB1YmxpYyBnZXQgbm8oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy52aXNpYmxlSW5kZXggPCAwKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgc3RhcnRJbmRleCA9IDE7XG4gICAgdmFyIGlzTnVtZXJpYyA9IHRydWU7XG4gICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LnF1ZXN0aW9uU3RhcnRJbmRleCkge1xuICAgICAgc3RyID0gdGhpcy5zdXJ2ZXkucXVlc3Rpb25TdGFydEluZGV4O1xuICAgICAgaWYgKHBhcnNlSW50KHN0cikpIHN0YXJ0SW5kZXggPSBwYXJzZUludChzdHIpO1xuICAgICAgZWxzZSBpZiAoc3RyLmxlbmd0aCA9PSAxKSBpc051bWVyaWMgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGlzTnVtZXJpYykgcmV0dXJuICh0aGlzLnZpc2libGVJbmRleCArIHN0YXJ0SW5kZXgpLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoc3RyLmNoYXJDb2RlQXQoMCkgKyB0aGlzLnZpc2libGVJbmRleCk7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnN1cnZleUxvYWRDYWxsYmFjayk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheVZhbHVlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU2V0RGF0YSgpIHtcbiAgICBzdXBlci5vblNldERhdGEoKTtcbiAgICB0aGlzLmluaXREYXRhRnJvbVN1cnZleSgpO1xuICAgIHRoaXMub25TdXJ2ZXlWYWx1ZUNoYW5nZWQodGhpcy52YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpO1xuICB9XG4gIHByb3RlY3RlZCBpbml0RGF0YUZyb21TdXJ2ZXkoKSB7XG4gICAgaWYgKCEhdGhpcy5kYXRhKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlRnJvbVN1cnZleSh0aGlzLmRhdGEuZ2V0VmFsdWUodGhpcy5nZXRWYWx1ZU5hbWUoKSkpO1xuICAgICAgdGhpcy51cGRhdGVDb21tZW50RnJvbVN1cnZleSh0aGlzLmRhdGEuZ2V0Q29tbWVudCh0aGlzLmdldFZhbHVlTmFtZSgpKSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0IHF1ZXN0aW9uVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVcIik7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgcXVlc3Rpb25WYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZhbHVlXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgcXVlc3Rpb25Db21tZW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbW1lbnRcIik7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgcXVlc3Rpb25Db21tZW50KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29tbWVudFwiLCB2YWwpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY29tbWVudENoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgLyoqXG4gICAqIEdldC9TZXQgdGhlIHF1ZXN0aW9uIHZhbHVlLlxuICAgKiBAc2VlIFN1cnZleU1vZGUuc2V0VmFsdWVcbiAgICogQHNlZSBTdXJ2ZXlNb2RlLmdldFZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVDb3JlKCk7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gIH1cbiAgcHVibGljIGNsZWFyVmFsdWUoKSB7XG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgdGhpcy5jb21tZW50ID0gbnVsbDtcbiAgfVxuICBwdWJsaWMgY3JlYXRlVmFsdWVDb3B5KCk6IGFueSB7XG4gICAgcmV0dXJuIEhlbHBlcnMuZ2V0VW5iaW5kVmFsdWUodGhpcy52YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBjYW5DbGVhclZhbHVlQXNJbnZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmIHRoaXMuaXNQYXJlbnRWaXNpYmxlKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCEhdGhpcy5wYWdlICYmIHRoaXMucGFnZS5pc1N0YXJ0ZWQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIXRoaXMuc3VydmV5IHx8ICF0aGlzLnZhbHVlTmFtZSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICF0aGlzLnN1cnZleS5oYXNWaXNpYmxlUXVlc3Rpb25CeVZhbHVlTmFtZSh0aGlzLnZhbHVlTmFtZSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNQYXJlbnRWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICBpZiAoIXBhcmVudC5pc1Zpc2libGUpIHJldHVybiBmYWxzZTtcbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBjbGVhclZhbHVlSWZJbnZpc2libGUoKSB7XG4gICAgaWYgKHRoaXMuY2FuQ2xlYXJWYWx1ZUFzSW52aXNpYmxlKCkpIHtcbiAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IGRpc3BsYXlWYWx1ZSgpOiBhbnkge1xuICAgIHRoaXMudXBkYXRlRGlzcGxheVZhbHVlKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlWYWx1ZVwiLCBcIlwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlRGlzcGxheVZhbHVlKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkaXNwbGF5VmFsdWVcIiwgdGhpcy5nZXREaXNwbGF5VmFsdWUodHJ1ZSkpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHF1ZXN0aW9uIHZhbHVlIGFzIGEgZGlzcGxheSB0ZXh0LiBGb3IgZXhhbXBsZSwgZm9yIGRyb3Bkb3duLCBpdCB3b3VsZCByZXR1cm4gdGhlIGl0ZW0gdGV4dCBpbnN0ZWFkIG9mIGl0ZW0gdmFsdWUuXG4gICAqIEBwYXJhbSBrZXlzQXNUZXh0IFNldCB0aGlzIHZhbHVlIHRvIHRydWUsIHRvIHJldHVybiBrZXkgKGluIG1hdHJpY2VzIHF1ZXN0aW9ucykgYXMgZGlzcGxheSB0ZXh0IGFzIHdlbGwuXG4gICAqL1xuICBwdWJsaWMgZ2V0RGlzcGxheVZhbHVlKGtleXNBc1RleHQ6IGJvb2xlYW4pOiBhbnkge1xuICAgIGlmICh0aGlzLmN1c3RvbVdpZGdldCkge1xuICAgICAgdmFyIHJlcyA9IHRoaXMuY3VzdG9tV2lkZ2V0LmdldERpc3BsYXlWYWx1ZSh0aGlzKTtcbiAgICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5QXNUZXh0OiBib29sZWFuKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IHZhbHVlIHRvIHRoZSBxdWVzdGlvbi4gSXQgd2lsbCBiZSBhc3NpZ24gdG8gdGhlIHF1ZXN0aW9uIG9uIGxvYWRpbmcgdGhlIHN1cnZleSBmcm9tIEpTT04gb3IgYWRkaW5nIGEgcXVlc3Rpb24gdG8gdGhlIHN1cnZleSBvciBvbiBzZXR0aW5nIHRoaXMgcHJvcGVydHkgb2YgdGhlIHZhbHVlIGlzIGVtcHR5LlxuICAgKi9cbiAgcHVibGljIGdldCBkZWZhdWx0VmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVmYXVsdFZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlXCIsIHZhbCk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHF1ZXN0aW9uIGFuc3dlciBkYXRhIGFzIGEgcGxhaW4gb2JqZWN0OiB3aXRoIHF1ZXN0aW9uIHRpdGxlLCBuYW1lLCB2YWx1ZSBhbmQgZGlzcGxheVZhbHVlLlxuICAgKiBGb3IgY29tcGxleCBxdWVzdGlvbnMgKGxpa2UgbWF0cml4LCBldGMuKSBpc05vZGUgZmxhZyBpcyBzZXQgdG8gdHJ1ZSBhbmQgZGF0YSBjb250YWlucyBhcnJheSBvZiBuZXN0ZWQgb2JqZWN0cyAocm93cylcbiAgICogc2V0IG9wdGlvbnMuaW5jbHVkZUVtcHR5IHRvIGZhbHNlIGlmIHlvdSB3YW50IHRvIHNraXAgZW1wdHkgYW5zd2Vyc1xuICAgKi9cbiAgcHVibGljIGdldFBsYWluRGF0YShcbiAgICBvcHRpb25zOiB7XG4gICAgICBpbmNsdWRlRW1wdHk/OiBib29sZWFuO1xuICAgICAgY2FsY3VsYXRpb25zPzogQXJyYXk8e1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgIH0gPSB7XG4gICAgICBpbmNsdWRlRW1wdHk6IHRydWVcbiAgICB9XG4gICkge1xuICAgIGlmIChvcHRpb25zLmluY2x1ZGVFbXB0eSB8fCAhdGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHZhciBxdWVzdGlvblBsYWluRGF0YSA9IDxhbnk+e1xuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgICAgZGlzcGxheVZhbHVlOiB0aGlzLmRpc3BsYXlWYWx1ZSxcbiAgICAgICAgaXNOb2RlOiBmYWxzZSxcbiAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiA/IEpTT04uc3RyaW5naWZ5KHZhbCkgOiB2YWxcbiAgICAgIH07XG4gICAgICAob3B0aW9ucy5jYWxjdWxhdGlvbnMgfHwgW10pLmZvckVhY2goY2FsY3VsYXRpb24gPT4ge1xuICAgICAgICBxdWVzdGlvblBsYWluRGF0YVtjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVdID0gdGhpc1tcbiAgICAgICAgICBjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVcbiAgICAgICAgXTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHF1ZXN0aW9uUGxhaW5EYXRhO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgY29ycmVjdCBhbnN3ZXIgb24gdGhlIHF1ZXN0aW9uLiBTZXQgdGhpcyB2YWx1ZSBpZiB5b3UgYXJlIGRvaW5nIGEgcXVpei5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5jb3JyZWN0QW5zd2Vyc1xuICAgKiBAc2VlIFN1cnZleU1vZGVsLmluQ29ycmVjdEFuc3dlcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgY29ycmVjdEFuc3dlcigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb3JyZWN0QW5zd2VyXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29ycmVjdEFuc3dlcih2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvcnJlY3RBbnN3ZXJcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgaXNBbnN3ZXJDb3JyZWN0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLnZhbHVlKSB8fCB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmNvcnJlY3RBbnN3ZXIpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmlzVHdvVmFsdWVFcXVhbHModGhpcy52YWx1ZSwgdGhpcy5jb3JyZWN0QW5zd2VyKTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fFxuICAgICAgKCF0aGlzLmlzRGVzaWduTW9kZSAmJiB0aGlzLmlzRGVmYXVsdFZhbHVlRW1wdHkoKSlcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgaWYgKCF0aGlzLmlzRGVzaWduTW9kZSAmJiAhdGhpcy5pc0VtcHR5KCkpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkgJiYgdGhpcy5pc0RlZmF1bHRWYWx1ZUVtcHR5KCkpIHJldHVybjtcbiAgICB0aGlzLnNldERlZmF1bHRWYWx1ZSgpO1xuICB9XG4gIGdldFF1ZXN0aW9uRnJvbUFycmF5KG5hbWU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IElRdWVzdGlvbiB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldERlZmF1bHRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNEZWZhdWx0VmFsdWVFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBzZXREZWZhdWx0VmFsdWUoKSB7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBxdWVzdGlvbiBjb21tZW50IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb21tZW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29tbWVudCgpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tbWVudChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCEhbmV3VmFsdWUpIHtcbiAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKS50cmltKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbW1lbnQgPT0gbmV3VmFsdWUpIHJldHVybjtcbiAgICB0aGlzLnNldENvbW1lbnQobmV3VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDb21tZW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25Db21tZW50O1xuICB9XG4gIHByb3RlY3RlZCBzZXRDb21tZW50KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldE5ld0NvbW1lbnQobmV3VmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXN0aW9uIHZhbHVlIGlzIGVtcHR5XG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy52YWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHF1ZXN0aW9uIHZhbGlkYXRvcnMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbGlkYXRvcnMoKTogQXJyYXk8U3VydmV5VmFsaWRhdG9yPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbGlkYXRvcnNcIik7XG4gIH1cbiAgcHVibGljIHNldCB2YWxpZGF0b3JzKHZhbDogQXJyYXk8U3VydmV5VmFsaWRhdG9yPikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZhbGlkYXRvcnNcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uTmFtZXMobmFtZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBuYW1lcy5wdXNoKHRoaXMubmFtZSk7XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQoXG4gICAgb2JqZWN0czogQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4sXG4gICAgY29udGV4dDogYW55XG4gICkge1xuICAgIG9iamVjdHMucHVzaCh7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICB0ZXh0OiB0aGlzLnByb2Nlc3NlZFRpdGxlLFxuICAgICAgcXVlc3Rpb246IHRoaXNcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0Q29uZGl0aW9uSnNvbihvcGVyYXRvcjogc3RyaW5nID0gbnVsbCwgcGF0aDogc3RyaW5nID0gbnVsbCk6IGFueSB7XG4gICAgdmFyIGpzb24gPSBuZXcgSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdCh0aGlzKTtcbiAgICBqc29uW1widHlwZVwiXSA9IHRoaXMuZ2V0VHlwZSgpO1xuICAgIHJldHVybiBqc29uO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSB2YWxpZGF0aW9uIGVycm9yKHMpIGluIHRoZSBxdWVzdGlvbi5cbiAgICogQHBhcmFtIGZpcmVDYWxsYmFjayBzZXQgaXQgdG8gdHJ1ZSB0byBzaG93IGFuIGVycm9yIGluIFVJLlxuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgdmFyIGVycm9ycyA9IHRoaXMuY2hlY2tGb3JFcnJvcnMoKTtcbiAgICBpZiAoZmlyZUNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPiAwO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2YWxpZGF0aW9uIGVycm9ycyBjb3VudC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudEVycm9yQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnMubGVuZ3RoO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjaGFyL3N0cmluZyBmb3IgYSByZXF1aXJlZCBxdWVzdGlvbi5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5yZXF1aXJlZFRleHRcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ICE9IG51bGwgJiYgdGhpcy5pc1JlcXVpcmVkXG4gICAgICA/IHRoaXMuc3VydmV5LnJlcXVpcmVkVGV4dFxuICAgICAgOiBcIlwiO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgZXJyb3IgaW50byB0aGUgcXVlc3Rpb24gZXJyb3IgbGlzdC5cbiAgICogQHBhcmFtIGVycm9yXG4gICAqL1xuICBwdWJsaWMgYWRkRXJyb3IoZXJyb3I6IFN1cnZleUVycm9yKSB7XG4gICAgdGhpcy5lcnJvcnMucHVzaChlcnJvcik7XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHBhcnRpY3VsYXIgZXJyb3IgZnJvbSB0aGUgcXVlc3Rpb24gZXJyb3IgbGlzdC5cbiAgICogQHBhcmFtIGVycm9yXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRXJyb3IoZXJyb3I6IFN1cnZleUVycm9yKSB7XG4gICAgdmFyIGVycm9ycyA9IHRoaXMuZXJyb3JzO1xuICAgIHZhciBpbmRleCA9IGVycm9ycy5pbmRleE9mKGVycm9yKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSBlcnJvcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuICBwcml2YXRlIGNoZWNrRm9yRXJyb3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgdmFyIHFFcnJvcnMgPSBuZXcgQXJyYXk8U3VydmV5RXJyb3I+KCk7XG4gICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmICF0aGlzLmlzUmVhZE9ubHkpIHtcbiAgICAgIHRoaXMuY29sbGVjdEVycm9ycyhxRXJyb3JzKTtcbiAgICB9XG4gICAgcmV0dXJuIHFFcnJvcnM7XG4gIH1cbiAgcHJpdmF0ZSBjb2xsZWN0RXJyb3JzKHFFcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xuICAgIHRoaXMub25DaGVja0ZvckVycm9ycyhxRXJyb3JzKTtcbiAgICBpZiAocUVycm9ycy5sZW5ndGggPT0gMCkge1xuICAgICAgdmFyIGVycm9ycyA9IHRoaXMucnVuVmFsaWRhdG9ycygpO1xuICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vdmFsaWRhdG9ycyBtYXkgY2hhbmdlIHRoZSBxdWVzdGlvbiB2YWx1ZS5cbiAgICAgICAgcUVycm9ycy5sZW5ndGggPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHFFcnJvcnMucHVzaChlcnJvcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnN1cnZleSAmJiBxRXJyb3JzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB2YXIgZXJyb3IgPSB0aGlzLmZpcmVTdXJ2ZXlWYWxpZGF0aW9uKCk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcUVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmaXJlU3VydmV5VmFsaWRhdGlvbigpOiBTdXJ2ZXlFcnJvciB7XG4gICAgaWYgKHRoaXMudmFsaWRhdGVWYWx1ZUNhbGxiYWNrKSByZXR1cm4gdGhpcy52YWxpZGF0ZVZhbHVlQ2FsbGJhY2soKTtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS52YWxpZGF0ZVF1ZXN0aW9uKHRoaXMpIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xuICAgIGlmICh0aGlzLmhhc1JlcXVpcmVkRXJyb3IoKSkge1xuICAgICAgZXJyb3JzLnB1c2gobmV3IEFuc3dlclJlcXVpcmVkRXJyb3IodGhpcy5yZXF1aXJlZEVycm9yVGV4dCwgdGhpcykpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgaGFzUmVxdWlyZWRFcnJvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1JlcXVpcmVkICYmIHRoaXMuaXNFbXB0eSgpO1xuICB9XG4gIHByb3RlY3RlZCBydW5WYWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSdW5uZXIoKS5ydW4odGhpcyk7XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlQ2hhbmdlZEluU3VydmV5ID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZXROZXdWYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5zZXROZXdWYWx1ZUluRGF0YShuZXdWYWx1ZSk7XG4gICAgdGhpcy5vblZhbHVlQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBzZXROZXdWYWx1ZUluRGF0YShuZXdWYWx1ZTogYW55KSB7XG4gICAgbmV3VmFsdWUgPSB0aGlzLnZhbHVlVG9EYXRhKG5ld1ZhbHVlKTtcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUNoYW5nZWRJblN1cnZleSkge1xuICAgICAgdGhpcy5zZXRWYWx1ZUNvcmUobmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmFsdWVDb3JlKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uVmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFZhbHVlQ29yZShuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5zZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlKTtcbiAgICBpZiAodGhpcy5kYXRhICE9IG51bGwpIHtcbiAgICAgIHRoaXMuZGF0YS5zZXRWYWx1ZSh0aGlzLmdldFZhbHVlTmFtZSgpLCBuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCB2YWx1ZUZyb21EYXRhKHZhbDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHByb3RlY3RlZCB2YWx1ZVRvRGF0YSh2YWw6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7fVxuICBwcm90ZWN0ZWQgc2V0TmV3Q29tbWVudChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5xdWVzdGlvbkNvbW1lbnQgPSBuZXdWYWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhICE9IG51bGwpIHtcbiAgICAgIHRoaXMuZGF0YS5zZXRDb21tZW50KHRoaXMuZ2V0VmFsdWVOYW1lKCksIG5ld1ZhbHVlKTtcbiAgICB9XG4gIH1cbiAgLy9JUXVlc3Rpb25cbiAgdXBkYXRlVmFsdWVGcm9tU3VydmV5KG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBuZXdWYWx1ZSA9IEhlbHBlcnMuZ2V0VW5iaW5kVmFsdWUobmV3VmFsdWUpO1xuICAgIHRoaXMuc2V0UXVlc3Rpb25WYWx1ZSh0aGlzLnZhbHVlRnJvbURhdGEobmV3VmFsdWUpKTtcbiAgfVxuICB1cGRhdGVDb21tZW50RnJvbVN1cnZleShuZXdWYWx1ZTogYW55KTogYW55IHtcbiAgICB0aGlzLnF1ZXN0aW9uQ29tbWVudCA9IG5ld1ZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBzZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnF1ZXN0aW9uVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnZhbHVlQ2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICBvblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBzZXRWaXNpYmxlSW5kZXgodmFsOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5pc1Zpc2libGUgfHwgIXRoaXMuaGFzVGl0bGUpIHtcbiAgICAgIHZhbCA9IC0xO1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgdmFsKTtcbiAgICByZXR1cm4gdmFsIDwgMCA/IDAgOiAxO1xuICB9XG4gIHB1YmxpYyByZW1vdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZW1vdmUgdmFsdWVzIGZyb20gdGhlIGN1cnJlbnQgcXVlc3Rpb24sIHRoYXQgZW5kLXVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlci5cbiAgICogRm9yIGV4YW1wbGUgdGhlIHZhbHVlIHRoYXQgZG9lc24ndCBleGlzdHMgaW4gYSByYWRpZ3JvdXAvZHJvcGRvd24vY2hlY2tib3ggY2hvaWNlcyBvciBtYXRyaXggcm93cy9jb2x1bW5zLlxuICAgKi9cbiAgcHVibGljIGNsZWFySW5jb3JyZWN0VmFsdWVzKCkge31cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byBjbGVhciBhbGwgZXJyb3JzIGluIHRoZSBxdWVzdGlvblxuICAgKi9cbiAgcHVibGljIGNsZWFyRXJyb3JzKCkge1xuICAgIHRoaXMuZXJyb3JzID0gW107XG4gIH1cbiAgcHVibGljIGNsZWFyVW51c2VkVmFsdWVzKCkge31cbiAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7fVxuICAvL0lMb2NhbGl6YWJsZU93bmVyXG4gIGxvY093bmVyOiBJTG9jYWxpemFibGVPd25lciA9IG51bGw7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN1cnZleSBsb2NhbGVcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5sb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXlcbiAgICAgID8gKDxJTG9jYWxpemFibGVPd25lcj4oPGFueT50aGlzLnN1cnZleSkpLmdldExvY2FsZSgpXG4gICAgICA6IHRoaXMubG9jT3duZXJcbiAgICAgICAgPyB0aGlzLmxvY093bmVyLmdldExvY2FsZSgpXG4gICAgICAgIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5XG4gICAgICA/IHRoaXMuc3VydmV5LmdldFN1cnZleU1hcmtkb3duSHRtbCh0aGlzLCB0ZXh0KVxuICAgICAgOiB0aGlzLmxvY093bmVyXG4gICAgICAgID8gdGhpcy5sb2NPd25lci5nZXRNYXJrZG93bkh0bWwodGV4dClcbiAgICAgICAgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9jZXNzZWRUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudGV4dFByb2Nlc3NvcilcbiAgICAgIHJldHVybiB0aGlzLnRleHRQcm9jZXNzb3IucHJvY2Vzc1RleHQodGV4dCwgdGhpcy51c2VEaXNwbGF5VmFsdWVzSW5UaXRsZSk7XG4gICAgaWYgKHRoaXMubG9jT3duZXIpIHJldHVybiB0aGlzLmxvY093bmVyLmdldFByb2Nlc3NlZFRleHQodGV4dCk7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbiAgLy9JU3VydmV5RXJyb3JPd25lclxuICBnZXRFcnJvckN1c3RvbVRleHQodGV4dDogc3RyaW5nLCBlcnJvcjogU3VydmV5RXJyb3IpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMuc3VydmV5KSByZXR1cm4gdGhpcy5zdXJ2ZXkuZ2V0RXJyb3JDdXN0b21UZXh0KHRleHQsIGVycm9yKTtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuICAvL0lWYWxpZGF0b3JPd25lclxuICBnZXRWYWxpZGF0b3JUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCB2YWxpZGF0ZWRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG4gIHNldCB2YWxpZGF0ZWRWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gIH1cbiAgZ2V0QWxsVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldEFsbFZhbHVlcygpIDogbnVsbDtcbiAgfVxufVxuU2VyaWFsaXplci5hZGRDbGFzcyhcInF1ZXN0aW9uXCIsIFtcbiAgXCIhbmFtZVwiLFxuICB7IG5hbWU6IFwidmlzaWJsZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBuYW1lOiBcInVzZURpc3BsYXlWYWx1ZXNJblRpdGxlOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSwgbGF5b3V0OiBcInJvd1wiIH0sXG4gIFwidmlzaWJsZUlmOmNvbmRpdGlvblwiLFxuICB7IG5hbWU6IFwid2lkdGhcIiB9LFxuICB7IG5hbWU6IFwic3RhcnRXaXRoTmV3TGluZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUsIGxheW91dDogXCJyb3dcIiB9LFxuICB7IG5hbWU6IFwiaW5kZW50Om51bWJlclwiLCBkZWZhdWx0OiAwLCBjaG9pY2VzOiBbMCwgMSwgMiwgM10sIGxheW91dDogXCJyb3dcIiB9LFxuICB7XG4gICAgbmFtZTogXCJwYWdlXCIsXG4gICAgaXNTZXJpYWxpemFibGU6IGZhbHNlLFxuICAgIGNob2ljZXM6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICB2YXIgc3VydmV5ID0gb2JqID8gb2JqLnN1cnZleSA6IG51bGw7XG4gICAgICByZXR1cm4gc3VydmV5XG4gICAgICAgID8gc3VydmV5LnBhZ2VzLm1hcCgocDogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcC5uYW1lLCB0ZXh0OiBwLnRpdGxlIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG4gIH0sXG4gIHsgbmFtZTogXCJ0aXRsZTp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUaXRsZVwiLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAge1xuICAgIG5hbWU6IFwiZGVzY3JpcHRpb246dGV4dFwiLFxuICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NEZXNjcmlwdGlvblwiLFxuICAgIGxheW91dDogXCJyb3dcIlxuICB9LFxuICBcInZhbHVlTmFtZVwiLFxuICBcImVuYWJsZUlmOmNvbmRpdGlvblwiLFxuICBcImRlZmF1bHRWYWx1ZTp2YWx1ZVwiLFxuICBcImNvcnJlY3RBbnN3ZXI6dmFsdWVcIixcbiAgXCJpc1JlcXVpcmVkOmJvb2xlYW5cIixcbiAgXCJyZXF1aXJlZElmOmNvbmRpdGlvblwiLFxuICB7XG4gICAgbmFtZTogXCJyZXF1aXJlZEVycm9yVGV4dDp0ZXh0XCIsXG4gICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1JlcXVpcmVkRXJyb3JUZXh0XCJcbiAgfSxcbiAgXCJyZWFkT25seTpib29sZWFuXCIsXG4gIHtcbiAgICBuYW1lOiBcInZhbGlkYXRvcnM6dmFsaWRhdG9yc1wiLFxuICAgIGJhc2VDbGFzc05hbWU6IFwic3VydmV5dmFsaWRhdG9yXCIsXG4gICAgY2xhc3NOYW1lUGFydDogXCJ2YWxpZGF0b3JcIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJ0aXRsZUxvY2F0aW9uXCIsXG4gICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIiwgXCJoaWRkZW5cIl0sXG4gICAgbGF5b3V0OiBcInJvd1wiXG4gIH1cbl0pO1xuU2VyaWFsaXplci5hZGRBbHRlck5hdGl2ZUNsYXNzTmFtZShcInF1ZXN0aW9uXCIsIFwicXVlc3Rpb25iYXNlXCIpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uLnRzIiwiLyoqXG4gKiBHbG9iYWwgc3VydmV5IHNldHRpbmdzXG4gKi9cbmV4cG9ydCB2YXIgc2V0dGluZ3MgPSB7XG4gIC8qKlxuICAgKiBUaGUgcHJlZml4IHRoYXQgdXNlcyB0byBzdG9yZSB0aGUgcXVlc3Rpb24gY29tbWVudCwgYXMge3F1ZXN0aW9uTmFtZX0gKyB7Y29tbWVudFByZWZpeH0uXG4gICAqIFRoZSBkZWZhdWx0XG4gICAqL1xuICBjb21tZW50UHJlZml4OiBcIi1Db21tZW50XCIsXG4gIC8qKlxuICAgKiBFbmNvZGUgcGFyYW1ldGVyIG9uIGNhbGxpbmcgcmVzdGZ1bGwgd2ViIEFQSVxuICAgKi9cbiAgd2Vic2VydmljZUVuY29kZVBhcmFtZXRlcnM6IHRydWUsXG4gIC8qKlxuICAgKiBTdXJ2ZXlKUyB3ZWIgc2VydmljZSBBUEkgdXJsXG4gICAqL1xuICBzdXJ2ZXlTZXJ2aWNlVXJsOiBcImh0dHBzOi8vZHhzdXJ2ZXlhcGkuYXp1cmV3ZWJzaXRlcy5uZXQvYXBpL1N1cnZleVwiLFxuICAvKipcbiAgICogc2VwYXJhdG9yIHRoYXQgY2FuIGFsbG93IHRvIHNldCB2YWx1ZSBhbmQgdGV4dCBvZiBJdGVtVmFsdWUgb2JqZWN0IGluIG9uZSBzdHJpbmcgYXM6IFwidmFsdWV8dGV4dFwiXG4gICAqL1xuICBpdGVtVmFsdWVTZXBhcmF0b3I6IFwifFwiLFxuICAvKipcbiAgICogZGVmYXVsdCBsb2NhbGUgbmFtZSBmb3IgbG9jYWxpemFibGUgc3RyaW5ncyB0aGF0IHVzZXMgZHVyaW5nIHNlcmlhbGl6YXRpb24sIHtcImRlZmF1bHRcIjogXCJNeSB0ZXh0XCIsIFwiZGVcIjogXCJNZWluIFRleHRcIn1cbiAgICovXG4gIGRlZmF1bHRMb2NhbGVOYW1lOiBcImRlZmF1bHRcIixcbiAgLyoqXG4gICAqIERlZmF1bHQgcm93IG5hbWUgZm9yIG1hdHJpeCAoc2luZ2xlIGNob2ljZSlcbiAgICovXG4gIG1hdHJpeERlZmF1bHRSb3dOYW1lOiBcImRlZmF1bHRcIixcbiAgLyoqXG4gICAqIERlZmF1bHQgY2VsbCB0eXBlIGZvciBkcm9wZG93biBhbmQgZHluYW1pYyBtYXRyaWNlc1xuICAgKi9cbiAgbWF0cml4RGVmYXVsdENlbGxUeXBlOiBcImRyb3Bkb3duXCIsXG4gIC8qKlxuICAgKiBUb3RhbCB2YWx1ZSBwb3N0Zml4IGZvciBkcm9wZG93biBhbmQgZHluYW1pYyBtYXRyaWNlcy4gVGhlIHRvdGFsIHZhbHVlIHN0b3JlcyBhczoge21hdHJpeE5hbWV9ICsge3Bvc3RmaXh9XG4gICAqL1xuICBtYXRyaXhUb3RhbFZhbHVlUG9zdEZpeDogXCItdG90YWxcIixcbiAgLyoqXG4gICAqIE1heGltdW0gcm93IGNvdW50IGluIGR5bmFtaWMgbWF0cml4XG4gICAqL1xuICBtYXRyaXhNYXhpbXVtUm93Q291bnQ6IDEwMDAsXG4gIC8qKlxuICAgKiBNYXhpbXVtIHBhbmVsIGNvdW50IGluIGR5bmFtaWMgcGFuZWxcbiAgICovXG4gIHBhbmVsTWF4aW11bVBhbmVsQ291bnQ6IDEwMCxcbiAgLyoqXG4gICAqIE1heGltdW0gcmF0ZSB2YWx1ZSBjb3VudCBpbiByYXRpbmcgcXVlc3Rpb25cbiAgICovXG4gIHJhdGluZ01heGltdW1SYXRlVmFsdWVDb3VudDogMjBcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2V0dGluZ3MudHMiLCJpbXBvcnQgeyBIYXNoVGFibGUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBQcm9jZXNzVmFsdWUgfSBmcm9tIFwiLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcblxuaW1wb3J0IHsgT3BlcmFuZCB9IGZyb20gXCIuL2V4cHJlc3Npb25zL2V4cHJlc3Npb25zXCI7XG5pbXBvcnQgeyBDb25kaXRpb25zUGFyc2VyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1BhcnNlclwiO1xuXG5leHBvcnQgY2xhc3MgRXhwcmVzc2lvblJ1bm5lckJhc2Uge1xuICBwcml2YXRlIGV4cHJlc3Npb25WYWx1ZTogc3RyaW5nO1xuICBwcml2YXRlIG9wZXJhbmQ6IE9wZXJhbmQ7XG4gIHByaXZhdGUgcHJvY2Vzc1ZhbHVlID0gbmV3IFByb2Nlc3NWYWx1ZSgpO1xuICBwcml2YXRlIHBhcnNlciA9IG5ldyBDb25kaXRpb25zUGFyc2VyKCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IHN0cmluZykge1xuICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGV4cHJlc3Npb24odmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmV4cHJlc3Npb24gPT09IHZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5leHByZXNzaW9uVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9wZXJhbmQgPSB0aGlzLnBhcnNlci5wYXJzZUV4cHJlc3Npb24odmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldFZhcmlhYmxlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMub3BlcmFuZCkgcmV0dXJuIFtdO1xuXG4gICAgdmFyIHZhcmlhYmxlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIHRoaXMub3BlcmFuZC5zZXRWYXJpYWJsZXModmFyaWFibGVzKTtcbiAgICByZXR1cm4gdmFyaWFibGVzO1xuICB9XG5cbiAgcHVibGljIGhhc0Z1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNhblJ1bigpKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcGVyYW5kLmhhc0Z1bmN0aW9uKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5SdW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5vcGVyYW5kO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJ1bkNvcmUoXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGxcbiAgKTogYW55IHtcbiAgICBpZiAoIXRoaXMub3BlcmFuZCkgcmV0dXJuIG51bGw7XG5cbiAgICB0aGlzLnByb2Nlc3NWYWx1ZS52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgdGhpcy5wcm9jZXNzVmFsdWUucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgcmV0dXJuIHRoaXMub3BlcmFuZC5ldmFsdWF0ZSh0aGlzLnByb2Nlc3NWYWx1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvblJ1bm5lciBleHRlbmRzIEV4cHJlc3Npb25SdW5uZXJCYXNlIHtcbiAgcHVibGljIHJ1bihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ydW5Db3JlKHZhbHVlcywgcHJvcGVydGllcykgPT0gdHJ1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXhwcmVzc2lvblJ1bm5lciBleHRlbmRzIEV4cHJlc3Npb25SdW5uZXJCYXNlIHtcbiAgcHVibGljIHJ1bih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGwpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnJ1bkNvcmUodmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbmRpdGlvbnMudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IsIElTdXJ2ZXlFcnJvck93bmVyIH0gZnJvbSBcIi4vYmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgQW5zd2VyUmVxdWlyZWRFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHRleHQ6IHN0cmluZyA9IG51bGwsXG4gICAgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsXG4gICkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyZXF1aXJlZFwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVxdWlyZWRFcnJvclwiKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIE9uZUFuc3dlclJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB0ZXh0OiBzdHJpbmcgPSBudWxsLFxuICAgIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbFxuICApIHtcbiAgICBzdXBlcih0ZXh0LCBlcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicmVxdWlyZW9uZWFuc3dlclwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVxdWlyZWRFcnJvckluUGFuZWxcIik7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBSZXF1cmVOdW1lcmljRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB0ZXh0OiBzdHJpbmcgPSBudWxsLFxuICAgIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbFxuICApIHtcbiAgICBzdXBlcih0ZXh0LCBlcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicmVxdWlyZW51bWVyaWNcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm51bWVyaWNFcnJvclwiKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEV4Y2VlZFNpemVFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXhTaXplOiBudW1iZXIsIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbCkge1xuICAgIHN1cGVyKG51bGwsIGVycm9yT3duZXIpO1xuICAgIHRoaXMubG9jVGV4dC50ZXh0ID0gdGhpcy5nZXRUZXh0KCk7XG4gIH1cbiAgcHVibGljIGdldEVycm9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImV4Y2VlZHNpemVcIjtcbiAgfVxuICBwdWJsaWMgZ2V0RGVmYXVsdFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAuZ2V0U3RyaW5nKFwiZXhjZWVkTWF4U2l6ZVwiKVxuICAgICAgW1wiZm9ybWF0XCJdKHRoaXMuZ2V0VGV4dFNpemUoKSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUZXh0U2l6ZSgpIHtcbiAgICB2YXIgc2l6ZXMgPSBbXCJCeXRlc1wiLCBcIktCXCIsIFwiTUJcIiwgXCJHQlwiLCBcIlRCXCJdO1xuICAgIHZhciBmaXhlZCA9IFswLCAwLCAyLCAzLCAzXTtcbiAgICBpZiAodGhpcy5tYXhTaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gXCIwIEJ5dGVcIjtcbiAgICB9XG4gICAgdmFyIGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKHRoaXMubWF4U2l6ZSkgLyBNYXRoLmxvZygxMDI0KSk7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5tYXhTaXplIC8gTWF0aC5wb3coMTAyNCwgaSk7XG4gICAgcmV0dXJuIHZhbHVlLnRvRml4ZWQoZml4ZWRbaV0pICsgXCIgXCIgKyBzaXplc1tpXTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFdlYlJlcXVlc3RFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHN0YXR1czogc3RyaW5nLFxuICAgIHB1YmxpYyByZXNwb25zZTogc3RyaW5nLFxuICAgIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbFxuICApIHtcbiAgICBzdXBlcihudWxsLCBlcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwid2VicmVxdWVzdFwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgIC5nZXRTdHJpbmcoXCJ1cmxSZXF1ZXN0RXJyb3JcIilcbiAgICAgIFtcImZvcm1hdFwiXSh0aGlzLnN0YXR1cywgdGhpcy5yZXNwb25zZSk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBXZWJSZXF1ZXN0RW1wdHlFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRleHQ6IHN0cmluZywgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsKSB7XG4gICAgc3VwZXIodGV4dCwgZXJyb3JPd25lcik7XG4gIH1cbiAgcHVibGljIGdldEVycm9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIndlYnJlcXVlc3RlbXB0eVwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwidXJsR2V0Q2hvaWNlc0Vycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgT3RoZXJFbXB0eUVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGV4dDogc3RyaW5nLCBlcnJvck93bmVyOiBJU3VydmV5RXJyb3JPd25lciA9IG51bGwpIHtcbiAgICBzdXBlcih0ZXh0LCBlcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwib3RoZXJlbXB0eVwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3RoZXJSZXF1aXJlZEVycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgVXBsb2FkaW5nRmlsZUVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGV4dDogc3RyaW5nLCBlcnJvck93bmVyOiBJU3VydmV5RXJyb3JPd25lciA9IG51bGwpIHtcbiAgICBzdXBlcih0ZXh0LCBlcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwidXBsb2FkaW5nZmlsZVwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwidXBsb2FkaW5nRmlsZVwiKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFJlcXVpcmVkSW5BbGxSb3dzRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZXh0OiBzdHJpbmcsIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbCkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyZXF1aXJlZGluYWxscm93c2Vycm9yXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZXF1aXJlZEluQWxsUm93c0Vycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgTWluUm93Q291bnRFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG1pblJvd0NvdW50OiBudW1iZXIsXG4gICAgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsXG4gICkge1xuICAgIHN1cGVyKG51bGwsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtaW5yb3djb3VudGVycm9yXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcIm1pblJvd0NvdW50RXJyb3JcIilcbiAgICAgIFtcImZvcm1hdFwiXSh0aGlzLm1pblJvd0NvdW50KTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEtleUR1cGxpY2F0aW9uRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZXh0OiBzdHJpbmcsIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbCkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJrZXlkdXBsaWNhdGlvbmVycm9yXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgQ3VzdG9tRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZXh0OiBzdHJpbmcsIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbCkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjdXN0b21cIjtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Vycm9yLnRzIiwiaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEpzb25PYmplY3QsIEpzb25PYmplY3RQcm9wZXJ0eSwgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG4vKipcbiAqIEFycmF5IG9mIEl0ZW1WYWx1ZSBpcyB1c2VkIGluIGNoZWNrb3gsIGRyb3Bkb3duIGFuZCByYWRpb2dyb3VwIGNob2ljZXMsIG1hdHJpeCBjb2x1bW5zIGFuZCByb3dzLlxuICogSXQgaGFzIHR3byBtYWluIHByb3BlcnRpZXM6IHZhbHVlIGFuZCB0ZXh0LiBJZiB0ZXh0IGlzIGVtcHR5LCB2YWx1ZSBpcyB1c2VkIGZvciBkaXNwbGF5aW5nLlxuICogVGhlIHRleHQgcHJvcGVydHkgaXMgbG9jYWxpemFibGUgYW5kIHN1cHBvcnQgbWFya2Rvd24uXG4gKi9cbmV4cG9ydCBjbGFzcyBJdGVtVmFsdWUgZXh0ZW5kcyBCYXNlIHtcbiAgW2luZGV4OiBzdHJpbmddOiBhbnk7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IFNlcGFyYXRvcigpIHtcbiAgICByZXR1cm4gc2V0dGluZ3MuaXRlbVZhbHVlU2VwYXJhdG9yO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgc2V0IFNlcGFyYXRvcih2YWw6IHN0cmluZykge1xuICAgIHNldHRpbmdzLml0ZW1WYWx1ZVNlcGFyYXRvciA9IHZhbDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUFycmF5KGxvY093bmVyOiBJTG9jYWxpemFibGVPd25lcik6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHZhciBpdGVtczogQXJyYXk8SXRlbVZhbHVlPiA9IFtdO1xuICAgIEl0ZW1WYWx1ZS5zZXR1cEFycmF5KGl0ZW1zLCBsb2NPd25lcik7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgc2V0dXBBcnJheShcbiAgICBpdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICBsb2NPd25lcjogSUxvY2FsaXphYmxlT3duZXJcbiAgKSB7XG4gICAgaXRlbXMucHVzaCA9IGZ1bmN0aW9uKHZhbHVlKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgIHZhbHVlLmxvY093bmVyID0gbG9jT3duZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgaXRlbXMudW5zaGlmdCA9IGZ1bmN0aW9uKHZhbHVlKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUudW5zaGlmdC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgIHZhbHVlLmxvY093bmVyID0gbG9jT3duZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgaXRlbXMuc3BsaWNlID0gZnVuY3Rpb24oXG4gICAgICBzdGFydD86IG51bWJlcixcbiAgICAgIGRlbGV0ZUNvdW50PzogbnVtYmVyLFxuICAgICAgLi4uaXRlbXM6IEl0ZW1WYWx1ZVtdXG4gICAgKTogSXRlbVZhbHVlW10ge1xuICAgICAgdmFyIHJlc3VsdCA9IEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGRlbGV0ZUNvdW50LFxuICAgICAgICAuLi5pdGVtc1xuICAgICAgKTtcbiAgICAgIGlmICghaXRlbXMpIGl0ZW1zID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZW1zW2ldLmxvY093bmVyID0gbG9jT3duZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXREYXRhKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LCB2YWx1ZXM6IEFycmF5PGFueT4pIHtcbiAgICBpdGVtcy5sZW5ndGggPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNbaV07XG4gICAgICB2YXIgaXRlbTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUuZ2V0VHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGl0ZW0gPSBTZXJpYWxpemVyLmNyZWF0ZUNsYXNzKHZhbHVlLmdldFR5cGUoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtID0gbmV3IEl0ZW1WYWx1ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIGl0ZW0uc2V0RGF0YSh2YWx1ZSk7XG4gICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldERhdGEoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4pOiBhbnkge1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaChpdGVtc1tpXS5nZXREYXRhKCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0SXRlbUJ5VmFsdWUoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sIHZhbDogYW55KTogSXRlbVZhbHVlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKGl0ZW1zW2ldLnZhbHVlLCB2YWwpKSByZXR1cm4gaXRlbXNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0VGV4dE9ySHRtbEJ5VmFsdWUoXG4gICAgaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgdmFsOiBhbnlcbiAgKTogc3RyaW5nIHtcbiAgICB2YXIgaXRlbSA9IEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShpdGVtcywgdmFsKTtcbiAgICByZXR1cm4gaXRlbSAhPT0gbnVsbCA/IGl0ZW0ubG9jVGV4dC50ZXh0T3JIdG1sIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGxvY1N0cnNDaGFuZ2VkKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbXNbaV0ubG9jVGV4dC5zdHJDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzdGF0aWMgcnVuQ29uZGl0aW9uc0Zvckl0ZW1zKFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIGZpbHRlcmVkSXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgcnVubmVyOiBDb25kaXRpb25SdW5uZXIsXG4gICAgdmFsdWVzOiBhbnksXG4gICAgcHJvcGVydGllczogYW55XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBJdGVtVmFsdWUucnVuQ29uZGl0aW9uc0Zvckl0ZW1zQ29yZShcbiAgICAgIGl0ZW1zLFxuICAgICAgZmlsdGVyZWRJdGVtcyxcbiAgICAgIHJ1bm5lcixcbiAgICAgIHZhbHVlcyxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHJ1bkVuYWJsZWRDb25kaXRpb25zRm9ySXRlbXMoXG4gICAgaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgcnVubmVyOiBDb25kaXRpb25SdW5uZXIsXG4gICAgdmFsdWVzOiBhbnksXG4gICAgcHJvcGVydGllczogYW55XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBJdGVtVmFsdWUucnVuQ29uZGl0aW9uc0Zvckl0ZW1zQ29yZShcbiAgICAgIGl0ZW1zLFxuICAgICAgbnVsbCxcbiAgICAgIHJ1bm5lcixcbiAgICAgIHZhbHVlcyxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICBmYWxzZVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgcnVuQ29uZGl0aW9uc0Zvckl0ZW1zQ29yZShcbiAgICBpdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICBmaWx0ZXJlZEl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHJ1bm5lcjogQ29uZGl0aW9uUnVubmVyLFxuICAgIHZhbHVlczogYW55LFxuICAgIHByb3BlcnRpZXM6IGFueSxcbiAgICBpc1Zpc2libGU6IGJvb2xlYW5cbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWx1ZXMpIHtcbiAgICAgIHZhbHVlcyA9IHt9O1xuICAgIH1cbiAgICB2YXIgaXRlbVZhbHVlID0gdmFsdWVzW1wiaXRlbVwiXTtcbiAgICB2YXIgY2hvaWNlVmFsdWUgPSB2YWx1ZXNbXCJjaG9pY2VcIl07XG4gICAgdmFyIGhhc0NoYW5kZWQgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgdmFsdWVzW1wiaXRlbVwiXSA9IGl0ZW0udmFsdWU7XG4gICAgICB2YWx1ZXNbXCJjaG9pY2VcIl0gPSBpdGVtLnZhbHVlO1xuICAgICAgdmFyIGl0ZW1SdW5uZXIgPSAhIWl0ZW0uZ2V0Q29uZGl0aW9uUnVubmVyXG4gICAgICAgID8gaXRlbS5nZXRDb25kaXRpb25SdW5uZXIoaXNWaXNpYmxlKVxuICAgICAgICA6IGZhbHNlO1xuICAgICAgaWYgKCFpdGVtUnVubmVyKSB7XG4gICAgICAgIGl0ZW1SdW5uZXIgPSBydW5uZXI7XG4gICAgICB9XG4gICAgICB2YXIgbmV3VmFsdWUgPSB0cnVlO1xuICAgICAgaWYgKGl0ZW1SdW5uZXIpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBpdGVtUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgICAgfVxuICAgICAgaWYgKCEhZmlsdGVyZWRJdGVtcyAmJiBuZXdWYWx1ZSkge1xuICAgICAgICBmaWx0ZXJlZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgICB2YXIgb2xkVmFsdWUgPSBpc1Zpc2libGUgPyBpdGVtLmlzVmlzaWJsZSA6IGl0ZW0uaXNFbmFibGVkO1xuICAgICAgaWYgKG5ld1ZhbHVlICE9IG9sZFZhbHVlKSB7XG4gICAgICAgIGhhc0NoYW5kZWQgPSB0cnVlO1xuICAgICAgICBpZiAoaXNWaXNpYmxlKSB7XG4gICAgICAgICAgaWYgKCEhaXRlbS5zZXRJc1Zpc2libGUpIGl0ZW0uc2V0SXNWaXNpYmxlKG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoISFpdGVtLnNldElzRW5hYmxlZCkgaXRlbS5zZXRJc0VuYWJsZWQobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpdGVtVmFsdWUpIHtcbiAgICAgIHZhbHVlc1tcIml0ZW1cIl0gPSBpdGVtVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZXNbXCJpdGVtXCJdO1xuICAgIH1cbiAgICBpZiAoY2hvaWNlVmFsdWUpIHtcbiAgICAgIHZhbHVlc1tcImNob2ljZVwiXSA9IGNob2ljZVZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVzW1wiY2hvaWNlXCJdO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQ2hhbmRlZDtcbiAgfVxuICBwcml2YXRlIHZpc2libGVJZlZhbHVlOiBzdHJpbmcgPSBcIlwiO1xuICBwcml2YXRlIGl0ZW1WYWx1ZTogYW55O1xuICBwcml2YXRlIGxvY1RleHRWYWx1ZTogTG9jYWxpemFibGVTdHJpbmc7XG4gIHByaXZhdGUgaXNWaXNpYmxlVmFsdWU6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIHZpc2libGVDb25kaXRpb25SdW5uZXI6IENvbmRpdGlvblJ1bm5lcjtcbiAgcHJpdmF0ZSBlbmFibGVDb25kaXRpb25SdW5uZXI6IENvbmRpdGlvblJ1bm5lcjtcblxuICBjb25zdHJ1Y3Rvcih2YWx1ZTogYW55LCB0ZXh0OiBzdHJpbmcgPSBudWxsLCBwcml2YXRlIHR5cGVOYW1lID0gXCJpdGVtdmFsdWVcIikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5sb2NUZXh0VmFsdWUgPSBuZXcgTG9jYWxpemFibGVTdHJpbmcobnVsbCwgdHJ1ZSk7XG4gICAgdGhpcy5sb2NUZXh0VmFsdWUub25HZXRUZXh0Q2FsbGJhY2sgPSB0eHQgPT4ge1xuICAgICAgcmV0dXJuIHR4dCA/IHR4dCA6ICF0aGlzLmlzVmFsdWVJdGVtRW1wdHkgPyB0aGlzLnZhbHVlLnRvU3RyaW5nKCkgOiBudWxsO1xuICAgIH07XG4gICAgaWYgKHRleHQpIHRoaXMubG9jVGV4dC50ZXh0ID0gdGV4dDtcbiAgICBpZiAoISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRoaXMuc2V0RGF0YSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5vbkNyZWF0aW5nKCk7XG4gIH1cbiAgcHVibGljIG9uQ3JlYXRpbmcoKTogYW55IHt9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy50eXBlTmFtZSA/IHRoaXMudHlwZU5hbWUgOiBcIml0ZW12YWx1ZVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGV4dFZhbHVlO1xuICB9XG4gIHNldExvY1RleHQobG9jVGV4dDogTG9jYWxpemFibGVTdHJpbmcpIHtcbiAgICB0aGlzLmxvY1RleHRWYWx1ZSA9IGxvY1RleHQ7XG4gIH1cbiAgcHVibGljIGdldCBsb2NPd25lcigpOiBJTG9jYWxpemFibGVPd25lciB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGV4dC5vd25lcjtcbiAgfVxuICBwdWJsaWMgc2V0IGxvY093bmVyKHZhbHVlOiBJTG9jYWxpemFibGVPd25lcikge1xuICAgIHRoaXMubG9jVGV4dC5vd25lciA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5pdGVtVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5pdGVtVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICBpZiAoIXRoaXMuaXRlbVZhbHVlKSByZXR1cm47XG4gICAgdmFyIHN0cjogc3RyaW5nID0gdGhpcy5pdGVtVmFsdWUudG9TdHJpbmcoKTtcbiAgICB2YXIgaW5kZXggPSBzdHIuaW5kZXhPZihzZXR0aW5ncy5pdGVtVmFsdWVTZXBhcmF0b3IpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLml0ZW1WYWx1ZSA9IHN0ci5zbGljZSgwLCBpbmRleCk7XG4gICAgICB0aGlzLnRleHQgPSBzdHIuc2xpY2UoaW5kZXggKyAxKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmhhc1RleHQpIHtcbiAgICAgIHRoaXMubG9jVGV4dC5vbkNoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBoYXNUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvY1RleHQucHVyZVRleHQgPyB0cnVlIDogZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGV4dC50ZXh0O1xuICB9XG4gIHB1YmxpYyBzZXQgdGV4dChuZXdUZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLmxvY1RleHQudGV4dCA9IG5ld1RleHQ7XG4gIH1cbiAgcHVibGljIGdldERhdGEoKTogYW55IHtcbiAgICB2YXIganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgaWYgKCEhanNvbltcInZhbHVlXCJdICYmICEhanNvbltcInZhbHVlXCJdW1wicG9zXCJdKSB7XG4gICAgICBkZWxldGUganNvbltcInZhbHVlXCJdW1wicG9zXCJdO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMoanNvbikubGVuZ3RoID09IDEgJiYgIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KGpzb25bXCJ2YWx1ZVwiXSkpXG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICByZXR1cm4ganNvbjtcbiAgfVxuICBwdWJsaWMgdG9KU09OKCk6IGFueSB7XG4gICAgdmFyIHJlcyA9IHt9O1xuICAgIHZhciBwcm9wZXJ0aWVzID0gU2VyaWFsaXplci5nZXRQcm9wZXJ0aWVzKHRoaXMuZ2V0VHlwZSgpKTtcbiAgICBpZiAoIXByb3BlcnRpZXMgfHwgcHJvcGVydGllcy5sZW5ndGggPT0gMCkge1xuICAgICAgcHJvcGVydGllcyA9IFNlcmlhbGl6ZXIuZ2V0UHJvcGVydGllcyhcIml0ZW12YWx1ZVwiKTtcbiAgICB9XG4gICAgdmFyIGpzb09iaiA9IG5ldyBKc29uT2JqZWN0KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBqc29PYmoudmFsdWVUb0pzb24odGhpcywgcmVzLCBwcm9wZXJ0aWVzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgc2V0RGF0YSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlKSkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgdmFsdWUudmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHZhciBqc29uID0gdmFsdWU7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGpzb24gPSAoPEJhc2U+dmFsdWUpLnRvSlNPTigpO1xuICAgICAgfVxuICAgICAgbmV3IEpzb25PYmplY3QoKS50b09iamVjdChqc29uLCB0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IHZpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVJZlZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy52aXNpYmxlSWZWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1Zpc2libGVWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0SXNWaXNpYmxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuaXNWaXNpYmxlVmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBpc0VuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzRW5hYmxlZFwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0SXNFbmFibGVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzRW5hYmxlZFwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDb25kaXRpb25SdW5uZXIoaXNWaXNpYmxlOiBib29sZWFuKSB7XG4gICAgaWYgKGlzVmlzaWJsZSkgcmV0dXJuIHRoaXMuZ2V0VmlzaWJsZUNvbmRpdGlvblJ1bm5lcigpO1xuICAgIHJldHVybiB0aGlzLmdldEVuYWJsZUNvbmRpdGlvblJ1bm5lcigpO1xuICB9XG4gIHByaXZhdGUgZ2V0VmlzaWJsZUNvbmRpdGlvblJ1bm5lcigpOiBDb25kaXRpb25SdW5uZXIge1xuICAgIGlmICghdGhpcy52aXNpYmxlSWYpIHJldHVybiBudWxsO1xuICAgIGlmICghdGhpcy52aXNpYmxlQ29uZGl0aW9uUnVubmVyKVxuICAgICAgdGhpcy52aXNpYmxlQ29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLnZpc2libGVJZik7XG4gICAgdGhpcy52aXNpYmxlQ29uZGl0aW9uUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLnZpc2libGVJZjtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29uZGl0aW9uUnVubmVyO1xuICB9XG4gIHByaXZhdGUgZ2V0RW5hYmxlQ29uZGl0aW9uUnVubmVyKCk6IENvbmRpdGlvblJ1bm5lciB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUlmKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMuZW5hYmxlQ29uZGl0aW9uUnVubmVyKVxuICAgICAgdGhpcy5lbmFibGVDb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuZW5hYmxlSWYpO1xuICAgIHRoaXMuZW5hYmxlQ29uZGl0aW9uUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLmVuYWJsZUlmO1xuICAgIHJldHVybiB0aGlzLmVuYWJsZUNvbmRpdGlvblJ1bm5lcjtcbiAgfVxuICBwcml2YXRlIGdldCBpc1ZhbHVlSXRlbUVtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy5pdGVtVmFsdWUgJiYgdGhpcy5pdGVtVmFsdWUgIT09IDAgJiYgdGhpcy5pdGVtVmFsdWUgIT09IGZhbHNlO1xuICB9XG59XG5cbkJhc2UuY3JlYXRlSXRlbVZhbHVlID0gZnVuY3Rpb24oZGVzdDogYW55KTogYW55IHtcbiAgdmFyIGl0ZW0gPSBudWxsO1xuICBpZiAodHlwZW9mIGRlc3QuZ2V0VHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaXRlbSA9IG5ldyBJdGVtVmFsdWUobnVsbCwgdW5kZWZpbmVkLCBkZXN0LmdldFR5cGUoKSk7XG4gIH0gZWxzZSB7XG4gICAgaXRlbSA9IG5ldyBJdGVtVmFsdWUobnVsbCk7XG4gIH1cbiAgaXRlbS5zZXREYXRhKGRlc3QpO1xuICByZXR1cm4gaXRlbTtcbn07XG5CYXNlLml0ZW1WYWx1ZUxvY1N0ckNoYW5nZWQgPSBmdW5jdGlvbihhcnI6IEFycmF5PGFueT4pOiB2b2lkIHtcbiAgSXRlbVZhbHVlLmxvY1N0cnNDaGFuZ2VkKGFycik7XG59O1xuSnNvbk9iamVjdFByb3BlcnR5LmdldEl0ZW1WYWx1ZXNEZWZhdWx0VmFsdWUgPSBmdW5jdGlvbih2YWw6IGFueSk6IGFueSB7XG4gIHZhciByZXMgPSBuZXcgQXJyYXk8SXRlbVZhbHVlPigpO1xuICBJdGVtVmFsdWUuc2V0RGF0YShyZXMsIHZhbCB8fCBbXSk7XG4gIHJldHVybiByZXM7XG59O1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIml0ZW12YWx1ZVwiLFxuICBbXG4gICAgXCJ2YWx1ZVwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwidGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RleHRcIlxuICAgIH0sXG4gICAgeyBuYW1lOiBcInZpc2libGVJZjpjb25kaXRpb25cIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiZW5hYmxlSWY6Y29uZGl0aW9uXCIsIHZpc2libGU6IGZhbHNlIH1cbiAgXSxcbiAgKHZhbHVlOiBhbnkpID0+IG5ldyBJdGVtVmFsdWUodmFsdWUpXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2l0ZW12YWx1ZS50cyIsImV4cG9ydCB2YXIgc3VydmV5Q3NzOiBhbnkgPSB7XG4gIGN1cnJlbnRUeXBlOiBcIlwiLFxuICBnZXRDc3M6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBsb2MgPSB0aGlzLmN1cnJlbnRUeXBlID8gdGhpc1t0aGlzLmN1cnJlbnRUeXBlXSA6IGRlZmF1bHRTdGFuZGFyZENzcztcbiAgICBpZiAoIWxvYykgbG9jID0gZGVmYXVsdFN0YW5kYXJkQ3NzO1xuICAgIHJldHVybiBsb2M7XG4gIH1cbn07XG5cbmV4cG9ydCB2YXIgZGVmYXVsdFN0YW5kYXJkQ3NzID0ge1xuICByb290OiBcInN2X21haW4gc3ZfZGVmYXVsdF9jc3NcIixcbiAgaGVhZGVyOiBcInN2X2hlYWRlclwiLFxuICBib2R5OiBcInN2X2JvZHlcIixcbiAgYm9keUVtcHR5OiBcInN2X2JvZHkgc3ZfYm9keV9lbXB0eVwiLFxuICBmb290ZXI6IFwic3ZfbmF2XCIsXG4gIG5hdmlnYXRpb25CdXR0b246IFwiXCIsXG4gIGNvbXBsZXRlZFBhZ2U6IFwic3ZfY29tcGxldGVkX3BhZ2VcIixcbiAgbmF2aWdhdGlvbjoge1xuICAgIGNvbXBsZXRlOiBcInN2X2NvbXBsZXRlX2J0blwiLFxuICAgIHByZXY6IFwic3ZfcHJldl9idG5cIixcbiAgICBuZXh0OiBcInN2X25leHRfYnRuXCIsXG4gICAgc3RhcnQ6IFwic3Zfc3RhcnRfYnRuXCJcbiAgfSxcbiAgcHJvZ3Jlc3M6IFwic3ZfcHJvZ3Jlc3NcIixcbiAgcHJvZ3Jlc3NCYXI6IFwic3ZfcHJvZ3Jlc3NfYmFyXCIsXG4gIHBhZ2U6IHtcbiAgICByb290OiBcInN2X3Bfcm9vdFwiLFxuICAgIHRpdGxlOiBcIlwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlwiXG4gIH0sXG4gIC8vIFRPRE86IG1vdmUgdG8gdGhlIHBhZ2Ugb2JqZWN0XG4gIHBhZ2VUaXRsZTogXCJzdl9wYWdlX3RpdGxlXCIsXG4gIHBhZ2VEZXNjcmlwdGlvbjogXCJcIixcbiAgcm93OiBcInN2X3Jvd1wiLFxuICBxdWVzdGlvbjoge1xuICAgIG1haW5Sb290OiBcInN2X3Egc3ZfcXN0blwiLFxuICAgIGZsb3dSb290OiBcInN2X3FfZmxvdyBzdl9xc3RuXCIsXG4gICAgdGl0bGVMZWZ0Um9vdDogXCJzdl9xc3RuX2xlZnRcIixcbiAgICB0aXRsZTogXCJzdl9xX3RpdGxlXCIsXG4gICAgbnVtYmVyOiBcInN2X3FfbnVtXCIsXG4gICAgZGVzY3JpcHRpb246IFwic3ZfcV9kZXNjcmlwdGlvblwiLFxuICAgIGNvbW1lbnQ6IFwiXCIsXG4gICAgcmVxdWlyZWQ6IFwiXCIsXG4gICAgdGl0bGVSZXF1aXJlZDogXCJcIixcbiAgICBoYXNFcnJvcjogXCJcIixcbiAgICBpbmRlbnQ6IDIwLFxuICAgIGZvb3RlcjogXCJzdl9xX2Zvb3RlclwiXG4gIH0sXG4gIHBhbmVsOiB7XG4gICAgdGl0bGU6IFwic3ZfcF90aXRsZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInN2X3BfZGVzY3JpcHRpb25cIixcbiAgICBjb250YWluZXI6IFwic3ZfcF9jb250YWluZXJcIlxuICB9LFxuICBlcnJvcjoge1xuICAgIHJvb3Q6IFwic3ZfcV9lcmJveFwiLFxuICAgIGljb246IFwiXCIsXG4gICAgaXRlbTogXCJcIixcbiAgICBsb2NhdGlvblRvcDogXCJzdl9xc3RuX2Vycm9yX3RvcFwiLFxuICAgIGxvY2F0aW9uQm90dG9tOiBcInN2X3FzdG5fZXJyb3JfYm90dG9tXCJcbiAgfSxcblxuICBib29sZWFuOiB7XG4gICAgcm9vdDogXCJzdl9xY2JjIHN2X3FibG5cIixcbiAgICBpdGVtOiBcInN2X3FfY2hlY2tib3hcIixcbiAgICBsYWJlbDogXCJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaGVja2JveC1tYXRlcmlhbFwiXG4gIH0sXG4gIGNoZWNrYm94OiB7XG4gICAgcm9vdDogXCJzdl9xY2JjIHN2X3FjYnhcIixcbiAgICBpdGVtOiBcInN2X3FfY2hlY2tib3hcIixcbiAgICBsYWJlbDogXCJzdl9xX2NoZWNrYm94X2xhYmVsXCIsXG4gICAgaXRlbUNvbnRyb2w6IFwic3ZfcV9jaGVja2JveF9jb250cm9sX2l0ZW1cIixcbiAgICBjb250cm9sTGFiZWw6IFwic3ZfcV9jaGVja2JveF9jb250cm9sX2xhYmVsXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwiY2hlY2tib3gtbWF0ZXJpYWxcIixcbiAgICBvdGhlcjogXCJzdl9xX290aGVyIHN2X3FfY2hlY2tib3hfb3RoZXJcIixcbiAgICBjb2x1bW46IFwic3ZfcV9zZWxlY3RfY29sdW1uXCJcbiAgfSxcbiAgY29tbWVudDogXCJcIixcbiAgZHJvcGRvd246IHtcbiAgICByb290OiBcIlwiLFxuICAgIGNvbnRyb2w6IFwic3ZfcV9kcm9wZG93bl9jb250cm9sXCIsXG4gICAgc2VsZWN0V3JhcHBlcjogXCJzdl9zZWxlY3Rfd3JhcHBlclwiLFxuICAgIG90aGVyOiBcInN2X3FfZGRfb3RoZXJcIlxuICB9LFxuICBodG1sOiB7IHJvb3Q6IFwiXCIgfSxcbiAgbWF0cml4OiB7XG4gICAgcm9vdDogXCJzdl9xX21hdHJpeFwiLFxuICAgIGxhYmVsOiBcInN2X3FfbV9sYWJlbFwiLFxuICAgIGNlbGxUZXh0OiBcInN2X3FfbV9jZWxsX3RleHRcIixcbiAgICBjZWxsVGV4dFNlbGVjdGVkOiBcInN2X3FfbV9jZWxsX3NlbGVjdGVkXCIsXG4gICAgY2VsbExhYmVsOiBcInN2X3FfbV9jZWxsX2xhYmVsXCJcbiAgfSxcbiAgbWF0cml4ZHJvcGRvd246IHsgcm9vdDogXCJzdl9xX21hdHJpeF9kcm9wZG93blwiIH0sXG4gIG1hdHJpeGR5bmFtaWM6IHtcbiAgICByb290OiBcInN2X3FfbWF0cml4X2R5bmFtaWNcIixcbiAgICBidXR0b246IFwic3ZfbWF0cml4X2R5bmFtaWNfYnV0dG9uXCIsXG4gICAgYnV0dG9uQWRkOiBcIlwiLFxuICAgIGJ1dHRvblJlbW92ZTogXCJcIixcbiAgICBpY29uQWRkOiBcIlwiLFxuICAgIGljb25SZW1vdmU6IFwiXCJcbiAgfSxcbiAgcGFuZWxkeW5hbWljOiB7XG4gICAgcm9vdDogXCJzdl9wYW5lbF9keW5hbWljXCIsXG4gICAgdGl0bGU6IFwic3ZfcF90aXRsZVwiLFxuICAgIGJ1dHRvbjogXCJcIixcbiAgICBidXR0b25QcmV2OiBcIlwiLFxuICAgIGJ1dHRvbk5leHQ6IFwiXCIsXG4gICAgYnV0dG9uQWRkOiBcIlwiLFxuICAgIGJ1dHRvblJlbW92ZTogXCJcIlxuICB9LFxuICBtdWx0aXBsZXRleHQ6IHtcbiAgICByb290OiBcInN2X3FfbXRcIixcbiAgICBpdGVtVGl0bGU6IFwic3ZfcV9tdF90aXRsZVwiLFxuICAgIHJvdzogXCJzdl9xX210X3Jvd1wiLFxuICAgIGl0ZW1WYWx1ZTogXCJzdl9xX210X2l0ZW1fdmFsdWUgc3ZfcV90ZXh0X3Jvb3RcIlxuICB9LFxuICByYWRpb2dyb3VwOiB7XG4gICAgcm9vdDogXCJzdl9xY2JjXCIsXG4gICAgaXRlbTogXCJzdl9xX3JhZGlvZ3JvdXBcIixcbiAgICBsYWJlbDogXCJzdl9xX3JhZGlvZ3JvdXBfbGFiZWxcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdl9xX3JhZGlvZ3JvdXBfY29udHJvbF9pdGVtXCIsXG4gICAgY29udHJvbExhYmVsOiBcIlwiLFxuICAgIG1hdGVyaWFsRGVjb3JhdG9yOiBcImNpcmNsZVwiLFxuICAgIG90aGVyOiBcInN2X3Ffb3RoZXIgc3ZfcV9yYWRpb2dyb3VwX290aGVyXCIsXG4gICAgY2xlYXJCdXR0b246IFwic3ZfcV9yYWRpb2dyb3VwX2NsZWFyXCIsXG4gICAgY29sdW1uOiBcInN2X3Ffc2VsZWN0X2NvbHVtblwiXG4gIH0sXG4gIGltYWdlcGlja2VyOiB7XG4gICAgcm9vdDogXCJzdl9pbWdzZWxcIixcbiAgICBpdGVtOiBcInN2X3FfaW1nc2VsXCIsXG4gICAgbGFiZWw6IFwic3ZfcV9pbWdzZWxfbGFiZWxcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdl9xX2ltZ3NlbF9jb250cm9sX2l0ZW1cIixcbiAgICBpbWFnZTogXCJzdl9xX2ltZ3NlbF9pbWFnZVwiLFxuICAgIGl0ZW1UZXh0OiBcInN2X3FfaW1nc2VsX3RleHRcIixcbiAgICBjbGVhckJ1dHRvbjogXCJzdl9xX3JhZGlvZ3JvdXBfY2xlYXJcIlxuICB9LFxuICByYXRpbmc6IHtcbiAgICByb290OiBcInN2X3FfcmF0aW5nXCIsXG4gICAgaXRlbTogXCJzdl9xX3JhdGluZ19pdGVtXCIsXG4gICAgc2VsZWN0ZWQ6IFwiYWN0aXZlXCIsXG4gICAgbWluVGV4dDogXCJzdl9xX3JhdGluZ19taW5fdGV4dFwiLFxuICAgIGl0ZW1UZXh0OiBcInN2X3FfcmF0aW5nX2l0ZW1fdGV4dFwiLFxuICAgIG1heFRleHQ6IFwic3ZfcV9yYXRpbmdfbWF4X3RleHRcIlxuICB9LFxuICB0ZXh0OiBcInN2X3FfdGV4dF9yb290XCIsXG4gIGV4cHJlc3Npb246IFwiXCIsXG4gIGZpbGU6IHtcbiAgICByb290OiBcInN2X3FfZmlsZVwiLFxuICAgIHBsYWNlaG9sZGVySW5wdXQ6IFwic3ZfcV9maWxlX3BsYWNlaG9sZGVyXCIsXG4gICAgcHJldmlldzogXCJzdl9xX2ZpbGVfcHJldmlld1wiLFxuICAgIHJlbW92ZUJ1dHRvbjogXCJzdl9xX2ZpbGVfcmVtb3ZlX2J1dHRvblwiLFxuICAgIGZpbGVJbnB1dDogXCJzdl9xX2ZpbGVfaW5wdXRcIixcbiAgICByZW1vdmVGaWxlOiBcInN2X3FfZmlsZV9yZW1vdmVcIlxuICB9LFxuICBzYXZlRGF0YToge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgc2F2aW5nOiBcIlwiLFxuICAgIGVycm9yOiBcIlwiLFxuICAgIHN1Y2Nlc3M6IFwiXCIsXG4gICAgc2F2ZUFnYWluQnV0dG9uOiBcIlwiXG4gIH0sXG4gIHdpbmRvdzoge1xuICAgIHJvb3Q6IFwic3Zfd2luZG93XCIsXG4gICAgYm9keTogXCJzdl93aW5kb3dfY29udGVudFwiLFxuICAgIGhlYWRlcjoge1xuICAgICAgcm9vdDogXCJzdl93aW5kb3dfdGl0bGVcIixcbiAgICAgIHRpdGxlOiBcIlwiLFxuICAgICAgYnV0dG9uOiBcIlwiLFxuICAgICAgYnV0dG9uRXhwYW5kZWQ6IFwiXCIsXG4gICAgICBidXR0b25Db2xsYXBzZWQ6IFwiXCJcbiAgICB9XG4gIH1cbn07XG5cbnN1cnZleUNzc1tcInN0YW5kYXJkXCJdID0gZGVmYXVsdFN0YW5kYXJkQ3NzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmQudHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi9xdWVzdGlvblwiO1xuaW1wb3J0IHtcbiAgUXVlc3Rpb25TZWxlY3RCYXNlLFxuICBRdWVzdGlvbkNoZWNrYm94QmFzZVxufSBmcm9tIFwiLi4vcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25TZWxlY3RCYXNlSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkltcGxlbWVudG9yIHtcbiAgcHJvdGVjdGVkIG9uQ3JlYXRlZCgpIHt9XG4gIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcblxuICAgIHRoaXMub25DcmVhdGVkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBpc090aGVyU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICg8UXVlc3Rpb25TZWxlY3RCYXNlPnRoaXMucXVlc3Rpb24pLmlzT3RoZXJTZWxlY3RlZDtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ2hlY2tib3hCYXNlSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvblNlbGVjdEJhc2VJbXBsZW1lbnRvciB7XG4gIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvQWZ0ZXJSZW5kZXJcIl0gPSB0aGlzLmtvQWZ0ZXJSZW5kZXI7XG4gIH1cbiAgcHJpdmF0ZSBrb0FmdGVyUmVuZGVyKGVsOiBhbnksIGNvbjogYW55KSB7XG4gICAgdmFyIHRFbCA9IGVsWzBdO1xuICAgIGlmICh0RWwubm9kZU5hbWUgPT0gXCIjdGV4dFwiKSB0RWwuZGF0YSA9IFwiXCI7XG4gICAgdEVsID0gZWxbZWwubGVuZ3RoIC0gMV07XG4gICAgaWYgKHRFbC5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHRFbC5kYXRhID0gXCJcIjtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fYmFzZXNlbGVjdC50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi4vc3VydmV5XCI7XG5pbXBvcnQgeyBJUGFnZSwgSVF1ZXN0aW9uLCBFdmVudCwgU3VydmV5RWxlbWVudCB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgeyBQYWdlIH0gZnJvbSBcIi4va29wYWdlXCI7XG5pbXBvcnQgeyBQYWdlTW9kZWwgfSBmcm9tIFwiLi4vcGFnZVwiO1xuaW1wb3J0IHsgc3VydmV5Q3NzIH0gZnJvbSBcIi4uL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmRcIjtcbmltcG9ydCB7IGtvVGVtcGxhdGUsIFN1cnZleVRlbXBsYXRlVGV4dCB9IGZyb20gXCIuL3RlbXBsYXRlVGV4dFwiO1xuaW1wb3J0IHtcbiAgUXVlc3Rpb25DdXN0b21XaWRnZXQsXG4gIEN1c3RvbVdpZGdldENvbGxlY3Rpb25cbn0gZnJvbSBcIi4uL3F1ZXN0aW9uQ3VzdG9tV2lkZ2V0c1wiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IEltcGxlbWVudG9yQmFzZSB9IGZyb20gXCIuL2tvYmFzZVwiO1xuXG5DdXN0b21XaWRnZXRDb2xsZWN0aW9uLkluc3RhbmNlLm9uQ3VzdG9tV2lkZ2V0QWRkZWQuYWRkKGN1c3RvbVdpZGdldCA9PiB7XG4gIGlmIChjdXN0b21XaWRnZXQud2lkZ2V0SnNvbi5pc0RlZmF1bHRSZW5kZXIpIHJldHVybjtcbiAgaWYgKCFjdXN0b21XaWRnZXQuaHRtbFRlbXBsYXRlKVxuICAgIGN1c3RvbVdpZGdldC5odG1sVGVtcGxhdGUgPVxuICAgICAgXCI8ZGl2PidodG1sVGVtcGxhdGUnIGF0dHJpYnV0ZSBpcyBtaXNzZWQuPC9kaXY+XCI7XG4gIG5ldyBTdXJ2ZXlUZW1wbGF0ZVRleHQoKS5yZXBsYWNlVGV4dChcbiAgICBjdXN0b21XaWRnZXQuaHRtbFRlbXBsYXRlLFxuICAgIFwid2lkZ2V0XCIsXG4gICAgY3VzdG9tV2lkZ2V0Lm5hbWVcbiAgKTtcbn0pO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5IGV4dGVuZHMgU3VydmV5TW9kZWwge1xuICBwdWJsaWMgc3RhdGljIGdldCBjc3NUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUNzcy5jdXJyZW50VHlwZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldCBjc3NUeXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBzdXJ2ZXlDc3MuY3VycmVudFR5cGUgPSB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIHJlbmRlcmVkRWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gIC8vVE9ETyByZW1vdmUgaXQsIHNpbmNlIHRoZXJlIGlzIG9uQWZ0ZXJSZW5kZXJTdXJ2ZXlcbiAgcHVibGljIG9uUmVuZGVyZWQ6IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsKSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwpID0+IGFueSxcbiAgICBhbnlcbiAgPigpO1xuICBwcml2YXRlIGlzRmlyc3RSZW5kZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIG1vdXNlRG93blBhZ2U6IGFueSA9IG51bGw7XG5cbiAga29DdXJyZW50UGFnZTogYW55O1xuICBrb0lzRmlyc3RQYWdlOiBhbnk7XG4gIGtvSXNMYXN0UGFnZTogYW55O1xuICBkdW1teU9ic2VydmFibGU6IGFueTtcbiAga29TdGF0ZTogYW55O1xuICBrb1Byb2dyZXNzOiBhbnk7XG4gIGtvUHJvZ3Jlc3NUZXh0OiBhbnk7XG4gIGtvQWZ0ZXJSZW5kZXJQYWdlOiBhbnk7XG4gIGtvQ29tcGxldGVkU3RhdGU6IGFueTtcbiAga29Db21wbGV0ZWRTdGF0ZVRleHQ6IGFueTtcbiAga29Db21wbGV0ZWRTdGF0ZUNzczogYW55O1xuICBrb1RpbWVySW5mb1RleHQ6IGFueTtcblxuICBwdWJsaWMgZ2V0RGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoOiBhbnksIGtleTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlc0hhc2hba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWx1ZXNIYXNoW2tleV0gPSBrby5vYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIHJldHVybiBrby51bndyYXAodmFsdWVzSGFzaFtrZXldKTtcbiAgfVxuICBwdWJsaWMgc2V0RGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoOiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKGtvLmlzV3JpdGVhYmxlT2JzZXJ2YWJsZSh2YWx1ZXNIYXNoW2tleV0pKSB7XG4gICAgICB2YWx1ZXNIYXNoW2tleV0odmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZXNIYXNoW2tleV0gPSBrby5vYnNlcnZhYmxlKHZhbHVlKTtcbiAgICAgIC8vIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgLy8gICB2YWx1ZXNIYXNoW2tleV0gPSBrby5vYnNlcnZhYmxlQXJyYXkodmFsdWUpO1xuICAgICAgLy8gICAoPGFueT52YWx1ZSlbXCJvbkFycmF5Q2hhbmdlZFwiXSA9ICgpID0+XG4gICAgICAvLyAgICAgdmFsdWVzSGFzaFtrZXldLm5vdGlmeVN1YnNjcmliZXJzKCk7XG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gICB2YWx1ZXNIYXNoW2tleV0gPSBrby5vYnNlcnZhYmxlKHZhbHVlKTtcbiAgICAgIC8vIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGRlbGV0ZURhdGFWYWx1ZUNvcmUodmFsdWVzSGFzaDogYW55LCBrZXk6IHN0cmluZykge1xuICAgIGlmIChrby5pc1dyaXRlYWJsZU9ic2VydmFibGUodmFsdWVzSGFzaFtrZXldKSkge1xuICAgICAgdmFsdWVzSGFzaFtrZXldKHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZXNIYXNoW2tleV07XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAganNvbk9iajogYW55ID0gbnVsbCxcbiAgICByZW5kZXJlZEVsZW1lbnQ6IGFueSA9IG51bGwsXG4gICAgY3NzOiBhbnkgPSBudWxsXG4gICkge1xuICAgIHN1cGVyKGpzb25PYmopO1xuICAgIG5ldyBJbXBsZW1lbnRvckJhc2UodGhpcyk7XG4gICAgaWYgKHR5cGVvZiBrbyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImtub2Nrb3V0anMgbGlicmFyeSBpcyBub3QgbG9hZGVkLlwiKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgLy8gdGhpcy5pdGVyYXRlRGF0YVZhbHVlc0hhc2goKGhhc2g6IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAvLyAgIHZhciB2YWwgPSBoYXNoW2tleV07XG4gICAgLy8gICBpZiAoIWtvLmlzV3JpdGVhYmxlT2JzZXJ2YWJsZSh2YWwpKSB7XG4gICAgLy8gICAgIGhhc2hba2V5XSA9IGtvLm9ic2VydmFibGUodmFsKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9KTtcbiAgICBpZiAoY3NzKSB7XG4gICAgICB0aGlzLmNzcyA9IGNzcztcbiAgICB9XG4gICAgaWYgKHJlbmRlcmVkRWxlbWVudCkge1xuICAgICAgdGhpcy5yZW5kZXJlZEVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnQ7XG4gICAgfVxuICAgIHRoaXMucmVuZGVyKHJlbmRlcmVkRWxlbWVudCk7XG4gIH1cbiAgcHVibGljIG5leHRQYWdlVUlDbGljaygpIHtcbiAgICBpZiAoISF0aGlzLm1vdXNlRG93blBhZ2UgJiYgdGhpcy5tb3VzZURvd25QYWdlICE9PSB0aGlzLmN1cnJlbnRQYWdlKSByZXR1cm47XG4gICAgdGhpcy5tb3VzZURvd25QYWdlID0gbnVsbDtcbiAgICB0aGlzLm5leHRQYWdlKCk7XG4gIH1cbiAgcHVibGljIG5leHRQYWdlTW91c2VEb3duKCkge1xuICAgIHRoaXMubW91c2VEb3duUGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgdmFyIGVsID0gPGFueT5kb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgIGlmICghIWVsICYmICEhZWwuYmx1cikgZWwuYmx1cigpO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzTmF2aWdhdGlvbkNvbXBsZXRlKCkge1xuICAgIHJldHVybiB0aGlzLmdldE5hdmlnYXRpb25Dc3MoXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uQnV0dG9uLFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbi5jb21wbGV0ZVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBjc3NOYXZpZ2F0aW9uUHJldigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROYXZpZ2F0aW9uQ3NzKFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbkJ1dHRvbixcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb24ucHJldlxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBjc3NOYXZpZ2F0aW9uU3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmF2aWdhdGlvbkNzcyhcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb25CdXR0b24sXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uLnN0YXJ0XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc05hdmlnYXRpb25OZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldE5hdmlnYXRpb25Dc3MoXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uQnV0dG9uLFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbi5uZXh0XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNvbXBsZXRlZENzcygpIHtcbiAgICB2YXIgY3NzID0gc3VydmV5Q3NzLmdldENzcygpO1xuICAgIHJldHVybiBjc3MuYm9keSArIFwiIFwiICsgY3NzLmNvbXBsZXRlZFBhZ2U7XG4gIH1cbiAgcHJpdmF0ZSBnZXROYXZpZ2F0aW9uQ3NzKG1haW46IHN0cmluZywgYnRuOiBzdHJpbmcpIHtcbiAgICB2YXIgcmVzID0gXCJcIjtcbiAgICBpZiAobWFpbikgcmVzID0gbWFpbjtcbiAgICBpZiAoYnRuKSByZXMgKz0gXCIgXCIgKyBidG47XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0IGNzcygpOiBhbnkge1xuICAgIHJldHVybiBzdXJ2ZXlDc3MuZ2V0Q3NzKCk7XG4gIH1cbiAgcHVibGljIHNldCBjc3ModmFsdWU6IGFueSkge1xuICAgIHRoaXMubWVyZ2VWYWx1ZXModmFsdWUsIHRoaXMuY3NzKTtcbiAgfVxuICBwdWJsaWMgcmVuZGVyKGVsZW1lbnQ6IGFueSA9IG51bGwpIHtcbiAgICB0aGlzLnVwZGF0ZUtvQ3VycmVudFBhZ2UoKTtcbiAgICB0aGlzLnVwZGF0ZUN1c3RvbVdpZGdldHModGhpcy5jdXJyZW50UGFnZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChlbGVtZW50ICYmIHR5cGVvZiBlbGVtZW50ID09IFwic3RyaW5nXCIpIHtcbiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50KTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMucmVuZGVyZWRFbGVtZW50ID0gZWxlbWVudDtcbiAgICB9XG4gICAgZWxlbWVudCA9IHRoaXMucmVuZGVyZWRFbGVtZW50O1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuICAgIHNlbGYuc3RhcnRUaW1lckZyb21VSSgpO1xuICAgIHNlbGYuYXBwbHlCaW5kaW5nKCk7XG4gIH1cbiAgcHVibGljIGNsZWFyKGNsZWFyRGF0YTogYm9vbGVhbiA9IHRydWUsIGdvdG9GaXJzdFBhZ2U6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgc3VwZXIuY2xlYXIoY2xlYXJEYXRhLCBnb3RvRmlyc3RQYWdlKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG4gIHByb3RlY3RlZCBvbkxvY2FsZUNoYW5nZWQoKSB7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuICBwdWJsaWMga29FdmVudEFmdGVyUmVuZGVyKGVsZW1lbnQ6IGFueSwgc3VydmV5OiBhbnkpIHtcbiAgICBzdXJ2ZXkub25SZW5kZXJlZC5maXJlKHNlbGYsIHt9KTtcbiAgICBzdXJ2ZXkuYWZ0ZXJSZW5kZXJTdXJ2ZXkoZWxlbWVudCk7XG4gIH1cbiAgcHVibGljIGxvYWRTdXJ2ZXlGcm9tU2VydmljZShcbiAgICBzdXJ2ZXlJZDogc3RyaW5nID0gbnVsbCxcbiAgICBjbGllbnRJZDogc3RyaW5nID0gbnVsbCxcbiAgICByZW5kZXJlZEVsZW1lbnQ6IGFueSA9IG51bGxcbiAgKSB7XG4gICAgaWYgKHJlbmRlcmVkRWxlbWVudCkge1xuICAgICAgdGhpcy5yZW5kZXJlZEVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnQ7XG4gICAgfVxuICAgIHN1cGVyLmxvYWRTdXJ2ZXlGcm9tU2VydmljZShzdXJ2ZXlJZCwgY2xpZW50SWQpO1xuICB9XG4gIHB1YmxpYyBzZXRDb21wbGV0ZWQoKSB7XG4gICAgc3VwZXIuc2V0Q29tcGxldGVkKCk7XG4gICAgdGhpcy51cGRhdGVLb0N1cnJlbnRQYWdlKCk7XG4gIH1cbiAgcHVibGljIHN0YXJ0KCkge1xuICAgIHN1cGVyLnN0YXJ0KCk7XG4gICAgdGhpcy51cGRhdGVLb0N1cnJlbnRQYWdlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1BhZ2UobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBQYWdlKG5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRIdG1sVGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4ga29UZW1wbGF0ZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CZWZvcmVDcmVhdGluZygpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5kdW1teU9ic2VydmFibGUgPSBrby5vYnNlcnZhYmxlKDApO1xuICAgIHRoaXMua29DdXJyZW50UGFnZSA9IGtvLm9ic2VydmFibGUodGhpcy5jdXJyZW50UGFnZSk7XG4gICAgdGhpcy5rb0lzRmlyc3RQYWdlID0ga28uY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgdGhpcy5kdW1teU9ic2VydmFibGUoKTtcbiAgICAgIHJldHVybiB0aGlzLmlzRmlyc3RQYWdlO1xuICAgIH0pO1xuICAgIHRoaXMua29Jc0xhc3RQYWdlID0ga28uY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgdGhpcy5kdW1teU9ic2VydmFibGUoKTtcbiAgICAgIHJldHVybiB0aGlzLmlzTGFzdFBhZ2U7XG4gICAgfSk7XG4gICAgdGhpcy5rb1Byb2dyZXNzVGV4dCA9IGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHRoaXMuZHVtbXlPYnNlcnZhYmxlKCk7XG4gICAgICByZXR1cm4gdGhpcy5wcm9ncmVzc1RleHQ7XG4gICAgfSk7XG4gICAgdGhpcy5rb1Byb2dyZXNzID0ga28uY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgdGhpcy5kdW1teU9ic2VydmFibGUoKTtcbiAgICAgIHJldHVybiB0aGlzLmdldFByb2dyZXNzKCk7XG4gICAgfSk7XG4gICAgdGhpcy5rb1N0YXRlID0ga28ub2JzZXJ2YWJsZSh0aGlzLnN0YXRlKTtcbiAgICB0aGlzLmtvQ29tcGxldGVkU3RhdGUgPSBrby5vYnNlcnZhYmxlKFwiXCIpO1xuICAgIHRoaXMua29Db21wbGV0ZWRTdGF0ZVRleHQgPSBrby5vYnNlcnZhYmxlKFwiXCIpO1xuICAgIHRoaXMua29Db21wbGV0ZWRTdGF0ZUNzcyA9IGtvLm9ic2VydmFibGUoXCJcIik7XG4gICAgdGhpcy5rb1RpbWVySW5mb1RleHQgPSBrby5vYnNlcnZhYmxlKHRoaXMudGltZXJJbmZvVGV4dCk7XG4gICAgdGhpcy5rb0FmdGVyUmVuZGVyUGFnZSA9IGZ1bmN0aW9uKGVsZW1lbnRzOiBhbnksIGNvbjogYW55KSB7XG4gICAgICB2YXIgZWwgPSBTdXJ2ZXlFbGVtZW50LkdldEZpcnN0Tm9uVGV4dEVsZW1lbnQoZWxlbWVudHMpO1xuICAgICAgaWYgKGVsKSBzZWxmLmFmdGVyUmVuZGVyUGFnZShlbCk7XG4gICAgfTtcbiAgfVxuICBwcm90ZWN0ZWQgY3VycmVudFBhZ2VDaGFuZ2VkKG5ld1ZhbHVlOiBQYWdlTW9kZWwsIG9sZFZhbHVlOiBQYWdlTW9kZWwpIHtcbiAgICB0aGlzLnVwZGF0ZUtvQ3VycmVudFBhZ2UoKTtcbiAgICBzdXBlci5jdXJyZW50UGFnZUNoYW5nZWQobmV3VmFsdWUsIG9sZFZhbHVlKTtcbiAgICBpZiAoIXRoaXMuaXNEZXNpZ25Nb2RlKSB0aGlzLnNjcm9sbFRvVG9wT25QYWdlQ2hhbmdlKCk7XG4gIH1cbiAgcGFnZVZpc2liaWxpdHlDaGFuZ2VkKHBhZ2U6IElQYWdlLCBuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgIHN1cGVyLnBhZ2VWaXNpYmlsaXR5Q2hhbmdlZChwYWdlLCBuZXdWYWx1ZSk7XG4gICAgdGhpcy51cGRhdGVLb0N1cnJlbnRQYWdlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTG9hZFN1cnZleUZyb21TZXJ2aWNlKCkge1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTG9hZGluZ1N1cnZleUZyb21TZXJ2aWNlKCkge1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldENvbXBsZXRlZFN0YXRlKHZhbHVlOiBzdHJpbmcsIHRleHQ6IHN0cmluZykge1xuICAgIHN1cGVyLnNldENvbXBsZXRlZFN0YXRlKHZhbHVlLCB0ZXh0KTtcbiAgICB0aGlzLmtvQ29tcGxldGVkU3RhdGUodGhpcy5jb21wbGV0ZWRTdGF0ZSk7XG4gICAgdGhpcy5rb0NvbXBsZXRlZFN0YXRlVGV4dCh0aGlzLmNvbXBsZXRlZFN0YXRlVGV4dCk7XG4gICAgdGhpcy5rb0NvbXBsZXRlZFN0YXRlQ3NzKFxuICAgICAgdGhpcy5jb21wbGV0ZWRTdGF0ZSAhPT0gXCJcIiA/IHRoaXMuY3NzLnNhdmVEYXRhW3RoaXMuY29tcGxldGVkU3RhdGVdIDogXCJcIlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGRvVGltZXIoKSB7XG4gICAgc3VwZXIuZG9UaW1lcigpO1xuICAgIHRoaXMua29UaW1lckluZm9UZXh0KHRoaXMudGltZXJJbmZvVGV4dCk7XG4gIH1cbiAgcHJpdmF0ZSBhcHBseUJpbmRpbmcoKSB7XG4gICAgaWYgKCF0aGlzLnJlbmRlcmVkRWxlbWVudCkgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlS29DdXJyZW50UGFnZSgpO1xuICAgIGtvLmNsZWFuTm9kZSh0aGlzLnJlbmRlcmVkRWxlbWVudCk7XG4gICAgaWYgKCF0aGlzLmlzRmlyc3RSZW5kZXIpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFBhZ2VRdWVzdGlvbnMoKTtcbiAgICB9XG4gICAgdGhpcy5pc0ZpcnN0UmVuZGVyID0gZmFsc2U7XG4gICAga28ucmVuZGVyVGVtcGxhdGUoXG4gICAgICBcInN1cnZleS1jb250ZW50XCIsXG4gICAgICB0aGlzLFxuICAgICAgeyBhZnRlclJlbmRlcjogdGhpcy5rb0V2ZW50QWZ0ZXJSZW5kZXIgfSxcbiAgICAgIHRoaXMucmVuZGVyZWRFbGVtZW50XG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZUtvQ3VycmVudFBhZ2UoKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLmR1bW15T2JzZXJ2YWJsZSh0aGlzLmR1bW15T2JzZXJ2YWJsZSgpICsgMSk7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgIT09IHRoaXMua29DdXJyZW50UGFnZSgpKSB7XG4gICAgICB0aGlzLmtvQ3VycmVudFBhZ2UodGhpcy5jdXJyZW50UGFnZSk7XG4gICAgfVxuICAgIHRoaXMua29TdGF0ZSh0aGlzLnN0YXRlKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZUN1cnJlbnRQYWdlUXVlc3Rpb25zKCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmN1cnJlbnRQYWdlID8gdGhpcy5jdXJyZW50UGFnZS5xdWVzdGlvbnMgOiBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICBpZiAocS52aXNpYmxlKSBxW1widXBkYXRlUXVlc3Rpb25cIl0oKTtcbiAgICB9XG4gIH1cbn1cblxuTG9jYWxpemFibGVTdHJpbmcucHJvdG90eXBlW1wib25DcmVhdGluZ1wiXSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMua29SZVJlbmRlciA9IGtvLm9ic2VydmFibGUoMCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmLCBcImtvSGFzSHRtbFwiLCB7XG4gICAgZ2V0OiAoKSA9PiB7XG4gICAgICBzZWxmLmtvUmVSZW5kZXIoKTtcbiAgICAgIHJldHVybiBzZWxmLmhhc0h0bWw7XG4gICAgfVxuICB9KTtcbiAgdGhpcy5rb1JlbmRlcmVkSHRtbCA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICBzZWxmLmtvUmVSZW5kZXIoKTtcbiAgICByZXR1cm4gc2VsZi5yZW5kZXJlZEh0bWw7XG4gIH0pO1xufTtcblxuSXRlbVZhbHVlLnByb3RvdHlwZVtcIm9uQ3JlYXRpbmdcIl0gPSBmdW5jdGlvbigpIHtcbiAgbmV3IEltcGxlbWVudG9yQmFzZSh0aGlzKTtcbn07XG5cbkxvY2FsaXphYmxlU3RyaW5nLnByb3RvdHlwZVtcIm9uQ2hhbmdlZFwiXSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmtvUmVSZW5kZXIodGhpcy5rb1JlUmVuZGVyKCkgKyAxKTtcbn07XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdXJ2ZXlcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IGZ1bmN0aW9uKHBhcmFtcywgY29tcG9uZW50SW5mbykge1xuICAgICAgdmFyIHN1cnZleTogU3VydmV5ID0ga28udW53cmFwKHBhcmFtcy5zdXJ2ZXkpO1xuICAgICAgc3VydmV5LnJlbmRlcigpO1xuICAgICAgcmV0dXJuIHBhcmFtcy5zdXJ2ZXk7XG4gICAgfVxuICB9LFxuICB0ZW1wbGF0ZToga29UZW1wbGF0ZVxufSk7XG5cbmtvLmJpbmRpbmdIYW5kbGVyc1tcInN1cnZleVByb3BcIl0gPSB7XG4gIHVwZGF0ZTogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3NBY2Nlc3Nvcikge1xuICAgIHZhciB2YWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKSB8fCB7fTtcbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wTmFtZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHZhciBwcm9wVmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlW3Byb3BOYW1lXSk7XG4gICAgICAgIGVsZW1lbnRbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblN1cnZleU1vZGVsLnBsYXRmb3JtID0gXCJrbm9ja291dFwiO1xuXG5leHBvcnQgdmFyIHJlZ2lzdGVyVGVtcGxhdGVFbmdpbmUgPSAoa286IGFueSwgcGxhdGZvcm06IHN0cmluZykgPT4ge1xuICAoPGFueT5rbykuc3VydmV5VGVtcGxhdGVFbmdpbmUgPSBmdW5jdGlvbigpIHt9O1xuXG4gICg8YW55PmtvKS5zdXJ2ZXlUZW1wbGF0ZUVuZ2luZS5wcm90b3R5cGUgPSBuZXcga28ubmF0aXZlVGVtcGxhdGVFbmdpbmUoKTtcblxuICAoPGFueT5rbykuc3VydmV5VGVtcGxhdGVFbmdpbmUucHJvdG90eXBlLm1ha2VUZW1wbGF0ZVNvdXJjZSA9IGZ1bmN0aW9uKFxuICAgIHRlbXBsYXRlOiBhbnksXG4gICAgdGVtcGxhdGVEb2N1bWVudDogYW55XG4gICkge1xuICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRlbXBsYXRlRG9jdW1lbnQgPSB0ZW1wbGF0ZURvY3VtZW50IHx8IGRvY3VtZW50O1xuICAgICAgdmFyIHRlbXBsYXRlRWxlbWVudFJvb3QgPSB0ZW1wbGF0ZURvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICAgICBcInN1cnZleS1jb250ZW50LVwiICsgcGxhdGZvcm1cbiAgICAgICk7XG4gICAgICBpZiAoIXRlbXBsYXRlRWxlbWVudFJvb3QpIHtcbiAgICAgICAgdGVtcGxhdGVFbGVtZW50Um9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRlbXBsYXRlRWxlbWVudFJvb3QuaWQgPSBcInN1cnZleS1jb250ZW50LVwiICsgU3VydmV5TW9kZWwucGxhdGZvcm07XG4gICAgICAgIHRlbXBsYXRlRWxlbWVudFJvb3Quc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICB0ZW1wbGF0ZUVsZW1lbnRSb290LmlubmVySFRNTCA9IGtvVGVtcGxhdGU7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcGxhdGVFbGVtZW50Um9vdCk7XG4gICAgICB9XG4gICAgICB2YXIgZWxlbTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVtcGxhdGVFbGVtZW50Um9vdC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGVtcGxhdGVFbGVtZW50Um9vdC5jaGlsZHJlbltpXS5pZCA9PT0gdGVtcGxhdGUpIHtcbiAgICAgICAgICBlbGVtID0gdGVtcGxhdGVFbGVtZW50Um9vdC5jaGlsZHJlbltpXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFlbGVtKSB7XG4gICAgICAgIGVsZW0gPSB0ZW1wbGF0ZURvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRlbXBsYXRlKTtcbiAgICAgIH1cbiAgICAgIGlmICghZWxlbSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCB0ZW1wbGF0ZSB3aXRoIElEIFwiICsgdGVtcGxhdGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBrby50ZW1wbGF0ZVNvdXJjZXMuZG9tRWxlbWVudChlbGVtKTtcbiAgICB9IGVsc2UgaWYgKHRlbXBsYXRlLm5vZGVUeXBlID09PSAxIHx8IHRlbXBsYXRlLm5vZGVUeXBlID09PSA4KSB7XG4gICAgICByZXR1cm4gbmV3IGtvLnRlbXBsYXRlU291cmNlcy5hbm9ueW1vdXNUZW1wbGF0ZSh0ZW1wbGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdGVtcGxhdGUgdHlwZTogXCIgKyB0ZW1wbGF0ZSk7XG4gICAgfVxuICB9O1xuXG4gIC8vICg8YW55PmtvKS5zdXJ2ZXlUZW1wbGF0ZUVuZ2luZS5wcm90b3R5cGUucmVuZGVyVGVtcGxhdGVTb3VyY2UgPSBmdW5jdGlvbiAodGVtcGxhdGVTb3VyY2U6IGFueSwgYmluZGluZ0NvbnRleHQ6IGFueSwgb3B0aW9uczogYW55LCB0ZW1wbGF0ZURvY3VtZW50OiBhbnkpIHtcbiAgLy8gICB2YXIgdXNlTm9kZXNJZkF2YWlsYWJsZSA9ICEoKDxhbnk+a28udXRpbHMpLmllVmVyc2lvbiA8IDkpLFxuICAvLyAgICAgdGVtcGxhdGVOb2Rlc0Z1bmMgPSB1c2VOb2Rlc0lmQXZhaWxhYmxlID8gdGVtcGxhdGVTb3VyY2VbXCJub2Rlc1wiXSA6IG51bGwsXG4gIC8vICAgICB0ZW1wbGF0ZU5vZGVzID0gdGVtcGxhdGVOb2Rlc0Z1bmMgPyB0ZW1wbGF0ZVNvdXJjZVtcIm5vZGVzXCJdKCkgOiBudWxsO1xuICAvLyAgIGlmICh0ZW1wbGF0ZU5vZGVzKSB7XG4gIC8vICAgICByZXR1cm4gKDxhbnk+a28udXRpbHMpLm1ha2VBcnJheSh0ZW1wbGF0ZU5vZGVzLmNsb25lTm9kZSh0cnVlKS5jaGlsZE5vZGVzKTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgdmFyIHRlbXBsYXRlVGV4dCA9IHRlbXBsYXRlU291cmNlW1widGV4dFwiXSgpO1xuICAvLyAgICAgcmV0dXJuICg8YW55PmtvLnV0aWxzKS5wYXJzZUh0bWxGcmFnbWVudCh0ZW1wbGF0ZVRleHQsIHRlbXBsYXRlRG9jdW1lbnQpO1xuICAvLyAgIH1cbiAgLy8gfTtcblxuICB2YXIgc3VydmV5VGVtcGxhdGVFbmdpbmVJbnN0YW5jZSA9IG5ldyAoPGFueT5rbykuc3VydmV5VGVtcGxhdGVFbmdpbmUoKTtcbiAga28uc2V0VGVtcGxhdGVFbmdpbmUoc3VydmV5VGVtcGxhdGVFbmdpbmVJbnN0YW5jZSk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvc3VydmV5LnRzIiwiaW1wb3J0IHsgSGVscGVycywgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZhbHVlQ29yZSB7XG4gIGhhc1ZhbHVlOiBib29sZWFuO1xuICB2YWx1ZTogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgUHJvY2Vzc1ZhbHVlIHtcbiAgcHVibGljIHZhbHVlczogSGFzaFRhYmxlPGFueT4gPSBudWxsO1xuICBwdWJsaWMgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4gPSBudWxsO1xuICBjb25zdHJ1Y3RvcigpIHt9XG4gIHB1YmxpYyBnZXRGaXJzdE5hbWUodGV4dDogc3RyaW5nLCBvYmo6IGFueSA9IG51bGwpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCkgcmV0dXJuIHRleHQ7XG4gICAgdmFyIHJlcyA9IFwiXCI7XG4gICAgaWYgKCEhb2JqKSB7XG4gICAgICByZXMgPSB0aGlzLmdldEZpcnN0UHJvcGVydHlOYW1lKHRleHQsIG9iaik7XG4gICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoID0gdGV4dFtpXTtcbiAgICAgIGlmIChjaCA9PSBcIi5cIiB8fCBjaCA9PSBcIltcIikgYnJlYWs7XG4gICAgICByZXMgKz0gY2g7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGhhc1ZhbHVlKHRleHQ6IHN0cmluZywgdmFsdWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoIXZhbHVlcykgdmFsdWVzID0gdGhpcy52YWx1ZXM7XG4gICAgdmFyIHJlcyA9IHRoaXMuZ2V0VmFsdWVDb3JlKHRleHQsIHZhbHVlcyk7XG4gICAgcmV0dXJuIHJlcy5oYXNWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0VmFsdWUob2JqOiBhbnksIHRleHQ6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICghdGV4dCkgcmV0dXJuO1xuICAgIHZhciBub25OZXN0ZWRPYmogPSB0aGlzLmdldE5vbk5lc3RlZE9iamVjdChvYmosIHRleHQpO1xuICAgIGlmICghbm9uTmVzdGVkT2JqKSByZXR1cm47XG4gICAgb2JqID0gbm9uTmVzdGVkT2JqLnZhbHVlO1xuICAgIHRleHQgPSBub25OZXN0ZWRPYmoudGV4dDtcbiAgICBpZiAoISFvYmogJiYgISF0ZXh0KSB7XG4gICAgICBvYmpbdGV4dF0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFZhbHVlKHRleHQ6IHN0cmluZywgdmFsdWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGwpOiBhbnkge1xuICAgIGlmICghdmFsdWVzKSB2YWx1ZXMgPSB0aGlzLnZhbHVlcztcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRWYWx1ZUNvcmUodGV4dCwgdmFsdWVzKTtcbiAgICByZXR1cm4gcmVzLnZhbHVlO1xuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWVDb3JlKHRleHQ6IHN0cmluZywgdmFsdWVzOiBhbnkpOiBhbnkge1xuICAgIHZhciByZXM6IFZhbHVlQ29yZSA9IHsgaGFzVmFsdWU6IGZhbHNlLCB2YWx1ZTogbnVsbCB9O1xuICAgIHZhciBjdXJWYWx1ZSA9IHZhbHVlcztcbiAgICBpZiAoIWN1clZhbHVlKSByZXR1cm4gcmVzO1xuICAgIGlmIChcbiAgICAgIHRleHQgJiZcbiAgICAgIHRleHQubGFzdEluZGV4T2YoXCIubGVuZ3RoXCIpID4gLTEgJiZcbiAgICAgIHRleHQubGFzdEluZGV4T2YoXCIubGVuZ3RoXCIpID09PSB0ZXh0Lmxlbmd0aCAtIFwiLmxlbmd0aFwiLmxlbmd0aFxuICAgICkge1xuICAgICAgcmVzLnZhbHVlID0gMDtcbiAgICAgIHJlcy5oYXNWYWx1ZSA9IHRydWU7XG4gICAgfVxuICAgIHZhciBub25OZXN0ZWRPYmogPSB0aGlzLmdldE5vbk5lc3RlZE9iamVjdChjdXJWYWx1ZSwgdGV4dCk7XG4gICAgaWYgKCFub25OZXN0ZWRPYmopIHJldHVybiByZXM7XG4gICAgcmVzLnZhbHVlID0gISFub25OZXN0ZWRPYmoudGV4dFxuICAgICAgPyB0aGlzLmdldE9iamVjdFZhbHVlKG5vbk5lc3RlZE9iai52YWx1ZSwgbm9uTmVzdGVkT2JqLnRleHQpXG4gICAgICA6IG5vbk5lc3RlZE9iai52YWx1ZTtcbiAgICByZXMuaGFzVmFsdWUgPSAhSGVscGVycy5pc1ZhbHVlRW1wdHkocmVzLnZhbHVlKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgZ2V0Tm9uTmVzdGVkT2JqZWN0KG9iajogYW55LCB0ZXh0OiBzdHJpbmcpOiBhbnkge1xuICAgIHZhciBjdXJOYW1lID0gdGhpcy5nZXRGaXJzdFByb3BlcnR5TmFtZSh0ZXh0LCBvYmopO1xuICAgIHdoaWxlICh0ZXh0ICE9IGN1ck5hbWUgJiYgISFvYmopIHtcbiAgICAgIHZhciBpc0FycmF5ID0gdGV4dFswXSA9PSBcIltcIjtcbiAgICAgIGlmICghaXNBcnJheSkge1xuICAgICAgICBpZiAoIWN1ck5hbWUgJiYgdGV4dCA9PSB0aGlzLmdldEZpcnN0TmFtZSh0ZXh0KSlcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogb2JqLCB0ZXh0OiB0ZXh0IH07XG4gICAgICAgIG9iaiA9IHRoaXMuZ2V0T2JqZWN0VmFsdWUob2JqLCBjdXJOYW1lKTtcbiAgICAgICAgaWYgKCFvYmopIHJldHVybiBudWxsO1xuICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHIoY3VyTmFtZS5sZW5ndGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9iakluQXJyYXkgPSB0aGlzLmdldE9iakluQXJyYXkob2JqLCB0ZXh0KTtcbiAgICAgICAgaWYgKCFvYmpJbkFycmF5KSByZXR1cm4gbnVsbDtcbiAgICAgICAgb2JqID0gb2JqSW5BcnJheS52YWx1ZTtcbiAgICAgICAgdGV4dCA9IG9iakluQXJyYXkudGV4dDtcbiAgICAgIH1cbiAgICAgIGlmICghIXRleHQgJiYgdGV4dFswXSA9PSBcIi5cIikge1xuICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHIoMSk7XG4gICAgICB9XG4gICAgICBjdXJOYW1lID0gdGhpcy5nZXRGaXJzdFByb3BlcnR5TmFtZSh0ZXh0LCBvYmopO1xuICAgIH1cbiAgICByZXR1cm4geyB2YWx1ZTogb2JqLCB0ZXh0OiB0ZXh0IH07XG4gIH1cbiAgcHJpdmF0ZSBnZXRPYmpJbkFycmF5KGN1clZhbHVlOiBhbnksIHRleHQ6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGN1clZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGluZGV4ID0gMTtcbiAgICB2YXIgc3RyID0gXCJcIjtcbiAgICB3aGlsZSAoaW5kZXggPCB0ZXh0Lmxlbmd0aCAmJiB0ZXh0W2luZGV4XSAhPSBcIl1cIikge1xuICAgICAgc3RyICs9IHRleHRbaW5kZXhdO1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gICAgdGV4dCA9IGluZGV4IDwgdGV4dC5sZW5ndGggPyB0ZXh0LnN1YnN0cihpbmRleCArIDEpIDogXCJcIjtcbiAgICBpbmRleCA9IHRoaXMuZ2V0SW50VmFsdWUoc3RyKTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGN1clZhbHVlLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHsgdmFsdWU6IGN1clZhbHVlW2luZGV4XSwgdGV4dDogdGV4dCB9O1xuICB9XG4gIHByaXZhdGUgZ2V0Rmlyc3RQcm9wZXJ0eU5hbWUobmFtZTogc3RyaW5nLCBvYmo6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gbmFtZTtcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KG5hbWUpKSByZXR1cm4gbmFtZTtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBBID0gbmFtZVswXTtcbiAgICB2YXIgYSA9IEEudG9VcHBlckNhc2UoKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICB2YXIgZmlyc3QgPSBrZXlbMF07XG4gICAgICBpZiAoZmlyc3QgPT09IGEgfHwgZmlyc3QgPT09IEEpIHtcbiAgICAgICAgdmFyIGtleU5hbWUgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGtleU5hbWUgPT0gbmFtZSkgcmV0dXJuIGtleTtcbiAgICAgICAgaWYgKG5hbWUubGVuZ3RoIDw9IGtleU5hbWUubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgICAgdmFyIGNoID0gbmFtZVtrZXlOYW1lLmxlbmd0aF07XG4gICAgICAgIGlmIChjaCAhPSBcIi5cIiAmJiBjaCAhPSBcIltcIikgY29udGludWU7XG4gICAgICAgIGlmIChrZXlOYW1lID09IG5hbWUuc3Vic3RyKDAsIGtleU5hbWUubGVuZ3RoKSkgcmV0dXJuIGtleTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcHJpdmF0ZSBnZXRPYmplY3RWYWx1ZShvYmo6IGFueSwgbmFtZTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIW5hbWUpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBvYmpbbmFtZV07XG4gIH1cbiAgcHJpdmF0ZSBnZXRJbnRWYWx1ZShzdHI6IGFueSkge1xuICAgIGlmIChzdHIgPT0gXCIwXCIgfHwgKChzdHIgfCAwKSA+IDAgJiYgc3RyICUgMSA9PSAwKSkgcmV0dXJuIE51bWJlcihzdHIpO1xuICAgIHJldHVybiAtMTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbmRpdGlvblByb2Nlc3NWYWx1ZS50cyIsImltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvY2FsaXphYmxlT3duZXIge1xuICBnZXRMb2NhbGUoKTogc3RyaW5nO1xuICBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nKTogc3RyaW5nO1xuICBnZXRQcm9jZXNzZWRUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGNsYXNzIHJlcHJlc2VudHMgdGhlIHN0cmluZyB0aGF0IHN1cHBvcnRzIG11bHRpLWxhbmd1YWdlcyBhbmQgbWFya2Rvd24uXG4gKiBJdCB1c2VzIGluIGFsbCBvYmplY3RzIHdoZXJlIHN1cHBvcnQgZm9yIG11bHRpLWxhbmd1YWdlcyBhbmQgbWFya2Rvd24gaXMgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2NhbGl6YWJsZVN0cmluZyB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGRlZmF1bHRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWU7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXQgZGVmYXVsdExvY2FsZSh2YWw6IHN0cmluZykge1xuICAgIHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lID0gdmFsO1xuICB9XG4gIHByaXZhdGUgdmFsdWVzID0ge307XG4gIHByaXZhdGUgaHRtbFZhbHVlcyA9IHt9O1xuICBwcml2YXRlIHJlbmRlcmVkVGV4dDogc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWxjdWxhdGVkVGV4dDogc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIG9uUmVuZGVyZWRIdG1sQ2FsbGJhY2s6IChodG1sOiBzdHJpbmcpID0+IHN0cmluZztcbiAgcHVibGljIG9uR2V0VGV4dENhbGxiYWNrOiAoc3RyOiBzdHJpbmcpID0+IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBvblN0ckNoYW5nZWQ6ICgpID0+IHZvaWQ7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBvd25lcjogSUxvY2FsaXphYmxlT3duZXIsXG4gICAgcHVibGljIHVzZU1hcmtkb3duOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdGhpcy5vbkNyZWF0aW5nKCk7XG4gIH1cbiAgcHVibGljIGdldCBsb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXIgPyB0aGlzLm93bmVyLmdldExvY2FsZSgpIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgc3RyQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5yZW5kZXJlZFRleHQgPT09IG51bGwpIHJldHVybjtcbiAgICB0aGlzLmNhbGN1bGF0ZWRUZXh0ID0gdGhpcy5jYWxUZXh0KCk7XG4gICAgaWYgKHRoaXMucmVuZGVyZWRUZXh0ICE9PSB0aGlzLmNhbGN1bGF0ZWRUZXh0KSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICB0aGlzLnJlbmRlcmVkVGV4dCA9XG4gICAgICB0aGlzLmNhbGN1bGF0ZWRUZXh0ICE9PSBudWxsID8gdGhpcy5jYWxjdWxhdGVkVGV4dCA6IHRoaXMuY2FsVGV4dCgpO1xuICAgIHRoaXMuY2FsY3VsYXRlZFRleHQgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVkVGV4dDtcbiAgfVxuICBwcml2YXRlIGNhbFRleHQoKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzID0gdGhpcy5wdXJlVGV4dDtcbiAgICBpZiAoXG4gICAgICByZXMgJiZcbiAgICAgIHRoaXMub3duZXIgJiZcbiAgICAgIHRoaXMub3duZXIuZ2V0UHJvY2Vzc2VkVGV4dCAmJlxuICAgICAgcmVzLmluZGV4T2YoXCJ7XCIpID4gLTFcbiAgICApIHtcbiAgICAgIHJlcyA9IHRoaXMub3duZXIuZ2V0UHJvY2Vzc2VkVGV4dChyZXMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vbkdldFRleHRDYWxsYmFjaykgcmVzID0gdGhpcy5vbkdldFRleHRDYWxsYmFjayhyZXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldCBwdXJlVGV4dCgpIHtcbiAgICB2YXIgbG9jID0gdGhpcy5sb2NhbGU7XG4gICAgaWYgKCFsb2MpIGxvYyA9IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lO1xuICAgIHZhciByZXMgPSAoPGFueT50aGlzKS52YWx1ZXNbbG9jXTtcbiAgICBpZiAoIXJlcyAmJiBsb2MgPT0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUpIHtcbiAgICAgIHJlcyA9ICg8YW55PnRoaXMpLnZhbHVlc1tzdXJ2ZXlMb2NhbGl6YXRpb24uZGVmYXVsdExvY2FsZV07XG4gICAgfVxuICAgIGlmICghcmVzICYmIGxvYyAhPT0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUpIHtcbiAgICAgIHJlcyA9ICg8YW55PnRoaXMpLnZhbHVlc1tzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZV07XG4gICAgfVxuICAgIGlmICghcmVzKSByZXMgPSBcIlwiO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldCBoYXNIdG1sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0h0bWxWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaHRtbCgpIHtcbiAgICBpZiAoIXRoaXMuaGFzSHRtbCkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SHRtbFZhbHVlKCk7XG4gIH1cbiAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcykubGVuZ3RoID09IDA7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0T3JIdG1sKCkge1xuICAgIHJldHVybiB0aGlzLmhhc0h0bWwgPyB0aGlzLmdldEh0bWxWYWx1ZSgpIDogdGhpcy50ZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgcmVuZGVyZWRIdG1sKCkge1xuICAgIHZhciByZXMgPSB0aGlzLnRleHRPckh0bWw7XG4gICAgcmV0dXJuIHRoaXMub25SZW5kZXJlZEh0bWxDYWxsYmFjayA/IHRoaXMub25SZW5kZXJlZEh0bWxDYWxsYmFjayhyZXMpIDogcmVzO1xuICB9XG4gIHB1YmxpYyBzZXQgdGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGVUZXh0KHRoaXMubG9jYWxlLCB2YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldExvY2FsZVRleHQobG9jOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbG9jKSBsb2MgPSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgICB2YXIgcmVzID0gKDxhbnk+dGhpcykudmFsdWVzW2xvY107XG4gICAgcmV0dXJuIHJlcyA/IHJlcyA6IFwiXCI7XG4gIH1cbiAgcHVibGljIHNldExvY2FsZVRleHQobG9jOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gdGhpcy5nZXRMb2NhbGVUZXh0KGxvYykpIHJldHVybjtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAmJlxuICAgICAgbG9jICYmXG4gICAgICBsb2MgIT0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUgJiZcbiAgICAgICEoPGFueT50aGlzKS52YWx1ZXNbbG9jXSAmJlxuICAgICAgdmFsdWUgPT0gdGhpcy5nZXRMb2NhbGVUZXh0KHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBpZiAoIWxvYykgbG9jID0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWU7XG4gICAgZGVsZXRlICg8YW55PnRoaXMpLmh0bWxWYWx1ZXNbbG9jXTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBpZiAoKDxhbnk+dGhpcykudmFsdWVzW2xvY10pIGRlbGV0ZSAoPGFueT50aGlzKS52YWx1ZXNbbG9jXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbG9jICE9IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lICYmXG4gICAgICAgICAgdmFsdWUgPT0gdGhpcy5nZXRMb2NhbGVUZXh0KHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnNldExvY2FsZVRleHQobG9jLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAoPGFueT50aGlzKS52YWx1ZXNbbG9jXSA9IHZhbHVlO1xuICAgICAgICAgIGlmIChsb2MgPT0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlVmFsdWVzRXF1YWxzVG9EZWZhdWx0KHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdHJDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIGhhc05vbkRlZmF1bHRUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy52YWx1ZXMpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGtleXMubGVuZ3RoID4gMSB8fCBrZXlzWzBdICE9IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lO1xuICB9XG4gIHB1YmxpYyBnZXRKc29uKCk6IGFueSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcyk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PSAxICYmIGtleXNbMF0gPT0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUpXG4gICAgICByZXR1cm4gKDxhbnk+dGhpcykudmFsdWVzW2tleXNbMF1dO1xuICAgIHJldHVybiB0aGlzLnZhbHVlcztcbiAgfVxuICBwdWJsaWMgc2V0SnNvbih2YWx1ZTogYW55KSB7XG4gICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICB0aGlzLmh0bWxWYWx1ZXMgPSB7fTtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhpcy5zZXRMb2NhbGVUZXh0KG51bGwsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0TG9jYWxlVGV4dChrZXksIHZhbHVlW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0ckNoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgZXF1YWxzKG9iajogYW55KSB7XG4gICAgaWYgKCFvYmogfHwgIW9iai52YWx1ZXMpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHRoaXMudmFsdWVzLCBvYmoudmFsdWVzKTtcbiAgfVxuICBwdWJsaWMgb25DaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLm9uU3RyQ2hhbmdlZCkgdGhpcy5vblN0ckNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DcmVhdGluZygpIHt9XG4gIHByaXZhdGUgaGFzSHRtbFZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5vd25lciB8fCAhdGhpcy51c2VNYXJrZG93bikgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB0ZXh0ID0gdGhpcy50ZXh0O1xuICAgIGlmICghdGV4dCkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBsb2MgPSB0aGlzLmxvY2FsZTtcbiAgICBpZiAoIWxvYykgbG9jID0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWU7XG4gICAgKDxhbnk+dGhpcykuaHRtbFZhbHVlc1tsb2NdID0gdGhpcy5vd25lci5nZXRNYXJrZG93bkh0bWwodGV4dCk7XG4gICAgcmV0dXJuICg8YW55PnRoaXMpLmh0bWxWYWx1ZXNbbG9jXSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGdldEh0bWxWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHZhciBsb2MgPSB0aGlzLmxvY2FsZTtcbiAgICBpZiAoIWxvYykgbG9jID0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWU7XG4gICAgcmV0dXJuICg8YW55PnRoaXMpLmh0bWxWYWx1ZXNbbG9jXTtcbiAgfVxuXG4gIHByaXZhdGUgZGVsZXRlVmFsdWVzRXF1YWxzVG9EZWZhdWx0KGRlZmF1bHRWYWx1ZTogc3RyaW5nKSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoa2V5c1tpXSA9PSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZSkgY29udGludWU7XG4gICAgICBpZiAoKDxhbnk+dGhpcykudmFsdWVzW2tleXNbaV1dID09IGRlZmF1bHRWYWx1ZSlcbiAgICAgICAgZGVsZXRlICg8YW55PnRoaXMpLnZhbHVlc1trZXlzW2ldXTtcbiAgICB9XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YWJsZXN0cmluZy50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi9iYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBJbXBsZW1lbnRvckJhc2Uge1xuICBwcml2YXRlIHN0YXRpYyBkb0l0ZXJhdGVQcm9wZXJ0aWVzKGhhc2g6IGFueSwga2V5OiBhbnkpOiBhbnkge1xuICAgIHZhciB2YWwgPSBoYXNoW2tleV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgaGFzaFtrZXldID0ga28ub2JzZXJ2YWJsZUFycmF5KHZhbCk7XG4gICAgICAoPGFueT52YWwpW1wib25BcnJheUNoYW5nZWRcIl0gPSAoKSA9PiBoYXNoW2tleV0ubm90aWZ5U3Vic2NyaWJlcnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGFzaFtrZXldID0ga28ub2JzZXJ2YWJsZSh2YWwpO1xuICAgIH1cbiAgfVxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogQmFzZSkge1xuICAgIGVsZW1lbnQuaXRlcmF0ZVByb3BlcnRpZXNIYXNoKChoYXNoLCBrZXkpID0+IHtcbiAgICAgIEltcGxlbWVudG9yQmFzZS5kb0l0ZXJhdGVQcm9wZXJ0aWVzKGhhc2gsIGtleSk7XG4gICAgfSk7XG4gICAgZWxlbWVudC5nZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXIgPSAoaGFzaCwga2V5KSA9PiB7XG4gICAgICBpZiAoaGFzaFtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGFzaFtrZXldID0ga28ub2JzZXJ2YWJsZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtvLnVud3JhcChoYXNoW2tleV0pO1xuICAgIH07XG4gICAgZWxlbWVudC5zZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXIgPSAoaGFzaCwga2V5LCB2YWwpID0+XG4gICAgICBoYXNoW2tleV0gIT09IHVuZGVmaW5lZFxuICAgICAgICA/IGhhc2hba2V5XSh2YWwpXG4gICAgICAgIDogKGhhc2hba2V5XSA9IGtvLm9ic2VydmFibGUodmFsKSk7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb2Jhc2UudHMiLCJpbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgQmFzZSxcbiAgSVN1cnZleUltcGwsXG4gIElQYWdlLFxuICBJUGFuZWwsXG4gIElDb25kaXRpb25SdW5uZXIsXG4gIElTdXJ2ZXksXG4gIElTdXJ2ZXlEYXRhLFxuICBJRWxlbWVudCxcbiAgSVN1cnZleUVsZW1lbnQsXG4gIElRdWVzdGlvbixcbiAgU3VydmV5RWxlbWVudCxcbiAgU3VydmV5RXJyb3IsXG4gIElTdXJ2ZXlFcnJvck93bmVyXG59IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IENvbmRpdGlvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IHN1cnZleUNzcyB9IGZyb20gXCIuL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmRcIjtcbmltcG9ydCB7IE9uZUFuc3dlclJlcXVpcmVkRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgUXVlc3Rpb25QYW5lbER5bmFtaWMgfSBmcm9tIFwiLi9rbm9ja291dC9rb3F1ZXN0aW9uX3BhbmVsZHluYW1pY1wiO1xuaW1wb3J0IHsgUGFnZU1vZGVsIH0gZnJvbSBcIi4vcGFnZVwiO1xuaW1wb3J0IHtzZXR0aW5nc30gZnJvbSBcIi4vc2V0dGluZ3NcIjtcblxuZXhwb3J0IGNsYXNzIERyYWdEcm9wSW5mbyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBzb3VyY2U6IElFbGVtZW50LFxuICAgIHB1YmxpYyB0YXJnZXQ6IElFbGVtZW50LFxuICAgIHB1YmxpYyBuZXN0ZWRQYW5lbERlcHRoOiBudW1iZXIgPSAtMVxuICApIHt9XG4gIHB1YmxpYyBkZXN0aW5hdGlvbjogSVN1cnZleUVsZW1lbnQ7XG4gIHB1YmxpYyBpc0JvdHRvbTogYm9vbGVhbjtcbiAgcHVibGljIGlzRWRnZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUm93TW9kZWwgZXh0ZW5kcyBCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHBhbmVsOiBQYW5lbE1vZGVsQmFzZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy52aXNpYmxlID0gcGFuZWwuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJlbGVtZW50c1wiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVsZW1lbnRzKCk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImVsZW1lbnRzXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZVwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZpc2libGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgdmlzaWJsZUVsZW1lbnRzKCk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHMuZmlsdGVyKGUgPT4gZS5pc1Zpc2libGUpO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVWaXNpYmxlKCkge1xuICAgIHRoaXMudmlzaWJsZSA9IHRoaXMuY2FsY1Zpc2libGUoKTtcbiAgICB0aGlzLnNldFdpZHRoKCk7XG4gIH1cbiAgcHVibGljIGFkZEVsZW1lbnQocTogSUVsZW1lbnQpIHtcbiAgICB0aGlzLmVsZW1lbnRzLnB1c2gocSk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlKCk7XG4gIH1cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhbmVsLnJvd3MuaW5kZXhPZih0aGlzKTtcbiAgfVxuICBwcml2YXRlIHNldFdpZHRoKCkge1xuICAgIHZhciB2aXNDb3VudCA9IHRoaXMudmlzaWJsZUVsZW1lbnRzLmxlbmd0aDtcbiAgICBpZiAodmlzQ291bnQgPT0gMCkgcmV0dXJuO1xuICAgIHZhciBjb3VudGVyID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmVsZW1lbnRzW2ldLmlzVmlzaWJsZSkge1xuICAgICAgICB2YXIgcSA9IHRoaXMuZWxlbWVudHNbaV07XG4gICAgICAgIHEucmVuZGVyV2lkdGggPSBxLndpZHRoID8gcS53aWR0aCA6ICgxMDAgLyB2aXNDb3VudCkudG9GaXhlZCg2KSArIFwiJVwiO1xuICAgICAgICBxLnJpZ2h0SW5kZW50ID0gY291bnRlciA8IHZpc0NvdW50IC0gMSA/IDEgOiAwO1xuICAgICAgICBjb3VudGVyKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVsZW1lbnRzW2ldLnJlbmRlcldpZHRoID0gXCJcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjYWxjVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlRWxlbWVudHMubGVuZ3RoID4gMDtcbiAgfVxufVxuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyBmb3IgYSBQYW5lbCBhbmQgUGFnZSBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgUGFuZWxNb2RlbEJhc2UgZXh0ZW5kcyBTdXJ2ZXlFbGVtZW50XG4gIGltcGxlbWVudHMgSVBhbmVsLCBJQ29uZGl0aW9uUnVubmVyLCBJTG9jYWxpemFibGVPd25lciwgSVN1cnZleUVycm9yT3duZXIge1xuICBwcml2YXRlIHN0YXRpYyBwYW5lbENvdW50ZXIgPSAxMDA7XG4gIHByaXZhdGUgc3RhdGljIGdldFBhbmVsSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzcF9cIiArIFBhbmVsTW9kZWxCYXNlLnBhbmVsQ291bnRlcisrO1xuICB9XG5cbiAgcHJpdmF0ZSBlbGVtZW50c1ZhbHVlOiBBcnJheTxJRWxlbWVudD47XG4gIHByaXZhdGUgaXNRdWVzdGlvbnNSZWFkeTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHF1ZXN0aW9uc1ZhbHVlOiBBcnJheTxRdWVzdGlvbj4gPSBuZXcgQXJyYXk8UXVlc3Rpb24+KCk7XG4gIGFkZEVsZW1lbnRDYWxsYmFjazogKGVsZW1lbnQ6IElFbGVtZW50KSA9PiB2b2lkO1xuICByZW1vdmVFbGVtZW50Q2FsbGJhY2s6IChlbGVtZW50OiBJRWxlbWVudCkgPT4gdm9pZDtcbiAgb25HZXRRdWVzdGlvblRpdGxlTG9jYXRpb246ICgpID0+IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJyb3dzXCIpO1xuICAgIHRoaXMuZWxlbWVudHNWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3QXJyYXkoXG4gICAgICBcImVsZW1lbnRzXCIsXG4gICAgICB0aGlzLm9uQWRkRWxlbWVudC5iaW5kKHRoaXMpLFxuICAgICAgdGhpcy5vblJlbW92ZUVsZW1lbnQuYmluZCh0aGlzKVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgIFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsXG4gICAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZWQuYmluZCh0aGlzKVxuICAgICk7XG4gICAgdGhpcy5pZCA9IFBhbmVsTW9kZWxCYXNlLmdldFBhbmVsSWQoKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIiwgdGhpcywgdHJ1ZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImRlc2NyaXB0aW9uXCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJyZXF1aXJlZEVycm9yVGV4dFwiLCB0aGlzKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInBhbmVsYmFzZVwiO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgIHN1cGVyLnNldFN1cnZleUltcGwodmFsdWUpO1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2ldLnNldFN1cnZleUltcGwodmFsdWUpO1xuICAgIH1cbiAgfVxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgdGhpcy5tYXJrUXVlc3Rpb25MaXN0RGlydHkoKTtcbiAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogUGFuZWxNb2RlbCBvciBQYWdlTW9kZWwgdGl0bGUgcHJvcGVydHkuXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKi9cbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRpdGxlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGl0bGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRpdGxlXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY1RpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIpO1xuICB9XG4gIC8qKlxuICAgKiBQYW5lbE1vZGVsIG9yIFBhZ2VNb2RlbCBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4gSXQgcmVuZGVycyB1bmRlciB0aXRsZSBieSB1c2luZyBzbWFsbGVyIGZvbnQuIFVubGlrZSB0aGUgdGl0bGUsIGRlc2NyaXB0aW9uIGNhbiBiZSBlbXB0eS5cbiAgICogQHNlZSB0aXRsZVxuICAgKi9cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImRlc2NyaXB0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVzY3JpcHRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImRlc2NyaXB0aW9uXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0Rlc2NyaXB0aW9uKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImRlc2NyaXB0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVGhlIGN1c3RvbSB0ZXh0IHRoYXQgd2lsbCBiZSBzaG93biBvbiByZXF1aXJlZCBlcnJvci4gVXNlIHRoaXMgcHJvcGVydHksIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzaG93IHRoZSBkZWZhdWx0IHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkRXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicmVxdWlyZWRFcnJvclRleHRcIik7XG4gIH1cbiAgcHVibGljIHNldCByZXF1aXJlZEVycm9yVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicmVxdWlyZWRFcnJvclRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUmVxdWlyZWRFcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicmVxdWlyZWRFcnJvclRleHRcIik7XG4gIH1cbiAgZ2V0TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5XG4gICAgICA/ICg8SUxvY2FsaXphYmxlT3duZXI+KDxhbnk+dGhpcy5zdXJ2ZXkpKS5nZXRMb2NhbGUoKVxuICAgICAgOiBcIlwiO1xuICB9XG4gIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5nZXRTdXJ2ZXlNYXJrZG93bkh0bWwodGhpcywgdGV4dCkgOiBudWxsO1xuICB9XG4gIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yXG4gICAgICA/IHRoaXMudGV4dFByb2Nlc3Nvci5wcm9jZXNzVGV4dCh0ZXh0LCB0cnVlKVxuICAgICAgOiB0ZXh0O1xuICB9XG4gIC8qKlxuICAgKiBBIHBhcmVudCBlbGVtZW50LiBJdCBpcyBhbHdheXMgbnVsbCBmb3IgdGhlIFBhZ2Ugb2JqZWN0IGFuZCBhbHdheXMgbm90IG51bGwgZm9yIHRoZSBQYW5lbCBvYmplY3QuIFBhbmVsIG9iamVjdCBtYXkgY29udGFpbiBRdWVzdGlvbnMgYW5kIG90aGVyIFBhbmVscy5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGFyZW50KCk6IFBhbmVsTW9kZWxCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFyZW50XCIsIG51bGwpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFyZW50KHZhbDogUGFuZWxNb2RlbEJhc2UpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYXJlbnRcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGRlcHRoKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHJldHVybiAwO1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5kZXB0aCArIDE7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIElmIGl0IHJldHVybnMgdHJ1ZSB0aGUgUGFuZWwgYmVjb21lcyB2aXNpYmxlIGFuZCBpZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBQYW5lbCBiZWNvbWVzIGludmlzaWJsZS4gVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIHZpc2libGUgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogQHNlZSB2aXNpYmxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc0NsYXNzZXMoKTogYW55IHtcbiAgICB2YXIgY2xhc3NlcyA9IHsgZXJyb3I6IHt9IH07XG4gICAgdGhpcy5jb3B5Q3NzQ2xhc3NlcyhjbGFzc2VzLCB0aGlzLmNzcyk7XG4gICAgdGhpcy5jb3B5Q3NzQ2xhc3NlcyhjbGFzc2VzLmVycm9yLCB0aGlzLmNzcy5lcnJvcik7XG4gICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICB0aGlzLnN1cnZleS51cGRhdGVQYW5lbENzc0NsYXNzZXModGhpcywgY2xhc3Nlcyk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc2VzO1xuICB9XG4gIHByaXZhdGUgZ2V0IGNzcygpOiBhbnkge1xuICAgIHJldHVybiBzdXJ2ZXlDc3MuZ2V0Q3NzKCk7XG4gIH1cbiAgLyoqXG4gICAqIEEgdW5pcXVlIGVsZW1lbnQgaWRlbnRpZmljYXRvci4gSXQgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlkXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaWQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpZFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIFBhbmVsLiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBjdXJyZW50IG9iamVjdCBpcyBQYWdlIChhIHJvb3QgUGFuZWwpLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1BhbmVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0UGFuZWwoKTogSVBhbmVsIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZXRMYXlvdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicm93XCI7XG4gIH1cbiAgaXNMYXlvdXRUeXBlU3VwcG9ydGVkKGxheW91dFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBsYXlvdXRUeXBlICE9PSBcImZsb3dcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgcXVlc3Rpb25zIGxvY2F0ZWQgaW4gdGhlIFBhbmVsL1BhZ2UsIGluY2x1ZGluZyBpbiB0aGUgbmVzdGVkIFBhbmVscy5cbiAgICogQHNlZSBRdWVzdGlvblxuICAgKiBAc2VlIGVsZW1lbnRzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9ucygpOiBBcnJheTxRdWVzdGlvbj4ge1xuICAgIGlmICghdGhpcy5pc1F1ZXN0aW9uc1JlYWR5KSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uc1ZhbHVlID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsID0gdGhpcy5lbGVtZW50c1tpXTtcbiAgICAgICAgaWYgKGVsLmlzUGFuZWwpIHtcbiAgICAgICAgICB2YXIgcXMgPSAoPFBhbmVsTW9kZWw+ZWwpLnF1ZXN0aW9ucztcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHFzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uc1ZhbHVlLnB1c2gocXNbal0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnF1ZXN0aW9uc1ZhbHVlLnB1c2goPFF1ZXN0aW9uPmVsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5pc1F1ZXN0aW9uc1JlYWR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbnNWYWx1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcXVlc3Rpb24gYnkgaXRzIG5hbWVcbiAgICogQHBhcmFtIG5hbWUgdGhlIHF1ZXN0aW9uIG5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRRdWVzdGlvbkJ5TmFtZShuYW1lOiBzdHJpbmcpOiBRdWVzdGlvbiB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocXVlc3Rpb25zW2ldLm5hbWUgPT0gbmFtZSkgcmV0dXJuIHF1ZXN0aW9uc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVucyB0aGUgZWxlbWVudCBieSBpdHMgbmFtZS4gSXQgd29ya3MgcmVjdXJzaXZlbHkuXG4gICAqIEBwYXJhbSBuYW1lIHRoZSBlbGVtZW50IG5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRFbGVtZW50QnlOYW1lKG5hbWU6IHN0cmluZyk6IElFbGVtZW50IHtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbCA9IGVsZW1lbnRzW2ldO1xuICAgICAgaWYgKGVsLm5hbWUgPT0gbmFtZSkgcmV0dXJuIGVsO1xuICAgICAgdmFyIHBubCA9IGVsLmdldFBhbmVsKCk7XG4gICAgICBpZiAoISFwbmwpIHtcbiAgICAgICAgdmFyIHJlcyA9ICg8UGFuZWxNb2RlbEJhc2U+cG5sKS5nZXRFbGVtZW50QnlOYW1lKG5hbWUpO1xuICAgICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKHZhbHVlTmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHF1ZXN0aW9uc1tpXS5nZXRWYWx1ZU5hbWUoKSA9PSB2YWx1ZU5hbWUpIHJldHVybiBxdWVzdGlvbnNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHF1ZXN0aW9uIHZhbHVlcyBvbiB0aGUgY3VycmVudCBwYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0VmFsdWUoKTogYW55IHtcbiAgICB2YXIgZGF0YSA9IHt9O1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnF1ZXN0aW9ucztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcSA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgIGlmIChxLmlzRW1wdHkoKSkgY29udGludWU7XG4gICAgICB2YXIgdmFsdWVOYW1lID0gcS5nZXRWYWx1ZU5hbWUoKTtcbiAgICAgICg8YW55PmRhdGEpW3ZhbHVlTmFtZV0gPSBxLnZhbHVlO1xuICAgICAgaWYgKCEhdGhpcy5kYXRhKSB7XG4gICAgICAgIHZhciBjb21tZW50ID0gdGhpcy5kYXRhLmdldENvbW1lbnQodmFsdWVOYW1lKTtcbiAgICAgICAgaWYgKCEhY29tbWVudCkge1xuICAgICAgICAgICg8YW55PmRhdGEpW3ZhbHVlTmFtZSArIHNldHRpbmdzLmNvbW1lbnRQcmVmaXhdID0gY29tbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBxdWVzdGlvbiBjb21tZW50cyBvbiB0aGUgY3VycmVudCBwYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29tbWVudHMoKTogYW55IHtcbiAgICB2YXIgY29tbWVudHMgPSB7fTtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuIGNvbW1lbnRzO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICB2YXIgY29tbWVudCA9IHRoaXMuZGF0YS5nZXRDb21tZW50KHEuZ2V0VmFsdWVOYW1lKCkpO1xuICAgICAgaWYgKCEhY29tbWVudCkge1xuICAgICAgICAoPGFueT5jb21tZW50cylbcS5nZXRWYWx1ZU5hbWUoKV0gPSBjb21tZW50O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29tbWVudHM7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZW1vdmUgYWxsIHF1ZXN0aW9uIHZhbHVlcyBmcm9tIHRoZSBjdXJyZW50IHBhZ2UvcGFuZWwsIHRoYXQgZW5kLXVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlci5cbiAgICogRm9yIGV4YW1wbGUgdGhlIHZhbHVlIHRoYXQgZG9lc24ndCBleGlzdHMgaW4gYSByYWRpZ3JvdXAvZHJvcGRvd24vY2hlY2tib3ggY2hvaWNlcyBvciBtYXRyaXggcm93cy9jb2x1bW5zLlxuICAgKiBQbGVhc2Ugbm90ZSwgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNsZWFyIHZhbHVlcyBmb3IgaW52aXNpYmxlIHF1ZXN0aW9ucyBvciB2YWx1ZXMgdGhhdCBkb2Vzbid0IGFzc29jaWF0ZWQgd2l0aCBxdWVzdGlvbnMuXG4gICAqIEBzZWUgUXVlc3Rpb24uY2xlYXJJbmNvcnJlY3RWYWx1ZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbaV0uY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byBjbGVhciBhbGwgZXJyb3JzIGluIHRoZSBwYW5lbCAvIHBhZ2UgYW5kIGFsbCBpdHMgY2hpbGQgZWxlbWVudHMgKHBhbmVscyBhbmQgcXVlc3Rpb25zKVxuICAgKi9cbiAgcHVibGljIGNsZWFyRXJyb3JzKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5jbGVhckVycm9ycygpO1xuICAgIH1cbiAgICB0aGlzLmVycm9ycyA9IFtdO1xuICB9XG4gIHByaXZhdGUgbWFya1F1ZXN0aW9uTGlzdERpcnR5KCkge1xuICAgIHRoaXMuaXNRdWVzdGlvbnNSZWFkeSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnBhcmVudCkgdGhpcy5wYXJlbnQubWFya1F1ZXN0aW9uTGlzdERpcnR5KCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBvYmplY3QsIFBhbmVsL1BhZ2UuIEVsZW1lbnRzIGNhbiBiZSBxdWVzdGlvbnMgb3IgcGFuZWxzLiBUaGUgZnVuY3Rpb24gZG9lc24ndCByZXR1cm4gZWxlbWVudHMgaW4gdGhlIG5lc3RlZCBQYW5lbHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVsZW1lbnRzKCk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHNWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0RWxlbWVudHNJbkRlc2lnbihpbmNsdWRlSGlkZGVuOiBib29sZWFuID0gZmFsc2UpOiBBcnJheTxJRWxlbWVudD4ge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRzO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgZWxlbWVudCBiZWxvbmdzIHRvIHRoZSBQYW5lbC9QYWdlLiBJdCBsb29rcyBpbiBuZXN0ZWQgUGFuZWxzIGFzIHdlbGwuXG4gICAqIEBwYXJhbSBlbGVtZW50XG4gICAqIEBzZWUgUGFuZWxNb2RlbFxuICAgKi9cbiAgcHVibGljIGNvbnRhaW5zRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsOiBhbnkgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgaWYgKGVsID09IGVsZW1lbnQpIHJldHVybiB0cnVlO1xuICAgICAgdmFyIHBubCA9IGVsLmdldFBhbmVsKCk7XG4gICAgICBpZiAoISFwbmwpIHtcbiAgICAgICAgaWYgKCg8UGFuZWxNb2RlbEJhc2U+cG5sKS5jb250YWluc0VsZW1lbnQoZWxlbWVudCkpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHRvIHJlcXVpcmUgdGhlIGFuc3dlciBhdCBsZWFzdCBpbiBvbmUgcXVlc3Rpb24gaW4gdGhlIHBhbmVsLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1JlcXVpcmVkXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzUmVxdWlyZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNSZXF1aXJlZFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUsIGlmIHRoZXJlIGlzIGFuIGVycm9yIG9uIHRoaXMgUGFnZSBvciBpbnNpZGUgdGhlIGN1cnJlbnQgUGFuZWxcbiAgICogQHBhcmFtIGZpcmVDYWxsYmFjayBzZXQgaXQgdG8gdHJ1ZSwgdG8gc2hvdyBlcnJvcnMgaW4gVUlcbiAgICogQHBhcmFtIGZvY3VzZU9uRmlyc3RFcnJvciBzZXQgaXQgdG8gdHJ1ZSB0byBmb2N1c2Ugb24gdGhlIGZpcnN0IHF1ZXN0aW9uIHRoYXQgZG9lc24ndCBwYXNzIHRoZSB2YWxpZGF0aW9uXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUsXG4gICAgZm9jdXNlT25GaXJzdEVycm9yOiBib29sZWFuID0gZmFsc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIHJlYyA9IHtcbiAgICAgIGZpcmVDYWxsYmFjazogZmlyZUNhbGxiYWNrLFxuICAgICAgZm9jdXNlT25GaXJzdEVycm9yOiBmb2N1c2VPbkZpcnN0RXJyb3IsXG4gICAgICBmaXJzdEVycm9yUXVlc3Rpb246IDxhbnk+bnVsbCxcbiAgICAgIHJlc3VsdDogZmFsc2VcbiAgICB9O1xuICAgIHRoaXMuaGFzRXJyb3JzQ29yZShyZWMpO1xuICAgIGlmIChyZWMuZmlyc3RFcnJvclF1ZXN0aW9uKSB7XG4gICAgICByZWMuZmlyc3RFcnJvclF1ZXN0aW9uLmZvY3VzKHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVjLnJlc3VsdDtcbiAgfVxuICBwcml2YXRlIGhhc0Vycm9yc0luUGFuZWxzKHJlYzogYW55KSB7XG4gICAgdmFyIGVycm9ycyA9IDxBcnJheTxhbnk+PltdO1xuICAgIHRoaXMuaGFzUmVxdWlyZWRFcnJvcihyZWMsIGVycm9ycyk7XG4gICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICB2YXIgY3VzdG9tRXJyb3IgPSB0aGlzLnN1cnZleS52YWxpZGF0ZVBhbmVsKHRoaXMpO1xuICAgICAgaWYgKGN1c3RvbUVycm9yKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGN1c3RvbUVycm9yKTtcbiAgICAgICAgcmVjLnJlc3VsdCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIXJlYy5maXJlQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIH1cbiAgfVxuICAvL0lTdXJ2ZXlFcnJvck93bmVyXG4gIGdldEVycm9yQ3VzdG9tVGV4dCh0ZXh0OiBzdHJpbmcsIGVycm9yOiBTdXJ2ZXlFcnJvcik6IHN0cmluZyB7XG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXkpIHJldHVybiB0aGlzLnN1cnZleS5nZXRFcnJvckN1c3RvbVRleHQodGV4dCwgZXJyb3IpO1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNSZXF1aXJlZEVycm9yKHJlYzogYW55LCBlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xuICAgIGlmICghdGhpcy5pc1JlcXVpcmVkKSByZXR1cm47XG4gICAgdmFyIHZpc1F1ZXN0aW9ucyA9IDxBcnJheTxhbnk+PltdO1xuICAgIHRoaXMuYWRkUXVlc3Rpb25zVG9MaXN0KHZpc1F1ZXN0aW9ucywgdHJ1ZSk7XG4gICAgaWYgKHZpc1F1ZXN0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlzUXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXZpc1F1ZXN0aW9uc1tpXS5pc0VtcHR5KCkpIHJldHVybjtcbiAgICB9XG4gICAgcmVjLnJlc3VsdCA9IHRydWU7XG4gICAgZXJyb3JzLnB1c2gobmV3IE9uZUFuc3dlclJlcXVpcmVkRXJyb3IodGhpcy5yZXF1aXJlZEVycm9yVGV4dCwgdGhpcykpO1xuICAgIGlmICghcmVjLmZpcnN0RXJyb3JRdWVzdGlvbikge1xuICAgICAgcmVjLmZpcnN0RXJyb3JRdWVzdGlvbiA9IHZpc1F1ZXN0aW9uc1swXTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGhhc0Vycm9yc0NvcmUocmVjOiBhbnkpIHtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzO1xuICAgIHZhciBlbGVtZW50ID0gbnVsbDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVsZW1lbnQgPSBlbGVtZW50c1tpXTtcblxuICAgICAgaWYgKCFlbGVtZW50LmlzVmlzaWJsZSkgY29udGludWU7XG5cbiAgICAgIGlmIChlbGVtZW50LmlzUGFuZWwpIHtcbiAgICAgICAgKDxQYW5lbE1vZGVsQmFzZT4oPGFueT5lbGVtZW50KSkuaGFzRXJyb3JzQ29yZShyZWMpO1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldFR5cGUoKSA9PT0gXCJwYW5lbGR5bmFtaWNcIikge1xuICAgICAgICAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPmVsZW1lbnQpLnBhbmVscy5mb3JFYWNoKFxuICAgICAgICAgIChwYW5lbDogUGFuZWxNb2RlbEJhc2UpID0+IHtcbiAgICAgICAgICAgIHBhbmVsLmhhc0Vycm9yc0NvcmUocmVjKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcXVlc3Rpb24gPSA8UXVlc3Rpb24+ZWxlbWVudDtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmlzUmVhZE9ubHkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAocXVlc3Rpb24uaGFzRXJyb3JzKHJlYy5maXJlQ2FsbGJhY2spKSB7XG4gICAgICAgICAgaWYgKHJlYy5mb2N1c2VPbkZpcnN0RXJyb3IgJiYgcmVjLmZpcnN0RXJyb3JRdWVzdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZWMuZmlyc3RFcnJvclF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlYy5yZXN1bHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaGFzRXJyb3JzSW5QYW5lbHMocmVjKTtcbiAgfVxuICB1cGRhdGVFbGVtZW50VmlzaWJpbGl0eSgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbCA9IHRoaXMuZWxlbWVudHNbaV07XG4gICAgICAoPEJhc2U+KDxhbnk+ZWwpKS5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNWaXNpYmxlXCIsIGVsLmlzVmlzaWJsZSk7XG4gICAgICBpZiAoZWwuaXNQYW5lbCkge1xuICAgICAgICAoPFBhbmVsTW9kZWxCYXNlPig8YW55PmVsKSkudXBkYXRlRWxlbWVudFZpc2liaWxpdHkoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0Rmlyc3RRdWVzdGlvblRvRm9jdXMod2l0aEVycm9yOiBib29sZWFuID0gZmFsc2UpOiBRdWVzdGlvbiB7XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5lbGVtZW50cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWwgPSBlbGVtZW50c1tpXTtcbiAgICAgIGlmICghZWwuaXNWaXNpYmxlKSBjb250aW51ZTtcbiAgICAgIGlmIChlbC5pc1BhbmVsKSB7XG4gICAgICAgIHZhciByZXMgPSAoPFBhbmVsTW9kZWxCYXNlPig8YW55PmVsKSkuZ2V0Rmlyc3RRdWVzdGlvblRvRm9jdXMoXG4gICAgICAgICAgd2l0aEVycm9yXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBxID0gPFF1ZXN0aW9uPmVsO1xuICAgICAgICBpZiAocS5oYXNJbnB1dCAmJiAoIXdpdGhFcnJvciB8fCBxLmN1cnJlbnRFcnJvckNvdW50ID4gMCkpIHJldHVybiBxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogRmlsbCBsaXN0IGFycmF5IHdpdGggdGhlIHF1ZXN0aW9ucy5cbiAgICogQHBhcmFtIGxpc3RcbiAgICogQHBhcmFtIHZpc2libGVPbmx5IHNldCBpdCB0byB0cnVlIHRvIGdldCB2aXNpYmxlIHF1ZXN0aW9ucyBvbmx5XG4gICAqL1xuICBwdWJsaWMgYWRkUXVlc3Rpb25zVG9MaXN0KFxuICAgIGxpc3Q6IEFycmF5PElRdWVzdGlvbj4sXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdGhpcy5hZGRFbGVtZW50c1RvTGlzdChsaXN0LCB2aXNpYmxlT25seSwgaW5jbHVkaW5nRGVzaWduVGltZSwgZmFsc2UpO1xuICB9XG4gIC8qKlxuICAgKiBGaWxsIGxpc3QgYXJyYXkgd2l0aCB0aGUgcGFuZWxzLlxuICAgKiBAcGFyYW0gbGlzdFxuICAgKi9cbiAgcHVibGljIGFkZFBhbmVsc0ludG9MaXN0KFxuICAgIGxpc3Q6IEFycmF5PElQYW5lbD4sXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdGhpcy5hZGRFbGVtZW50c1RvTGlzdChcbiAgICAgIDxBcnJheTxJRWxlbWVudD4+KDxBcnJheTxhbnk+Pmxpc3QpLFxuICAgICAgdmlzaWJsZU9ubHksXG4gICAgICBpbmNsdWRpbmdEZXNpZ25UaW1lLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBhZGRFbGVtZW50c1RvTGlzdChcbiAgICBsaXN0OiBBcnJheTxJRWxlbWVudD4sXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4sXG4gICAgaW5jbHVkaW5nRGVzaWduVGltZTogYm9vbGVhbixcbiAgICBpc1BhbmVsOiBib29sZWFuXG4gICkge1xuICAgIGlmICh2aXNpYmxlT25seSAmJiAhdGhpcy52aXNpYmxlKSByZXR1cm47XG4gICAgdGhpcy5hZGRFbGVtZW50c1RvTGlzdENvcmUoXG4gICAgICBsaXN0LFxuICAgICAgdGhpcy5lbGVtZW50cyxcbiAgICAgIHZpc2libGVPbmx5LFxuICAgICAgaW5jbHVkaW5nRGVzaWduVGltZSxcbiAgICAgIGlzUGFuZWxcbiAgICApO1xuICB9XG4gIHByaXZhdGUgYWRkRWxlbWVudHNUb0xpc3RDb3JlKFxuICAgIGxpc3Q6IEFycmF5PElFbGVtZW50PixcbiAgICBlbGVtZW50czogQXJyYXk8SUVsZW1lbnQ+LFxuICAgIHZpc2libGVPbmx5OiBib29sZWFuLFxuICAgIGluY2x1ZGluZ0Rlc2lnblRpbWU6IGJvb2xlYW4sXG4gICAgaXNQYW5lbDogYm9vbGVhblxuICApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWwgPSBlbGVtZW50c1tpXTtcbiAgICAgIGlmICh2aXNpYmxlT25seSAmJiAhZWwudmlzaWJsZSkgY29udGludWU7XG4gICAgICBpZiAoKGlzUGFuZWwgJiYgZWwuaXNQYW5lbCkgfHwgKCFpc1BhbmVsICYmICFlbC5pc1BhbmVsKSkge1xuICAgICAgICBsaXN0LnB1c2goZWwpO1xuICAgICAgfVxuICAgICAgaWYgKGVsLmlzUGFuZWwpIHtcbiAgICAgICAgKDxQYW5lbE1vZGVsPmVsKS5hZGRFbGVtZW50c1RvTGlzdENvcmUoXG4gICAgICAgICAgbGlzdCxcbiAgICAgICAgICAoPFBhbmVsTW9kZWw+ZWwpLmVsZW1lbnRzLFxuICAgICAgICAgIHZpc2libGVPbmx5LFxuICAgICAgICAgIGluY2x1ZGluZ0Rlc2lnblRpbWUsXG4gICAgICAgICAgaXNQYW5lbFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGluY2x1ZGluZ0Rlc2lnblRpbWUpIHtcbiAgICAgICAgICB0aGlzLmFkZEVsZW1lbnRzVG9MaXN0Q29yZShcbiAgICAgICAgICAgIGxpc3QsXG4gICAgICAgICAgICAoPFN1cnZleUVsZW1lbnQ+KDxhbnk+ZWwpKS5nZXRFbGVtZW50c0luRGVzaWduKGZhbHNlKSxcbiAgICAgICAgICAgIHZpc2libGVPbmx5LFxuICAgICAgICAgICAgaW5jbHVkaW5nRGVzaWduVGltZSxcbiAgICAgICAgICAgIGlzUGFuZWxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIFBhZ2UgYW5kIGl0IGlzIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5zdXJ2ZXkgfHwgPFBhZ2VNb2RlbD50aGlzLnN1cnZleS5jdXJyZW50UGFnZSA9PSB0aGlzLnJvb3Q7XG4gIH1cbiAgcHVibGljIHVwZGF0ZUN1c3RvbVdpZGdldHMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2ldLnVwZGF0ZUN1c3RvbVdpZGdldHMoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IGRpZmZlcmVudCBmcm9tIFwiZGVmYXVsdFwiIHRvIHNldCB0aGUgc3BlY2lmaWMgcXVlc3Rpb24gdGl0bGUgbG9jYXRpb24gZm9yIHRoaXMgcGFuZWwvcGFnZS5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblRpdGxlTG9jYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLCBcImRlZmF1bHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvblRpdGxlTG9jYXRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLCB2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuICBnZXRRdWVzdGlvblRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5vbkdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbilcbiAgICAgIHJldHVybiB0aGlzLm9uR2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk7XG4gICAgaWYgKHRoaXMucXVlc3Rpb25UaXRsZUxvY2F0aW9uICE9IFwiZGVmYXVsdFwiKVxuICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb25UaXRsZUxvY2F0aW9uO1xuICAgIGlmICh0aGlzLnBhcmVudCkgcmV0dXJuIHRoaXMucGFyZW50LmdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpO1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnF1ZXN0aW9uVGl0bGVMb2NhdGlvbiA6IFwidG9wXCI7XG4gIH1cbiAgZ2V0Q2hpbGRyZW5MYXlvdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicm93XCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCByb290KCk6IFBhbmVsTW9kZWxCYXNlIHtcbiAgICB2YXIgcmVzID0gPFBhbmVsTW9kZWxCYXNlPnRoaXM7XG4gICAgd2hpbGUgKHJlcy5wYXJlbnQpIHJlcyA9IHJlcy5wYXJlbnQ7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgY2hpbGRWaXNpYmlsaXR5Q2hhbmdlZCgpIHtcbiAgICB2YXIgbmV3SXNWaXNpYmxlVmFsdWUgPSB0aGlzLmdldElzUGFnZVZpc2libGUobnVsbCk7XG4gICAgdmFyIG9sZElzVmlzaWJsZVZhbHVlID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNWaXNpYmxlXCIsIHRydWUpO1xuICAgIGlmIChuZXdJc1Zpc2libGVWYWx1ZSAhPT0gb2xkSXNWaXNpYmxlVmFsdWUpIHtcbiAgICAgIHRoaXMub25WaXNpYmxlQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUm93KCk6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Sb3dNb2RlbCh0aGlzKTtcbiAgfVxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5vblN1cnZleUxvYWQoKTtcbiAgICB9XG4gICAgdGhpcy5vbkVsZW1lbnRWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzKTtcbiAgfVxuICBwdWJsaWMgb25GaXJzdFJlbmRlcmluZygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbaV0ub25GaXJzdFJlbmRlcmluZygpO1xuICAgIH1cbiAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgfVxuICBnZXQgcm93cygpOiBBcnJheTxRdWVzdGlvblJvd01vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Sb3dzQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIiwgdGhpcy5idWlsZFJvd3MoKSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQWRkRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIGVsZW1lbnQuc2V0U3VydmV5SW1wbCh0aGlzLnN1cnZleUltcGwpO1xuICAgIGVsZW1lbnQucGFyZW50ID0gdGhpcztcbiAgICB0aGlzLm1hcmtRdWVzdGlvbkxpc3REaXJ0eSgpO1xuICAgIHRoaXMudXBkYXRlUm93c09uRWxlbWVudEFkZGVkKGVsZW1lbnQsIGluZGV4KTtcbiAgICBpZiAoZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICB2YXIgcCA9IDxQYW5lbE1vZGVsPmVsZW1lbnQ7XG4gICAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgICAgdGhpcy5zdXJ2ZXkucGFuZWxBZGRlZChwLCBpbmRleCwgdGhpcywgdGhpcy5yb290KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICAgIHZhciBxID0gPFF1ZXN0aW9uPmVsZW1lbnQ7XG4gICAgICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uQWRkZWQocSwgaW5kZXgsIHRoaXMsIHRoaXMucm9vdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIXRoaXMuYWRkRWxlbWVudENhbGxiYWNrKSB0aGlzLmFkZEVsZW1lbnRDYWxsYmFjayhlbGVtZW50KTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgKDxCYXNlPig8YW55PmVsZW1lbnQpKS5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1widmlzaWJsZVwiLCBcImlzVmlzaWJsZVwiXSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9uRWxlbWVudFZpc2liaWxpdHlDaGFuZ2VkKGVsZW1lbnQpO1xuICAgICAgfSxcbiAgICAgIHRoaXMuaWRcbiAgICApO1xuICAgICg8QmFzZT4oPGFueT5lbGVtZW50KSkucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgICBcInN0YXJ0V2l0aE5ld0xpbmVcIixcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9uRWxlbWVudFN0YXJ0V2l0aE5ld0xpbmVDaGFuZ2VkKGVsZW1lbnQpO1xuICAgICAgfSxcbiAgICAgIHRoaXMuaWRcbiAgICApO1xuICAgIHRoaXMub25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUmVtb3ZlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIGVsZW1lbnQucGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLm1hcmtRdWVzdGlvbkxpc3REaXJ0eSgpO1xuICAgICg8QmFzZT4oPGFueT5lbGVtZW50KSkudW5SZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1widmlzaWJsZVwiLCBcImlzVmlzaWJsZVwiLCBcInN0YXJ0V2l0aE5ld0xpbmVcIl0sXG4gICAgICB0aGlzLmlkXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVJvd3NPbkVsZW1lbnRSZW1vdmVkKGVsZW1lbnQpO1xuICAgIGlmICghZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICBpZiAodGhpcy5zdXJ2ZXkpIHRoaXMuc3VydmV5LnF1ZXN0aW9uUmVtb3ZlZCg8UXVlc3Rpb24+ZWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnN1cnZleSkgdGhpcy5zdXJ2ZXkucGFuZWxSZW1vdmVkKGVsZW1lbnQpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLnJlbW92ZUVsZW1lbnRDYWxsYmFjaykgdGhpcy5yZW1vdmVFbGVtZW50Q2FsbGJhY2soZWxlbWVudCk7XG4gICAgdGhpcy5vbkVsZW1lbnRWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzKTtcbiAgfVxuICBwcml2YXRlIG9uRWxlbWVudFZpc2liaWxpdHlDaGFuZ2VkKGVsZW1lbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy51cGRhdGVSb3dzVmlzaWJpbGl0eShlbGVtZW50KTtcbiAgICB0aGlzLmNoaWxkVmlzaWJpbGl0eUNoYW5nZWQoKTtcbiAgICBpZiAoISF0aGlzLnBhcmVudCkge1xuICAgICAgdGhpcy5wYXJlbnQub25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQodGhpcyk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgb25FbGVtZW50U3RhcnRXaXRoTmV3TGluZUNoYW5nZWQoZWxlbWVudDogYW55KSB7XG4gICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVSb3dzVmlzaWJpbGl0eShlbGVtZW50OiBhbnkpIHtcbiAgICB2YXIgcm93cyA9IHRoaXMucm93cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSByb3dzW2ldO1xuICAgICAgaWYgKHJvdy5lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpID4gLTEpIHtcbiAgICAgICAgcm93LnVwZGF0ZVZpc2libGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY2FuQnVpbGRSb3dzKCkge1xuICAgIHJldHVybiAhdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiAmJiB0aGlzLmdldENoaWxkcmVuTGF5b3V0VHlwZSgpID09IFwicm93XCI7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZFJvd3MoKTogQXJyYXk8UXVlc3Rpb25Sb3dNb2RlbD4ge1xuICAgIGlmICghdGhpcy5jYW5CdWlsZFJvd3MoKSkgcmV0dXJuIFtdO1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8UXVlc3Rpb25Sb3dNb2RlbD4oKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbCA9IHRoaXMuZWxlbWVudHNbaV07XG4gICAgICB2YXIgaXNOZXdSb3cgPSBpID09IDAgfHwgZWwuc3RhcnRXaXRoTmV3TGluZTtcbiAgICAgIHZhciByb3cgPSBpc05ld1JvdyA/IHRoaXMuY3JlYXRlUm93KCkgOiByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGlzTmV3Um93KSByZXN1bHQucHVzaChyb3cpO1xuICAgICAgcm93LmFkZEVsZW1lbnQoZWwpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0W2ldLnVwZGF0ZVZpc2libGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVJvd3NPbkVsZW1lbnRBZGRlZChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5jYW5CdWlsZFJvd3MoKSkgcmV0dXJuO1xuICAgIHZhciBkcmFnRHJvcEluZm8gPSBuZXcgRHJhZ0Ryb3BJbmZvKG51bGwsIGVsZW1lbnQpO1xuICAgIGRyYWdEcm9wSW5mby50YXJnZXQgPSBlbGVtZW50O1xuICAgIGRyYWdEcm9wSW5mby5pc0VkZ2UgPSB0aGlzLmVsZW1lbnRzLmxlbmd0aCA+IDE7XG4gICAgaWYgKHRoaXMuZWxlbWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uID0gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgZHJhZ0Ryb3BJbmZvLmlzQm90dG9tID0gaW5kZXggPiAwO1xuICAgICAgaWYgKGluZGV4ID09IDApIHtcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uID0gdGhpcy5lbGVtZW50c1sxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbiA9IHRoaXMuZWxlbWVudHNbaW5kZXggLSAxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kcmFnRHJvcEFkZFRhcmdldFRvUm93KGRyYWdEcm9wSW5mbywgbnVsbCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVSb3dzT25FbGVtZW50UmVtb3ZlZChlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5jYW5CdWlsZFJvd3MoKSkgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlUm93c1JlbW92ZUVsZW1lbnRGcm9tUm93KFxuICAgICAgZWxlbWVudCxcbiAgICAgIHRoaXMuZmluZFJvd0J5RWxlbWVudChlbGVtZW50KVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZVJvd3NSZW1vdmVFbGVtZW50RnJvbVJvdyhcbiAgICBlbGVtZW50OiBJRWxlbWVudCxcbiAgICByb3c6IFF1ZXN0aW9uUm93TW9kZWxcbiAgKSB7XG4gICAgaWYgKCFyb3cgfHwgIXJvdy5wYW5lbCkgcmV0dXJuO1xuICAgIHZhciBlbEluZGV4ID0gcm93LmVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCk7XG4gICAgaWYgKGVsSW5kZXggPCAwKSByZXR1cm47XG4gICAgcm93LmVsZW1lbnRzLnNwbGljZShlbEluZGV4LCAxKTtcbiAgICBpZiAocm93LmVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyb3cuaW5kZXggPj0gMCkge1xuICAgICAgICByb3cucGFuZWwucm93cy5zcGxpY2Uocm93LmluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmaW5kUm93QnlFbGVtZW50KGVsOiBJRWxlbWVudCk6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIHZhciByb3dzID0gdGhpcy5yb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJvd3NbaV0uZWxlbWVudHMuaW5kZXhPZihlbCkgPiAtMSkgcmV0dXJuIHJvd3NbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGVsZW1lbnRXaWR0aENoYW5nZWQoZWw6IElFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgcm93ID0gdGhpcy5maW5kUm93QnlFbGVtZW50KGVsKTtcbiAgICBpZiAoISFyb3cpIHtcbiAgICAgIHJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHJlbmRlcmVkIHRpdGxlIHRleHQgb3IgaHRtbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkVGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVuZGVyZWRUaXRsZSh0aGlzLmxvY1RpdGxlLnRleHRPckh0bWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRSZW5kZXJlZFRpdGxlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yICE9IG51bGxcbiAgICAgID8gdGhpcy50ZXh0UHJvY2Vzc29yLnByb2Nlc3NUZXh0KHN0ciwgdHJ1ZSlcbiAgICAgIDogc3RyO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gZ2V0L3NldCB0aGUgb2JqZWN0IHZpc2liaWxpdHkuXG4gICAqIEBzZWUgdmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLnZpc2libGUpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHZhbHVlKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdGhpcy5pc1Zpc2libGUpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmlzaWJsZUNoYW5nZWQoKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNWaXNpYmxlXCIsIHRoaXMuaXNWaXNpYmxlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIG9iamVjdCBpcyB2aXNpYmxlIG9yIHN1cnZleSBpcyBpbiBkZXNpZ24gbW9kZSByaWdodCBub3cuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcgfHwgdGhpcy5nZXRJc1BhZ2VWaXNpYmxlKG51bGwpO1xuICB9XG4gIGdldElzUGFnZVZpc2libGUoZXhjZXB0aW9uUXVlc3Rpb246IElRdWVzdGlvbik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy52aXNpYmxlKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5lbGVtZW50c1tpXSA9PSBleGNlcHRpb25RdWVzdGlvbikgY29udGludWU7XG4gICAgICBpZiAodGhpcy5lbGVtZW50c1tpXS5pc1Zpc2libGUpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHNldFZpc2libGVJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlIHx8IGluZGV4IDwgMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudHNbaV0uc2V0VmlzaWJsZUluZGV4KC0xKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB2YXIgc3RhcnRJbmRleCA9IGluZGV4O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaW5kZXggKz0gdGhpcy5lbGVtZW50c1tpXS5zZXRWaXNpYmxlSW5kZXgoaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gaW5kZXggLSBzdGFydEluZGV4O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1bnMgdHJ1ZSBpZiByZWFkT25seSBwcm9wZXJ0eSBpcyB0cnVlIG9yIHN1cnZleSBpcyBpbiBkaXNwbGF5IG1vZGUgb3IgcGFyZW50IHBhbmVsL3BhZ2UgaXMgcmVhZE9ubHkuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubW9kZWxcbiAgICogQHNlZSByZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHZhciBpc1BhcmVudFJlYWRPbmx5ID0gISF0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5pc1JlYWRPbmx5O1xuICAgIHZhciBpc1N1cnZleVJlYWRPbmx5ID0gISF0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rpc3BsYXlNb2RlO1xuICAgIHJldHVybiB0aGlzLnJlYWRPbmx5IHx8IGlzUGFyZW50UmVhZE9ubHkgfHwgaXNTdXJ2ZXlSZWFkT25seTtcbiAgfVxuICBwcm90ZWN0ZWQgb25SZWFkT25seUNoYW5nZWQoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWwgPSA8U3VydmV5RWxlbWVudD4oPGFueT50aGlzLmVsZW1lbnRzW2ldKTtcbiAgICAgIGVsLnNldFByb3BlcnR5VmFsdWUoXCJpc1JlYWRPbmx5XCIsIGVsLmlzUmVhZE9ubHkpO1xuICAgIH1cbiAgICBzdXBlci5vblJlYWRPbmx5Q2hhbmdlZCgpO1xuICB9XG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBQYW5lbC9QYWdlIGJlY29tZXMgcmVhZCBvbmx5IGFuZCBhbiBlbmQtdXNlciB3aWxsIG5vdCBhYmxlIHRvIGFuc3dlciBvbiBxdXN0aW9ucyBpbnNpZGUgaXQuXG4gICAqIFRoZSBsaWJyYXJ5IHJ1bnMgdGhlIGV4cHJlc3Npb24gb24gc3VydmV5IHN0YXJ0IGFuZCBvbiBjaGFuZ2luZyBhIHF1ZXN0aW9uIHZhbHVlLiBJZiB0aGUgcHJvcGVydHkgaXMgZW1wdHkgdGhlbiByZWFkT25seSBwcm9wZXJ0eSBpcyB1c2VkLlxuICAgKiBAc2VlIHJlYWRPbmx5XG4gICAqIEBzZWUgaXNSZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCBlbmFibGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJlbmFibGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVuYWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZW5hYmxlSWZcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQWRkIGFuIGVsZW1lbnQgaW50byBQYW5lbCBvciBQYWdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgYWRkZWQgc3VjY2Vzc2Z1bGx5LiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cbiAgICogQHBhcmFtIGVsZW1lbnRcbiAgICogQHBhcmFtIGluZGV4IGVsZW1lbnQgaW5kZXggaW4gdGhlIGVsZW1lbnRzIGFycmF5XG4gICAqL1xuICBwdWJsaWMgYWRkRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlciA9IC0xKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNhbkFkZEVsZW1lbnQoZWxlbWVudCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxlbWVudHMuc3BsaWNlKGluZGV4LCAwLCBlbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIGNhbkFkZEVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFlbGVtZW50ICYmIGVsZW1lbnQuaXNMYXlvdXRUeXBlU3VwcG9ydGVkKHRoaXMuZ2V0Q2hpbGRyZW5MYXlvdXRUeXBlKCkpXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgcXVlc3Rpb24gaW50byBQYW5lbCBvciBQYWdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXN0aW9uIGFkZGVkIHN1Y2Nlc3NmdWxseS4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXG4gICAqIEBwYXJhbSBxdWVzdGlvblxuICAgKiBAcGFyYW0gaW5kZXggZWxlbWVudCBpbmRleCBpbiB0aGUgZWxlbWVudHMgYXJyYXlcbiAgICovXG4gIHB1YmxpYyBhZGRRdWVzdGlvbihxdWVzdGlvbjogUXVlc3Rpb24sIGluZGV4OiBudW1iZXIgPSAtMSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFkZEVsZW1lbnQocXVlc3Rpb24sIGluZGV4KTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgcGFuZWwgaW50byBQYW5lbCBvciBQYWdlLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBwYW5lbCBhZGRlZCBzdWNjZXNzZnVsbHkuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLlxuICAgKiBAcGFyYW0gcGFuZWxcbiAgICogQHBhcmFtIGluZGV4IGVsZW1lbnQgaW5kZXggaW4gdGhlIGVsZW1lbnRzIGFycmF5XG4gICAqL1xuICBwdWJsaWMgYWRkUGFuZWwocGFuZWw6IFBhbmVsTW9kZWwsIGluZGV4OiBudW1iZXIgPSAtMSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFkZEVsZW1lbnQocGFuZWwsIGluZGV4KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBxdWVzdGlvbiBhbmQgYWRkcyBpdCBpbnRvIHRoZSBlbmQgb2YgdGhlIGVsZW1lbnRzIGxpc3QuIFJldHVybnMgbnVsbCwgaWYgdGhlIHF1ZXN0aW9uIGNvdWxkIG5vdCBiZSBjcmVhdGVkIG9yIGNvdWxkIG5vdCBiZSBhZGRlZCBpbnRvIHBhZ2Ugb3IgcGFuZWwuXG4gICAqIEBwYXJhbSBxdWVzdGlvblR5cGUgdGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6IFwidGV4dFwiLCBcImNoZWNrYm94XCIsIFwiZHJvcGRvd25cIiwgXCJtYXRyaXhcIiwgXCJodG1sXCIsIFwibWF0cml4ZHluYW1pY1wiLCBcIm1hdHJpeGRyb3Bkb3duXCIgYW5kIHNvIG9uLlxuICAgKiBAcGFyYW0gbmFtZSBhIHF1ZXN0aW9uIG5hbWVcbiAgICovXG4gIHB1YmxpYyBhZGROZXdRdWVzdGlvbihxdWVzdGlvblR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nID0gbnVsbCk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgcXVlc3Rpb24gPSBRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UuY3JlYXRlUXVlc3Rpb24ocXVlc3Rpb25UeXBlLCBuYW1lKTtcbiAgICBpZiAoIXRoaXMuYWRkUXVlc3Rpb24ocXVlc3Rpb24pKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcXVlc3Rpb247XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGFuZWwgYW5kIGFkZHMgaXQgaW50byB0aGUgZW5kIG9mIHRoZSBlbGVtZW50cyBsaXN0LiBSZXR1cm5zIG51bGwsIGlmIHRoZSBwYW5lbCBjb3VsZCBub3QgYmUgY3JlYXRlZCBvciBjb3VsZCBub3QgYmUgYWRkZWQgaW50byBwYWdlIG9yIHBhbmVsLlxuICAgKiBAcGFyYW0gbmFtZSBhIHBhbmVsIG5hbWVcbiAgICovXG4gIHB1YmxpYyBhZGROZXdQYW5lbChuYW1lOiBzdHJpbmcgPSBudWxsKTogUGFuZWxNb2RlbCB7XG4gICAgdmFyIHBhbmVsID0gdGhpcy5jcmVhdGVOZXdQYW5lbChuYW1lKTtcbiAgICBpZiAoIXRoaXMuYWRkUGFuZWwocGFuZWwpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcGFuZWw7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1BhbmVsKG5hbWU6IHN0cmluZyk6IFBhbmVsTW9kZWwge1xuICAgIHJldHVybiBuZXcgUGFuZWxNb2RlbChuYW1lKTtcbiAgfVxuICAvKipcbiAgICogUmVtb3ZlIGFuIGVsZW1lbnQgKFBhbmVsIG9yIFF1ZXN0aW9uKSBmcm9tIHRoZSBlbGVtZW50cyBsaXN0LlxuICAgKiBAcGFyYW0gZWxlbWVudFxuICAgKiBAc2VlIGVsZW1lbnRzXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHZhciBpbmRleCA9IHRoaXMuZWxlbWVudHMuaW5kZXhPZihlbGVtZW50KTtcbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHNbaV0ucmVtb3ZlRWxlbWVudChlbGVtZW50KSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuZWxlbWVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogUmVtb3ZlIHF1ZXN0aW9uICBmcm9tIHRoZSBlbGVtZW50cyBsaXN0LlxuICAgKiBAcGFyYW0gcXVlc3Rpb25cbiAgICogQHNlZSBlbGVtZW50c1xuICAgKiBAc2VlIHJlbW92ZUVsZW1lbnRcbiAgICovXG4gIHB1YmxpYyByZW1vdmVRdWVzdGlvbihxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICB0aGlzLnJlbW92ZUVsZW1lbnQocXVlc3Rpb24pO1xuICB9XG4gIHByaXZhdGUgY29uZGl0aW9uVmVyc2lvbiA9IC0xO1xuICBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcbiAgICBpZiAodmFsdWVzLmNvbmRpdGlvblZlcnNpb24gPCB0aGlzLmNvbmRpdGlvblZlcnNpb24pIHJldHVybjtcbiAgICB0aGlzLmNvbmRpdGlvblZlcnNpb24gPSB2YWx1ZXMuY29uZGl0aW9uVmVyc2lvbjtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzLnNsaWNlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlcy5jb25kaXRpb25WZXJzaW9uIDwgdGhpcy5jb25kaXRpb25WZXJzaW9uKSByZXR1cm47XG4gICAgICBlbGVtZW50c1tpXS5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlcy5jb25kaXRpb25WZXJzaW9uIDwgdGhpcy5jb25kaXRpb25WZXJzaW9uKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZykge1xuICAgICAgdGhpcy5ydW5WaXNpYmxlQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICAgIHRoaXMucnVuRW5hYmxlQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHJpdmF0ZSBydW5WaXNpYmxlQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLnZpc2libGVJZikgcmV0dXJuO1xuICAgIHZhciBjb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMudmlzaWJsZUlmKTtcbiAgICB0aGlzLnZpc2libGUgPSBjb25kaXRpb25SdW5uZXIucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHJpdmF0ZSBydW5FbmFibGVDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlSWYpIHJldHVybjtcbiAgICB2YXIgY29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLmVuYWJsZUlmKTtcbiAgICB0aGlzLnJlYWRPbmx5ID0gIWNvbmRpdGlvblJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbaV0ub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBkcmFnRHJvcEFkZFRhcmdldChkcmFnRHJvcEluZm86IERyYWdEcm9wSW5mbykge1xuICAgIHZhciBwcmV2Um93ID0gdGhpcy5kcmFnRHJvcEZpbmRSb3coZHJhZ0Ryb3BJbmZvLnRhcmdldCk7XG4gICAgaWYgKHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb1JvdyhkcmFnRHJvcEluZm8sIHByZXZSb3cpKSB7XG4gICAgICB0aGlzLnVwZGF0ZVJvd3NSZW1vdmVFbGVtZW50RnJvbVJvdyhkcmFnRHJvcEluZm8udGFyZ2V0LCBwcmV2Um93KTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGRyYWdEcm9wRmluZFJvdyhmaW5kRWxlbWVudDogSVN1cnZleUVsZW1lbnQpOiBRdWVzdGlvblJvd01vZGVsIHtcbiAgICBpZiAoIWZpbmRFbGVtZW50IHx8IGZpbmRFbGVtZW50LmlzUGFnZSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGVsZW1lbnQgPSA8SUVsZW1lbnQ+ZmluZEVsZW1lbnQ7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocm93c1tpXS5lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpID4gLTEpIHJldHVybiByb3dzW2ldO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwbmwgPSB0aGlzLmVsZW1lbnRzW2ldLmdldFBhbmVsKCk7XG4gICAgICBpZiAoIXBubCkgY29udGludWU7XG4gICAgICB2YXIgcm93ID0gKDxQYW5lbE1vZGVsQmFzZT5wbmwpLmRyYWdEcm9wRmluZFJvdyhlbGVtZW50KTtcbiAgICAgIGlmICghIXJvdykgcmV0dXJuIHJvdztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcEFkZFRhcmdldFRvUm93KFxuICAgIGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvLFxuICAgIHByZXZSb3c6IFF1ZXN0aW9uUm93TW9kZWxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFkcmFnRHJvcEluZm8uZGVzdGluYXRpb24pIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9FbXB0eVBhbmVsKGRyYWdEcm9wSW5mbykpIHJldHVybiB0cnVlO1xuICAgIHZhciBkZXN0ID0gZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uO1xuICAgIHZhciBkZXN0Um93ID0gdGhpcy5kcmFnRHJvcEZpbmRSb3coZGVzdCk7XG4gICAgaWYgKCFkZXN0Um93KSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIWRyYWdEcm9wSW5mby50YXJnZXQuc3RhcnRXaXRoTmV3TGluZSlcbiAgICAgIHJldHVybiB0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9FeGlzdGluZ1JvdyhcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLFxuICAgICAgICBkZXN0Um93LFxuICAgICAgICBwcmV2Um93XG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9OZXdSb3coZHJhZ0Ryb3BJbmZvLCBkZXN0Um93LCBwcmV2Um93KTtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQWRkVGFyZ2V0VG9FbXB0eVBhbmVsKGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvKTogYm9vbGVhbiB7XG4gICAgaWYgKGRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbi5pc1BhZ2UpIHtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb0VtcHR5UGFuZWxDb3JlKFxuICAgICAgICB0aGlzLnJvb3QsXG4gICAgICAgIGRyYWdEcm9wSW5mby50YXJnZXQsXG4gICAgICAgIGRyYWdEcm9wSW5mby5pc0JvdHRvbVxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgZGVzdCA9IDxJRWxlbWVudD5kcmFnRHJvcEluZm8uZGVzdGluYXRpb247XG4gICAgaWYgKGRlc3QuaXNQYW5lbCAmJiAhZHJhZ0Ryb3BJbmZvLmlzRWRnZSkge1xuICAgICAgdmFyIHBhbmVsID0gPFBhbmVsTW9kZWxCYXNlPig8YW55PmRlc3QpO1xuICAgICAgaWYgKFxuICAgICAgICBkcmFnRHJvcEluZm8ubmVzdGVkUGFuZWxEZXB0aCA8IDAgfHxcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLm5lc3RlZFBhbmVsRGVwdGggPj0gcGFuZWwuZGVwdGhcbiAgICAgICkge1xuICAgICAgICB0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9FbXB0eVBhbmVsQ29yZShcbiAgICAgICAgICA8UGFuZWxNb2RlbEJhc2U+KDxhbnk+ZGVzdCksXG4gICAgICAgICAgZHJhZ0Ryb3BJbmZvLnRhcmdldCxcbiAgICAgICAgICBkcmFnRHJvcEluZm8uaXNCb3R0b21cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQWRkVGFyZ2V0VG9FeGlzdGluZ1JvdyhcbiAgICBkcmFnRHJvcEluZm86IERyYWdEcm9wSW5mbyxcbiAgICBkZXN0Um93OiBRdWVzdGlvblJvd01vZGVsLFxuICAgIHByZXZSb3c6IFF1ZXN0aW9uUm93TW9kZWxcbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIGluZGV4ID0gZGVzdFJvdy5lbGVtZW50cy5pbmRleE9mKDxJRWxlbWVudD5kcmFnRHJvcEluZm8uZGVzdGluYXRpb24pO1xuICAgIGlmIChcbiAgICAgIGluZGV4ID09IDAgJiZcbiAgICAgICFkcmFnRHJvcEluZm8uaXNCb3R0b20gJiZcbiAgICAgIGRlc3RSb3cuZWxlbWVudHNbMF0uc3RhcnRXaXRoTmV3TGluZVxuICAgICkge1xuICAgICAgaWYgKGRlc3RSb3cuaW5kZXggPiAwKSB7XG4gICAgICAgIGRyYWdEcm9wSW5mby5pc0JvdHRvbSA9IHRydWU7XG4gICAgICAgIGRlc3RSb3cgPSBkZXN0Um93LnBhbmVsLnJvd3NbZGVzdFJvdy5pbmRleCAtIDFdO1xuICAgICAgICBkcmFnRHJvcEluZm8uZGVzdGluYXRpb24gPVxuICAgICAgICAgIGRlc3RSb3cuZWxlbWVudHNbZGVzdFJvdy5lbGVtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb0V4aXN0aW5nUm93KFxuICAgICAgICAgIGRyYWdEcm9wSW5mbyxcbiAgICAgICAgICBkZXN0Um93LFxuICAgICAgICAgIHByZXZSb3dcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9OZXdSb3coZHJhZ0Ryb3BJbmZvLCBkZXN0Um93LCBwcmV2Um93KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHByZXZSb3dJbmRleCA9IC0xO1xuICAgIGlmIChwcmV2Um93ID09IGRlc3RSb3cpIHtcbiAgICAgIHByZXZSb3dJbmRleCA9IGRlc3RSb3cuZWxlbWVudHMuaW5kZXhPZihkcmFnRHJvcEluZm8udGFyZ2V0KTtcbiAgICB9XG4gICAgaWYgKGRyYWdEcm9wSW5mby5pc0JvdHRvbSkgaW5kZXgrKztcbiAgICB2YXIgc3JjUm93ID0gdGhpcy5maW5kUm93QnlFbGVtZW50KGRyYWdEcm9wSW5mby5zb3VyY2UpO1xuICAgIGlmIChcbiAgICAgIHNyY1JvdyA9PSBkZXN0Um93ICYmXG4gICAgICBzcmNSb3cuZWxlbWVudHMuaW5kZXhPZihkcmFnRHJvcEluZm8uc291cmNlKSA9PSBpbmRleFxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaW5kZXggPT0gcHJldlJvd0luZGV4KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHByZXZSb3dJbmRleCA+IC0xKSB7XG4gICAgICBkZXN0Um93LmVsZW1lbnRzLnNwbGljZShwcmV2Um93SW5kZXgsIDEpO1xuICAgICAgaWYgKHByZXZSb3dJbmRleCA8IGluZGV4KSBpbmRleC0tO1xuICAgIH1cbiAgICBkZXN0Um93LmVsZW1lbnRzLnNwbGljZShpbmRleCwgMCwgZHJhZ0Ryb3BJbmZvLnRhcmdldCk7XG4gICAgZGVzdFJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgcmV0dXJuIHByZXZSb3dJbmRleCA8IDA7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcEFkZFRhcmdldFRvTmV3Um93KFxuICAgIGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvLFxuICAgIGRlc3RSb3c6IFF1ZXN0aW9uUm93TW9kZWwsXG4gICAgcHJldlJvdzogUXVlc3Rpb25Sb3dNb2RlbFxuICApOiBib29sZWFuIHtcbiAgICB2YXIgdGFyZ2V0Um93ID0gZGVzdFJvdy5wYW5lbC5jcmVhdGVSb3coKTtcbiAgICB0YXJnZXRSb3cuYWRkRWxlbWVudChkcmFnRHJvcEluZm8udGFyZ2V0KTtcbiAgICB2YXIgaW5kZXggPSBkZXN0Um93LmluZGV4O1xuICAgIGlmIChkcmFnRHJvcEluZm8uaXNCb3R0b20pIHtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuICAgIC8vc2FtZSByb3dcbiAgICBpZiAoISFwcmV2Um93ICYmIHByZXZSb3cucGFuZWwgPT0gdGFyZ2V0Um93LnBhbmVsICYmIHByZXZSb3cuaW5kZXggPT0gaW5kZXgpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHNyY1JvdyA9IHRoaXMuZmluZFJvd0J5RWxlbWVudChkcmFnRHJvcEluZm8uc291cmNlKTtcbiAgICBpZiAoXG4gICAgICAhIXNyY1JvdyAmJlxuICAgICAgc3JjUm93LnBhbmVsID09IHRhcmdldFJvdy5wYW5lbCAmJlxuICAgICAgc3JjUm93LmVsZW1lbnRzLmxlbmd0aCA9PSAxICYmXG4gICAgICBzcmNSb3cuaW5kZXggPT0gaW5kZXhcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgZGVzdFJvdy5wYW5lbC5yb3dzLnNwbGljZShpbmRleCwgMCwgdGFyZ2V0Um93KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQWRkVGFyZ2V0VG9FbXB0eVBhbmVsQ29yZShcbiAgICBwYW5lbDogUGFuZWxNb2RlbEJhc2UsXG4gICAgdGFyZ2V0OiBJRWxlbWVudCxcbiAgICBpc0JvdHRvbTogYm9vbGVhblxuICApIHtcbiAgICB2YXIgdGFyZ2V0Um93ID0gcGFuZWwuY3JlYXRlUm93KCk7XG4gICAgdGFyZ2V0Um93LmFkZEVsZW1lbnQodGFyZ2V0KTtcbiAgICBpZiAocGFuZWwuZWxlbWVudHMubGVuZ3RoID09IDAgfHwgaXNCb3R0b20pIHtcbiAgICAgIHBhbmVsLnJvd3MucHVzaCh0YXJnZXRSb3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYW5lbC5yb3dzLnNwbGljZSgwLCAwLCB0YXJnZXRSb3cpO1xuICAgIH1cbiAgfVxuICBkcmFnRHJvcE1vdmVFbGVtZW50KHNyYzogSUVsZW1lbnQsIHRhcmdldDogSUVsZW1lbnQsIHRhcmdldEluZGV4OiBudW1iZXIpIHtcbiAgICB2YXIgc3JjSW5kZXggPSAoPFBhbmVsTW9kZWxCYXNlPnNyYy5wYXJlbnQpLmVsZW1lbnRzLmluZGV4T2Yoc3JjKTtcbiAgICBpZiAodGFyZ2V0SW5kZXggPiBzcmNJbmRleCkge1xuICAgICAgdGFyZ2V0SW5kZXgtLTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVFbGVtZW50KHNyYyk7XG4gICAgdGhpcy5hZGRFbGVtZW50KHRhcmdldCwgdGFyZ2V0SW5kZXgpO1xuICB9XG59XG5cbi8qKlxuICogQSBjb250YWluZXIgZWxlbWVudCwgc2ltaWxhciB0byB0aGUgUGFnZSBvYmplY3RzLiBIb3dldmVyLCB1bmxpa2UgdGhlIFBhZ2UsIFBhbmVsIGNhbid0IGJlIGEgcm9vdC5cbiAqIEl0IG1heSBjb250YWluIHF1ZXN0aW9ucyBhbmQgb3RoZXIgcGFuZWxzLlxuICovXG5leHBvcnQgY2xhc3MgUGFuZWxNb2RlbCBleHRlbmRzIFBhbmVsTW9kZWxCYXNlIGltcGxlbWVudHMgSUVsZW1lbnQge1xuICBzdGF0ZUNoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZyA9IFwiXCIpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInN0YXRlXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuc3RhdGVDaGFuZ2VkQ2FsbGJhY2spIHNlbGYuc3RhdGVDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwid2lkdGhcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoISFzZWxmLnBhcmVudCkge1xuICAgICAgICBzZWxmLnBhcmVudC5lbGVtZW50V2lkdGhDaGFuZ2VkKHNlbGYpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcImluZGVudFwiLCBcImlubmVySW5kZW50XCIsIFwicmlnaHRJbmRlbnRcIl0sXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5vbkluZGVudENoYW5nZWQoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicGFuZWxcIjtcbiAgfVxuICBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5vbkluZGVudENoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIHBhZ2Ugd2hlcmUgdGhlIHBhbmVsIGlzIGxvY2F0ZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhZ2UoKTogSVBhZ2Uge1xuICAgIHJldHVybiB0aGlzLmdldFBhZ2UodGhpcy5wYXJlbnQpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFnZSh2YWw6IElQYWdlKSB7XG4gICAgdGhpcy5zZXRQYWdlKHRoaXMucGFyZW50LCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBcImNvbGxhcHNlZFwiIHRvIHJlbmRlciBvbmx5IFBhbmVsIHRpdGxlIGFuZCBleHBhbmRlZCBidXR0b24gYW5kIHRvIFwiZXhwYW5kZWRcIiB0byByZW5kZXIgdGhlIGNvbGxhcHNlZCBidXR0b24gaW4gdGhlIFBhbmVsIGNhcHRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3RhdGVcIiwgXCJkZWZhdWx0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RhdGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzdGF0ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFBhbmVsIGlzIGluIHRoZSBjb2xsYXBzZWQgc3RhdGVcbiAgICogQHNlZSBzdGF0ZVxuICAgKiBAc2VlIGNvbGxhcHNlXG4gICAqIEBzZWUgaXNFeHBhbmRlZFxuICAgKi9cbiAgcHVibGljIGdldCBpc0NvbGxhcHNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PSBcImNvbGxhcHNlZFwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFBhbmVsIGlzIGluIHRoZSBleHBhbmRlZCBzdGF0ZVxuICAgKiBAc2VlIHN0YXRlXG4gICAqIEBzZWUgZXhwYW5kXG4gICAqIEBzZWUgaXNDb2xsYXBzZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNFeHBhbmRlZCgpIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PSBcImV4cGFuZGVkXCI7XG4gIH1cbiAgLyoqXG4gICAqIENvbGxhcHNlIHRoZSBQYW5lbFxuICAgKiBAc2VlIHN0YXRlXG4gICAqL1xuICBwdWJsaWMgY29sbGFwc2UoKSB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgdGhpcy5zdGF0ZSA9IFwiY29sbGFwc2VkXCI7XG4gIH1cbiAgLyoqXG4gICAqIEV4cGFuZCB0aGUgUGFuZWxcbiAgICogQHNlZSBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGV4cGFuZCgpIHtcbiAgICB0aGlzLnN0YXRlID0gXCJleHBhbmRlZFwiO1xuICB9XG4gIHByb3RlY3RlZCBoYXNFcnJvcnNDb3JlKHJlYzogYW55KSB7XG4gICAgc3VwZXIuaGFzRXJyb3JzQ29yZShyZWMpO1xuICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkICYmIHJlYy5yZXN1bHQgJiYgcmVjLmZpcmVDYWxsYmFjaykge1xuICAgICAgdGhpcy5leHBhbmQoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldFJlbmRlcmVkVGl0bGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghc3RyKSB7XG4gICAgICBpZiAodGhpcy5pc0NvbGxhcHNlZCB8fCB0aGlzLmlzRXhwYW5kZWQpIHJldHVybiB0aGlzLm5hbWU7XG4gICAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybiBcIltcIiArIHRoaXMubmFtZSArIFwiXVwiO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuZ2V0UmVuZGVyZWRUaXRsZShzdHIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgUGFuZWwgd2lkdGguXG4gICAqL1xuICBwdWJsaWMgZ2V0IHdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIndpZHRoXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgd2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGVmdCBpbmRlbnQuIFNldCB0aGlzIHByb3BlcnR5IHRvIGluY3JlYXNlIHRoZSBwYW5lbCBsZWZ0IGluZGVudC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5kZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImluZGVudFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluZGVudCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImluZGVudFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW5uZXIgaW5kZW50LiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBpbmNyZWFzZSB0aGUgcGFuZWwgY29udGVudCBtYXJnaW4uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlubmVySW5kZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlubmVySW5kZW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5uZXJJbmRlbnQodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbm5lckluZGVudFwiLCB2YWwpO1xuICB9XG4gIGdldCByZW5kZXJXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJXaWR0aFwiKTtcbiAgfVxuICBzZXQgcmVuZGVyV2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJXaWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgUGFuZWwgcmVuZGVycyBvbiB0aGUgbmV3IGxpbmUgaWYgdGhlIHByb3BlcnR5IGlzIHRydWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBmYWxzZSwgdGhlIHBhbmVsIHRyaWVzIHRvIHJlbmRlciBvbiB0aGUgc2FtZSBsaW5lL3JvdyB3aXRoIGEgcHJldmlvdXMgcXVlc3Rpb24vcGFuZWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXJ0V2l0aE5ld0xpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN0YXJ0V2l0aE5ld0xpbmVcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzdGFydFdpdGhOZXdMaW5lKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3RhcnRXaXRoTmV3TGluZVwiLCB2YWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSByaWdodCBpbmRlbnQgb2YgdGhlIFBhbmVsLlxuICAgKi9cbiAgcHVibGljIGdldCByaWdodEluZGVudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyaWdodEluZGVudFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJpZ2h0SW5kZW50KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmlnaHRJbmRlbnRcIiwgdmFsKTtcbiAgfVxuICBnZXQgcGFkZGluZ0xlZnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZ0xlZnRcIiwgXCJcIik7XG4gIH1cbiAgc2V0IHBhZGRpbmdMZWZ0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZ0xlZnRcIiwgdmFsKTtcbiAgfVxuICBnZXQgaW5uZXJQYWRkaW5nTGVmdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbm5lclBhZGRpbmdMZWZ0XCIsIFwiXCIpO1xuICB9XG4gIHNldCBpbm5lclBhZGRpbmdMZWZ0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW5uZXJQYWRkaW5nTGVmdFwiLCB2YWwpO1xuICB9XG4gIGdldCBwYWRkaW5nUmlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZ1JpZ2h0XCIsIFwiXCIpO1xuICB9XG4gIHNldCBwYWRkaW5nUmlnaHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nUmlnaHRcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIG9uSW5kZW50Q2hhbmdlZCgpIHtcbiAgICB0aGlzLmlubmVyUGFkZGluZ0xlZnQgPSB0aGlzLmdldEluZGVudFNpemUodGhpcy5pbm5lckluZGVudCk7XG4gICAgdGhpcy5wYWRkaW5nTGVmdCA9IHRoaXMuZ2V0SW5kZW50U2l6ZSh0aGlzLmluZGVudCk7XG4gICAgdGhpcy5wYWRkaW5nUmlnaHQgPSB0aGlzLmdldEluZGVudFNpemUodGhpcy5yaWdodEluZGVudCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRJbmRlbnRTaXplKGluZGVudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoaW5kZW50IDwgMSkgcmV0dXJuIFwiXCI7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHJldHVybiBcIlwiO1xuICAgIHZhciBjc3MgPSAoPGFueT50aGlzKS5zdXJ2ZXlbXCJjc3NcIl07XG4gICAgaWYgKCFjc3MpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiBpbmRlbnQgKiBjc3MucXVlc3Rpb24uaW5kZW50ICsgXCJweFwiO1xuICB9XG4gIHByb3RlY3RlZCBvblZpc2libGVDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdGhpcy5pc1Zpc2libGUpO1xuICAgIGlmICh0aGlzLnN1cnZleSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnN1cnZleS5wYW5lbFZpc2liaWxpdHlDaGFuZ2VkKHRoaXMsIHRoaXMudmlzaWJsZSk7XG4gICAgfVxuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicGFuZWxiYXNlXCIsXG4gIFtcbiAgICBcIm5hbWVcIixcbiAgICB7XG4gICAgICBuYW1lOiBcImVsZW1lbnRzXCIsXG4gICAgICBhbHRlcm5hdGl2ZU5hbWU6IFwicXVlc3Rpb25zXCIsXG4gICAgICBiYXNlQ2xhc3NOYW1lOiBcInF1ZXN0aW9uXCIsXG4gICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgIGlzTGlnaHRTZXJpYWxpemFibGU6IGZhbHNlXG4gICAgfSxcbiAgICB7IG5hbWU6IFwidmlzaWJsZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBcInZpc2libGVJZjpjb25kaXRpb25cIixcbiAgICBcImVuYWJsZUlmOmNvbmRpdGlvblwiLFxuICAgIFwicmVhZE9ubHk6Ym9vbGVhblwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIsIFwiaGlkZGVuXCJdXG4gICAgfSxcbiAgICB7IG5hbWU6IFwidGl0bGVcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RpdGxlXCIgfSxcbiAgICB7IG5hbWU6IFwiZGVzY3JpcHRpb246dGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jRGVzY3JpcHRpb25cIiB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUGFuZWxNb2RlbEJhc2UoKTtcbiAgfVxuKTtcblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJwYW5lbFwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJzdGF0ZVwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIFwiY29sbGFwc2VkXCIsIFwiZXhwYW5kZWRcIl1cbiAgICB9LFxuICAgIFwiaXNSZXF1aXJlZDpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJyZXF1aXJlZEVycm9yVGV4dDp0ZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUmVxdWlyZWRFcnJvclRleHRcIlxuICAgIH0sXG4gICAgeyBuYW1lOiBcInN0YXJ0V2l0aE5ld0xpbmU6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcImlubmVySW5kZW50Om51bWJlclwiLCBkZWZhdWx0OiAwLCBjaG9pY2VzOiBbMCwgMSwgMiwgM10gfSxcbiAgICB7IG5hbWU6IFwiaW5kZW50Om51bWJlclwiLCBkZWZhdWx0OiAwLCBjaG9pY2VzOiBbMCwgMSwgMiwgM10gfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInBhZ2VcIixcbiAgICAgIGlzU2VyaWFsaXphYmxlOiBmYWxzZSxcbiAgICAgIGNob2ljZXM6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHZhciBzdXJ2ZXkgPSBvYmogPyBvYmouc3VydmV5IDogbnVsbDtcbiAgICAgICAgcmV0dXJuIHN1cnZleVxuICAgICAgICAgID8gc3VydmV5LnBhZ2VzLm1hcCgocDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBwLm5hbWUsIHRleHQ6IHAudGl0bGUgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiBbXTtcbiAgICAgIH1cbiAgICB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUGFuZWxNb2RlbCgpO1xuICB9LFxuICBcInBhbmVsYmFzZVwiXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BhbmVsLnRzIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFN1cnZleUVycm9yLCBJU3VydmV5SW1wbCB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgSGVscGVycywgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgT3RoZXJFbXB0eUVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IENob2ljZXNSZXN0ZnVsbCB9IGZyb20gXCIuL2Nob2ljZXNSZXN0ZnVsbFwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgQ29uZGl0aW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuaW1wb3J0IHsgdHVya2lzaFN1cnZleVN0cmluZ3MgfSBmcm9tIFwiLi9sb2NhbGl6YXRpb24vdHVya2lzaFwiO1xuaW1wb3J0IHsgYmFzZW5hbWUgfSBmcm9tIFwicGF0aFwiO1xuXG4vKipcbiAqIEl0IGlzIGEgYmFzZSBjbGFzcyBmb3IgY2hlY2tib3gsIGRyb3Bkb3duIGFuZCByYWRpb2dyb3VwIHF1ZXN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uU2VsZWN0QmFzZSBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgcHJpdmF0ZSBmaWx0ZXJlZENob2ljZXNWYWx1ZTogQXJyYXk8SXRlbVZhbHVlPiA9IG51bGw7XG4gIHByaXZhdGUgY29uZGl0aW9uQ2hvaWNlc1Zpc2libGVJZlJ1bm5lcjogQ29uZGl0aW9uUnVubmVyO1xuICBwcml2YXRlIGNvbmRpdGlvbkNob2ljZXNFbmFibGVJZlJ1bm5lcjogQ29uZGl0aW9uUnVubmVyO1xuICBwcml2YXRlIGNvbW1lbnRWYWx1ZTogc3RyaW5nO1xuICBwcml2YXRlIHByZXZDb21tZW50VmFsdWU6IHN0cmluZztcbiAgcHJpdmF0ZSBvdGhlckl0ZW1WYWx1ZTogSXRlbVZhbHVlID0gbmV3IEl0ZW1WYWx1ZShcIm90aGVyXCIpO1xuICBwcml2YXRlIGNob2ljZXNGcm9tVXJsOiBBcnJheTxJdGVtVmFsdWU+ID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzOiBhbnkgPSBudWxsO1xuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gZmlsbCB0aGUgY2hvaWNlcyBmcm9tIGEgcmVzdGZ1bCBzZXJ2aWNlLlxuICAgKiBAc2VlIGNob2ljZXNcbiAgICovXG4gIHB1YmxpYyBjaG9pY2VzQnlVcmw6IENob2ljZXNSZXN0ZnVsbDtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuY2hvaWNlcyA9IHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcImNob2ljZXNcIik7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImNob2ljZXNcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIXNlbGYuZmlsdGVySXRlbXMoKSkge1xuICAgICAgICBzZWxmLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgIFwiaGlkZUlmQ2hvaWNlc0VtcHR5XCIsXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi51cGRhdGVWaXNpYmlsaXR5QmFzZWRPbkNob2ljZXMoKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJ2aXNpYmxlQ2hvaWNlc1wiKTtcbiAgICB0aGlzLmNob2ljZXNCeVVybCA9IHRoaXMuY3JlYXRlUmVzdGZ1bGwoKTtcbiAgICB0aGlzLmNob2ljZXNCeVVybC5vd25lciA9IHRoaXM7XG4gICAgdmFyIGxvY090aGVyVGV4dCA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJvdGhlclRleHRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm90aGVyRXJyb3JUZXh0XCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMub3RoZXJJdGVtVmFsdWUubG9jT3duZXIgPSB0aGlzO1xuICAgIHRoaXMub3RoZXJJdGVtVmFsdWUuc2V0TG9jVGV4dChsb2NPdGhlclRleHQpO1xuICAgIGxvY090aGVyVGV4dC5vbkdldFRleHRDYWxsYmFjayA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgIHJldHVybiAhIXRleHQgPyB0ZXh0IDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm90aGVySXRlbVRleHRcIik7XG4gICAgfTtcbiAgICB0aGlzLmNob2ljZXNCeVVybC5nZXRSZXN1bHRDYWxsYmFjayA9IGZ1bmN0aW9uKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+KSB7XG4gICAgICBzZWxmLm9uTG9hZENob2ljZXNGcm9tVXJsKGl0ZW1zKTtcbiAgICB9O1xuICAgIHRoaXMuY2hvaWNlc0J5VXJsLnVwZGF0ZVJlc3VsdENhbGxiYWNrID0gZnVuY3Rpb24oXG4gICAgICBpdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICAgIHNlcnZlclJlc3VsdDogYW55XG4gICAgKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgICBpZiAoc2VsZi5zdXJ2ZXkpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuc3VydmV5LnVwZGF0ZUNob2ljZXNGcm9tU2VydmVyKHNlbGYsIGl0ZW1zLCBzZXJ2ZXJSZXN1bHQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH07XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm90aGVyUGxhY2VIb2xkZXJcIiwgdGhpcyk7XG4gIH1cbiAgaXNMYXlvdXRUeXBlU3VwcG9ydGVkKGxheW91dFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvdGhlciBpdGVtLiBCeSB1c2luZyB0aGlzIHByb3BlcnR5LCB5b3UgbWF5IGNoYW5nZSBwcm9ncmFtbWF0aWNhbGx5IGl0J3MgdmFsdWUgYW5kIHRleHQuXG4gICAqIEBzZWUgaGFzT3RoZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgb3RoZXJJdGVtKCk6IEl0ZW1WYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMub3RoZXJJdGVtVmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhIHVzZXIgc2VsZWN0IHRoZSAnb3RoZXInIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzT3RoZXJTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNPdGhlciAmJiB0aGlzLmdldEhhc090aGVyKHRoaXMucmVuZGVyZWRWYWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIEl0IHJ1bnMgYWdhaW5zdCBlYWNoIGNob2ljZXMgaXRlbSBhbmQgaWYgZm9yIHRoaXMgaXRlbSBpdCByZXR1cm5zIHRydWUsIHRoZW4gdGhlIGl0ZW0gaXMgdmlzaWJsZSBvdGhlcndpc2UgdGhlIGl0ZW0gYmVjb21lcyBpbnZpc2libGUuIFBsZWFzZSB1c2Uge2l0ZW19IHRvIGdldCB0aGUgY3VycmVudCBpdGVtIHZhbHVlIGluIHRoZSBleHByZXNzaW9uLlxuICAgKiBAc2VlIHZpc2libGVJZlxuICAgKiBAc2VlIGNob2ljZXNFbmFibGVJZlxuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzVmlzaWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNWaXNpYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzVmlzaWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1Zpc2libGVJZlwiLCB2YWwpO1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgfVxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSXQgcnVucyBhZ2FpbnN0IGVhY2ggY2hvaWNlcyBpdGVtIGFuZCBpZiBmb3IgdGhpcyBpdGVtIGl0IHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgaXRlbSBpcyBlbmFibGVkIG90aGVyd2lzZSB0aGUgaXRlbSBiZWNvbWVzIGRpc2FibGVkLiBQbGVhc2UgdXNlIHtpdGVtfSB0byBnZXQgdGhlIGN1cnJlbnQgaXRlbSB2YWx1ZSBpbiB0aGUgZXhwcmVzc2lvbi5cbiAgICogQHNlZSBjaG9pY2VzVmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXNFbmFibGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzRW5hYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzRW5hYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzRW5hYmxlSWZcIiwgdmFsKTtcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMucnVuSXRlbXNFbmFibGVDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB0aGlzLnJ1bkl0ZW1zQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgaXNTZXR0aW5nRGVmYXVsdFZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZXREZWZhdWx0VmFsdWUoKSB7XG4gICAgdGhpcy5pc1NldHRpbmdEZWZhdWx0VmFsdWUgPVxuICAgICAgIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFZhbHVlKSAmJlxuICAgICAgdGhpcy5oYXNVbmtub3duVmFsdWUodGhpcy5kZWZhdWx0VmFsdWUpO1xuICAgIHN1cGVyLnNldERlZmF1bHRWYWx1ZSgpO1xuICAgIHRoaXMuaXNTZXR0aW5nRGVmYXVsdFZhbHVlID0gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGZpbHRlckl0ZW1zKCk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHxcbiAgICAgICF0aGlzLmRhdGEgfHxcbiAgICAgIHRoaXMuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmdldERhdGFGaWx0ZXJlZFZhbHVlcygpO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgdGhpcy5ydW5JdGVtc0VuYWJsZUNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHJldHVybiB0aGlzLnJ1bkl0ZW1zQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHJvdGVjdGVkIHJ1bkl0ZW1zQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKTogYm9vbGVhbiB7XG4gICAgdGhpcy5zZXRDb25kaXRpb25hbENob2ljZXNSdW5uZXIoKTtcbiAgICB2YXIgaGFzQ2hhbmdlcyA9IHRoaXMucnVuQ29uZGl0aW9uc0Zvckl0ZW1zKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgaWYgKFxuICAgICAgISF0aGlzLmZpbHRlcmVkQ2hvaWNlc1ZhbHVlICYmXG4gICAgICB0aGlzLmZpbHRlcmVkQ2hvaWNlc1ZhbHVlLmxlbmd0aCA9PT0gdGhpcy5hY3RpdmVDaG9pY2VzLmxlbmd0aFxuICAgICkge1xuICAgICAgdGhpcy5maWx0ZXJlZENob2ljZXNWYWx1ZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChoYXNDaGFuZ2VzKSB7XG4gICAgICBpZiAoISF0aGlzLmZpbHRlcmVkQ2hvaWNlc1ZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0NoYW5nZXM7XG4gIH1cbiAgcHJvdGVjdGVkIHJ1bkl0ZW1zRW5hYmxlQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKTogYW55IHtcbiAgICB0aGlzLnNldENvbmRpdGlvbmFsRW5hYmxlQ2hvaWNlc1J1bm5lcigpO1xuICAgIHZhciBoYXNDaGFuZ2VkID0gSXRlbVZhbHVlLnJ1bkVuYWJsZWRDb25kaXRpb25zRm9ySXRlbXMoXG4gICAgICB0aGlzLmFjdGl2ZUNob2ljZXMsXG4gICAgICB0aGlzLmNvbmRpdGlvbkNob2ljZXNFbmFibGVJZlJ1bm5lcixcbiAgICAgIHZhbHVlcyxcbiAgICAgIHByb3BlcnRpZXNcbiAgICApO1xuICAgIGlmIChoYXNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLmNsZWFyRGlzYWJsZWRWYWx1ZXMoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzZXRDb25kaXRpb25hbENob2ljZXNSdW5uZXIoKSB7XG4gICAgaWYgKHRoaXMuY2hvaWNlc1Zpc2libGVJZikge1xuICAgICAgaWYgKCF0aGlzLmNvbmRpdGlvbkNob2ljZXNWaXNpYmxlSWZSdW5uZXIpIHtcbiAgICAgICAgdGhpcy5jb25kaXRpb25DaG9pY2VzVmlzaWJsZUlmUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcihcbiAgICAgICAgICB0aGlzLmNob2ljZXNWaXNpYmxlSWZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uZGl0aW9uQ2hvaWNlc1Zpc2libGVJZlJ1bm5lci5leHByZXNzaW9uID0gdGhpcy5jaG9pY2VzVmlzaWJsZUlmO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbmRpdGlvbkNob2ljZXNWaXNpYmxlSWZSdW5uZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHNldENvbmRpdGlvbmFsRW5hYmxlQ2hvaWNlc1J1bm5lcigpIHtcbiAgICBpZiAodGhpcy5jaG9pY2VzRW5hYmxlSWYpIHtcbiAgICAgIGlmICghdGhpcy5jb25kaXRpb25DaG9pY2VzRW5hYmxlSWZSdW5uZXIpIHtcbiAgICAgICAgdGhpcy5jb25kaXRpb25DaG9pY2VzRW5hYmxlSWZSdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKFxuICAgICAgICAgIHRoaXMuY2hvaWNlc0VuYWJsZUlmXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbmRpdGlvbkNob2ljZXNFbmFibGVJZlJ1bm5lci5leHByZXNzaW9uID0gdGhpcy5jaG9pY2VzRW5hYmxlSWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZGl0aW9uQ2hvaWNlc0VuYWJsZUlmUnVubmVyID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBydW5Db25kaXRpb25zRm9ySXRlbXMoXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApOiBib29sZWFuIHtcbiAgICB0aGlzLmZpbHRlcmVkQ2hvaWNlc1ZhbHVlID0gW107XG4gICAgcmV0dXJuIEl0ZW1WYWx1ZS5ydW5Db25kaXRpb25zRm9ySXRlbXMoXG4gICAgICB0aGlzLmFjdGl2ZUNob2ljZXMsXG4gICAgICB0aGlzLmZpbHRlcmVkQ2hvaWNlcyxcbiAgICAgIHRoaXMuY29uZGl0aW9uQ2hvaWNlc1Zpc2libGVJZlJ1bm5lcixcbiAgICAgIHZhbHVlcyxcbiAgICAgIHByb3BlcnRpZXNcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBnZXRIYXNPdGhlcih2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWwgPT09IHRoaXMub3RoZXJJdGVtLnZhbHVlO1xuICB9XG4gIGdldCB2YWxpZGF0ZWRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnJlbmRyZWRWYWx1ZVRvRGF0YUNvcmUodGhpcy52YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVJlc3RmdWxsKCk6IENob2ljZXNSZXN0ZnVsbCB7XG4gICAgcmV0dXJuIG5ldyBDaG9pY2VzUmVzdGZ1bGwoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29tbWVudCgpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMuY29tbWVudFZhbHVlKSByZXR1cm4gdGhpcy5jb21tZW50VmFsdWU7XG4gICAgaWYgKHRoaXMuZ2V0U3RvcmVPdGhlcnNBc0NvbW1lbnQoKSkgcmV0dXJuIHN1cGVyLmdldENvbW1lbnQoKTtcbiAgICByZXR1cm4gdGhpcy5jb21tZW50VmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBpc1NldHRpbmdDb21tZW50OiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZXRDb21tZW50KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpKSBzdXBlci5zZXRDb21tZW50KG5ld1ZhbHVlKTtcbiAgICBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5pc1NldHRpbmdDb21tZW50ICYmIG5ld1ZhbHVlICE9IHRoaXMuY29tbWVudFZhbHVlKSB7XG4gICAgICAgIHRoaXMuaXNTZXR0aW5nQ29tbWVudCA9IHRydWU7XG4gICAgICAgIHRoaXMuY29tbWVudFZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmlzT3RoZXJTZWxlY3RlZCAmJiAhdGhpcy5pc1JlbmRlcmVkVmFsdWVTZXR0aW5nKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMucmVuZHJlZFZhbHVlVG9EYXRhKHRoaXMucmVuZGVyZWRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1NldHRpbmdDb21tZW50ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgcmVuZGVyZWRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJlZFZhbHVlXCIsIG51bGwpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVuZGVyZWRWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcmVkVmFsdWVcIiwgdmFsKTtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5yZW5kcmVkVmFsdWVUb0RhdGEodmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh0aGlzLnZhbHVlLCBuZXdWYWx1ZSkpIHJldHVybjtcbiAgICBzdXBlci5zZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJlZFZhbHVlXCIsIHRoaXMucmVuZHJlZFZhbHVlRnJvbURhdGEobmV3VmFsdWUpKTtcbiAgICB2YXIgaXNPdGhlclNlbCA9IHRoaXMuaXNPdGhlclNlbGVjdGVkO1xuICAgIGlmIChpc090aGVyU2VsICYmICEhdGhpcy5wcmV2Q29tbWVudFZhbHVlKSB7XG4gICAgICB2YXIgb2xkQ29tbWVudCA9IHRoaXMucHJldkNvbW1lbnRWYWx1ZTtcbiAgICAgIHRoaXMucHJldkNvbW1lbnRWYWx1ZSA9IFwiXCI7XG4gICAgICB0aGlzLmNvbW1lbnQgPSBvbGRDb21tZW50O1xuICAgIH1cbiAgICBpZiAoIWlzT3RoZXJTZWwgJiYgISF0aGlzLmNvbW1lbnQpIHtcbiAgICAgIGlmICh0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkpIHtcbiAgICAgICAgdGhpcy5wcmV2Q29tbWVudFZhbHVlID0gdGhpcy5jb21tZW50O1xuICAgICAgfVxuICAgICAgdGhpcy5jb21tZW50ID0gXCJcIjtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHNldE5ld1ZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBuZXdWYWx1ZSA9IHRoaXMudmFsdWVGcm9tRGF0YShuZXdWYWx1ZSk7XG4gICAgaWYgKFxuICAgICAgKCF0aGlzLmNob2ljZXNCeVVybC5pc1J1bm5pbmcgJiZcbiAgICAgICAgIXRoaXMuY2hvaWNlc0J5VXJsLmlzV2FpdGluZ0ZvclBhcmFtZXRlcnMpIHx8XG4gICAgICAhdGhpcy5pc1ZhbHVlRW1wdHkobmV3VmFsdWUpXG4gICAgKSB7XG4gICAgICB0aGlzLmNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHMgPSBuZXdWYWx1ZTtcbiAgICB9XG4gICAgc3VwZXIuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCB2YWx1ZUZyb21EYXRhKHZhbDogYW55KTogYW55IHtcbiAgICBsZXQgY2hvaWNlaXRlbSA9IEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZSh0aGlzLmNob2ljZXMsIHZhbCk7XG4gICAgaWYgKCEhY2hvaWNlaXRlbSkge1xuICAgICAgcmV0dXJuIGNob2ljZWl0ZW0udmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci52YWx1ZUZyb21EYXRhKHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRyZWRWYWx1ZUZyb21EYXRhKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpKSByZXR1cm4gdmFsO1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVkVmFsdWVGcm9tRGF0YUNvcmUodmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZHJlZFZhbHVlVG9EYXRhKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpKSByZXR1cm4gdmFsO1xuICAgIHJldHVybiB0aGlzLnJlbmRyZWRWYWx1ZVRvRGF0YUNvcmUodmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyZWRWYWx1ZUZyb21EYXRhQ29yZSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmhhc1Vua25vd25WYWx1ZSh2YWwsIHRydWUpKSByZXR1cm4gdGhpcy52YWx1ZUZyb21EYXRhKHZhbCk7XG4gICAgdGhpcy5jb21tZW50ID0gdmFsO1xuICAgIHJldHVybiB0aGlzLm90aGVySXRlbS52YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZHJlZFZhbHVlVG9EYXRhQ29yZSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKHZhbCA9PSB0aGlzLm90aGVySXRlbS52YWx1ZSAmJiB0aGlzLmdldENvbW1lbnQoKSkge1xuICAgICAgdmFsID0gdGhpcy5nZXRDb21tZW50KCk7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc1Vua25vd25WYWx1ZSh2YWw6IGFueSwgaW5jbHVkZU90aGVyOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpbmNsdWRlT3RoZXIgJiYgdmFsID09IHRoaXMub3RoZXJJdGVtLnZhbHVlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZSh0aGlzLmZpbHRlcmVkQ2hvaWNlcywgdmFsKSA9PSBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBpc1ZhbHVlRGlzYWJsZWQodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICB2YXIgaXRlbVZhbHVlID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHRoaXMuZmlsdGVyZWRDaG9pY2VzLCB2YWwpO1xuICAgIHJldHVybiAhIWl0ZW1WYWx1ZSAmJiAhaXRlbVZhbHVlLmlzRW5hYmxlZDtcbiAgfVxuICAvKipcbiAgICogSWYgdGhlIGNsZWFySW5jb3JyZWN0VmFsdWVzQ2FsbGJhY2sgaXMgc2V0LCBpdCBpcyB1c2VkIHRvIGNsZWFyIGluY29ycnJlY3QgdmFsdWVzIGluc3RlYWQgb2YgZGVmYXVsdCBiZWhhdmlvdXIuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXNDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGl0ZW1zLiBFdmVyeSBpdGVtIGhhcyB2YWx1ZSBhbmQgdGV4dC4gSWYgdGV4dCBpcyBlbXB0eSwgdGhlIHZhbHVlIGlzIHJlbmRlcmVkLiBUaGUgaXRlbSB0ZXh0IHN1cHBvcnRzIG1hcmtkb3duLlxuICAgKiBAc2VlIGNob2ljZXNCeVVybFxuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hvaWNlcyhuZXdWYWx1ZTogQXJyYXk8YW55Pikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNcIiwgbmV3VmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGlkZUlmQ2hvaWNlc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJoaWRlSWZDaG9pY2VzRW1wdHlcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaGlkZUlmQ2hvaWNlc0VtcHR5KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhpZGVJZkNob2ljZXNFbXB0eVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBQbGVhc2UgdXNlIHN1cnZleS5zdG9yZU90aGVyc0FzQ29tbWVudCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9uIHRoZSBzdXJ2ZXkgbGV2ZWwuIFRoaXMgcHJvcGVydHkgaXMgZGVwcmljYXRlZCBhbmQgaW52aXNpYmxlIGluIFN1cnZleSBDcmVhdG9yLlxuICAgKiBCeSBkZWZhdWx0IHRoZSBlbnRlcmVkIHRleHQgaW4gdGhlIG90aGVycyBpbnB1dCBpbiB0aGUgY2hlY2tib3gvcmFkaW9ncm91cC9kcm9wZG93biBhcmUgc3RvcmVkIGFzIFwicXVlc3Rpb24gbmFtZSBcIiArIFwiLUNvbW1lbnRcIi4gVGhlIHZhbHVlIGl0c2VsZiBpcyBcInF1ZXN0aW9uIG5hbWVcIjogXCJvdGhlcnNcIi4gU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UsIHRvIHN0b3JlIHRoZSBlbnRlcmVkIHRleHQgZGlyZWN0bHkgaW4gdGhlIFwicXVlc3Rpb24gbmFtZVwiIGtleS5cbiAgICogUG9zc2libGUgdmFsdWVzIGFyZTogXCJkZWZhdWx0XCIsIHRydWUsIGZhbHNlXG4gICAqIEBzZWUgU3VydmV5TW9kZWwuc3RvcmVPdGhlcnNBc0NvbW1lbnRcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RvcmVPdGhlcnNBc0NvbW1lbnQoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3RvcmVPdGhlcnNBc0NvbW1lbnRcIiwgXCJkZWZhdWx0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RvcmVPdGhlcnNBc0NvbW1lbnQodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBoYXNPdGhlckNoYW5nZWQoKSB7XG4gICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byByZW5kZXIgaXRlbXMgaW4gYSBzcGVjaWZpYyBvcmRlcjogXCJhc2NcIiwgXCJkZXNjXCIsIFwicmFuZG9tXCIuIERlZmF1bHQgdmFsdWUgaXMgXCJub25lXCIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXNPcmRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzT3JkZXJcIiwgXCJub25lXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hvaWNlc09yZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdmFsID0gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHZhbCA9PSB0aGlzLmNob2ljZXNPcmRlcikgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNPcmRlclwiLCB2YWwpO1xuICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gc2V0IHRoZSBkaWZmZXJlbnQgdGV4dCBmb3Igb3RoZXIgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgb3RoZXJUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJvdGhlclRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlckl0ZW1UZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IG90aGVyVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwib3RoZXJUZXh0XCIsIHZhbCk7XG4gICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICB9XG4gIGdldCBsb2NPdGhlclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwib3RoZXJUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiAgVXNlIHRoaXMgcHJvcGVydHkgdG8gc2V0IHRoZSBwbGFjZSBob2xkZXIgdGV4dCBmb3Igb3RoZXIgb3IgY29tbWVudCBmaWVsZCAgLlxuICAgKi9cbiAgcHVibGljIGdldCBvdGhlclBsYWNlSG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwib3RoZXJQbGFjZUhvbGRlclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG90aGVyUGxhY2VIb2xkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm90aGVyUGxhY2VIb2xkZXJcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jT3RoZXJQbGFjZUhvbGRlcigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJvdGhlclBsYWNlSG9sZGVyXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0aGF0IHNob3dzIHdoZW4gdGhlIG90aGVyIGl0ZW0gaXMgY2hvb3NlZCBieSB0aGUgb3RoZXIgaW5wdXQgaXMgZW1wdHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG90aGVyRXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJvdGhlckVycm9yVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm90aGVyUmVxdWlyZWRFcnJvclwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBvdGhlckVycm9yVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwib3RoZXJFcnJvclRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jT3RoZXJFcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwib3RoZXJFcnJvclRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGl0ZW1zIGFzIHRoZXkgd2lsbCBiZSByZW5kZXJlZC4gSWYgbmVlZGVkIGl0ZW1zIGFyZSBzb3J0ZWQgYW5kIHRoZSBvdGhlciBpdGVtIGlzIGFkZGVkLlxuICAgKiBAc2VlIGhhc090aGVyXG4gICAqIEBzZWUgY2hvaWNlc09yZGVyXG4gICAqIEBzZWUgZW5hYmxlZENob2ljZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUNob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVDaG9pY2VzXCIsIFtdKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgZW5hYmxlZCBpdGVtcyBhcyB0aGV5IHdpbGwgYmUgcmVuZGVyZWQuIFRoZSBkaXNhYmxlZCBpdGVtcyBhcmUgbm90IGluY2x1ZGVkXG4gICAqIEBzZWUgaGFzT3RoZXJcbiAgICogQHNlZSBjaG9pY2VzT3JkZXJcbiAgICogQHNlZSB2aXNpYmxlQ2hvaWNlc1xuICAgKi9cbiAgcHVibGljIGdldCBlbmFibGVkQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIGl0ZW1zID0gdGhpcy52aXNpYmxlQ2hvaWNlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXRlbXNbaV0uaXNFbmFibGVkKSByZXMucHVzaChpdGVtc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZVZpc2libGVDaG9pY2VzKCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdmFyIG5ld1ZhbHVlID0gbmV3IEFycmF5PEl0ZW1WYWx1ZT4oKTtcbiAgICB2YXIgY2FsY1ZhbHVlID0gdGhpcy5jYWxjVmlzaWJsZUNob2ljZXMoKTtcbiAgICBpZiAoIWNhbGNWYWx1ZSkgY2FsY1ZhbHVlID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxjVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5ld1ZhbHVlLnB1c2goY2FsY1ZhbHVlW2ldKTtcbiAgICB9XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUNob2ljZXNcIiwgbmV3VmFsdWUpO1xuICB9XG4gIHByaXZhdGUgY2FsY1Zpc2libGVDaG9pY2VzKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIGlmICh0aGlzLmNhblVzZUZpbHRlcmVkQ2hvaWNlcygpKSByZXR1cm4gdGhpcy5maWx0ZXJlZENob2ljZXM7XG4gICAgdmFyIHJlcyA9IHRoaXMuc29ydFZpc2libGVDaG9pY2VzKHRoaXMuZmlsdGVyZWRDaG9pY2VzLnNsaWNlKCkpO1xuICAgIHRoaXMuYWRkVG9WaXNpYmxlQ2hvaWNlcyhyZXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGNhblVzZUZpbHRlcmVkQ2hvaWNlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaGFzT3RoZXIgJiYgdGhpcy5jaG9pY2VzT3JkZXIgPT0gXCJub25lXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGFkZFRvVmlzaWJsZUNob2ljZXMoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4pIHtcbiAgICBpZiAodGhpcy5oYXNPdGhlcikge1xuICAgICAgaXRlbXMucHVzaCh0aGlzLm90aGVySXRlbSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRQbGFpbkRhdGEoXG4gICAgb3B0aW9uczoge1xuICAgICAgaW5jbHVkZUVtcHR5PzogYm9vbGVhbjtcbiAgICAgIGNhbGN1bGF0aW9ucz86IEFycmF5PHtcbiAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICB9ID0ge1xuICAgICAgaW5jbHVkZUVtcHR5OiB0cnVlXG4gICAgfVxuICApIHtcbiAgICB2YXIgcXVlc3Rpb25QbGFpbkRhdGEgPSBzdXBlci5nZXRQbGFpbkRhdGEob3B0aW9ucyk7XG4gICAgaWYgKCEhcXVlc3Rpb25QbGFpbkRhdGEpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gdGhpcy52YWx1ZSA6IFt0aGlzLnZhbHVlXTtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmlzTm9kZSA9IHRydWU7XG4gICAgICBxdWVzdGlvblBsYWluRGF0YS5kYXRhID0gdmFsdWVzLm1hcCgoZGF0YVZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICB2YXIgY2hvaWNlID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHRoaXMudmlzaWJsZUNob2ljZXMsIGRhdGFWYWx1ZSk7XG4gICAgICAgIHZhciBjaG9pY2VEYXRhSXRlbSA9IDxhbnk+e1xuICAgICAgICAgIG5hbWU6IGluZGV4LFxuICAgICAgICAgIHRpdGxlOiBcIkNob2ljZVwiLFxuICAgICAgICAgIHZhbHVlOiBkYXRhVmFsdWUsXG4gICAgICAgICAgZGlzcGxheVZhbHVlOiB0aGlzLmdldENob2ljZXNEaXNwbGF5VmFsdWUoXG4gICAgICAgICAgICB0aGlzLnZpc2libGVDaG9pY2VzLFxuICAgICAgICAgICAgZGF0YVZhbHVlXG4gICAgICAgICAgKSxcbiAgICAgICAgICBnZXRTdHJpbmc6ICh2YWw6IGFueSkgPT5cbiAgICAgICAgICAgIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgPyBKU09OLnN0cmluZ2lmeSh2YWwpIDogdmFsLFxuICAgICAgICAgIGlzTm9kZTogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCEhY2hvaWNlKSB7XG4gICAgICAgICAgKG9wdGlvbnMuY2FsY3VsYXRpb25zIHx8IFtdKS5mb3JFYWNoKGNhbGN1bGF0aW9uID0+IHtcbiAgICAgICAgICAgIGNob2ljZURhdGFJdGVtW2NhbGN1bGF0aW9uLnByb3BlcnR5TmFtZV0gPVxuICAgICAgICAgICAgICBjaG9pY2VbY2FsY3VsYXRpb24ucHJvcGVydHlOYW1lXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hvaWNlRGF0YUl0ZW07XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXN0aW9uUGxhaW5EYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBjdXJyZW50IHZhbHVlLiBJZiB0aGUgdmFsdWUgaXMgbnVsbCB0aGVuIHJldHVybnMgZW1wdHkgc3RyaW5nLiBJZiAnb3RoZXInIGlzIHNlbGVjdGVkIHRoZW4gcmV0dXJucyB0aGUgdGV4dCBmb3Igb3RoZXIgdmFsdWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuKTogYW55IHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiB0aGlzLmdldENob2ljZXNEaXNwbGF5VmFsdWUodGhpcy52aXNpYmxlQ2hvaWNlcywgdGhpcy52YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENob2ljZXNEaXNwbGF5VmFsdWUoaXRlbXM6IEl0ZW1WYWx1ZVtdLCB2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKHZhbCA9PSB0aGlzLm90aGVySXRlbVZhbHVlLnZhbHVlKVxuICAgICAgcmV0dXJuIHRoaXMuY29tbWVudCA/IHRoaXMuY29tbWVudCA6IHRoaXMubG9jT3RoZXJUZXh0LnRleHRPckh0bWw7XG4gICAgdmFyIHN0ciA9IEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZShpdGVtcywgdmFsKTtcbiAgICByZXR1cm4gc3RyID09IFwiXCIgJiYgdmFsID8gdmFsIDogc3RyO1xuICB9XG4gIHByaXZhdGUgZ2V0IGZpbHRlcmVkQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZENob2ljZXNWYWx1ZVxuICAgICAgPyB0aGlzLmZpbHRlcmVkQ2hvaWNlc1ZhbHVlXG4gICAgICA6IHRoaXMuYWN0aXZlQ2hvaWNlcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGFjdGl2ZUNob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hvaWNlc0Zyb21VcmwgPyB0aGlzLmNob2ljZXNGcm9tVXJsIDogdGhpcy5nZXRDaG9pY2VzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hvaWNlcztcbiAgfVxuICBwdWJsaWMgc3VwcG9ydENvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRPdGhlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xuICAgIHN1cGVyLm9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzKTtcbiAgICBpZiAoIXRoaXMuaGFzT3RoZXIgfHwgIXRoaXMuaXNPdGhlclNlbGVjdGVkIHx8IHRoaXMuY29tbWVudCkgcmV0dXJuO1xuICAgIGVycm9ycy5wdXNoKG5ldyBPdGhlckVtcHR5RXJyb3IodGhpcy5vdGhlckVycm9yVGV4dCwgdGhpcykpO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgIHN1cGVyLnNldFN1cnZleUltcGwodmFsdWUpO1xuICAgIHRoaXMucnVuQ2hvaWNlc0J5VXJsKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkge1xuICAgIGlmICh0aGlzLmlzU2V0dGluZ0RlZmF1bHRWYWx1ZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnN0b3JlT3RoZXJzQXNDb21tZW50ID09PSB0cnVlIHx8XG4gICAgICAodGhpcy5zdG9yZU90aGVyc0FzQ29tbWVudCA9PSBcImRlZmF1bHRcIiAmJlxuICAgICAgICAodGhpcy5zdXJ2ZXkgIT0gbnVsbCA/IHRoaXMuc3VydmV5LnN0b3JlT3RoZXJzQXNDb21tZW50IDogdHJ1ZSkpIHx8XG4gICAgICAoIXRoaXMuY2hvaWNlc0J5VXJsLmlzRW1wdHkgJiYgIXRoaXMuY2hvaWNlc0Zyb21VcmwpXG4gICAgKTtcbiAgfVxuICBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5ydW5DaG9pY2VzQnlVcmwoKTtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gIH1cbiAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgaWYgKG5hbWUgIT0gdGhpcy5nZXRWYWx1ZU5hbWUoKSkge1xuICAgICAgdGhpcy5ydW5DaG9pY2VzQnlVcmwoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBydW5DaG9pY2VzQnlVcmwoKSB7XG4gICAgaWYgKCF0aGlzLmNob2ljZXNCeVVybCB8fCB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdmFyIHByb2Nlc3NvciA9IHRoaXMuc3VydmV5SW1wbFxuICAgICAgPyB0aGlzLnN1cnZleUltcGwuZ2V0VGV4dFByb2Nlc3NvcigpXG4gICAgICA6IHRoaXMudGV4dFByb2Nlc3NvcjtcbiAgICBpZiAoIXByb2Nlc3NvcikgcHJvY2Vzc29yID0gdGhpcy5zdXJ2ZXk7XG4gICAgaWYgKCFwcm9jZXNzb3IpIHJldHVybjtcbiAgICB0aGlzLmNob2ljZXNCeVVybC5ydW4ocHJvY2Vzc29yKTtcbiAgfVxuICBwcml2YXRlIGlzRmlyc3RMb2FkQ2hvaWNlc0Zyb21VcmwgPSB0cnVlO1xuICBwcm90ZWN0ZWQgb25Mb2FkQ2hvaWNlc0Zyb21VcmwoYXJyYXk6IEFycmF5PEl0ZW1WYWx1ZT4pIHtcbiAgICB2YXIgZXJyb3JzID0gW107XG4gICAgaWYgKHRoaXMuY2hvaWNlc0J5VXJsICYmIHRoaXMuY2hvaWNlc0J5VXJsLmVycm9yKSB7XG4gICAgICBlcnJvcnMucHVzaCh0aGlzLmNob2ljZXNCeVVybC5lcnJvcik7XG4gICAgfVxuICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIHZhciBuZXdDaG9pY2VzID0gbnVsbDtcbiAgICB2YXIgY2hlY2tDYWNoZWRWYWx1ZXNPbkV4aXN0aW5nID0gdHJ1ZTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzRmlyc3RMb2FkQ2hvaWNlc0Zyb21VcmwgJiZcbiAgICAgICF0aGlzLmNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHMgJiZcbiAgICAgIHRoaXMuZGVmYXVsdFZhbHVlXG4gICAgKSB7XG4gICAgICB0aGlzLmNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHMgPSB0aGlzLmRlZmF1bHRWYWx1ZTtcbiAgICAgIGNoZWNrQ2FjaGVkVmFsdWVzT25FeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5jYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzKSkge1xuICAgICAgdGhpcy5jYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzID0gdGhpcy52YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5pc0ZpcnN0TG9hZENob2ljZXNGcm9tVXJsID0gZmFsc2U7XG4gICAgdmFyIGNhY2hlZFZhbHVlcyA9IHRoaXMuY3JlYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyhcbiAgICAgIHRoaXMuY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyxcbiAgICAgIGNoZWNrQ2FjaGVkVmFsdWVzT25FeGlzdGluZ1xuICAgICk7XG4gICAgaWYgKGFycmF5ICYmIGFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgIG5ld0Nob2ljZXMgPSBuZXcgQXJyYXk8SXRlbVZhbHVlPigpO1xuICAgICAgSXRlbVZhbHVlLnNldERhdGEobmV3Q2hvaWNlcywgYXJyYXkpO1xuICAgIH1cbiAgICB0aGlzLmNob2ljZXNGcm9tVXJsID0gbmV3Q2hvaWNlcztcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgIGlmIChuZXdDaG9pY2VzKSB7XG4gICAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLnVwZGF0ZUNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHMoXG4gICAgICAgIGNhY2hlZFZhbHVlcyxcbiAgICAgICAgbmV3Q2hvaWNlc1xuICAgICAgKTtcbiAgICAgIGlmICghIW5ld1ZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZS52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVDYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzKFxuICAgIHZhbDogYW55LFxuICAgIGNoZWNrT25FeGlzdGluZzogYm9vbGVhblxuICApOiBhbnkge1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eSh2YWwpKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICB2YXIgcmVzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXMucHVzaCh0aGlzLmNyZWF0ZUNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHModmFsW2ldLCB0cnVlKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICB2YXIgaXNFeGlzdHMgPSBjaGVja09uRXhpc3RpbmcgPyAhdGhpcy5oYXNVbmtub3duVmFsdWUodmFsKSA6IHRydWU7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHZhbCwgaXNFeGlzdHM6IGlzRXhpc3RzIH07XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVDYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzKFxuICAgIHZhbDogYW55LFxuICAgIG5ld0Nob2ljZXM6IEFycmF5PEl0ZW1WYWx1ZT5cbiAgKTogYW55IHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkodmFsKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdmFyIHJlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRWYWx1ZSA9IHRoaXMudXBkYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyhcbiAgICAgICAgICB2YWxbaV0sXG4gICAgICAgICAgbmV3Q2hvaWNlc1xuICAgICAgICApO1xuICAgICAgICBpZiAodXBkYXRlZFZhbHVlICYmICF0aGlzLmlzVmFsdWVFbXB0eSh1cGRhdGVkVmFsdWUudmFsdWUpKSB7XG4gICAgICAgICAgdmFyIG5ld1ZhbHVlID0gdXBkYXRlZFZhbHVlLnZhbHVlO1xuICAgICAgICAgIHZhciBpdGVtID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKG5ld0Nob2ljZXMsIHVwZGF0ZWRWYWx1ZS52YWx1ZSk7XG4gICAgICAgICAgaWYgKCEhaXRlbSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpdGVtLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXMucHVzaChuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHZhbHVlOiByZXMgfTtcbiAgICB9XG4gICAgdmFyIHZhbHVlID1cbiAgICAgIHZhbC5pc0V4aXN0cyAmJiB0aGlzLmhhc1Vua25vd25WYWx1ZSh2YWwudmFsdWUpID8gbnVsbCA6IHZhbC52YWx1ZTtcbiAgICB2YXIgaXRlbSA9IEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShuZXdDaG9pY2VzLCB2YWx1ZSk7XG4gICAgaWYgKCEhaXRlbSkge1xuICAgICAgdmFsdWUgPSBpdGVtLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4geyB2YWx1ZTogdmFsdWUgfTtcbiAgfVxuICBwcm90ZWN0ZWQgb25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVDaG9pY2VzKCk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5QmFzZWRPbkNob2ljZXMoKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVZpc2liaWxpdHlCYXNlZE9uQ2hvaWNlcygpIHtcbiAgICBpZiAodGhpcy5oaWRlSWZDaG9pY2VzRW1wdHkpIHtcbiAgICAgIHRoaXMudmlzaWJsZSA9ICF0aGlzLmZpbHRlcmVkQ2hvaWNlcyB8fCB0aGlzLmZpbHRlcmVkQ2hvaWNlcy5sZW5ndGggPiAwO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHNvcnRWaXNpYmxlQ2hvaWNlcyhhcnJheTogQXJyYXk8SXRlbVZhbHVlPik6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHZhciBvcmRlciA9IHRoaXMuY2hvaWNlc09yZGVyLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG9yZGVyID09IFwiYXNjXCIpIHJldHVybiB0aGlzLnNvcnRBcnJheShhcnJheSwgMSk7XG4gICAgaWYgKG9yZGVyID09IFwiZGVzY1wiKSByZXR1cm4gdGhpcy5zb3J0QXJyYXkoYXJyYXksIC0xKTtcbiAgICBpZiAob3JkZXIgPT0gXCJyYW5kb21cIikgcmV0dXJuIHRoaXMucmFuZG9taXplQXJyYXkoYXJyYXkpO1xuICAgIHJldHVybiBhcnJheTtcbiAgfVxuICBwcml2YXRlIHNvcnRBcnJheShhcnJheTogQXJyYXk8SXRlbVZhbHVlPiwgbXVsdDogbnVtYmVyKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgcmV0dXJuIGFycmF5LnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgaWYgKGEudGV4dCA8IGIudGV4dCkgcmV0dXJuIC0xICogbXVsdDtcbiAgICAgIGlmIChhLnRleHQgPiBiLnRleHQpIHJldHVybiAxICogbXVsdDtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgcmFuZG9taXplQXJyYXkoYXJyYXk6IEFycmF5PEl0ZW1WYWx1ZT4pOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gSGVscGVycy5yYW5kb21pemVBcnJheTxJdGVtVmFsdWU+KGFycmF5KTtcbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgaWYgKFxuICAgICAgISF0aGlzLnN1cnZleSAmJlxuICAgICAgdGhpcy5zdXJ2ZXkucXVlc3Rpb25Db3VudEJ5VmFsdWVOYW1lKHRoaXMuZ2V0VmFsdWVOYW1lKCkpID4gMVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBpZiAodGhpcy5jbGVhckluY29ycmVjdFZhbHVlc0NhbGxiYWNrKSB7XG4gICAgICB0aGlzLmNsZWFySW5jb3JyZWN0VmFsdWVzQ2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGVhckluY29ycmVjdFZhbHVlc0NvcmUoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFyVmFsdWVJZkludmlzaWJsZSgpIHtcbiAgICBzdXBlci5jbGVhclZhbHVlSWZJbnZpc2libGUoKTtcbiAgICB0aGlzLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyRGlzYWJsZWRWYWx1ZXMoKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSB8fCAhdGhpcy5zdXJ2ZXkuY2xlYXJWYWx1ZU9uRGlzYWJsZUl0ZW1zKSByZXR1cm47XG4gICAgdGhpcy5jbGVhckRpc2FibGVkVmFsdWVzQ29yZSgpO1xuICB9XG4gIHByb3RlY3RlZCBjbGVhckluY29ycmVjdFZhbHVlc0NvcmUoKSB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKHRoaXMuY2FuQ2xlYXJWYWx1ZUFuVW5rbm93KHZhbCkpIHtcbiAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY2FuQ2xlYXJWYWx1ZUFuVW5rbm93KHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkgJiYgdGhpcy5pc090aGVyU2VsZWN0ZWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5oYXNVbmtub3duVmFsdWUodmFsLCB0cnVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJEaXNhYmxlZFZhbHVlc0NvcmUoKSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZURpc2FibGVkKHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLmNsZWFyVmFsdWUoKTtcbiAgICB9XG4gIH1cbiAgY2xlYXJVbnVzZWRWYWx1ZXMoKSB7XG4gICAgc3VwZXIuY2xlYXJVbnVzZWRWYWx1ZXMoKTtcbiAgICBpZiAoIXRoaXMuaXNPdGhlclNlbGVjdGVkICYmICF0aGlzLmhhc0NvbW1lbnQpIHtcbiAgICAgIHRoaXMuY29tbWVudCA9IFwiXCI7XG4gICAgfVxuICB9XG4gIGdldENvbHVtbkNsYXNzKCkge1xuICAgIHZhciBjb2x1bW5DbGFzcyA9IHRoaXMuY3NzQ2xhc3Nlcy5jb2x1bW47XG4gICAgaWYgKHRoaXMuaGFzQ29sdW1ucykge1xuICAgICAgY29sdW1uQ2xhc3MgKz0gXCIgc3YtcS1jb2x1bW4tXCIgKyB0aGlzLmNvbENvdW50O1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uQ2xhc3M7XG4gIH1cbiAgZ2V0IGNvbHVtbnMoKSB7XG4gICAgdmFyIGNvbHVtbnMgPSBbXTtcbiAgICB2YXIgY29sQ291bnQgPSB0aGlzLmNvbENvdW50O1xuICAgIGlmICh0aGlzLmhhc0NvbHVtbnMgJiYgdGhpcy52aXNpYmxlQ2hvaWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbENvdW50OyBpKyspIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IFtdO1xuICAgICAgICBmb3IgKHZhciBqID0gaTsgaiA8IHRoaXMudmlzaWJsZUNob2ljZXMubGVuZ3RoOyBqICs9IGNvbENvdW50KSB7XG4gICAgICAgICAgY29sdW1uLnB1c2godGhpcy52aXNpYmxlQ2hvaWNlc1tqXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG4gIGdldCBoYXNDb2x1bW5zKCkge1xuICAgIHJldHVybiB0aGlzLmNvbENvdW50ID4gMTtcbiAgfVxufVxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIGNoZWNrYm94IGFuZCByYWRpb2dyb3VwIHF1ZXN0aW9ucy4gSXQgaW50cm9kdWNlZCBhIGNvbENvdW50IHByb3BlcnR5LlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25DaGVja2JveEJhc2UgZXh0ZW5kcyBRdWVzdGlvblNlbGVjdEJhc2Uge1xuICBjb2xDb3VudENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgZm9yIHJhZGlvZ3JvdXAgYW5kIGNoZWNrYm94IHF1ZXN0aW9ucy4gSXRlbXMgYXJlIHJlbmRyZWQgaW4gb25lIGxpbmUgaWYgdGhlIHZhbHVlIGlzIDAuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbENvdW50XCIsIHRoaXMuaXNGbG93TGF5b3V0ID8gMCA6IDEpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sQ291bnQodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiA1IHx8IHRoaXMuaXNGbG93TGF5b3V0KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIiwgdmFsdWUpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIHByb3RlY3RlZCBvblBhcmVudENoYW5nZWQoKSB7XG4gICAgc3VwZXIub25QYXJlbnRDaGFuZ2VkKCk7XG4gICAgaWYgKHRoaXMuaXNGbG93TGF5b3V0KSB7XG4gICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2xDb3VudFwiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwic2VsZWN0YmFzZVwiLFxuICBbXG4gICAgeyBuYW1lOiBcImhhc0NvbW1lbnQ6Ym9vbGVhblwiLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbW1lbnRUZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29tbWVudFRleHRcIixcbiAgICAgIGxheW91dDogXCJyb3dcIlxuICAgIH0sXG4gICAgXCJoYXNPdGhlcjpib29sZWFuXCIsXG4gICAgeyBuYW1lOiBcIm90aGVyUGxhY2VIb2xkZXJcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY090aGVyUGxhY2VIb2xkZXJcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY2hvaWNlczppdGVtdmFsdWVbXVwiLFxuICAgICAgYmFzZVZhbHVlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9pY2VzX0l0ZW1cIik7XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNob2ljZXNPcmRlclwiLFxuICAgICAgZGVmYXVsdDogXCJub25lXCIsXG4gICAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwiYXNjXCIsIFwiZGVzY1wiLCBcInJhbmRvbVwiXVxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjaG9pY2VzQnlVcmw6cmVzdGZ1bGxcIixcbiAgICAgIGNsYXNzTmFtZTogXCJDaG9pY2VzUmVzdGZ1bGxcIixcbiAgICAgIG9uR2V0VmFsdWU6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiBvYmouY2hvaWNlc0J5VXJsLmdldERhdGEoKTtcbiAgICAgIH0sXG4gICAgICBvblNldFZhbHVlOiBmdW5jdGlvbihvYmo6IGFueSwgdmFsdWU6IGFueSkge1xuICAgICAgICBvYmouY2hvaWNlc0J5VXJsLnNldERhdGEodmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgXCJoaWRlSWZDaG9pY2VzRW1wdHk6Ym9vbGVhblwiLFxuICAgIFwiY2hvaWNlc1Zpc2libGVJZjpjb25kaXRpb25cIixcbiAgICBcImNob2ljZXNFbmFibGVJZjpjb25kaXRpb25cIixcbiAgICB7IG5hbWU6IFwib3RoZXJUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NPdGhlclRleHRcIiB9LFxuICAgIHsgbmFtZTogXCJvdGhlckVycm9yVGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jT3RoZXJFcnJvclRleHRcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwic3RvcmVPdGhlcnNBc0NvbW1lbnRcIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCB0cnVlLCBmYWxzZV0sXG4gICAgICB2aXNpYmxlOiBmYWxzZVxuICAgIH1cbiAgXSxcbiAgbnVsbCxcbiAgXCJxdWVzdGlvblwiXG4pO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImNoZWNrYm94YmFzZVwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJjb2xDb3VudDpudW1iZXJcIixcbiAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICBjaG9pY2VzOiBbMCwgMSwgMiwgMywgNCwgNV0sXG4gICAgICBsYXlvdXQ6IFwicm93XCJcbiAgICB9XG4gIF0sXG4gIG51bGwsXG4gIFwic2VsZWN0YmFzZVwiXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2Jhc2VzZWxlY3QudHMiLCJpbXBvcnQge1xuICBKc29uT2JqZWN0LFxuICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbixcbiAgSnNvbk9iamVjdFByb3BlcnR5LFxuICBTZXJpYWxpemVyXG59IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uTWF0cml4QmFzZU1vZGVsIH0gZnJvbSBcIi4vbWFydGl4QmFzZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgQmFzZSxcbiAgSVF1ZXN0aW9uLFxuICBJU3VydmV5RGF0YSxcbiAgSVN1cnZleSxcbiAgSVN1cnZleUltcGwsXG4gIElUZXh0UHJvY2Vzc29yLFxuICBTdXJ2ZXlFcnJvclxufSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBUZXh0UHJlUHJvY2Vzc29yLCBUZXh0UHJlUHJvY2Vzc29yVmFsdWUgfSBmcm9tIFwiLi90ZXh0UHJlUHJvY2Vzc29yXCI7XG5pbXBvcnQgeyBQcm9jZXNzVmFsdWUgfSBmcm9tIFwiLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgUXVlc3Rpb25TZWxlY3RCYXNlIH0gZnJvbSBcIi4vcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgU3VydmV5VmFsaWRhdG9yIH0gZnJvbSBcIi4vdmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBnZXRDdXJyZWN5Q29kZXMgfSBmcm9tIFwiLi9xdWVzdGlvbl9leHByZXNzaW9uXCI7XG5pbXBvcnQgeyBGdW5jdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9mdW5jdGlvbnNmYWN0b3J5XCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1hdHJpeERyb3Bkb3duRGF0YSB7XG4gIHZhbHVlOiBhbnk7XG4gIG9uUm93Q2hhbmdlZChcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICBuZXdSb3dWYWx1ZTogYW55LFxuICAgIGlzRGVsZXRpbmdWYWx1ZTogYm9vbGVhblxuICApOiB2b2lkO1xuICBvblJvd0NoYW5naW5nKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKTogYW55O1xuICBnZXRSb3dJbmRleChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogbnVtYmVyO1xuICB2YWxpZGF0ZUNlbGwoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgcm93VmFsdWU6IGFueVxuICApOiBTdXJ2ZXlFcnJvcjtcbiAgY29sdW1uczogQXJyYXk8TWF0cml4RHJvcGRvd25Db2x1bW4+O1xuICBjcmVhdGVRdWVzdGlvbihcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW5cbiAgKTogUXVlc3Rpb247XG4gIGdldExvY2FsZSgpOiBzdHJpbmc7XG4gIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmc7XG4gIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nO1xuICBnZXRTaGFyZWRRdWVzdGlvbkJ5TmFtZShcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxuICApOiBRdWVzdGlvbjtcbiAgb25Ub3RhbFZhbHVlQ2hhbmdlZCgpOiBhbnk7XG4gIGdldFN1cnZleSgpOiBJU3VydmV5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNYXRyaXhDb2x1bW5Pd25lciBleHRlbmRzIElMb2NhbGl6YWJsZU93bmVyIHtcbiAgZ2V0UmVxdWlyZWRUZXh0KCk6IHN0cmluZztcbiAgb25Db2x1bW5Qcm9wZXJ0aWVzQ2hhbmdlZChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogdm9pZDtcbiAgZ2V0Q2VsbFR5cGUoKTogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBvblVwZGF0ZVNlbGVjdEJhc2VDZWxsUXVlc3Rpb24oXG4gIGNlbGxRdWVzdGlvbjogUXVlc3Rpb25TZWxlY3RCYXNlLFxuICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICBxdWVzdGlvbjogUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSxcbiAgZGF0YTogYW55XG4pIHtcbiAgaWYgKGNlbGxRdWVzdGlvbi5oYXNPdGhlcikge1xuICAgIGNlbGxRdWVzdGlvbi5zdG9yZU90aGVyc0FzQ29tbWVudCA9IGZhbHNlO1xuICB9XG4gIGlmIChcbiAgICAoIWNlbGxRdWVzdGlvbi5jaG9pY2VzIHx8IGNlbGxRdWVzdGlvbi5jaG9pY2VzLmxlbmd0aCA9PSAwKSAmJlxuICAgIGNlbGxRdWVzdGlvbi5jaG9pY2VzQnlVcmwuaXNFbXB0eVxuICApIHtcbiAgICBjZWxsUXVlc3Rpb24uY2hvaWNlcyA9IHF1ZXN0aW9uLmNob2ljZXM7XG4gIH1cbiAgaWYgKCFjZWxsUXVlc3Rpb24uY2hvaWNlc0J5VXJsLmlzRW1wdHkpIHtcbiAgICBjZWxsUXVlc3Rpb24uY2hvaWNlc0J5VXJsLnJ1bihkYXRhKTtcbiAgfVxufVxuZXhwb3J0IHZhciBtYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzID0ge1xuICBkcm9wZG93bjoge1xuICAgIHByb3BlcnRpZXM6IFtcbiAgICAgIFwiY2hvaWNlc1wiLFxuICAgICAgXCJjaG9pY2VzT3JkZXJcIixcbiAgICAgIFwiY2hvaWNlc0J5VXJsXCIsXG4gICAgICBcIm9wdGlvbnNDYXB0aW9uXCIsXG4gICAgICBcIm90aGVyVGV4dFwiLFxuICAgICAgXCJjaG9pY2VzVmlzaWJsZUlmXCJcbiAgICBdLFxuICAgIG9uQ2VsbFF1ZXN0aW9uVXBkYXRlOiAoXG4gICAgICBjZWxsUXVlc3Rpb246IGFueSxcbiAgICAgIGNvbHVtbjogYW55LFxuICAgICAgcXVlc3Rpb246IGFueSxcbiAgICAgIGRhdGE6IGFueVxuICAgICkgPT4ge1xuICAgICAgb25VcGRhdGVTZWxlY3RCYXNlQ2VsbFF1ZXN0aW9uKGNlbGxRdWVzdGlvbiwgY29sdW1uLCBxdWVzdGlvbiwgZGF0YSk7XG4gICAgICBpZiAoIWNlbGxRdWVzdGlvbi5vcHRpb25zQ2FwdGlvbilcbiAgICAgICAgY2VsbFF1ZXN0aW9uLm9wdGlvbnNDYXB0aW9uID0gcXVlc3Rpb24ub3B0aW9uc0NhcHRpb247XG4gICAgfVxuICB9LFxuICBjaGVja2JveDoge1xuICAgIHByb3BlcnRpZXM6IFtcbiAgICAgIFwiY2hvaWNlc1wiLFxuICAgICAgXCJjaG9pY2VzT3JkZXJcIixcbiAgICAgIFwiY2hvaWNlc0J5VXJsXCIsXG4gICAgICBcIm90aGVyVGV4dFwiLFxuICAgICAgXCJjaG9pY2VzVmlzaWJsZUlmXCJcbiAgICBdLFxuICAgIG9uQ2VsbFF1ZXN0aW9uVXBkYXRlOiAoXG4gICAgICBjZWxsUXVlc3Rpb246IGFueSxcbiAgICAgIGNvbHVtbjogYW55LFxuICAgICAgcXVlc3Rpb246IGFueSxcbiAgICAgIGRhdGE6IGFueVxuICAgICkgPT4ge1xuICAgICAgb25VcGRhdGVTZWxlY3RCYXNlQ2VsbFF1ZXN0aW9uKGNlbGxRdWVzdGlvbiwgY29sdW1uLCBxdWVzdGlvbiwgZGF0YSk7XG4gICAgICBjZWxsUXVlc3Rpb24uY29sQ291bnQgPVxuICAgICAgICBjb2x1bW4uY29sQ291bnQgPiAtMSA/IGNvbHVtbi5jb2xDb3VudCA6IHF1ZXN0aW9uLmNvbHVtbkNvbENvdW50O1xuICAgIH1cbiAgfSxcbiAgcmFkaW9ncm91cDoge1xuICAgIHByb3BlcnRpZXM6IFtcbiAgICAgIFwiY2hvaWNlc1wiLFxuICAgICAgXCJjaG9pY2VzT3JkZXJcIixcbiAgICAgIFwiY2hvaWNlc0J5VXJsXCIsXG4gICAgICBcIm90aGVyVGV4dFwiLFxuICAgICAgXCJjaG9pY2VzVmlzaWJsZUlmXCJcbiAgICBdLFxuICAgIG9uQ2VsbFF1ZXN0aW9uVXBkYXRlOiAoXG4gICAgICBjZWxsUXVlc3Rpb246IGFueSxcbiAgICAgIGNvbHVtbjogYW55LFxuICAgICAgcXVlc3Rpb246IGFueSxcbiAgICAgIGRhdGE6IGFueVxuICAgICkgPT4ge1xuICAgICAgb25VcGRhdGVTZWxlY3RCYXNlQ2VsbFF1ZXN0aW9uKGNlbGxRdWVzdGlvbiwgY29sdW1uLCBxdWVzdGlvbiwgZGF0YSk7XG4gICAgICBjZWxsUXVlc3Rpb24uY29sQ291bnQgPVxuICAgICAgICBjb2x1bW4uY29sQ291bnQgPiAtMSA/IGNvbHVtbi5jb2xDb3VudCA6IHF1ZXN0aW9uLmNvbHVtbkNvbENvdW50O1xuICAgIH1cbiAgfSxcbiAgdGV4dDoge1xuICAgIHByb3BlcnRpZXM6IFtcInBsYWNlSG9sZGVyXCIsIFwiaW5wdXRUeXBlXCIsIFwibWF4TGVuZ3RoXCJdLFxuICAgIG9uQ2VsbFF1ZXN0aW9uVXBkYXRlOiAoXG4gICAgICBjZWxsUXVlc3Rpb246IGFueSxcbiAgICAgIGNvbHVtbjogYW55LFxuICAgICAgcXVlc3Rpb246IGFueSxcbiAgICAgIGRhdGE6IGFueVxuICAgICkgPT4ge31cbiAgfSxcbiAgY29tbWVudDoge1xuICAgIHByb3BlcnRpZXM6IFtcInBsYWNlSG9sZGVyXCIsIFwicm93c1wiLCBcIm1heExlbmd0aFwiXSxcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKFxuICAgICAgY2VsbFF1ZXN0aW9uOiBhbnksXG4gICAgICBjb2x1bW46IGFueSxcbiAgICAgIHF1ZXN0aW9uOiBhbnksXG4gICAgICBkYXRhOiBhbnlcbiAgICApID0+IHt9XG4gIH0sXG4gIGJvb2xlYW46IHtcbiAgICBwcm9wZXJ0aWVzOiBbXCJkZWZhdWx0VmFsdWVcIl0sXG4gICAgb25DZWxsUXVlc3Rpb25VcGRhdGU6IChcbiAgICAgIGNlbGxRdWVzdGlvbjogYW55LFxuICAgICAgY29sdW1uOiBhbnksXG4gICAgICBxdWVzdGlvbjogYW55LFxuICAgICAgZGF0YTogYW55XG4gICAgKSA9PiB7XG4gICAgICBjZWxsUXVlc3Rpb24uc2hvd1RpdGxlID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG4gIGV4cHJlc3Npb246IHtcbiAgICBwcm9wZXJ0aWVzOiBbXCJleHByZXNzaW9uXCIsIFwiZGlzcGxheVN0eWxlXCIsIFwiY3VycmVuY3lcIl0sXG4gICAgb25DZWxsUXVlc3Rpb25VcGRhdGU6IChcbiAgICAgIGNlbGxRdWVzdGlvbjogYW55LFxuICAgICAgY29sdW1uOiBhbnksXG4gICAgICBxdWVzdGlvbjogYW55LFxuICAgICAgZGF0YTogYW55XG4gICAgKSA9PiB7fVxuICB9XG59O1xuXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25Db2x1bW4gZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgSUxvY2FsaXphYmxlT3duZXIge1xuICBwdWJsaWMgc3RhdGljIGdldENvbHVtblR5cGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gbWF0cml4RHJvcGRvd25Db2x1bW5UeXBlcykge1xuICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHRlbXBsYXRlUXVlc3Rpb25WYWx1ZTogUXVlc3Rpb247XG4gIHByaXZhdGUgY29sT3duZXJWYWx1ZTogSU1hdHJpeENvbHVtbk93bmVyID0gbnVsbDtcbiAgcHJpdmF0ZSBpbmRleFZhbHVlID0gLTE7XG4gIHByaXZhdGUgX2lzVmlzaWJsZSA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB0aXRsZTogc3RyaW5nID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJ0b3RhbEZvcm1hdFwiLCB0aGlzKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXG4gICAgICAgIFwidG90YWxUeXBlXCIsXG4gICAgICAgIFwidG90YWxFeHByZXNzaW9uXCIsXG4gICAgICAgIFwidG90YWxGb3JtYXRcIixcbiAgICAgICAgXCJ0b3RhbEN1cnJlbmN5XCIsXG4gICAgICAgIFwidG90YWxEaXNwbGF5U3R5bGVcIixcbiAgICAgICAgXCJ0b3RhbE1heGltdW1GcmFjdGlvbkRpZ2l0c1wiLFxuICAgICAgICBcInRvdGFsTWluaW11bUZyYWN0aW9uRGlnaXRzXCJcbiAgICAgIF0sXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5kb0NvbHVtblByb3BlcnRpZXNDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVRlbXBsYXRlUXVlc3Rpb24oKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIGlmICh0aXRsZSkgdGhpcy50aXRsZSA9IHRpdGxlO1xuICB9XG4gIGdldER5bmFtaWNQcm9wZXJ0eU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjZWxsVHlwZVwiO1xuICB9XG4gIGdldER5bmFtaWNUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY0NlbGxRdWVzdGlvblR5cGUoKTtcbiAgfVxuICBnZXREeW5hbWljUHJvcGVydGllcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcVR5cGUgPSB0aGlzLmNhbGNDZWxsUXVlc3Rpb25UeXBlKCk7XG4gICAgdmFyIHFEZWZpbml0aW9uID0gKDxhbnk+bWF0cml4RHJvcGRvd25Db2x1bW5UeXBlcylbcVR5cGVdO1xuICAgIGlmIChxRGVmaW5pdGlvbikgcmV0dXJuIHFEZWZpbml0aW9uLnByb3BlcnRpZXM7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHB1YmxpYyBnZXQgY29sT3duZXIoKTogSU1hdHJpeENvbHVtbk93bmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb2xPd25lclZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sT3duZXIodmFsdWU6IElNYXRyaXhDb2x1bW5Pd25lcikge1xuICAgIHRoaXMuY29sT3duZXJWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlVGVtcGxhdGVRdWVzdGlvbigpO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIHRoaXMubG9jVGl0bGUuc3RyQ2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXhWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0SW5kZXgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLmluZGV4VmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKSB7XG4gICAgcmV0dXJuIFwibWF0cml4ZHJvcGRvd25jb2x1bW5cIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGNlbGxUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNlbGxUeXBlXCIsIFwiZGVmYXVsdFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNlbGxUeXBlKHZhbDogc3RyaW5nKSB7XG4gICAgdmFsID0gdmFsLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2VsbFR5cGVcIiwgdmFsKTtcbiAgICB0aGlzLnVwZGF0ZVRlbXBsYXRlUXVlc3Rpb24oKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRlbXBsYXRlUXVlc3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvblZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5uYW1lO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Zpc2libGU7XG4gIH1cbiAgcHVibGljIHNldElzVmlzaWJsZShuZXdWYWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc1Zpc2libGUgPSBuZXdWYWw7XG4gIH1cbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubmFtZTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubmFtZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi50aXRsZTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnRpdGxlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jVGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5sb2NUaXRsZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGZ1bGxUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldEZ1bGxUaXRsZSh0aGlzLmxvY1RpdGxlLnRleHRPckh0bWwpO1xuICB9XG4gIHB1YmxpYyBnZXRGdWxsVGl0bGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghc3RyKSBzdHIgPSB0aGlzLm5hbWU7XG4gICAgaWYgKHRoaXMuaXNSZXF1aXJlZCkge1xuICAgICAgdmFyIHJlcXVpcmVUZXh0ID0gdGhpcy5jb2xPd25lciA/IHRoaXMuY29sT3duZXIuZ2V0UmVxdWlyZWRUZXh0KCkgOiBcIlwiO1xuICAgICAgaWYgKHJlcXVpcmVUZXh0KSByZXF1aXJlVGV4dCArPSBcIiBcIjtcbiAgICAgIHN0ciA9IHJlcXVpcmVUZXh0ICsgc3RyO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmlzUmVxdWlyZWQ7XG4gIH1cbiAgcHVibGljIHNldCBpc1JlcXVpcmVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5pc1JlcXVpcmVkID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRFcnJvclRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnJlcXVpcmVkRXJyb3JUZXh0O1xuICB9XG4gIHB1YmxpYyBzZXQgcmVxdWlyZWRFcnJvclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ucmVxdWlyZWRFcnJvclRleHQgPSB2YWw7XG4gIH1cbiAgZ2V0IGxvY1JlcXVpcmVkRXJyb3JUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmxvY1JlcXVpcmVkRXJyb3JUZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5yZWFkT25seTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlYWRPbmx5KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5yZWFkT25seSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc090aGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uaGFzT3RoZXI7XG4gIH1cbiAgcHVibGljIHNldCBoYXNPdGhlcih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uaGFzT3RoZXIgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCB2aXNpYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnZpc2libGVJZjtcbiAgfVxuICBwdWJsaWMgc2V0IHZpc2libGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi52aXNpYmxlSWYgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBlbmFibGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uZW5hYmxlSWY7XG4gIH1cbiAgcHVibGljIHNldCBlbmFibGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5lbmFibGVJZiA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IHJlcXVpcmVkSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnJlcXVpcmVkSWY7XG4gIH1cbiAgcHVibGljIHNldCByZXF1aXJlZElmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnJlcXVpcmVkSWYgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBoYXNDb25kaXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy52aXNpYmxlSWYgfHwgIXRoaXMuZW5hYmxlSWYgfHwgIXRoaXMucmVxdWlyZWRJZjtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbGlkYXRvcnMoKTogQXJyYXk8U3VydmV5VmFsaWRhdG9yPiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi52YWxpZGF0b3JzO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsaWRhdG9ycyh2YWw6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4pIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24udmFsaWRhdG9ycyA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IHRvdGFsVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0b3RhbFR5cGVcIiwgXCJub25lXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdG90YWxUeXBlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxUeXBlXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB0b3RhbEV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxFeHByZXNzaW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdG90YWxFeHByZXNzaW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxFeHByZXNzaW9uXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBoYXNUb3RhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50b3RhbFR5cGUgIT0gXCJub25lXCIgfHwgISF0aGlzLnRvdGFsRXhwcmVzc2lvbjtcbiAgfVxuICBwdWJsaWMgZ2V0IHRvdGFsRm9ybWF0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidG90YWxGb3JtYXRcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB0b3RhbEZvcm1hdCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidG90YWxGb3JtYXRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jVG90YWxGb3JtYXQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidG90YWxGb3JtYXRcIik7XG4gIH1cbiAgcHVibGljIGdldCB0b3RhbE1heGltdW1GcmFjdGlvbkRpZ2l0cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0b3RhbE1heGltdW1GcmFjdGlvbkRpZ2l0c1wiLCAtMSk7XG4gIH1cbiAgcHVibGljIHNldCB0b3RhbE1heGltdW1GcmFjdGlvbkRpZ2l0cyh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAtMSB8fCB2YWwgPiAyMCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRvdGFsTWF4aW11bUZyYWN0aW9uRGlnaXRzXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB0b3RhbE1pbmltdW1GcmFjdGlvbkRpZ2l0cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0b3RhbE1pbmltdW1GcmFjdGlvbkRpZ2l0c1wiLCAtMSk7XG4gIH1cbiAgcHVibGljIHNldCB0b3RhbE1pbmltdW1GcmFjdGlvbkRpZ2l0cyh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAtMSB8fCB2YWwgPiAyMCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRvdGFsTWluaW11bUZyYWN0aW9uRGlnaXRzXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB0b3RhbERpc3BsYXlTdHlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0b3RhbERpc3BsYXlTdHlsZVwiLCBcIm5vbmVcIik7XG4gIH1cbiAgcHVibGljIHNldCB0b3RhbERpc3BsYXlTdHlsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRvdGFsRGlzcGxheVN0eWxlXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB0b3RhbEN1cnJlbmN5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRvdGFsQ3VycmVuY3lcIiwgXCJVU0RcIik7XG4gIH1cbiAgcHVibGljIHNldCB0b3RhbEN1cnJlbmN5KHZhbDogc3RyaW5nKSB7XG4gICAgaWYgKGdldEN1cnJlY3lDb2RlcygpLmluZGV4T2YodmFsKSA8IDApIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0b3RhbEN1cnJlbmN5XCIsIHZhbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1pbldpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1pbldpZHRoXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluV2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtaW5XaWR0aFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgY29sQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIiwgLTEpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sQ291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgLTEgfHwgdmFsID4gNCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbENvdW50XCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbE93bmVyID8gdGhpcy5jb2xPd25lci5nZXRMb2NhbGUoKSA6IFwiXCI7XG4gIH1cbiAgcHVibGljIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbE93bmVyID8gdGhpcy5jb2xPd25lci5nZXRNYXJrZG93bkh0bWwodGV4dCkgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9jZXNzZWRUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29sT3duZXIgPyB0aGlzLmNvbE93bmVyLmdldFByb2Nlc3NlZFRleHQodGV4dCkgOiB0ZXh0O1xuICB9XG4gIHB1YmxpYyBjcmVhdGVDZWxsUXVlc3Rpb24oZGF0YTogYW55KTogUXVlc3Rpb24ge1xuICAgIHZhciBxVHlwZSA9IHRoaXMuY2FsY0NlbGxRdWVzdGlvblR5cGUoKTtcbiAgICB2YXIgY2VsbFF1ZXN0aW9uID0gPFF1ZXN0aW9uPnRoaXMuY3JlYXRlTmV3UXVlc3Rpb24ocVR5cGUpO1xuICAgIHRoaXMudXBkYXRlQ2VsbFF1ZXN0aW9uKGNlbGxRdWVzdGlvbiwgZGF0YSk7XG4gICAgcmV0dXJuIGNlbGxRdWVzdGlvbjtcbiAgfVxuICBwdWJsaWMgdXBkYXRlQ2VsbFF1ZXN0aW9uKGNlbGxRdWVzdGlvbjogUXVlc3Rpb24sIGRhdGE6IGFueSkge1xuICAgIHRoaXMuc2V0UXVlc3Rpb25Qcm9wZXJ0aWVzKGNlbGxRdWVzdGlvbik7XG4gICAgdmFyIHFUeXBlID0gY2VsbFF1ZXN0aW9uLmdldFR5cGUoKTtcbiAgICB2YXIgcURlZmluaXRpb24gPSAoPGFueT5tYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzKVtxVHlwZV07XG4gICAgaWYgKHFEZWZpbml0aW9uICYmIHFEZWZpbml0aW9uW1wib25DZWxsUXVlc3Rpb25VcGRhdGVcIl0pIHtcbiAgICAgIHFEZWZpbml0aW9uW1wib25DZWxsUXVlc3Rpb25VcGRhdGVcIl0oXG4gICAgICAgIGNlbGxRdWVzdGlvbixcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy5jb2xPd25lcixcbiAgICAgICAgZGF0YVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgZGVmYXVsdENlbGxUeXBlQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZVRlbXBsYXRlUXVlc3Rpb24oKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2FsY0NlbGxRdWVzdGlvblR5cGUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jZWxsVHlwZSAhPT0gXCJkZWZhdWx0XCIpIHJldHVybiB0aGlzLmNlbGxUeXBlO1xuICAgIGlmICh0aGlzLmNvbE93bmVyKSByZXR1cm4gdGhpcy5jb2xPd25lci5nZXRDZWxsVHlwZSgpO1xuICAgIHJldHVybiBzZXR0aW5ncy5tYXRyaXhEZWZhdWx0Q2VsbFR5cGU7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZVRlbXBsYXRlUXVlc3Rpb24oKSB7XG4gICAgdmFyIHByZXZDZWxsVHlwZSA9IHRoaXMudGVtcGxhdGVRdWVzdGlvblxuICAgICAgPyB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uZ2V0VHlwZSgpXG4gICAgICA6IFwiXCI7XG4gICAgdmFyIGN1ckNlbGxUeXBlID0gdGhpcy5jYWxjQ2VsbFF1ZXN0aW9uVHlwZSgpO1xuICAgIGlmIChjdXJDZWxsVHlwZSA9PT0gcHJldkNlbGxUeXBlKSByZXR1cm47XG4gICAgaWYgKHRoaXMudGVtcGxhdGVRdWVzdGlvbikge1xuICAgICAgdGhpcy5yZW1vdmVQcm9wZXJ0aWVzKHByZXZDZWxsVHlwZSk7XG4gICAgfVxuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvblZhbHVlID0gdGhpcy5jcmVhdGVOZXdRdWVzdGlvbihjdXJDZWxsVHlwZSk7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmxvY093bmVyID0gdGhpcztcbiAgICB0aGlzLmFkZFByb3BlcnRpZXMoY3VyQ2VsbFR5cGUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubG9jVGl0bGUub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICByZXR1cm4gc2VsZi5nZXRGdWxsVGl0bGUodGV4dCk7XG4gICAgfTtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ub25Qcm9wZXJ0eUNoYW5nZWQuYWRkKGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5kb0NvbHVtblByb3BlcnRpZXNDaGFuZ2VkKCk7XG4gICAgfSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1F1ZXN0aW9uKGNlbGxUeXBlOiBzdHJpbmcpOiBRdWVzdGlvbiB7XG4gICAgdmFyIHF1ZXN0aW9uID0gPFF1ZXN0aW9uPlNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3MoY2VsbFR5cGUpO1xuICAgIHRoaXMuc2V0UXVlc3Rpb25Qcm9wZXJ0aWVzKHF1ZXN0aW9uKTtcbiAgICByZXR1cm4gcXVlc3Rpb247XG4gIH1cbiAgcHJvdGVjdGVkIHNldFF1ZXN0aW9uUHJvcGVydGllcyhxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBpZiAodGhpcy50ZW1wbGF0ZVF1ZXN0aW9uKSB7XG4gICAgICB2YXIganNvbiA9IG5ldyBKc29uT2JqZWN0KCkudG9Kc29uT2JqZWN0KHRoaXMudGVtcGxhdGVRdWVzdGlvbiwgdHJ1ZSk7XG4gICAgICBqc29uLnR5cGUgPSBxdWVzdGlvbi5nZXRUeXBlKCk7XG4gICAgICBxdWVzdGlvbi5zdGFydExvYWRpbmdGcm9tSnNvbigpO1xuICAgICAgbmV3IEpzb25PYmplY3QoKS50b09iamVjdChqc29uLCBxdWVzdGlvbik7XG4gICAgICBxdWVzdGlvbi5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICAgIHF1ZXN0aW9uLm9uU3VydmV5TG9hZCgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nLCBvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICB0aGlzLmRvQ29sdW1uUHJvcGVydGllc0NoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIGRvQ29sdW1uUHJvcGVydGllc0NoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMuY29sT3duZXIgIT0gbnVsbCAmJiAhdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy5jb2xPd25lci5vbkNvbHVtblByb3BlcnRpZXNDaGFuZ2VkKHRoaXMpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFByb3BlcnRpZXMoY3VyQ2VsbFR5cGU6IHN0cmluZyk6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIHZhciBxRGVmID0gKDxhbnk+bWF0cml4RHJvcGRvd25Db2x1bW5UeXBlcylbY3VyQ2VsbFR5cGVdO1xuICAgIGlmICghcURlZiB8fCAhcURlZi5wcm9wZXJ0aWVzKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFNlcmlhbGl6ZXIuZmluZFByb3BlcnRpZXMoY3VyQ2VsbFR5cGUsIHFEZWYucHJvcGVydGllcyk7XG4gIH1cbiAgcHJpdmF0ZSByZW1vdmVQcm9wZXJ0aWVzKGN1ckNlbGxUeXBlOiBzdHJpbmcpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcyhjdXJDZWxsVHlwZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHByb3BlcnRpZXNbaV07XG4gICAgICBkZWxldGUgKDxhbnk+dGhpcylbcHJvcC5uYW1lXTtcbiAgICAgIGlmIChwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSkge1xuICAgICAgICBkZWxldGUgKDxhbnk+dGhpcylbcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZFByb3BlcnRpZXMoY3VyQ2VsbFR5cGU6IHN0cmluZykge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMudGVtcGxhdGVRdWVzdGlvbjtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcyhjdXJDZWxsVHlwZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHByb3BlcnRpZXNbaV07XG4gICAgICB0aGlzLmFkZFByb3BlcnR5KHF1ZXN0aW9uLCBwcm9wLm5hbWUsIGZhbHNlKTtcbiAgICAgIGlmIChwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSkge1xuICAgICAgICB0aGlzLmFkZFByb3BlcnR5KHF1ZXN0aW9uLCBwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgYWRkUHJvcGVydHkoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgaXNSZWFkT25seTogYm9vbGVhblxuICApIHtcbiAgICB2YXIgZGVzYyA9IHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAoPGFueT5xdWVzdGlvbilbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKCFpc1JlYWRPbmx5KSB7XG4gICAgICAoPGFueT5kZXNjKVtcInNldFwiXSA9IGZ1bmN0aW9uKHY6IGFueSkge1xuICAgICAgICAoPGFueT5xdWVzdGlvbilbcHJvcE5hbWVdID0gdjtcbiAgICAgIH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wTmFtZSwgZGVzYyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duQ2VsbCB7XG4gIHByaXZhdGUgcXVlc3Rpb25WYWx1ZTogUXVlc3Rpb247XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIHB1YmxpYyByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIHB1YmxpYyBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhXG4gICkge1xuICAgIHRoaXMucXVlc3Rpb25WYWx1ZSA9IHRoaXMuY3JlYXRlUXVlc3Rpb24oY29sdW1uLCByb3csIGRhdGEpO1xuICAgIHRoaXMucXVlc3Rpb25WYWx1ZS51cGRhdGVDdXN0b21XaWRnZXQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUXVlc3Rpb24oXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGFcbiAgKTogUXVlc3Rpb24ge1xuICAgIHZhciByZXMgPSBkYXRhLmNyZWF0ZVF1ZXN0aW9uKHRoaXMucm93LCB0aGlzLmNvbHVtbik7XG4gICAgcmVzLnZhbGlkYXRlVmFsdWVDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGRhdGEudmFsaWRhdGVDZWxsKHJvdywgY29sdW1uLm5hbWUsIHJvdy52YWx1ZSk7XG4gICAgfTtcbiAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5nZXRQcm9wZXJ0aWVzKGNvbHVtbi5nZXRUeXBlKCkpLmZvckVhY2goXG4gICAgICBwcm9wZXJ0eSA9PiB7XG4gICAgICAgIGxldCBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eS5uYW1lO1xuICAgICAgICBpZiAoKDxhbnk+Y29sdW1uKVtwcm9wZXJ0eU5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXNbcHJvcGVydHlOYW1lXSA9ICg8YW55PmNvbHVtbilbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvblZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi52YWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnF1ZXN0aW9uLnZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHRoaXMucXVlc3Rpb24ucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duVG90YWxDZWxsIGV4dGVuZHMgTWF0cml4RHJvcGRvd25DZWxsIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAgcHVibGljIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgcHVibGljIGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGFcbiAgKSB7XG4gICAgc3VwZXIoY29sdW1uLCByb3csIGRhdGEpO1xuICAgIHRoaXMudXBkYXRlQ2VsbFF1ZXN0aW9uKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVF1ZXN0aW9uKFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhXG4gICk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgcmVzID0gPFF1ZXN0aW9uPlNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3MoXCJleHByZXNzaW9uXCIpO1xuICAgIHJlcy5zZXRTdXJ2ZXlJbXBsKHJvdyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgdXBkYXRlQ2VsbFF1ZXN0aW9uKCkge1xuICAgIHRoaXMucXVlc3Rpb24ubG9jQ2FsY3VsYXRpb24oKTtcbiAgICB0aGlzLmNvbHVtbi51cGRhdGVDZWxsUXVlc3Rpb24odGhpcy5xdWVzdGlvbiwgbnVsbCk7XG4gICAgdGhpcy5xdWVzdGlvbi5leHByZXNzaW9uID0gdGhpcy5nZXRUb3RhbEV4cHJlc3Npb24oKTtcbiAgICB0aGlzLnF1ZXN0aW9uLmZvcm1hdCA9IHRoaXMuY29sdW1uLnRvdGFsRm9ybWF0O1xuICAgIHRoaXMucXVlc3Rpb24uY3VycmVuY3kgPSB0aGlzLmNvbHVtbi50b3RhbEN1cnJlbmN5O1xuICAgIHRoaXMucXVlc3Rpb24uZGlzcGxheVN0eWxlID0gdGhpcy5jb2x1bW4udG90YWxEaXNwbGF5U3R5bGU7XG4gICAgdGhpcy5xdWVzdGlvbi5tYXhpbXVtRnJhY3Rpb25EaWdpdHMgPSB0aGlzLmNvbHVtbi50b3RhbE1heGltdW1GcmFjdGlvbkRpZ2l0cztcbiAgICB0aGlzLnF1ZXN0aW9uLm1pbmltdW1GcmFjdGlvbkRpZ2l0cyA9IHRoaXMuY29sdW1uLnRvdGFsTWluaW11bUZyYWN0aW9uRGlnaXRzO1xuICAgIHRoaXMucXVlc3Rpb24udW5sb2NDYWxjdWxhdGlvbigpO1xuICB9XG4gIHB1YmxpYyBnZXRUb3RhbEV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLmNvbHVtbi50b3RhbEV4cHJlc3Npb24pIHJldHVybiB0aGlzLmNvbHVtbi50b3RhbEV4cHJlc3Npb247XG4gICAgaWYgKHRoaXMuY29sdW1uLnRvdGFsVHlwZSA9PSBcIm5vbmVcIikgcmV0dXJuIFwiXCI7XG4gICAgdmFyIGZ1bk5hbWUgPSB0aGlzLmNvbHVtbi50b3RhbFR5cGUgKyBcIkluQXJyYXlcIjtcbiAgICBpZiAoIUZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5oYXNGdW5jdGlvbihmdW5OYW1lKSkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIGZ1bk5hbWUgKyBcIih7c2VsZn0sICdcIiArIHRoaXMuY29sdW1uLm5hbWUgKyBcIicpXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlXG4gIGltcGxlbWVudHMgSVN1cnZleURhdGEsIElTdXJ2ZXlJbXBsLCBJTG9jYWxpemFibGVPd25lciwgSVRleHRQcm9jZXNzb3Ige1xuICBwdWJsaWMgc3RhdGljIFJvd1ZhcmlhYmxlTmFtZSA9IFwicm93XCI7XG4gIHB1YmxpYyBzdGF0aWMgT3duZXJWYXJpYWJsZU5hbWUgPSBcInNlbGZcIjtcbiAgcHVibGljIHN0YXRpYyBJbmRleFZhcmlhYmxlTmFtZSA9IFwicm93SW5kZXhcIjtcblxuICBwcml2YXRlIHN0YXRpYyBpZENvdW50ZXI6IG51bWJlciA9IDE7XG4gIHByaXZhdGUgc3RhdGljIGdldElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic3Jvd19cIiArIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLmlkQ291bnRlcisrO1xuICB9XG4gIHByb3RlY3RlZCBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhO1xuICBwcml2YXRlIGlzU2V0dGluZ1ZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgaWRWYWx1ZTogc3RyaW5nO1xuICBwcml2YXRlIHRleHRQcmVQcm9jZXNzb3I6IFRleHRQcmVQcm9jZXNzb3I7XG5cbiAgcHVibGljIGNlbGxzOiBBcnJheTxNYXRyaXhEcm9wZG93bkNlbGw+ID0gW107XG5cbiAgY29uc3RydWN0b3IoZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YSwgdmFsdWU6IGFueSkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yID0gbmV3IFRleHRQcmVQcm9jZXNzb3IoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yLm9uUHJvY2VzcyA9IGZ1bmN0aW9uKFxuICAgICAgdGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWVcbiAgICApIHtcbiAgICAgIHNlbGYuZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKHRleHRWYWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLmlkVmFsdWUgPSBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5nZXRJZCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZFZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgcm93TmFtZSgpOiBhbnkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICB2YXIgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuY2VsbHNbaV0ucXVlc3Rpb247XG4gICAgICBpZiAoIXF1ZXN0aW9uLmlzRW1wdHkoKSkge1xuICAgICAgICByZXN1bHRbcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCldID0gcXVlc3Rpb24udmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZ2V0QWxsVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbiAgZ2V0RmlsdGVyZWRWYWx1ZXMoKTogYW55IHtcbiAgICB2YXIgYWxsVmFsdWVzID0gdGhpcy5nZXRBbGxWYWx1ZXMoKTtcbiAgICB2YXIgdmFsdWVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0geyByb3c6IGFsbFZhbHVlcyB9O1xuICAgIGZvciAodmFyIGtleSBpbiBhbGxWYWx1ZXMpIHtcbiAgICAgIHZhbHVlc1trZXldID0gYWxsVmFsdWVzW2tleV07XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cbiAgZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHsgc3VydmV5OiB0aGlzLmdldFN1cnZleSgpLCByb3c6IHRoaXMgfTtcbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKCEhdGhpcy5kYXRhKSB7XG4gICAgICB2YWx1ZXNbTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UuT3duZXJWYXJpYWJsZU5hbWVdID0gdGhpcy5kYXRhLnZhbHVlO1xuICAgIH1cbiAgICB2YWx1ZXNbTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UuSW5kZXhWYXJpYWJsZU5hbWVdID0gdGhpcy5yb3dJbmRleDtcbiAgICBpZiAoIXByb3BlcnRpZXMpIHByb3BlcnRpZXMgPSB7fTtcbiAgICBwcm9wZXJ0aWVzW01hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLlJvd1ZhcmlhYmxlTmFtZV0gPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWVzW01hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLlJvd1ZhcmlhYmxlTmFtZV0gPSB0aGlzLnZhbHVlO1xuICAgICAgdGhpcy5jZWxsc1tpXS5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5pc1NldHRpbmdWYWx1ZSA9IHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmNlbGxzW2ldLnF1ZXN0aW9uO1xuICAgICAgdmFyIHZhbCA9ICEhdmFsdWUgPyB2YWx1ZVtxdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKV0gOiBudWxsO1xuICAgICAgcXVlc3Rpb24udXBkYXRlVmFsdWVGcm9tU3VydmV5KHZhbCk7XG4gICAgICBxdWVzdGlvbi5vblN1cnZleVZhbHVlQ2hhbmdlZCh2YWwpO1xuICAgIH1cbiAgICB0aGlzLmlzU2V0dGluZ1ZhbHVlID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jZWxsc1tpXS5xdWVzdGlvbi5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldERhdGFWYWx1ZUNvcmUodmFsdWVzSGFzaDogYW55LCBrZXk6IHN0cmluZykge1xuICAgIHZhciBzdXJ2ZXkgPSB0aGlzLmdldFN1cnZleSgpO1xuICAgIGlmICghIXN1cnZleSkge1xuICAgICAgcmV0dXJuICg8YW55PnN1cnZleSkuZ2V0RGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoLCBrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsdWVzSGFzaFtrZXldO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlDb2x1bW5OYW1lKG5hbWUpO1xuICAgIHJldHVybiAhIXF1ZXN0aW9uID8gcXVlc3Rpb24udmFsdWUgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIG5ld0NvbHVtblZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc1NldHRpbmdWYWx1ZSkgcmV0dXJuO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgdmFyIGNoYW5nZWRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUobmFtZSk7XG4gICAgdmFyIGNoYW5nZWRRdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeUNvbHVtbk5hbWUobmFtZSk7XG4gICAgdmFyIGNoYW5naW5nVmFsdWUgPSB0aGlzLmRhdGEub25Sb3dDaGFuZ2luZyh0aGlzLCBuYW1lLCBuZXdWYWx1ZSk7XG4gICAgaWYgKFxuICAgICAgISFjaGFuZ2VkUXVlc3Rpb24gJiZcbiAgICAgICFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMoY2hhbmdpbmdWYWx1ZSwgY2hhbmdlZFZhbHVlKVxuICAgICkge1xuICAgICAgdGhpcy5nZXRRdWVzdGlvbkJ5Q29sdW1uTmFtZShuYW1lKS52YWx1ZSA9IGNoYW5naW5nVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YS5vblJvd0NoYW5nZWQoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICBuZXdDb2x1bW5WYWx1ZSA9PSBudWxsICYmICFjaGFuZ2VkUXVlc3Rpb25cbiAgICAgICk7XG4gICAgICB0aGlzLm9uQW55VmFsdWVDaGFuZ2VkKE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLlJvd1ZhcmlhYmxlTmFtZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRDb21tZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZ2V0VmFsdWUobmFtZSArIHNldHRpbmdzLmNvbW1lbnRQcmVmaXgpO1xuICAgIHJldHVybiByZXN1bHQgPyByZXN1bHQgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBzZXRDb21tZW50KG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0VmFsdWUobmFtZSArIHNldHRpbmdzLmNvbW1lbnRQcmVmaXgsIG5ld1ZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzRW1wdHkoKSB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbCkpIHJldHVybiB0cnVlO1xuICAgIGZvciAodmFyIGtleSBpbiB2YWwpIHtcbiAgICAgIGlmICh2YWxba2V5XSAhPT0gdW5kZWZpbmVkICYmIHZhbFtrZXldICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXRRdWVzdGlvbkJ5Q29sdW1uKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBRdWVzdGlvbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jZWxsc1tpXS5jb2x1bW4gPT0gY29sdW1uKSByZXR1cm4gdGhpcy5jZWxsc1tpXS5xdWVzdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlDb2x1bW5OYW1lKGNvbHVtbk5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNlbGxzW2ldLmNvbHVtbi5uYW1lID09IGNvbHVtbk5hbWUpXG4gICAgICAgIHJldHVybiB0aGlzLmNlbGxzW2ldLnF1ZXN0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U2hhcmVkUXVlc3Rpb25CeU5hbWUoY29sdW1uTmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YVxuICAgICAgPyB0aGlzLmRhdGEuZ2V0U2hhcmVkUXVlc3Rpb25CeU5hbWUoY29sdW1uTmFtZSwgdGhpcylcbiAgICAgIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXModmFsOiBhbnkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlDb2x1bW5OYW1lKGtleSk7XG4gICAgICBpZiAocXVlc3Rpb24pIHtcbiAgICAgICAgdmFyIHFWYWwgPSBxdWVzdGlvbi52YWx1ZTtcbiAgICAgICAgcXVlc3Rpb24uY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICAgICAgaWYgKCFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMocVZhbCwgcXVlc3Rpb24udmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5zZXRWYWx1ZShrZXksIHF1ZXN0aW9uLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLmdldFNoYXJlZFF1ZXN0aW9uQnlOYW1lKGtleSkpIHtcbiAgICAgICAgICB0aGlzLnNldFZhbHVlKGtleSwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGdldExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0TG9jYWxlKCkgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldE1hcmtkb3duSHRtbCh0ZXh0KSA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldFByb2Nlc3NlZFRleHQodGV4dCkgOiB0ZXh0O1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY2VsbHNbaV0ucXVlc3Rpb24ubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHVwZGF0ZUNlbGxRdWVzdGlvbk9uQ29sdW1uQ2hhbmdlZChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jZWxsc1tpXS5jb2x1bW4gPT09IGNvbHVtbikge1xuICAgICAgICB0aGlzLnVwZGF0ZUNlbGxPbkNvbHVtbkNoYW5nZWQodGhpcy5jZWxsc1tpXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIG9uUXVlc3Rpb25SZWFkT25seUNoYW5nZWQocGFyZW50SXNSZWFkT25seTogYm9vbGVhbikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCEhdGhpcy5jZWxsc1tpXS5xdWVzdGlvbikge1xuICAgICAgICB0aGlzLmNlbGxzW2ldLnF1ZXN0aW9uLnJlYWRPbmx5ID0gcGFyZW50SXNSZWFkT25seTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUNlbGxPbkNvbHVtbkNoYW5nZWQoY2VsbDogTWF0cml4RHJvcGRvd25DZWxsKSB7XG4gICAgY2VsbC5jb2x1bW4udXBkYXRlQ2VsbFF1ZXN0aW9uKGNlbGwucXVlc3Rpb24sIHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBidWlsZENlbGxzKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmlzU2V0dGluZ1ZhbHVlID0gdHJ1ZTtcbiAgICB2YXIgY29sdW1ucyA9IHRoaXMuZGF0YS5jb2x1bW5zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNvbHVtbiA9IGNvbHVtbnNbaV07XG4gICAgICBpZiAoY29sdW1uLmlzVmlzaWJsZSkge1xuICAgICAgICB2YXIgY2VsbCA9IHRoaXMuY3JlYXRlQ2VsbChjb2x1bW4pO1xuICAgICAgICB0aGlzLmNlbGxzLnB1c2goY2VsbCk7XG4gICAgICAgIGlmICghIXZhbHVlICYmICFIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZVtjb2x1bW4ubmFtZV0pKSB7XG4gICAgICAgICAgY2VsbC5xdWVzdGlvbi52YWx1ZSA9IHZhbHVlW2NvbHVtbi5uYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmlzU2V0dGluZ1ZhbHVlID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2VsbCA9IHRoaXMuY2VsbHNbaV07XG4gICAgICBpZiAoXG4gICAgICAgICFjZWxsLnF1ZXN0aW9uLmlzRW1wdHkoKSAmJlxuICAgICAgICAoIXZhbHVlIHx8XG4gICAgICAgICAgIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhcbiAgICAgICAgICAgIGNlbGwucXVlc3Rpb24udmFsdWUsXG4gICAgICAgICAgICB2YWx1ZVtjZWxsLmNvbHVtbi5uYW1lXVxuICAgICAgICAgICkpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZShjZWxsLmNvbHVtbi5uYW1lLCBjZWxsLnF1ZXN0aW9uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUNlbGwoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IE1hdHJpeERyb3Bkb3duQ2VsbCB7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXhEcm9wZG93bkNlbGwoY29sdW1uLCB0aGlzLCB0aGlzLmRhdGEpO1xuICB9XG4gIGdlU3VydmV5RGF0YSgpOiBJU3VydmV5RGF0YSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0U3VydmV5KCkgOiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcm93SW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gISF0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0Um93SW5kZXgodGhpcykgKyAxIDogLTE7XG4gIH1cbiAgLy9JVGV4dFByb2Nlc3NvclxuICBwcml2YXRlIGdldFByb2Nlc3NlZFRleHRWYWx1ZSh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSkge1xuICAgIHZhciBmaXJzdE5hbWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCkuZ2V0Rmlyc3ROYW1lKHRleHRWYWx1ZS5uYW1lKTtcbiAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPVxuICAgICAgZmlyc3ROYW1lID09IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLlJvd1ZhcmlhYmxlTmFtZTtcbiAgICB0ZXh0VmFsdWUuY2FuUHJvY2VzcyA9IHRleHRWYWx1ZS5pc0V4aXN0cztcbiAgICBpZiAoIXRleHRWYWx1ZS5pc0V4aXN0cykgcmV0dXJuO1xuICAgIHZhciB2YWx1ZXMgPSB7IHJvdzogdGhpcy52YWx1ZSB9O1xuICAgIHRleHRWYWx1ZS52YWx1ZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRWYWx1ZSh0ZXh0VmFsdWUubmFtZSwgdmFsdWVzKTtcbiAgfVxuICBnZXRUZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBwcm9jZXNzVGV4dCh0ZXh0OiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgdGV4dCA9IHRoaXMudGV4dFByZVByb2Nlc3Nvci5wcm9jZXNzKHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSk7XG4gICAgaWYgKCF0aGlzLmdldFN1cnZleSgpKSByZXR1cm4gdGV4dDtcbiAgICByZXR1cm4gdGhpcy5nZXRTdXJ2ZXkoKS5wcm9jZXNzVGV4dCh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUpO1xuICB9XG4gIHByb2Nlc3NUZXh0RXgodGV4dDogc3RyaW5nLCByZXR1cm5EaXNwbGF5VmFsdWU6IGJvb2xlYW4pOiBhbnkge1xuICAgIHRleHQgPSB0aGlzLnByb2Nlc3NUZXh0KHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSk7XG4gICAgaWYgKCF0aGlzLmdldFN1cnZleSgpKSByZXR1cm4gdGV4dDtcbiAgICB2YXIgaGFzQWxsVmFsdWVzT25MYXN0UnVuID0gdGhpcy50ZXh0UHJlUHJvY2Vzc29yLmhhc0FsbFZhbHVlc09uTGFzdFJ1bjtcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRTdXJ2ZXkoKS5wcm9jZXNzVGV4dEV4KHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSwgZmFsc2UpO1xuICAgIHJlcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4gPVxuICAgICAgcmVzLmhhc0FsbFZhbHVlc09uTGFzdFJ1biAmJiBoYXNBbGxWYWx1ZXNPbkxhc3RSdW47XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duVG90YWxSb3dNb2RlbCBleHRlbmRzIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgY29uc3RydWN0b3IoZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YSkge1xuICAgIHN1cGVyKGRhdGEsIG51bGwpO1xuICAgIHRoaXMuYnVpbGRDZWxscyhudWxsKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlQ2VsbChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogTWF0cml4RHJvcGRvd25DZWxsIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeERyb3Bkb3duVG90YWxDZWxsKGNvbHVtbiwgdGhpcywgdGhpcy5kYXRhKTtcbiAgfVxuICBwdWJsaWMgc2V0VmFsdWUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKCEhdGhpcy5kYXRhKSB7XG4gICAgICB0aGlzLmRhdGEub25Ub3RhbFZhbHVlQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgIHZhciBwcmV2VmFsdWU7XG4gICAgZG8ge1xuICAgICAgcHJldlZhbHVlID0gSGVscGVycy5nZXRVbmJpbmRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgICAgY291bnRlcisrO1xuICAgIH0gd2hpbGUgKCFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMocHJldlZhbHVlLCB0aGlzLnZhbHVlKSAmJiBjb3VudGVyIDwgMyk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUNlbGxPbkNvbHVtbkNoYW5nZWQoY2VsbDogTWF0cml4RHJvcGRvd25DZWxsKSB7XG4gICAgKDxNYXRyaXhEcm9wZG93blRvdGFsQ2VsbD5jZWxsKS51cGRhdGVDZWxsUXVlc3Rpb24oKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyBmb3IgbWF0cml4IGRyb3Bkb3duIGFuZCBtYXRyaXggZHluYW1pYyBxdWVzdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlXG4gIGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhCYXNlTW9kZWw8XG4gICAgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgTWF0cml4RHJvcGRvd25Db2x1bW5cbiAgPlxuICBpbXBsZW1lbnRzIElNYXRyaXhEcm9wZG93bkRhdGEge1xuICBwdWJsaWMgc3RhdGljIGdldCBkZWZhdWx0Q2VsbFR5cGUoKSB7XG4gICAgcmV0dXJuIHNldHRpbmdzLm1hdHJpeERlZmF1bHRDZWxsVHlwZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldCBkZWZhdWx0Q2VsbFR5cGUodmFsOiBzdHJpbmcpIHtcbiAgICBzZXR0aW5ncy5tYXRyaXhEZWZhdWx0Q2VsbFR5cGUgPSB2YWw7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBhZGREZWZhdWx0Q29sdW1ucyhtYXRyaXg6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UpIHtcbiAgICB2YXIgY29sTmFtZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENvbHVtcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbE5hbWVzLmxlbmd0aDsgaSsrKSBtYXRyaXguYWRkQ29sdW1uKGNvbE5hbWVzW2ldKTtcbiAgfVxuICBwcml2YXRlIGNob2ljZXNWYWx1ZTogQXJyYXk8SXRlbVZhbHVlPjtcbiAgcHJvdGVjdGVkIGlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcbiAgY29sdW1uc0NoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgdXBkYXRlQ2VsbHNDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY29sdW1uTGF5b3V0Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gIHByb3RlY3RlZCBjcmVhdGVDb2x1bW5WYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJjb2x1bW5zXCIsIChpdGVtOiBhbnkpID0+IHtcbiAgICAgIGl0ZW0uY29sT3duZXIgPSB0aGlzO1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmNob2ljZXNWYWx1ZSA9IHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcImNob2ljZXNcIik7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIsIHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJjb2x1bW5zXCIsIGZ1bmN0aW9uKFxuICAgICAgbmV3Q29sdW1uczogYW55XG4gICAgKSB7XG4gICAgICBzZWxmLnVwZGF0ZUNvbHVtbnNJbmRleGVzKG5ld0NvbHVtbnMpO1xuICAgICAgc2VsZi5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IG51bGw7XG4gICAgICBzZWxmLmdlbmVyYXRlZFRvdGFsUm93ID0gbnVsbDtcbiAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKHNlbGYuY29sdW1uc0NoYW5nZWRDYWxsYmFjayk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wiY29sdW1uTGF5b3V0XCIsIFwiYWRkUm93TG9jYXRpb25cIl0sXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soc2VsZi5jb2x1bW5MYXlvdXRDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImNlbGxUeXBlXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IG51bGw7XG4gICAgICBzZWxmLmZpcmVDYWxsYmFjayhzZWxmLmNvbHVtbnNDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibWF0cml4ZHJvcGRvd25iYXNlXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1Jvd3NEeW5hbWljKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogU2V0IGNvbHVtbkxheW91dCB0byAndmVydGljYWwnIHRvIHBsYWNlIGNvbHVtbnMgdmVydGljYWxseSBhbmQgcm93cyBob3Jpem9udGFsbHkuIEl0IG1ha2VzIHNlbnNlIHdoZW4gd2UgaGF2ZSBtYW55IGNvbHVtbnMgYW5kIGZldyByb3dzLlxuICAgKiBAc2VlIGNvbHVtbnNcbiAgICogQHNlZSByb3dDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBjb2x1bW5MYXlvdXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uTGF5b3V0XCIsIFwiaG9yaXpvbnRhbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbHVtbkxheW91dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbkxheW91dFwiLCB2YWwpO1xuICB9XG4gIGdldCBjb2x1bW5zTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5MYXlvdXQ7XG4gIH1cbiAgc2V0IGNvbHVtbnNMb2NhdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuY29sdW1uTGF5b3V0ID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgY29sdW1ucyBhcmUgbG9jYXRlZCBob3Jpem9udGFsbHlcbiAgICogQHNlZSBjb2x1bW5MYXlvdXRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNDb2x1bW5MYXlvdXRIb3Jpem9udGFsKCkge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbkxheW91dCAhPSBcInZlcnRpY2FsXCI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTWF0cml4Um93Q3JlYXRlZChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgcm93VmFsdWU6IHJvdy52YWx1ZSxcbiAgICAgIHJvdzogcm93LFxuICAgICAgY29sdW1uOiA8YW55Pm51bGwsXG4gICAgICBjb2x1bW5OYW1lOiA8YW55Pm51bGwsXG4gICAgICBjZWxsOiA8YW55Pm51bGwsXG4gICAgICBjZWxsUXVlc3Rpb246IDxhbnk+bnVsbCxcbiAgICAgIHZhbHVlOiA8YW55Pm51bGxcbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgb3B0aW9ucy5jb2x1bW4gPSB0aGlzLmNvbHVtbnNbaV07XG4gICAgICBvcHRpb25zLmNvbHVtbk5hbWUgPSBvcHRpb25zLmNvbHVtbi5uYW1lO1xuICAgICAgdmFyIGNlbGwgPSByb3cuY2VsbHNbaV07XG4gICAgICBvcHRpb25zLmNlbGwgPSBjZWxsO1xuICAgICAgb3B0aW9ucy5jZWxsUXVlc3Rpb24gPSBjZWxsLnF1ZXN0aW9uO1xuICAgICAgb3B0aW9ucy52YWx1ZSA9IGNlbGwudmFsdWU7XG4gICAgICB0aGlzLnN1cnZleS5tYXRyaXhDZWxsQ3JlYXRlZCh0aGlzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBjZWxsIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNlbGxUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNlbGxUeXBlXCIsIHNldHRpbmdzLm1hdHJpeERlZmF1bHRDZWxsVHlwZSk7XG4gIH1cbiAgcHVibGljIHNldCBjZWxsVHlwZSh2YWw6IHN0cmluZykge1xuICAgIHZhbCA9IHZhbC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh0aGlzLmNlbGxUeXBlID09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNlbGxUeXBlXCIsIHZhbCk7XG4gICAgdGhpcy51cGRhdGVDb2x1bW5zQ2VsbFR5cGUoKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnVwZGF0ZUNlbGxzQ2FsbGJhY2spO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uc0NlbGxUeXBlKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNvbHVtbnNbaV0uZGVmYXVsdENlbGxUeXBlQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbnNJbmRleGVzKGNvbHM6IEFycmF5PE1hdHJpeERyb3Bkb3duQ29sdW1uPikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykge1xuICAgICAgY29sc1tpXS5zZXRJbmRleChpKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGNvbHVtbiBjb3VudCBmb3IgcmFkaW9ncm91cCBhbmQgY2hlY2tib3ggIGNlbGwgdHlwZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbHVtbkNvbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbkNvbENvdW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sdW1uQ29sQ291bnQodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiA0KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uQ29sQ291bnRcIiwgdmFsdWUpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMudXBkYXRlQ2VsbHNDYWxsYmFjayk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgbWltaW11bSBjb2x1bW4gd2lkdGguXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbHVtbk1pbldpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbk1pbldpZHRoXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sdW1uTWluV2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5NaW5XaWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHRvIHNob3cgdGhlIGhvcml6b250YWwgc2Nyb2xsLlxuICAgKi9cbiAgcHVibGljIGdldCBob3Jpem9udGFsU2Nyb2xsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJob3Jpem9udGFsU2Nyb2xsXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhvcml6b250YWxTY3JvbGwodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaG9yaXpvbnRhbFNjcm9sbFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRSZXF1aXJlZFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5yZXF1aXJlZFRleHQgOiBcIlwiO1xuICB9XG4gIG9uQ29sdW1uUHJvcGVydGllc0NoYW5nZWQoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbikge1xuICAgIHRoaXMudXBkYXRlSGFzRm9vdGVyKCk7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLnVwZGF0ZUNlbGxRdWVzdGlvbk9uQ29sdW1uQ2hhbmdlZChjb2x1bW4pO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmdlbmVyYXRlZFRvdGFsUm93KSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFRvdGFsUm93LnVwZGF0ZUNlbGxRdWVzdGlvbk9uQ29sdW1uQ2hhbmdlZChjb2x1bW4pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0Zvb3RlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGFzRm9vdGVyXCIsIGZhbHNlKTtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlSGFzRm9vdGVyKCkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhhc0Zvb3RlclwiLCB0aGlzLmhhc1RvdGFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1RvdGFsKCk6IGJvb2xlYW4ge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jb2x1bW5zW2ldLmhhc1RvdGFsKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldENlbGxUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbFR5cGU7XG4gIH1cbiAgcHVibGljIGdldENvbmRpdGlvbkpzb24ob3BlcmF0b3I6IHN0cmluZyA9IG51bGwsIHBhdGg6IHN0cmluZyA9IG51bGwpOiBhbnkge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIHN1cGVyLmdldENvbmRpdGlvbkpzb24oKTtcbiAgICB2YXIgY29sdW1uTmFtZSA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChwYXRoW2ldID09IFwiLlwiKSBicmVhaztcbiAgICAgIGNvbHVtbk5hbWUgPSBwYXRoW2ldICsgY29sdW1uTmFtZTtcbiAgICB9XG4gICAgdmFyIGNvbHVtbiA9IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbk5hbWUpO1xuICAgIGlmICghY29sdW1uKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcXVlc3Rpb24gPSBjb2x1bW4uY3JlYXRlQ2VsbFF1ZXN0aW9uKG51bGwpO1xuICAgIGlmICghcXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgIHJldHVybiBxdWVzdGlvbi5nZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yKTtcbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcm93c1tpXS5jbGVhckluY29ycmVjdFZhbHVlcyh0aGlzLmdldFJvd1ZhbHVlKGkpKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFyRXJyb3JzKCkge1xuICAgIHN1cGVyLmNsZWFyRXJyb3JzKCk7XG4gICAgaWYgKCEhdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByb3cgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJvdy5jZWxscy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHJvdy5jZWxsc1tqXS5xdWVzdGlvbi5jbGVhckVycm9ycygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMucnVuQ2VsbHNDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB0aGlzLnJ1blRvdGFsc0NvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByb3RlY3RlZCBydW5DZWxsc0NvbmRpdGlvbihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICkge1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyB8fCAhdGhpcy5oYXNDZWxsc0NvbmRpdGlvbikgcmV0dXJuO1xuICAgIHZhciBuZXdWYWx1ZXMgPSB0aGlzLmdldFJvd0NvbmRpdGlvblZhbHVlcyh2YWx1ZXMpO1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJvd3NbaV0ucnVuQ29uZGl0aW9uKG5ld1ZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBydW5Ub3RhbHNDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVG90YWxSb3cpIHJldHVybjtcbiAgICB0aGlzLmdlbmVyYXRlZFRvdGFsUm93LnJ1bkNvbmRpdGlvbihcbiAgICAgIHRoaXMuZ2V0Um93Q29uZGl0aW9uVmFsdWVzKHZhbHVlcyksXG4gICAgICBwcm9wZXJ0aWVzXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGdldFJvd0NvbmRpdGlvblZhbHVlcyh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+KTogSGFzaFRhYmxlPGFueT4ge1xuICAgIHZhciBuZXdWYWx1ZXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICBuZXdWYWx1ZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlcykpO1xuICAgIH1cbiAgICBuZXdWYWx1ZXNbXCJyb3dcIl0gPSB7fTtcbiAgICByZXR1cm4gbmV3VmFsdWVzO1xuICB9XG4gIHByaXZhdGUgZ2V0IGhhc0NlbGxzQ29uZGl0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jb2x1bW5zW2ldLmhhc0NvbmRpdGlvbikgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB2YXIgcm93cyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3M7XG4gICAgaWYgKCFyb3dzKSByZXR1cm47XG4gICAgdmFyIGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb2x1bW5zW2ldLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcm93c1tpXS5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmdlbmVyYXRlZFRvdGFsUm93KSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFRvdGFsUm93LmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb2x1bW4gYnkgaXQncyBuYW1lLiBSZXR1bnMgbnVsbCBpZiBhIGNvbHVtbiB3aXRoIHRoaXMgbmFtZSBkb2Vzbid0IGV4aXN0LlxuICAgKiBAcGFyYW0gY29sdW1uXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbk5hbWU6IHN0cmluZyk6IE1hdHJpeERyb3Bkb3duQ29sdW1uIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuY29sdW1uc1tpXS5uYW1lID09IGNvbHVtbk5hbWUpIHJldHVybiB0aGlzLmNvbHVtbnNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldENvbHVtbk5hbWUoY29sdW1uTmFtZTogc3RyaW5nKTogTWF0cml4RHJvcGRvd25Db2x1bW4ge1xuICAgIHJldHVybiB0aGlzLmdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29sdW1uIHdpZHRoLlxuICAgKiBAcGFyYW0gY29sdW1uXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uV2lkdGgoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbHVtbi5taW5XaWR0aCA/IGNvbHVtbi5taW5XaWR0aCA6IHRoaXMuY29sdW1uTWluV2lkdGg7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGNob2ljZXMgZm9yIGRyb3Bkb3duLCBjaGVja2JveCBhbmQgcmFkaW9ncm91cCBjZWxsIHR5cGVzLlxuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNob2ljZXNWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXModmFsOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBvcHRpb25zIGNhcHRpb24gZm9yIGRyb3Bkb3duIGNlbGwgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgb3B0aW9uc0NhcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJvcHRpb25zQ2FwdGlvblwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IG9wdGlvbnNDYXB0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJvcHRpb25zQ2FwdGlvblwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jT3B0aW9uc0NhcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJvcHRpb25zQ2FwdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgYWRkQ29sdW1uKG5hbWU6IHN0cmluZywgdGl0bGU6IHN0cmluZyA9IG51bGwpOiBNYXRyaXhEcm9wZG93bkNvbHVtbiB7XG4gICAgdmFyIGNvbHVtbiA9IG5ldyBNYXRyaXhEcm9wZG93bkNvbHVtbihuYW1lLCB0aXRsZSk7XG4gICAgdGhpcy5jb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICByZXR1cm4gY29sdW1uO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWaXNpYmxlUm93cygpOiBBcnJheTxNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZT4ge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSB0aGlzLmdlbmVyYXRlUm93cygpO1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5mb3JFYWNoKHJvdyA9PiB0aGlzLm9uTWF0cml4Um93Q3JlYXRlZChyb3cpKTtcbiAgICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7IHN1cnZleTogdGhpcy5zdXJ2ZXkgfTtcbiAgICAgICAgdGhpcy5ydW5DZWxsc0NvbmRpdGlvbih0aGlzLmRhdGEuZ2V0QWxsVmFsdWVzKCksIHByb3BlcnRpZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgfVxuICBwdWJsaWMgZ2V0IHRvdGFsVmFsdWUoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuaGFzVG90YWwpIHJldHVybiB7fTtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlVG90YWxSb3cudmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFZpc2libGVUb3RhbFJvdygpOiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmhhc1RvdGFsKSB7XG4gICAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVG90YWxSb3cpIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdyA9IHRoaXMuZ2VuZXJhdGVUb3RhbFJvdygpO1xuICAgICAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7IHN1cnZleTogdGhpcy5zdXJ2ZXkgfTtcbiAgICAgICAgICB0aGlzLnJ1blRvdGFsc0NvbmRpdGlvbih0aGlzLmRhdGEuZ2V0QWxsVmFsdWVzKCksIHByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVG90YWxSb3cgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdztcbiAgfVxuICBwdWJsaWMgZ2V0IHZpc2libGVUb3RhbFJvdygpOiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmlzaWJsZVRvdGFsUm93KCk7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgICB0aGlzLnVwZGF0ZUNvbHVtbnNJbmRleGVzKHRoaXMuY29sdW1ucyk7XG4gICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IG51bGw7XG4gICAgdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdyA9IG51bGw7XG4gICAgdGhpcy51cGRhdGVIYXNGb290ZXIoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93IHZhbHVlLiBJZiB0aGUgcm93IHZhbHVlIGlzIGVtcHR5LCB0aGUgb2JqZWN0IGlzIGVtcHR5OiB7fS5cbiAgICogQHBhcmFtIHJvd0luZGV4IHJvdyBpbmRleCBmcm9tIDAgdG8gdmlzaWJsZSByb3cgY291bnQgLSAxLlxuICAgKi9cbiAgcHVibGljIGdldFJvd1ZhbHVlKHJvd0luZGV4OiBudW1iZXIpIHtcbiAgICBpZiAocm93SW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgdmlzUm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgaWYgKHJvd0luZGV4ID49IHZpc1Jvd3MubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um93VmFsdWVDb3JlKHZpc1Jvd3Nbcm93SW5kZXhdLCBuZXdWYWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGUgcm93IHZhbHVlLlxuICAgKiBAcGFyYW0gcm93SW5kZXggcm93IGluZGV4IGZyb20gMCB0byB2aXNpYmxlIHJvdyBjb3VudCAtIDEuXG4gICAqIEBwYXJhbSByb3dWYWx1ZSBhbiBvYmplY3Qge1wiY29sdW1uIG5hbWVcIjogY29sdW1uVmFsdWUsLi4uIH1cbiAgICovXG4gIHB1YmxpYyBzZXRSb3dWYWx1ZShyb3dJbmRleDogbnVtYmVyLCByb3dWYWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAocm93SW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgdmlzUm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgaWYgKHJvd0luZGV4ID49IHZpc1Jvd3MubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLm9uUm93Q2hhbmdlZCh2aXNSb3dzW3Jvd0luZGV4XSwgXCJcIiwgcm93VmFsdWUsIGZhbHNlKTtcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdlbmVyYXRlUm93cygpOiBBcnJheTxNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZT4ge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZW5lcmF0ZVRvdGFsUm93KCk6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeERyb3Bkb3duVG90YWxSb3dNb2RlbCh0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3VmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gIXRoaXMudmFsdWUgPyB7fSA6IHRoaXMuY3JlYXRlVmFsdWVDb3B5KCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFJvd1ZhbHVlQ29yZShcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIHF1ZXN0aW9uVmFsdWU6IGFueSxcbiAgICBjcmVhdGU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBhbnkge1xuICAgIHZhciByZXN1bHQgPSBxdWVzdGlvblZhbHVlW3Jvdy5yb3dOYW1lXSA/IHF1ZXN0aW9uVmFsdWVbcm93LnJvd05hbWVdIDogbnVsbDtcbiAgICBpZiAoIXJlc3VsdCAmJiBjcmVhdGUpIHtcbiAgICAgIHJlc3VsdCA9IHt9O1xuICAgICAgcXVlc3Rpb25WYWx1ZVtyb3cucm93TmFtZV0gPSByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Um93RGlzcGxheVZhbHVlKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgcm93VmFsdWU6IGFueVxuICApOiBhbnkge1xuICAgIGlmICghcm93VmFsdWUpIHJldHVybiByb3dWYWx1ZTtcbiAgICBmb3IgKHZhciBrZXkgaW4gcm93VmFsdWUpIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHJvdy5nZXRRdWVzdGlvbkJ5Q29sdW1uTmFtZShrZXkpO1xuICAgICAgaWYgKCFxdWVzdGlvbikge1xuICAgICAgICBxdWVzdGlvbiA9IHRoaXMuZ2V0U2hhcmVkUXVlc3Rpb25CeU5hbWUoa2V5LCByb3cpO1xuICAgICAgfVxuICAgICAgaWYgKCEhcXVlc3Rpb24pIHtcbiAgICAgICAgcm93VmFsdWVba2V5XSA9IHF1ZXN0aW9uLmRpc3BsYXlWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXRQbGFpbkRhdGEoXG4gICAgb3B0aW9uczoge1xuICAgICAgaW5jbHVkZUVtcHR5PzogYm9vbGVhbjtcbiAgICAgIGNhbGN1bGF0aW9ucz86IEFycmF5PHtcbiAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICB9ID0ge1xuICAgICAgaW5jbHVkZUVtcHR5OiB0cnVlXG4gICAgfVxuICApIHtcbiAgICB2YXIgcXVlc3Rpb25QbGFpbkRhdGEgPSBzdXBlci5nZXRQbGFpbkRhdGEob3B0aW9ucyk7XG4gICAgaWYgKCEhcXVlc3Rpb25QbGFpbkRhdGEpIHtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmlzTm9kZSA9IHRydWU7XG4gICAgICBxdWVzdGlvblBsYWluRGF0YS5kYXRhID0gdGhpcy52aXNpYmxlUm93cy5tYXAoXG4gICAgICAgIChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKSA9PiB7XG4gICAgICAgICAgdmFyIHJvd0RhdGFJdGVtID0gPGFueT57XG4gICAgICAgICAgICBuYW1lOiByb3cucm93TmFtZSxcbiAgICAgICAgICAgIHRpdGxlOiByb3cucm93TmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiByb3cudmFsdWUsXG4gICAgICAgICAgICBkaXNwbGF5VmFsdWU6IHRoaXMuZ2V0Um93RGlzcGxheVZhbHVlKHJvdywgcm93LnZhbHVlKSxcbiAgICAgICAgICAgIGdldFN0cmluZzogKHZhbDogYW55KSA9PlxuICAgICAgICAgICAgICB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiID8gSlNPTi5zdHJpbmdpZnkodmFsKSA6IHZhbCxcbiAgICAgICAgICAgIGlzTm9kZTogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IHJvdy5jZWxsc1xuICAgICAgICAgICAgICAubWFwKChjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGwpID0+XG4gICAgICAgICAgICAgICAgY2VsbC5xdWVzdGlvbi5nZXRQbGFpbkRhdGEob3B0aW9ucylcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAuZmlsdGVyKChkOiBhbnkpID0+ICEhZClcbiAgICAgICAgICB9O1xuICAgICAgICAgIChvcHRpb25zLmNhbGN1bGF0aW9ucyB8fCBbXSkuZm9yRWFjaChjYWxjdWxhdGlvbiA9PiB7XG4gICAgICAgICAgICByb3dEYXRhSXRlbVtjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVdID0gKDxhbnk+cm93KVtcbiAgICAgICAgICAgICAgY2FsY3VsYXRpb24ucHJvcGVydHlOYW1lXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByb3dEYXRhSXRlbTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXN0aW9uUGxhaW5EYXRhO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVmb3JlVmFsdWVDaGFuZ2VkKHZhbDogYW55KSB7fVxuICBwcml2YXRlIG9uU2V0UXVlc3Rpb25WYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5pc1Jvd0NoYW5naW5nKSByZXR1cm47XG4gICAgdGhpcy5vbkJlZm9yZVZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlKTtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgfHwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGggPT0gMClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSB0cnVlO1xuICAgIHZhciB2YWwgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV0udmFsdWUgPSB0aGlzLmdldFJvd1ZhbHVlQ29yZShyb3csIHZhbCk7XG4gICAgfVxuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBzZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5zZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlKTtcbiAgICB0aGlzLm9uU2V0UXVlc3Rpb25WYWx1ZSgpO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2VsbHMgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLmNlbGxzO1xuICAgICAgaWYgKCFjZWxscykgY29udGludWU7XG4gICAgICBmb3IgKHZhciBjb2xJbmRleCA9IDA7IGNvbEluZGV4IDwgY2VsbHMubGVuZ3RoOyBjb2xJbmRleCsrKSB7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHF1ZXN0aW9uICYmXG4gICAgICAgICAgKCFxdWVzdGlvbi5zdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHx8ICFxdWVzdGlvbi52YWx1ZSlcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgdmFyIGVycm9zSW5Db2x1bW5zID0gdGhpcy5oYXNFcnJvckluQ29sdW1ucyhmaXJlQ2FsbGJhY2spO1xuICAgIHJldHVybiBzdXBlci5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrKSB8fCBlcnJvc0luQ29sdW1ucztcbiAgfVxuICBwdWJsaWMgZ2V0QWxsRXJyb3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgdmFyIHJlc3VsdCA9IHN1cGVyLmdldEFsbEVycm9ycygpO1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSByb3dzW2ldO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByb3cuY2VsbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVycm9ycyA9IHJvdy5jZWxsc1tqXS5xdWVzdGlvbi5nZXRBbGxFcnJvcnMoKTtcbiAgICAgICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JJbkNvbHVtbnMoZmlyZUNhbGxiYWNrOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGxzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS5jZWxscztcbiAgICAgIGlmICghY2VsbHMpIGNvbnRpbnVlO1xuICAgICAgZm9yICh2YXIgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IGNlbGxzLmxlbmd0aDsgY29sSW5kZXgrKykge1xuICAgICAgICBpZiAoIWNlbGxzW2NvbEluZGV4XSkgY29udGludWU7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbjtcbiAgICAgICAgcmVzID1cbiAgICAgICAgICAocXVlc3Rpb24gJiYgcXVlc3Rpb24udmlzaWJsZSAmJiBxdWVzdGlvbi5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrKSkgfHxcbiAgICAgICAgICByZXM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldEZpcnN0Q2VsbFF1ZXN0aW9uKGZhbHNlKTtcbiAgICByZXR1cm4gcXVlc3Rpb24gPyBxdWVzdGlvbi5pbnB1dElkIDogc3VwZXIuZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdEVycm9ySW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldEZpcnN0Q2VsbFF1ZXN0aW9uKHRydWUpO1xuICAgIHJldHVybiBxdWVzdGlvbiA/IHF1ZXN0aW9uLmlucHV0SWQgOiBzdXBlci5nZXRGaXJzdEVycm9ySW5wdXRFbGVtZW50SWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RDZWxsUXVlc3Rpb24ob25FcnJvcjogYm9vbGVhbik6IFF1ZXN0aW9uIHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybiBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGxzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS5jZWxscztcbiAgICAgIGZvciAodmFyIGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCBjZWxscy5sZW5ndGg7IGNvbEluZGV4KyspIHtcbiAgICAgICAgaWYgKCFvbkVycm9yKSByZXR1cm4gY2VsbHNbY29sSW5kZXhdLnF1ZXN0aW9uO1xuICAgICAgICBpZiAoY2VsbHNbY29sSW5kZXhdLnF1ZXN0aW9uLmN1cnJlbnRFcnJvckNvdW50ID4gMClcbiAgICAgICAgICByZXR1cm4gY2VsbHNbY29sSW5kZXhdLnF1ZXN0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25SZWFkT25seUNoYW5nZWQoKSB7XG4gICAgc3VwZXIub25SZWFkT25seUNoYW5nZWQoKTtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVSb3dzKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnZpc2libGVSb3dzW2ldLm9uUXVlc3Rpb25SZWFkT25seUNoYW5nZWQodGhpcy5pc1JlYWRPbmx5KTtcbiAgICB9XG4gIH1cblxuICAvL0lNYXRyaXhEcm9wZG93bkRhdGFcbiAgcHVibGljIGNyZWF0ZVF1ZXN0aW9uKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtblxuICApOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUXVlc3Rpb25Db3JlKHJvdywgY29sdW1uKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUXVlc3Rpb25Db3JlKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtblxuICApOiBRdWVzdGlvbiB7XG4gICAgdmFyIHF1ZXN0aW9uID0gY29sdW1uLmNyZWF0ZUNlbGxRdWVzdGlvbihyb3cpO1xuICAgIGlmICh0aGlzLmlzUmVhZE9ubHkpIHtcbiAgICAgIHF1ZXN0aW9uLnJlYWRPbmx5ID0gdHJ1ZTtcbiAgICB9XG4gICAgcXVlc3Rpb24uc2V0U3VydmV5SW1wbChyb3cpO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuICBwcm90ZWN0ZWQgZGVsZXRlUm93VmFsdWUoXG4gICAgbmV3VmFsdWU6IGFueSxcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlXG4gICk6IGFueSB7XG4gICAgZGVsZXRlIG5ld1ZhbHVlW3Jvdy5yb3dOYW1lXTtcbiAgICByZXR1cm4gdGhpcy5pc09iamVjdChuZXdWYWx1ZSkgJiYgT2JqZWN0LmtleXMobmV3VmFsdWUpLmxlbmd0aCA9PSAwXG4gICAgICA/IG51bGxcbiAgICAgIDogbmV3VmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBpc0RvaW5nb25BbnlWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcbiAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fFxuICAgICAgdGhpcy5pc0RvaW5nb25BbnlWYWx1ZUNoYW5nZWQgfHxcbiAgICAgICF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuaXNEb2luZ29uQW55VmFsdWVDaGFuZ2VkID0gdHJ1ZTtcbiAgICB2YXIgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByb3dzW2ldLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIH1cbiAgICB0aGlzLmlzRG9pbmdvbkFueVZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBpc09iamVjdCh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIjtcbiAgfVxuICBwcml2YXRlIGdldE9uQ2VsbFZhbHVlQ2hhbmdlZE9wdGlvbnMoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgcm93VmFsdWU6IGFueVxuICApOiBhbnkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZ2V0UXVlc3Rpb24gPSBmdW5jdGlvbihjb2xOYW1lOiBhbnkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBzZWxmLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNlbGYuY29sdW1uc1tpXS5uYW1lID09PSBjb2xOYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHJvdy5jZWxsc1tpXS5xdWVzdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgcm93OiByb3csXG4gICAgICBjb2x1bW5OYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgcm93VmFsdWU6IHJvd1ZhbHVlLFxuICAgICAgdmFsdWU6ICEhcm93VmFsdWUgPyByb3dWYWx1ZVtjb2x1bW5OYW1lXSA6IG51bGwsXG4gICAgICBnZXRDZWxsUXVlc3Rpb246IGdldFF1ZXN0aW9uXG4gICAgfTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DZWxsVmFsdWVDaGFuZ2VkKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5nZXRPbkNlbGxWYWx1ZUNoYW5nZWRPcHRpb25zKHJvdywgY29sdW1uTmFtZSwgcm93VmFsdWUpO1xuICAgIHRoaXMuc3VydmV5Lm1hdHJpeENlbGxWYWx1ZUNoYW5nZWQodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgdmFsaWRhdGVDZWxsKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKTogU3VydmV5RXJyb3Ige1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICByb3c6IHJvdyxcbiAgICAgIGNvbHVtbk5hbWU6IGNvbHVtbk5hbWUsXG4gICAgICByb3dWYWx1ZTogcm93VmFsdWUsXG4gICAgICB2YWx1ZTogcm93VmFsdWVbY29sdW1uTmFtZV1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnN1cnZleS5tYXRyaXhDZWxsVmFsaWRhdGUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgb25Sb3dDaGFuZ2luZyhcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICByb3dWYWx1ZTogYW55XG4gICk6IGFueSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuICEhcm93VmFsdWUgPyByb3dWYWx1ZVtjb2x1bW5OYW1lXSA6IG51bGw7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLmdldE9uQ2VsbFZhbHVlQ2hhbmdlZE9wdGlvbnMocm93LCBjb2x1bW5OYW1lLCByb3dWYWx1ZSk7XG4gICAgdmFyIG9sZFJvd1ZhbHVlID0gdGhpcy5nZXRSb3dWYWx1ZUNvcmUocm93LCB0aGlzLmNyZWF0ZU5ld1ZhbHVlKCksIHRydWUpO1xuICAgIG9wdGlvbnMub2xkVmFsdWUgPSAhIW9sZFJvd1ZhbHVlID8gb2xkUm93VmFsdWVbY29sdW1uTmFtZV0gOiBudWxsO1xuICAgIHRoaXMuc3VydmV5Lm1hdHJpeENlbGxWYWx1ZUNoYW5naW5nKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLnZhbHVlO1xuICB9XG4gIG9uUm93Q2hhbmdlZChcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICBuZXdSb3dWYWx1ZTogYW55LFxuICAgIGlzRGVsZXRpbmdWYWx1ZTogYm9vbGVhblxuICApIHtcbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKCk7XG4gICAgaWYgKHRoaXMuaXNNYXRyaXhWYWx1ZUVtcHR5KG9sZFZhbHVlKSkgb2xkVmFsdWUgPSBudWxsO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcbiAgICB2YXIgcm93VmFsdWUgPSB0aGlzLmdldFJvd1ZhbHVlQ29yZShyb3csIG5ld1ZhbHVlLCB0cnVlKTtcbiAgICBpZiAoIXJvd1ZhbHVlKSByb3dWYWx1ZSA9IHt9O1xuICAgIGlmIChpc0RlbGV0aW5nVmFsdWUpIHtcbiAgICAgIGRlbGV0ZSByb3dWYWx1ZVtjb2x1bW5OYW1lXTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3cuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSByb3cuY2VsbHNbaV0ucXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCk7XG4gICAgICBkZWxldGUgcm93VmFsdWVba2V5XTtcbiAgICB9XG4gICAgaWYgKG5ld1Jvd1ZhbHVlKSB7XG4gICAgICBuZXdSb3dWYWx1ZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobmV3Um93VmFsdWUpKTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBuZXdSb3dWYWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KG5ld1Jvd1ZhbHVlW2tleV0pKSB7XG4gICAgICAgICAgcm93VmFsdWVba2V5XSA9IG5ld1Jvd1ZhbHVlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuaXNPYmplY3Qocm93VmFsdWUpICYmIE9iamVjdC5rZXlzKHJvd1ZhbHVlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIG5ld1ZhbHVlID0gdGhpcy5kZWxldGVSb3dWYWx1ZShuZXdWYWx1ZSwgcm93KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNUd29WYWx1ZUVxdWFscyhvbGRWYWx1ZSwgbmV3VmFsdWUpKSByZXR1cm47XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcbiAgICBpZiAoY29sdW1uTmFtZSkge1xuICAgICAgdGhpcy5vbkNlbGxWYWx1ZUNoYW5nZWQocm93LCBjb2x1bW5OYW1lLCByb3dWYWx1ZSk7XG4gICAgfVxuICB9XG4gIGdldFJvd0luZGV4KHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVSb3dzLmluZGV4T2Yocm93KTtcbiAgfVxuICBnZXRTaGFyZWRRdWVzdGlvbkJ5TmFtZShcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxuICApOiBRdWVzdGlvbiB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSB8fCAhdGhpcy52YWx1ZU5hbWUpIHJldHVybiBudWxsO1xuICAgIHZhciBpbmRleCA9IHRoaXMuZ2V0Um93SW5kZXgocm93KTtcbiAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gPFF1ZXN0aW9uPnRoaXMuc3VydmV5LmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWVGcm9tQXJyYXkoXG4gICAgICB0aGlzLnZhbHVlTmFtZSxcbiAgICAgIGNvbHVtbk5hbWUsXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cbiAgb25Ub3RhbFZhbHVlQ2hhbmdlZCgpOiBhbnkge1xuICAgIGlmICghIXRoaXMuZGF0YSAmJiAhIXRoaXMudmlzaWJsZVRvdGFsUm93KSB7XG4gICAgICB0aGlzLmRhdGEuc2V0VmFsdWUoXG4gICAgICAgIHRoaXMuZ2V0VmFsdWVOYW1lKCkgKyBzZXR0aW5ncy5tYXRyaXhUb3RhbFZhbHVlUG9zdEZpeCxcbiAgICAgICAgdGhpcy50b3RhbFZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0UXVlc3Rpb25Gcm9tQXJyYXkobmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogSVF1ZXN0aW9uIHtcbiAgICBpZiAoaW5kZXggPj0gdGhpcy52aXNpYmxlUm93cy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnZpc2libGVSb3dzW2luZGV4XS5nZXRRdWVzdGlvbkJ5Q29sdW1uTmFtZShuYW1lKTtcbiAgfVxuICBwcml2YXRlIGlzTWF0cml4VmFsdWVFbXB0eSh2YWw6IGFueSkge1xuICAgIGlmICghdmFsKSByZXR1cm47XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPYmplY3QodmFsW2ldKSAmJiBPYmplY3Qua2V5cyh2YWxbaV0pLmxlbmd0aCA+IDApXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyh2YWwpLmxlbmd0aCA9PSAwO1xuICB9XG4gIGdldFN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJtYXRyaXhkcm9wZG93bmNvbHVtblwiLFxuICBbXG4gICAgXCIhbmFtZVwiLFxuICAgIHsgbmFtZTogXCJ0aXRsZVwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGl0bGVcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY2VsbFR5cGVcIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogKCkgPT4ge1xuICAgICAgICB2YXIgcmVzID0gTWF0cml4RHJvcGRvd25Db2x1bW4uZ2V0Q29sdW1uVHlwZXMoKTtcbiAgICAgICAgcmVzLnNwbGljZSgwLCAwLCBcImRlZmF1bHRcIik7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IG5hbWU6IFwiY29sQ291bnRcIiwgZGVmYXVsdDogLTEsIGNob2ljZXM6IFstMSwgMCwgMSwgMiwgMywgNF0gfSxcbiAgICBcImlzUmVxdWlyZWQ6Ym9vbGVhblwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwicmVxdWlyZWRFcnJvclRleHQ6dGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1JlcXVpcmVkRXJyb3JUZXh0XCJcbiAgICB9LFxuICAgIFwiaGFzT3RoZXI6Ym9vbGVhblwiLFxuICAgIFwicmVhZE9ubHk6Ym9vbGVhblwiLFxuICAgIFwibWluV2lkdGhcIixcbiAgICBcInZpc2libGVJZjpjb25kaXRpb25cIixcbiAgICBcImVuYWJsZUlmOmNvbmRpdGlvblwiLFxuICAgIFwicmVxdWlyZWRJZjpjb25kaXRpb25cIixcbiAgICB7XG4gICAgICBuYW1lOiBcInZhbGlkYXRvcnM6dmFsaWRhdG9yc1wiLFxuICAgICAgYmFzZUNsYXNzTmFtZTogXCJzdXJ2ZXl2YWxpZGF0b3JcIixcbiAgICAgIGNsYXNzTmFtZVBhcnQ6IFwidmFsaWRhdG9yXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidG90YWxUeXBlXCIsXG4gICAgICBkZWZhdWx0OiBcIm5vbmVcIixcbiAgICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJzdW1cIiwgXCJjb3VudFwiLCBcIm1pblwiLCBcIm1heFwiLCBcImF2Z1wiXVxuICAgIH0sXG4gICAgXCJ0b3RhbEV4cHJlc3Npb246ZXhwcmVzc2lvblwiLFxuICAgIHsgbmFtZTogXCJ0b3RhbEZvcm1hdFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVG90YWxGb3JtYXRcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidG90YWxEaXNwbGF5U3R5bGVcIixcbiAgICAgIGRlZmF1bHQ6IFwibm9uZVwiLFxuICAgICAgY2hvaWNlczogW1wibm9uZVwiLCBcImRlY2ltYWxcIiwgXCJjdXJyZW5jeVwiLCBcInBlcmNlbnRcIl1cbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidG90YWxDdXJyZW5jeVwiLFxuICAgICAgY2hvaWNlczogKCkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0Q3VycmVjeUNvZGVzKCk7XG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogXCJVU0RcIlxuICAgIH0sXG4gICAgeyBuYW1lOiBcInRvdGFsTWF4aW11bUZyYWN0aW9uRGlnaXRzOm51bWJlclwiLCBkZWZhdWx0OiAtMSB9LFxuICAgIHsgbmFtZTogXCJ0b3RhbE1pbmltdW1GcmFjdGlvbkRpZ2l0czpudW1iZXJcIiwgZGVmYXVsdDogLTEgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeERyb3Bkb3duQ29sdW1uKFwiXCIpO1xuICB9XG4pO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIm1hdHJpeGRyb3Bkb3duYmFzZVwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJjb2x1bW5zOm1hdHJpeGRyb3Bkb3duY29sdW1uc1wiLFxuICAgICAgY2xhc3NOYW1lOiBcIm1hdHJpeGRyb3Bkb3duY29sdW1uXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY29sdW1uTGF5b3V0XCIsXG4gICAgICBhbHRlcm5hdGl2ZU5hbWU6IFwiY29sdW1uc0xvY2F0aW9uXCIsXG4gICAgICBkZWZhdWx0OiBcImhvcml6b250YWxcIixcbiAgICAgIGNob2ljZXM6IFtcImhvcml6b250YWxcIiwgXCJ2ZXJ0aWNhbFwiXVxuICAgIH0sXG4gICAgXCJob3Jpem9udGFsU2Nyb2xsOmJvb2xlYW5cIixcbiAgICB7XG4gICAgICBuYW1lOiBcImNob2ljZXM6aXRlbXZhbHVlW11cIlxuICAgIH0sXG4gICAgeyBuYW1lOiBcIm9wdGlvbnNDYXB0aW9uXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NPcHRpb25zQ2FwdGlvblwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjZWxsVHlwZVwiLFxuICAgICAgZGVmYXVsdDogXCJkcm9wZG93blwiLFxuICAgICAgY2hvaWNlczogKCkgPT4ge1xuICAgICAgICByZXR1cm4gTWF0cml4RHJvcGRvd25Db2x1bW4uZ2V0Q29sdW1uVHlwZXMoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJjb2x1bW5Db2xDb3VudFwiLCBkZWZhdWx0OiAwLCBjaG9pY2VzOiBbMCwgMSwgMiwgMywgNF0gfSxcbiAgICBcImNvbHVtbk1pbldpZHRoXCJcbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlKFwiXCIpO1xuICB9LFxuICBcIm1hdHJpeGJhc2VcIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2UudHMiLCJleHBvcnQgY2xhc3MgVGV4dFByZVByb2Nlc3Nvckl0ZW0ge1xuICBwdWJsaWMgc3RhcnQ6IG51bWJlcjtcbiAgcHVibGljIGVuZDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgVGV4dFByZVByb2Nlc3NvclZhbHVlIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuaXNFeGlzdHMgPSBmYWxzZTtcbiAgICB0aGlzLmNhblByb2Nlc3MgPSB0cnVlO1xuICB9XG4gIHB1YmxpYyB2YWx1ZTogYW55O1xuICBwdWJsaWMgaXNFeGlzdHM6IGJvb2xlYW47XG4gIHB1YmxpYyBjYW5Qcm9jZXNzOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgVGV4dFByZVByb2Nlc3NvciB7XG4gIHByaXZhdGUgaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWU6IGJvb2xlYW47XG4gIHB1YmxpYyBvblByb2Nlc3M6ICh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IoKSB7fVxuICBwdWJsaWMgcHJvY2VzcyhcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuID0gZmFsc2UsXG4gICAgZG9FbmNvZGluZzogYm9vbGVhbiA9IGZhbHNlXG4gICk6IHN0cmluZyB7XG4gICAgdGhpcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW5WYWx1ZSA9IHRydWU7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gdGV4dDtcbiAgICBpZiAoIXRoaXMub25Qcm9jZXNzKSByZXR1cm4gdGV4dDtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKHRleHQpO1xuICAgIGZvciAodmFyIGkgPSBpdGVtcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgIHZhciBuYW1lID0gdGhpcy5nZXROYW1lKHRleHQuc3Vic3RyaW5nKGl0ZW0uc3RhcnQgKyAxLCBpdGVtLmVuZCkpO1xuICAgICAgaWYgKCFuYW1lKSBjb250aW51ZTtcbiAgICAgIHZhciB0ZXh0VmFsdWUgPSBuZXcgVGV4dFByZVByb2Nlc3NvclZhbHVlKG5hbWUsIHJldHVybkRpc3BsYXlWYWx1ZSk7XG4gICAgICB0aGlzLm9uUHJvY2Vzcyh0ZXh0VmFsdWUpO1xuICAgICAgaWYgKCF0ZXh0VmFsdWUuaXNFeGlzdHMpIHtcbiAgICAgICAgaWYgKHRleHRWYWx1ZS5jYW5Qcm9jZXNzKSB7XG4gICAgICAgICAgdGhpcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCF0ZXh0VmFsdWUudmFsdWUpIHtcbiAgICAgICAgdGhpcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW5WYWx1ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHJlcGxhY2VkVmFsdWUgPSAhIXRleHRWYWx1ZS52YWx1ZSA/IHRleHRWYWx1ZS52YWx1ZSA6IFwiXCI7XG4gICAgICBpZiAoZG9FbmNvZGluZykge1xuICAgICAgICByZXBsYWNlZFZhbHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlcGxhY2VkVmFsdWUpO1xuICAgICAgfVxuICAgICAgdGV4dCA9XG4gICAgICAgIHRleHQuc3Vic3RyKDAsIGl0ZW0uc3RhcnQpICsgcmVwbGFjZWRWYWx1ZSArIHRleHQuc3Vic3RyKGl0ZW0uZW5kICsgMSk7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzQWxsVmFsdWVzT25MYXN0UnVuKCkge1xuICAgIHJldHVybiAhIXRoaXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBnZXRJdGVtcyh0ZXh0OiBzdHJpbmcpOiBBcnJheTxUZXh0UHJlUHJvY2Vzc29ySXRlbT4ge1xuICAgIHZhciBpdGVtcyA9IFtdO1xuICAgIHZhciBsZW5ndGggPSB0ZXh0Lmxlbmd0aDtcbiAgICB2YXIgc3RhcnQgPSAtMTtcbiAgICB2YXIgY2ggPSBcIlwiO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoID0gdGV4dFtpXTtcbiAgICAgIGlmIChjaCA9PSBcIntcIikgc3RhcnQgPSBpO1xuICAgICAgaWYgKGNoID09IFwifVwiKSB7XG4gICAgICAgIGlmIChzdGFydCA+IC0xKSB7XG4gICAgICAgICAgdmFyIGl0ZW0gPSBuZXcgVGV4dFByZVByb2Nlc3Nvckl0ZW0oKTtcbiAgICAgICAgICBpdGVtLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgaXRlbS5lbmQgPSBpO1xuICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnQgPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG4gIHByaXZhdGUgZ2V0TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSkgcmV0dXJuO1xuICAgIHJldHVybiBuYW1lLnRyaW0oKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3RleHRQcmVQcm9jZXNzb3IudHMiLCJpbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0LCBKc29uRXJyb3IsIFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge1xuICBCYXNlLFxuICBJU3VydmV5LFxuICBTdXJ2ZXlFbGVtZW50LFxuICBJU3VydmV5RGF0YSxcbiAgSVN1cnZleUltcGwsXG4gIElUZXh0UHJvY2Vzc29yLFxuICBJUXVlc3Rpb24sXG4gIElQYW5lbCxcbiAgSUVsZW1lbnQsXG4gIElDb25kaXRpb25SdW5uZXIsXG4gIElQYWdlLFxuICBTdXJ2ZXlFcnJvcixcbiAgRXZlbnQsXG4gIElTdXJ2ZXlFcnJvck93bmVyLFxuICBJU3VydmV5RWxlbWVudFxufSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBJU3VydmV5VHJpZ2dlck93bmVyLCBTdXJ2ZXlUcmlnZ2VyIH0gZnJvbSBcIi4vdHJpZ2dlclwiO1xuaW1wb3J0IHsgUGFnZU1vZGVsIH0gZnJvbSBcIi4vcGFnZVwiO1xuaW1wb3J0IHsgVGV4dFByZVByb2Nlc3NvciwgVGV4dFByZVByb2Nlc3NvclZhbHVlIH0gZnJvbSBcIi4vdGV4dFByZVByb2Nlc3NvclwiO1xuaW1wb3J0IHsgUHJvY2Vzc1ZhbHVlIH0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5pbXBvcnQgeyBkeFN1cnZleVNlcnZpY2UgfSBmcm9tIFwiLi9keFN1cnZleVNlcnZpY2VcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IEN1c3RvbUVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBTdHlsZXNNYW5hZ2VyIH0gZnJvbSBcIi4vc3R5bGVzbWFuYWdlclwiO1xuaW1wb3J0IHsgU3VydmV5VGltZXIgfSBmcm9tIFwiLi9zdXJ2ZXl0aW1lclwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBQYW5lbE1vZGVsQmFzZSB9IGZyb20gXCIuL3BhbmVsXCI7XG5pbXBvcnQgeyBIdG1sQ29uZGl0aW9uSXRlbSB9IGZyb20gXCIuL2h0bWxDb25kaXRpb25JdGVtXCI7XG5pbXBvcnQgeyBFeHByZXNzaW9uUnVubmVyLCBDb25kaXRpb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQge3NldHRpbmdzfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG4vKipcbiAqIFN1cnZleSBvYmplY3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN1cnZleS4gUGFnZXMsIFF1ZXN0aW9ucywgZmxvdyBsb2dpYyBhbmQgZXRjLlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5TW9kZWwgZXh0ZW5kcyBCYXNlXG4gIGltcGxlbWVudHNcbiAgICBJU3VydmV5LFxuICAgIElTdXJ2ZXlEYXRhLFxuICAgIElTdXJ2ZXlJbXBsLFxuICAgIElTdXJ2ZXlUcmlnZ2VyT3duZXIsXG4gICAgSVN1cnZleUVycm9yT3duZXIsXG4gICAgSUxvY2FsaXphYmxlT3duZXIge1xuICBbaW5kZXg6IHN0cmluZ106IGFueTtcbiAgcHJpdmF0ZSBzdGF0aWMgc3R5bGVzTWFuYWdlcjogU3R5bGVzTWFuYWdlciA9IG51bGw7XG4gIHB1YmxpYyBzdGF0aWMgcGxhdGZvcm06IHN0cmluZyA9IFwidW5rbm93blwiO1xuICBwdWJsaWMgZ2V0IHBsYXRmb3JtTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTdXJ2ZXlNb2RlbC5wbGF0Zm9ybTtcbiAgfVxuICAvKipcbiAgICogWW91IG1heSBzaG93IGNvbW1lbnRzIGlucHV0IGZvciB0aGUgbW9zdCBvZiBxdWVzdGlvbnMuIFRoZSBlbnRlcmVkIHRleHQgaW4gdGhlIGNvbW1lbnQgaW5wdXQgd2lsbCBiZSBzYXZlZCBhcyAncXVlc3Rpb24gbmFtZScgKyAnY29tbWVudFByZWZpeCcuXG4gICAqIEBzZWUgZGF0YVxuICAgKi9cbiAgcHVibGljIGdldCBjb21tZW50UHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHNldHRpbmdzLmNvbW1lbnRQcmVmaXg7XG4gIH1cbiAgcHVibGljIHNldCBjb21tZW50UHJlZml4KHZhbDogc3RyaW5nKSB7XG4gICAgc2V0dGluZ3MuY29tbWVudFByZWZpeCA9IHZhbDtcbiAgfVxuXG4gIHByaXZhdGUgcGFnZXNWYWx1ZTogQXJyYXk8UGFnZU1vZGVsPjtcbiAgcHJpdmF0ZSB0cmlnZ2Vyc1ZhbHVlOiBBcnJheTxTdXJ2ZXlUcmlnZ2VyPjtcbiAgcHJpdmF0ZSBjb21wbGV0ZWRIdG1sT25Db25kaXRpb25WYWx1ZTogQXJyYXk8SHRtbENvbmRpdGlvbkl0ZW0+O1xuICBwcml2YXRlIGdldCBjdXJyZW50UGFnZVZhbHVlKCk6IFBhZ2VNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImN1cnJlbnRQYWdlVmFsdWVcIiwgbnVsbCk7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgY3VycmVudFBhZ2VWYWx1ZSh2YWw6IFBhZ2VNb2RlbCkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImN1cnJlbnRQYWdlVmFsdWVcIiwgdmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsdWVzSGFzaDogSGFzaFRhYmxlPGFueT4gPSB7fTtcbiAgcHJpdmF0ZSB2YXJpYWJsZXNIYXNoOiBIYXNoVGFibGU8YW55PiA9IHt9O1xuXG4gIHByaXZhdGUgbG9jYWxlVmFsdWU6IHN0cmluZyA9IFwiXCI7XG5cbiAgcHJpdmF0ZSB0ZXh0UHJlUHJvY2Vzc29yOiBUZXh0UHJlUHJvY2Vzc29yO1xuICBwcml2YXRlIGNvbXBsZXRlZFN0YXRlVmFsdWU6IHN0cmluZyA9IFwiXCI7XG4gIHByaXZhdGUgY29tcGxldGVkU3RhdGVUZXh0VmFsdWU6IHN0cmluZyA9IFwiXCI7XG5cbiAgcHJpdmF0ZSBpc1RpbWVyU3RhcnRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSB0aGUgc3VydmV5IGlzIGNvbXBsZXRlZCBhbmQgb25Db21wbGV0ZSBldmVudCBpcyBmaXJlZC4gWW91IG1heSBwcmV2ZW50IHRoZSBzdXJ2ZXkgZnJvbSBjb21wbGV0aW5nIGJ5IHNldHRpbmcgb3B0aW9ucy5hbGxvd0NvbXBsZXRlIHRvIGZhbHNlXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLmFsbG93Q29tcGxldGUgc2V0IGl0IGZhbHNlIHRvIHByZXZlbnQgdGhlIHN1cnZleSBmcm9tIGNvbXBsZXRpbmcuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuXG4gICAqIEBzZWUgb25Db21wbGV0ZVxuICAgKi9cbiAgcHVibGljIG9uQ29tcGxldGluZzogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGFmdGVyIGEgdXNlciBjbGljayBvbiAnQ29tcGxldGUnIGJ1dHRvbiBhbmQgZmluaXNoZWQgdGhlIHN1cnZleS4gWW91IG1heSB1c2UgaXQgdG8gc2VuZCB0aGUgZGF0YSB0byB5b3VyIHdlYiBzZXJ2ZXIuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnNob3dEYXRhU2F2aW5nKHRleHQpIGNhbGwgdGhpcyBtZXRob2QgdG8gc2hvdyB0aGF0IHRoZSBzdXJ2ZXkgaXMgc2F2aW5nIHRoZSBkYXRhIG9uIHlvdXIgc2VydmVyLiBUaGUgdGV4dCBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gc2hvdyB5b3VyIG1lc3NhZ2UgaW5zdGVhZCBvZiBkZWZhdWx0LlxuICAgKiA8YnIvPiBvcHRpb25zLnNob3dEYXRhU2F2aW5nRXJyb3IodGV4dCkgY2FsbCB0aGlzIG1ldGhvZCB0byBzaG93IHRoYXQgdGhlcmUgaXMgYW4gZXJyb3Igb24gc2F2aW5nIHRoZSBkYXRhIG9uIHlvdXIgc2VydmVyLiBJZiB5b3Ugd2FudCB0byBzaG93IGEgY3VzdG9tIGVycm9yLCB1c2UgYW4gb3B0aW9uYWwgdGV4dCBwYXJhbWV0ZXIuXG4gICAqIDxici8+IG9wdGlvbnMuc2hvd0RhdGFTYXZpbmdTdWNjZXNzKHRleHQpIGNhbGwgdGhpcyBtZXRob2QgdG8gc2hvdyB0aGF0IHRoZSBkYXRhIHdlcmUgc3VjY2Vzc2Z1bCBzYXZlZCBvbiB0aGUgc2VydmVyLlxuICAgKiA8YnIvPiBvcHRpb25zLnNob3dEYXRhU2F2aW5nQ2xlYXIgY2FsbCB0aGlzIG1ldGhvZCB0byBoaWRlIHRoZSB0ZXh0IGFib3V0IHRoZSBzYXZpbmcgcHJvZ3Jlc3MuXG4gICAqIEBzZWUgZGF0YVxuICAgKiBAc2VlIGNsZWFySW52aXNpYmxlVmFsdWVzXG4gICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgKiBAc2VlIHN1cnZleVBvc3RJZFxuICAgKi9cbiAgcHVibGljIG9uQ29tcGxldGU6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBhZnRlciB0aGUgc3VydmV5IGNoYW5nZWQgaXQncyBzdGF0ZSBmcm9tIFwic3RhcnRpbmdcIiB0byBcInJ1bm5pbmdcIi4gVGhlIFwic3RhcnRpbmdcIiBzdGF0ZSBtZWFucyB0aGF0IHN1cnZleSBzaG93cyB0aGUgc3RhcnRlZCBwYWdlLlxuICAgKiBUaGUgZmlyc3RQYWdlSXNTdGFydGVkIHByb3BlcnR5IHNob3VsZCBiZSBzZXQgdG8gdGhlIHRydWUsIGlmIHlvdSB3YW50IHRvIGhhdmUgdGhlIHN0YXJ0ZWQgcGFnZSBpbiB5b3VyIHN1cnZleS4gVGhlIGVuZC11c2VyIHNob3VsZCBjbGljayBvbiB0aGUgXCJTdGFydFwiIGJ1dHRvbiB0byBzdGFydCB0aGUgc3VydmV5LlxuICAgKiBAc2VlIGZpcnN0UGFnZUlzU3RhcnRlZFxuICAgKi9cbiAgcHVibGljIG9uU3RhcnRlZDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCkgPT4gYW55LFxuICAgIGFueVxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gY2xpY2tpbmcgJ05leHQnIHBhZ2UgaWYgc2VuZFJlc3VsdE9uUGFnZU5leHQgaXMgc2V0IHRvIHRydWUuIFlvdSBtYXkgdXNlIGl0IHRvIHNhdmUgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzLCBmb3IgZXhhbXBsZSwgaWYgeW91ciBzdXJ2ZXkgaXMgbGFyZ2UgZW5vdWdoLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogQHNlZSBzZW5kUmVzdWx0T25QYWdlTmV4dFxuICAgKi9cbiAgcHVibGljIG9uUGFydGlhbFNlbmQ6IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsKSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwpID0+IGFueSxcbiAgICBhbnlcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSBhbm90aGVyIHBhZ2UgYmVjb21lcyB0aGUgY3VycmVudC4gVHlwaWNhbGx5IGl0IGhhcHBlbnMgd2hlbiBhIHVzZXIgY2xpY2sgb24gJ05leHQnIG9yICdQcmV2JyBidXR0b25zLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9uLm9sZEN1cnJlbnRQYWdlIHRoZSBwcmV2aW91cyBjdXJyZW50L2FjdGl2ZSBwYWdlXG4gICAqIDxici8+IG9wdGlvbi5uZXdDdXJyZW50UGFnZSBhIG5ldyBjdXJyZW50L2FjdGl2ZSBwYWdlXG4gICAqIDxici8+IG9wdGlvbi5hbGxvd0NoYW5naW5nIHNldCBpdCB0byBmYWxzZSB0byBkaXNhYmxlIHRoZSBjdXJyZW50IHBhZ2UgY2hhbmdpbmcuIEl0IGlzIHRydWUgYnkgZGVmYXVsdC5cbiAgICogQHNlZSBjdXJyZW50UGFnZVxuICAgKiBAc2VlIGN1cnJlbnRQYWdlTm9cbiAgICogQHNlZSBuZXh0UGFnZVxuICAgKiBAc2VlIHByZXZQYWdlXG4gICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgKiBAc2VlIG9uQ3VycmVudFBhZ2VDaGFuZ2VkXG4gICAqKi9cbiAgcHVibGljIG9uQ3VycmVudFBhZ2VDaGFuZ2luZzogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gYW5vdGhlciBwYWdlIGJlY29tZXMgdGhlIGN1cnJlbnQuIFR5cGljYWxseSBpdCBoYXBwZW5zIHdoZW4gYSB1c2VyIGNsaWNrIG9uICdOZXh0JyBvciAnUHJldicgYnV0dG9ucy5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbi5vbGRDdXJyZW50UGFnZSB0aGUgcHJldmlvdXMgY3VycmVudC9hY3RpdmUgcGFnZVxuICAgKiA8YnIvPiBvcHRpb24ubmV3Q3VycmVudFBhZ2UgYSBuZXcgY3VycmVudC9hY3RpdmUgcGFnZVxuICAgKiBAc2VlIGN1cnJlbnRQYWdlXG4gICAqIEBzZWUgY3VycmVudFBhZ2VOb1xuICAgKiBAc2VlIG5leHRQYWdlXG4gICAqIEBzZWUgcHJldlBhZ2VcbiAgICogQHNlZSBjb21wbGV0ZUxhc3RQYWdlXG4gICAqIEBzZWUgb25DdXJyZW50UGFnZUNoYW5naW5nXG4gICAqL1xuICBwdWJsaWMgb25DdXJyZW50UGFnZUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgdGhlIHF1ZXN0aW9uIHZhbHVlIGlzIGNoYW5nZWQuIEl0IGNhbiBiZSBkb25lIHZpYSBVSSBieSBhIHVzZXIgb3IgcHJvZ3JhbW1hdGljYWxseSBvbiBjYWxsaW5nIHNldFZhbHVlIG1ldGhvZC5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMubmFtZSB0aGUgdmFsdWUgbmFtZSB0aGF0IGhhcyBiZWluZyBjaGFuZ2VkXG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBxdWVzdGlvbiB3aGljaCBxdWVzdGlvbi5uYW1lIGVxdWFscyB0byB0aGUgdmFsdWUgbmFtZS4gSWYgdGhlcmUgYXJlIHNldmVyYWwgcXVlc3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSwgdGhlIGZpcnN0IHF1ZXN0aW9uIGlzIHRha2VuLiBJZiB0aGVyZSBpcyBubyBzdWNoIHF1ZXN0aW9ucywgdGhlIG9wdGlvbnMucXVlc3Rpb24gaXMgbnVsbC5cbiAgICogPGJyLz4gb3B0aW9ucy5vbGRWYWx1ZSBvbGQsIHByZXZpb3VzIHZhbHVlLlxuICAgKiA8YnIvPiBvcHRpb25zLnZhbHVlIGEgbmV3IHZhbHVlLiBZb3UgbWF5IGNoYW5nZSBpdFxuICAgKiBAc2VlIHNldFZhbHVlXG4gICAqIEBzZWUgb25WYWx1ZUNoYW5nZWRcbiAgICovXG4gIHB1YmxpYyBvblZhbHVlQ2hhbmdpbmc6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIHRoZSBxdWVzdGlvbiB2YWx1ZSBpcyBjaGFuZ2VkLiBJdCBjYW4gYmUgZG9uZSB2aWEgVUkgYnkgYSB1c2VyIG9yIHByb2dyYW1tYXRpY2FsbHkgb24gY2FsbGluZyBzZXRWYWx1ZSBtZXRob2QuXG4gICAqIFBsZWFzZSB1c2Ugb25EeW5hbWljUGFuZWxJdGVtVmFsdWVDaGFuZ2VkIGFuZCBvbk1hdHJpeENlbGxWYWx1ZUNoYW5nZWQgZXZlbnRzIHRvIGhhbmRsZSBjaGFuZ2VzIGEgcXVlc3Rpb24gaW4gdGhlIFBhbmVsIER5bmFtaWMgYW5kIGEgY2VsbCBxdWVzdGlvbiBpbiBtYXRyaWNlcy5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMubmFtZSB0aGUgdmFsdWUgbmFtZSB0aGF0IGhhcyBiZWVuIGNoYW5nZWRcbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiBhIHF1ZXN0aW9uIHdoaWNoIHF1ZXN0aW9uLm5hbWUgZXF1YWxzIHRvIHRoZSB2YWx1ZSBuYW1lLiBJZiB0aGVyZSBhcmUgc2V2ZXJhbCBxdWVzdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLCB0aGUgZmlyc3QgcXVlc3Rpb24gaXMgdGFrZW4uIElmIHRoZXJlIGlzIG5vIHN1Y2ggcXVlc3Rpb25zLCB0aGUgb3B0aW9ucy5xdWVzdGlvbiBpcyBudWxsLlxuICAgKiA8YnIvPiBvcHRpb25zLnZhbHVlIGEgbmV3IHZhbHVlXG4gICAqIEBzZWUgc2V0VmFsdWVcbiAgICogQHNlZSBvblZhbHVlQ2hhbmdpbmdcbiAgICogQHNlZSBvbkR5bmFtaWNQYW5lbEl0ZW1WYWx1ZUNoYW5nZWRcbiAgICogQHNlZSBvbk1hdHJpeENlbGxWYWx1ZUNoYW5nZWRcbiAgICovXG4gIHB1YmxpYyBvblZhbHVlQ2hhbmdlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmlzaWJpbGl0eS5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBxdWVzdGlvbiB3aGljaCB2aXNpYmlsaXR5IGhhcyBiZWVuIGNoYW5nZWRcbiAgICogPGJyLz4gb3B0aW9ucy5uYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgKiA8YnIvPiBvcHRpb25zLnZpc2libGUgYSBxdWVzdGlvbiB2aXNpYmxlIGJvb2xlYW4gdmFsdWVcbiAgICogQHNlZSBRdWVzdGlvbi52aXNpYmlsZVxuICAgKiBAc2VlIFF1ZXN0aW9uLnZpc2liaWxlSWZcbiAgICovXG4gIHB1YmxpYyBvblZpc2libGVDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gY2hhbmdpbmcgYSBwYWdlIHZpc2liaWxpdHkuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnBhZ2UgYSBwYWdlICB3aGljaCB2aXNpYmlsaXR5IGhhcyBiZWVuIGNoYW5nZWRcbiAgICogPGJyLz4gb3B0aW9ucy52aXNpYmxlIGEgcGFnZSB2aXNpYmxlIGJvb2xlYW4gdmFsdWVcbiAgICogQHNlZSBQYWdlTW9kZWwudmlzaWJpbGVcbiAgICogQHNlZSBQYWdlTW9kZWwudmlzaWJpbGVJZlxuICAgKi9cbiAgcHVibGljIG9uUGFnZVZpc2libGVDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gY2hhbmdpbmcgYSBwYW5lbCB2aXNpYmlsaXR5LlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5wYW5lbCBhIHBhbmVsIHdoaWNoIHZpc2liaWxpdHkgaGFzIGJlZW4gY2hhbmdlZFxuICAgKiA8YnIvPiBvcHRpb25zLnZpc2libGUgYSBwYW5lbCB2aXNpYmxlIGJvb2xlYW4gdmFsdWVcbiAgICogQHNlZSBQYW5lbE1vZGVsLnZpc2liaWxlXG4gICAqIEBzZWUgUGFuZWxNb2RlbC52aXNpYmlsZUlmXG4gICAqL1xuICBwdWJsaWMgb25QYW5lbFZpc2libGVDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gYWRkaW5nIGEgbmV3IHF1ZXN0aW9uIGludG8gc3VydmV5LlxuICAgKiAncXVlc3Rpb24nOiBxdWVzdGlvbiwgJ25hbWUnOiBxdWVzdGlvbi5uYW1lLCAnaW5kZXgnOiBpbmRleCwgJ3BhcmVudFBhbmVsJzogcGFyZW50UGFuZWwsICdyb290UGFuZWwnOiByb290UGFuZWxcbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBuZXdseSBhZGRlZCBxdWVzdGlvbiBvYmplY3QuXG4gICAqIDxici8+IG9wdGlvbnMubmFtZSBhIHF1ZXN0aW9uIG5hbWVcbiAgICogPGJyLz4gb3B0aW9ucy5pbmRleCBhIGluZGV4IG9mIHRoZSBxdWVzdGlvbiBpbiB0aGUgY29udGFpbmVyIChwYWdlIG9yIHBhbmVsKVxuICAgKiA8YnIvPiBvcHRpb25zLnBhcmVudFBhbmVsIGEgY29udGFpbmVyIHdoZXJlIHF1ZXN0aW9uIGlzIGxvY2F0ZWQuIEl0IGNhbiBiZSBwYWdlIG9yIHBhbmVsLlxuICAgKiA8YnIvPiBvcHRpb25zLnJvb3RQYW5lbCB0eXBpY2FsbHkgaXQgaXMgYSBwYWdlLlxuICAgKiBAc2VlIFF1ZXN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25RdWVzdGlvbkFkZGVkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gcmVtb3ZpbmcgYSBxdWVzdGlvbiBmcm9tIHN1cnZleVxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiBhIHJlbW92ZWQgcXVlc3Rpb24gb2JqZWN0LlxuICAgKiA8YnIvPiBvcHRpb25zLm5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAqIEBzZWUgUXVlc3Rpb25cbiAgICovXG4gIHB1YmxpYyBvblF1ZXN0aW9uUmVtb3ZlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGFkZGluZyBhIHBhbmVsIGludG8gc3VydmV5XG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnBhbmVsIGEgbmV3bHkgYWRkZWQgcGFuZWwgb2JqZWN0LlxuICAgKiA8YnIvPiBvcHRpb25zLm5hbWUgYSBwYW5lbCBuYW1lXG4gICAqIDxici8+IG9wdGlvbnMuaW5kZXggYSBpbmRleCBvZiB0aGUgcGFuZWwgaW4gdGhlIGNvbnRhaW5lciAocGFnZSBvciBwYW5lbClcbiAgICogPGJyLz4gb3B0aW9ucy5wYXJlbnRQYW5lbCBhIGNvbnRhaW5lciB3aGVyZSBxdWVzdGlvbiBpcyBsb2NhdGVkLiBJdCBjYW4gYmUgcGFnZSBvciBwYW5lbC5cbiAgICogPGJyLz4gb3B0aW9ucy5yb290UGFuZWwgdHlwaWNhbGx5IGl0IGlzIGEgcGFnZS5cbiAgICogQHNlZSBQYW5lbE1vZGVsXG4gICAqL1xuICBwdWJsaWMgb25QYW5lbEFkZGVkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gcmVtb3ZpbmcgYSBwYW5lbCBmcm9tIHN1cnZleVxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5wYW5lbCBhIHJlbW92ZWQgcGFuZWwgb2JqZWN0LlxuICAgKiA8YnIvPiBvcHRpb25zLm5hbWUgYSBwYW5lbCBuYW1lXG4gICAqIEBzZWUgUGFuZWxNb2RlbFxuICAgKi9cbiAgcHVibGljIG9uUGFuZWxSZW1vdmVkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gYWRkaW5nIGEgcGFnZSBpbnRvIHN1cnZleVxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5wYWdlIGEgbmV3bHkgYWRkZWQgcGFuZWwgb2JqZWN0LlxuICAgKiBAc2VlIFBhbmVsTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvblBhZ2VBZGRlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIHZhbGlkYXRpbmcgdmFsdWUgaW4gYSBxdWVzdGlvbi4gU2V0IHlvdXIgZXJyb3IgdG8gb3B0aW9ucy5lcnJvciBhbmQgc3VydmV5IHdpbGwgc2hvdyB0aGUgZXJyb3IgZm9yIHRoZSBxdWVzdGlvbiBhbmQgYmxvY2sgY29tcGxldGluZyB0aGUgc3VydmV5IG9yIGdvaW5nIHRvIHRoZSBuZXh0IHBhZ2UuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIGEgcXVlc3Rpb25cbiAgICogPGJyLz4gb3B0aW9ucy5uYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgKiA8YnIvPiBvcHRpb25zLnZhbHVlIHRoZSBjdXJyZW50IHF1ZXN0aW9uIHZhbHVlXG4gICAqIDxici8+IG9wdGlvbnMuZXJyb3IgYW4gZXJyb3Igc3RyaW5nLiBJdCBpcyBlbXB0eSBieSBkZWZhdWx0LlxuICAgKiBAc2VlIG9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnNcbiAgICovXG4gIHB1YmxpYyBvblZhbGlkYXRlUXVlc3Rpb246IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIHZhbGlkYXRlIGRhdGEgb24geW91ciBzZXJ2ZXIuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLmRhdGEgdGhlIHZhbHVlcyBvZiBhbGwgbm9uLWVtcHR5IHF1ZXN0aW9ucyBvbiB0aGUgY3VycmVudCBwYWdlLiBZb3UgY2FuIGdldCBhIHF1ZXN0aW9uIHZhbHVlIGFzIG9wdGlvbnMuZGF0YVtcIm15UXVlc3Rpb25OYW1lXCJdLlxuICAgKiA8YnIvPiBvcHRpb25zLmVycm9ycyBzZXQgeW91ciBlcnJvcnMgdG8gdGhpcyBvYmplY3QgYXM6IG9wdGlvbnMuZXJyb3JzW1wibXlRdWVzdGlvbk5hbWVcIl0gPSBcIkVycm9yIHRleHRcIjsuIEl0IHdpbGwgYmUgc2hvd24gYXMgYSBxdWVzdGlvbiBlcnJvci5cbiAgICogPGJyLz4gb3B0aW9ucy5jb21wbGV0ZSgpIGNhbGwgdGhpcyBmdW5jdGlvbiB0byB0ZWxsIHN1cnZleSB0aGF0IHlvdXIgc2VydmVyIGNhbGxiYWNrIGhhcyBiZWVuIHByb2Nlc3NlZC5cbiAgICogQHNlZSBvblZhbGlkYXRlUXVlc3Rpb25cbiAgICogQHNlZSBvblZhbGlkYXRlUGFuZWxcbiAgICovXG4gIHB1YmxpYyBvblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zOiBhbnkgPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBtb2RpZnkgdGhlIGh0bWwgYmVmb3JlIHJlbmRlcmluZywgZm9yIGV4YW1wbGUgaHRtbCBvbiAnVGhhbmsgeW91JyBwYWdlLiBPcHRpb25zIGhhcyBvbmUgcGFyYW1ldGVyOiBvcHRpb25zLmh0bWwuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLmh0bWwgYW4gaHRtbCB0aGF0IHlvdSBtYXkgY2hhbmdlIGJlZm9yZSB0ZXh0IHByb2Nlc3NpbmcgYW5kIHRoZW4gcmVuZGVyaW5nLlxuICAgKiBAc2VlIGNvbXBsZXRlZEh0bWxcbiAgICogQHNlZSBsb2FkaW5nSHRtbFxuICAgKiBAc2VlIFF1ZXN0aW9uSHRtbE1vZGVsLmh0bWxcbiAgICovXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gdmFsaWRhdGluZyBhIHBhbmVsLiBTZXQgeW91ciBlcnJvciB0byBvcHRpb25zLmVycm9yIGFuZCBzdXJ2ZXkgd2lsbCBzaG93IHRoZSBlcnJvciBmb3IgdGhlIHBhbmVsIGFuZCBibG9jayBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkgb3IgZ29pbmcgdG8gdGhlIG5leHQgcGFnZS5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMubmFtZSBhIHBhbmVsIG5hbWVcbiAgICogPGJyLz4gb3B0aW9ucy5lcnJvciBhbiBlcnJvciBzdHJpbmcuIEl0IGlzIGVtcHR5IGJ5IGRlZmF1bHQuXG4gICAqIEBzZWUgb25WYWxpZGF0ZVF1ZXN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25WYWxpZGF0ZVBhbmVsOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhlIGV2ZW50IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBlcnJvciB0ZXh0LlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy50ZXh0IGFuIGVycm9yIHRleHRcbiAgICogPGJyLz4gb3B0aW9ucy5lcnJvciBhbiBpbnN0YW5jZSBvZiBTdXJ2ZXlFcnJvciBvYmplY3RcbiAgICogPGJyLz4gb3B0aW9ucy5uYW1lIHRoZSBlcnJvciBuYW1lLiBUaGUgZm9sbG93aW5nIGVycm9yIG5hbWUgYXJlIGF2YWlsYWJsZTpcbiAgICogcmVxdWlyZWQsIHJlcXVpcmVvbmVhbnN3ZXIsIHJlcXVpcmVudW1lcmljLCBleGNlZWRzaXplLCB3ZWJyZXF1ZXN0LCB3ZWJyZXF1ZXN0ZW1wdHksIG90aGVyZW1wdHksXG4gICAqIHVwbG9hZGluZ2ZpbGUsIHJlcXVpcmVkaW5hbGxyb3dzZXJyb3IsIG1pbnJvd2NvdW50ZXJyb3IsIGtleWR1cGxpY2F0aW9uZXJyb3IsIGN1c3RvbVxuICAgKi9cbiAgcHVibGljIG9uRXJyb3JDdXN0b21UZXh0OiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhlIHRoaXMgZXZlbnQgdG8gYmUgbm90aWZpZWQgd2hlbiB0aGUgc3VydmV5IGZpbmlzaGVkIHZhbGlkYXRlIHF1ZXN0aW9ucyBvbiB0aGUgY3VycmVudCBwYWdlLiBJdCBjb21tb25seSBoYXBwZW5zIHdoZW4gYSB1c2VyIHRyeSB0byBnbyB0byB0aGUgbmV4dCBwYWdlIG9yIGNvbXBsZXRlIHRoZSBzdXJ2ZXlcbiAgICogb3B0aW9ucy5xdWVzdGlvbnMgLSB0aGUgbGlzdCBvZiBxdWVzdGlvbnMgdGhhdCBoYXZlIGVycm9yc1xuICAgKiBvcHRpb25zLmVycm9ycyAtIHRoZSBsaXN0IG9mIGVycm9yc1xuICAgKi9cbiAgcHVibGljIG9uVmFsaWRhdGVkRXJyb3JzT25DdXJyZW50UGFnZTogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBtb2RpZnkgdGhlIGh0bWwgYmVmb3JlIHJlbmRlcmluZywgZm9yIGV4YW1wbGUgY29tcGxldGVIdG1sIG9yIGxvYWRpbmdIdG1sLlxuICAgKiBvcHRpb25zLmh0bWwgLSBjaGFuZ2UgdGhpcyBodG1sIHByb3BlcnR5IGJlZm9yZSB0aGUgbGlicmFyeSByZW5kZXJlZCBpdFxuICAgKiBAc2VlIGNvbXBsZXRlZEh0bWxcbiAgICogQHNlZSBsb2FkaW5nSHRtbFxuICAgKi9cbiAgcHVibGljIG9uUHJvY2Vzc0h0bWw6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+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+IG9wdGlvbnMudmFsdWUgLSBhIG5ldyB2YWx1ZVxuICAgKiA8YnIvPiBvcHRpb25zLnJvdyAtIHRoZSBtYXRyaXggcm93IG9iamVjdFxuICAgKiA8YnIvPiBvcHRpb25zLmdldENlbGxRdWVzdGlvbihjb2x1bW5OYW1lKSAtIHRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNlbGwgcXVlc3Rpb24gYnkgY29sdW1uIG5hbWUuXG4gICAqIEBzZWUgb25NYXRyaXhDZWxsVmFsdWVDaGFuZ2luZ1xuICAgKiBAc2VlIG9uTWF0cml4QmVmb3JlUm93QWRkZWRcbiAgICogQHNlZSBvbk1hdHJpeFJvd0FkZGVkXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeENlbGxWYWx1ZUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBjaGFuZ2luZyBjZWxsIHZhbHVlIGluIE1hdHJpeCBEeW1pYyBhbmQgTWF0cml4IERyb3Bkb3duIHF1ZXN0aW9ucy4gWW91IG1heSBjaGFuZ2UgdGhlIG9wdGlvbnMudmFsdWUgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSB2YWx1ZSBpbiB0aGUgY2VsbC5cbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiAtIHRoZSBtYXRyaXggcXVlc3Rpb25cbiAgICogPGJyLz4gb3B0aW9ucy5jb2x1bU5hbWUgLSB0aGUgbWF0cml4IGNvbHVtbiBuYW1lXG4gICAqIDxici8+IG9wdGlvbnMudmFsdWUgLSBhIG5ldyB2YWx1ZVxuICAgKiA8YnIvPiBvcHRpb25zLm9sZFZhbHVlIC0gdGhlIG9sZCB2YWx1ZVxuICAgKiA8YnIvPiBvcHRpb25zLnJvdyAtIHRoZSBtYXRyaXggcm93IG9iamVjdFxuICAgKiA8YnIvPiBvcHRpb25zLmdldENlbGxRdWVzdGlvbihjb2x1bW5OYW1lKSAtIHRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNlbGwgcXVlc3Rpb24gYnkgY29sdW1uIG5hbWUuXG4gICAqIEBzZWUgb25NYXRyaXhDZWxsVmFsdWVDaGFuZ2VkXG4gICAqIEBzZWUgb25NYXRyaXhCZWZvcmVSb3dBZGRlZFxuICAgKiBAc2VlIG9uTWF0cml4Um93QWRkZWRcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbFxuICAgKi9cbiAgcHVibGljIG9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdpbmc6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIE1hdHJpeCBEeW1pYyBhbmQgTWF0cml4IERyb3Bkb3duIHF1ZXN0aW9ucyB2YWxpZGF0ZSB0aGUgY2VsbCB2YWx1ZS5cbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiAtIHRoZSBtYXRyaXggcXVlc3Rpb25cbiAgICogPGJyLz4gb3B0aW9ucy5jb2x1bU5hbWUgLSB0aGUgbWF0cml4IGNvbHVtbiBuYW1lXG4gICAqIDxici8+IG9wdGlvbnMudmFsdWUgLSBhIGNlbGwgdmFsdWVcbiAgICogPGJyLz4gb3B0aW9ucy5yb3cgLSB0aGUgbWF0cml4IHJvdyBvYmplY3RcbiAgICogPGJyLz4gb3B0aW9ucy5nZXRDZWxsUXVlc3Rpb24oY29sdW1uTmFtZSkgLSB0aGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBjZWxsIHF1ZXN0aW9uIGJ5IGNvbHVtbiBuYW1lLlxuICAgKiBAc2VlIG9uTWF0cml4QmVmb3JlUm93QWRkZWRcbiAgICogQHNlZSBvbk1hdHJpeFJvd0FkZGVkXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeENlbGxWYWxpZGF0ZTogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGFkZGluZyBhIG5ldyBwYW5lbCBpbiBQYW5lbCBEeW5hbWljIHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiBhIHBhbmVsIHF1ZXN0aW9uLlxuICAgKiBAc2VlIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsLnBhbmVsc1xuICAgKi9cbiAgcHVibGljIG9uRHluYW1pY1BhbmVsQWRkZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiByZW1vdmluZyBhIHBhbmVsIGZyb20gUGFuZWwgRHluYW1pYyBxdWVzdGlvbi5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBwYW5lbCBxdWVzdGlvbi5cbiAgICogPGJyLz4gb3B0aW9ucy5wYW5lbEluZGV4IGEgcmVtb3ZlZCBwYW5lbCBpbmRleC5cbiAgICogQHNlZSBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbC5wYW5lbHNcbiAgICovXG4gIHB1YmxpYyBvbkR5bmFtaWNQYW5lbFJlbW92ZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBldmVyeSBzZWNvbmQgaWYgdGhlIG1ldGhvZCBzdGFydFRpbWVyIGhhcyBiZWVuIGNhbGxlZC5cbiAgICogQHNlZSBzdGFydFRpbWVyXG4gICAqIEBzZWUgdGltZVNwZW50XG4gICAqIEBzZWUgUGFnZS50aW1lU3BlbnRcbiAgICovXG4gIHB1YmxpYyBvblRpbWVyOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsKSA9PiBhbnksXG4gICAgYW55XG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgZGlzcGxheWluZyBhIG5ldyBpbmZvcm1hdGlvbiBpbiB0aGUgVGltZXIgUGFuZWwuIFVzZSBpdCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICogPGJyLz4gb3B0aW9ucy50ZXh0IC0gdGhlIHRpbWVyIHBhbmVsIGluZm8gdGV4dC5cbiAgICovXG4gIHB1YmxpYyBvblRpbWVyUGFuZWxJbmZvVGV4dDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gaXRlbSB2YWx1ZSBpcyBjaGFuZ2VkIGluIFBhbmVsIER5bmFtaWMgcXVlc3Rpb24uXG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gLSB0aGUgcGFuZWwgcXVlc3Rpb25cbiAgICogPGJyLz4gb3B0aW9ucy5wYW5lbCAtIHRoZSBkeW5hbWljIHBhbmVsIGl0ZW1cbiAgICogPGJyLz4gb3B0aW9ucy5uYW1lIC0gdGhlIGl0ZW0gbmFtZVxuICAgKiA8YnIvPiBvcHRpb25zLnZhbHVlIC0gYSBuZXcgdmFsdWVcbiAgICogPGJyLz4gb3B0aW9ucy5pdGVtSW5kZXggLSB0aGUgcGFuZWwgaXRlbSBpbmRleFxuICAgKiA8YnIvPiBvcHRpb25zLml0ZW1WYWx1ZSAtIHRoZSBwYW5lbCBpdGVtIG9iamVjdFxuICAgKiBAc2VlIG9uRHluYW1pY1BhbmVsQWRkZWRcbiAgICogQHNlZSBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsXG4gICAqL1xuICBwdWJsaWMgb25EeW5hbWljUGFuZWxJdGVtVmFsdWVDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBkZWZpbmUsIGlmIHRoZSBhbnN3ZXIgb24gdGhlIHF1ZXN0aW9uIGlzIGNvcnJlY3Qgb3Igbm90LlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiBhIHF1ZXN0aW9uIG9uIHdoaWNoIHlvdSBoYXZlIHRvIGRlY2lkZSBpZiB0aGUgYW5zd2VyIGlzIGNvcnJlY3Qgb3Igbm90LlxuICAgKiA8YnIvPiBvcHRpb25zLnJlc3VsdCByZXR1cm4gdHJ1ZSwgaWYgdGhlIGFuc3dlciBpcyBjb3JyZWN0IG9yIGZhbHNlIGlmIHRoZSBhbnN3ZXIgaXMgbm90IGNvcnJlY3QuIFVzZSBxdWVzdGlvbnMgdmFsdWUgYW5kIGNvcnJlY3RBbnN3ZXIgcHJvcGVydGllcyB0byByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUuXG4gICAqIEBzZWUgUXVlc3Rpb24udmFsdWVcbiAgICogQHNlZSBRdWVzdGlvbi5jb3JyZWN0QW5zd2VyXG4gICAqL1xuICBwdWJsaWMgb25Jc0Fuc3dlckNvcnJlY3Q6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIGNvbnRyb2wgZHJhZyZkcm9wIG9wZXJhdGlvbnMgZHVyaW5nIGRlc2lnbiBtb2RlLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IG9wdGlvbnMuYWxsb3cgc2V0IGl0IHRvIGZhbHNlIHRvIGRpc2FibGUgZHJhZ2dpbmcuXG4gICAqIDxici8+IG9wdGlvbnMudGFyZ2V0IGEgdGFyZ2V0IGVsZW1lbnQgdGhhdCBpcyBkcmFnZ2luZy5cbiAgICogPGJyLz4gb3B0aW9ucy5zb3VyY2UgYSBzb3VyY2UgZWxlbWVudC4gSXQgY2FuIGJlIG51bGwsIGlmIGl0IGlzIGEgbmV3IGVsZW1lbnQsIGRyYWdnaW5nIGZyb20gdG9vbGJveC5cbiAgICogPGJyLz4gb3B0aW9ucy5wYXJlbnQgYSBwYWdlIG9yIHBhbmVsIHdoZXJlIHRhcmdldCBlbGVtZW50IGlzIGRyYWdnaW5nLlxuICAgKiA8YnIvPiBvcHRpb25zLmluc2VydEJlZm9yZSBhbiBlbGVtZW50IGJlZm9yZSB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgZHJhZ2dpbmcuIEl0IGNhbiBiZSBudWxsIGlmIHBhcmVudCBjb250YWluZXIgKHBhZ2Ugb3IgcGFuZWwpIGlzIGVtcHR5IG9yIGRyYWdnaW5nIGFuIGVsZW1lbnQgdW5kZXIgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgY29udGFpbmVyLlxuICAgKiA8YnIvPiBvcHRpb25zLmluc2VydEFmdGVyIGFuIGVsZW1lbnQgYWZ0ZXIgdGhlIHRhcmdldCBlbGVtZW50IGlzIGRyYWdnaW5nLiBJdCBjYW4gYmUgbnVsbCBpZiBwYXJlbnQgY29udGFpbmVyIChwYWdlIG9yIHBhbmVsKSBpcyBlbXB0eSBvciBkcmFnZ2luZyBlbGVtZW50IHRvIHRoZSB0b3Agb2YgdGhlIHBhcmVudCBjb250YWluZXIuXG4gICAqIEBzZWUgc2V0RGVzaWduTW9kZVxuICAgKiBAc2VlIGlzRGVzaWduTW9kZVxuICAgKi9cbiAgcHVibGljIG9uRHJhZ0Ryb3BBbGxvdzogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgZXJyb3JzIG9uIGxvYWRpbmcgc3VydmV5IGpzb24uIElmIHRoZSBsaXN0IGlzIGVtcHR5IGFmdGVyIGxvYWRpbmcgYSBqc29uIHRoZW4gdGhlIGpzb24gaXMgY29ycmVjdCBhbmQgdGhlcmUgaXMgbm8gZXJyb3JzIGluIGl0LlxuICAgKiBAc2VlIEpzb25FcnJvclxuICAgKi9cbiAgcHVibGljIGpzb25FcnJvcnM6IEFycmF5PEpzb25FcnJvcj4gPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGpzb25PYmo6IGFueSA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBTdXJ2ZXlNb2RlbC5zdHlsZXNNYW5hZ2VyID0gbmV3IFN0eWxlc01hbmFnZXIoKTtcbiAgICB9XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJkZXNjcmlwdGlvblwiLCB0aGlzLCB0cnVlKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVkSHRtbFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVkQmVmb3JlSHRtbFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwibG9hZGluZ0h0bWxcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInN0YXJ0U3VydmV5XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwYWdlUHJldlwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFnZU5leHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImNvbXBsZXRlXCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJxdWVzdGlvblRpdGxlVGVtcGxhdGVcIiwgdGhpcywgdHJ1ZSk7XG5cbiAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3IgPSBuZXcgVGV4dFByZVByb2Nlc3NvcigpO1xuICAgIHRoaXMudGV4dFByZVByb2Nlc3Nvci5vblByb2Nlc3MgPSBmdW5jdGlvbihcbiAgICAgIHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlXG4gICAgKSB7XG4gICAgICBzZWxmLmdldFByb2Nlc3NlZFRleHRWYWx1ZSh0ZXh0VmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy5wYWdlc1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdBcnJheShcInBhZ2VzXCIsIGZ1bmN0aW9uKHZhbHVlOiBhbnkpIHtcbiAgICAgIHNlbGYuZG9PblBhZ2VBZGRlZCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy50cmlnZ2Vyc1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdBcnJheShcInRyaWdnZXJzXCIsIGZ1bmN0aW9uKHZhbHVlOiBhbnkpIHtcbiAgICAgIHZhbHVlLnNldE93bmVyKHNlbGYpO1xuICAgIH0pO1xuICAgIHRoaXMuY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uVmFsdWUgPSB0aGlzLmNyZWF0ZU5ld0FycmF5KFxuICAgICAgXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb25cIixcbiAgICAgIGZ1bmN0aW9uKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdmFsdWUubG9jT3duZXIgPSBzZWxmO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgIFwicXVlc3Rpb25UaXRsZVRlbXBsYXRlXCIsXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5xdWVzdGlvblRpdGxlVGVtcGxhdGVDYWNoZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgICBcImZpcnN0UGFnZUlzU3RhcnRlZFwiLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYub25GaXJzdFBhZ2VJc1N0YXJ0ZWRDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiaXNTaW5nbGVQYWdlXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vbklzU2luZ2xlUGFnZUNoYW5nZWQoKTtcbiAgICB9KTtcbiAgICB0aGlzLm9uQmVmb3JlQ3JlYXRpbmcoKTtcbiAgICBpZiAoanNvbk9iaikge1xuICAgICAgaWYgKHR5cGVvZiBqc29uT2JqID09PSBcInN0cmluZ1wiIHx8IGpzb25PYmogaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAganNvbk9iaiA9IEpTT04ucGFyc2UoanNvbk9iaiBhcyBzdHJpbmcpO1xuICAgICAgfVxuICAgICAgaWYgKGpzb25PYmogJiYganNvbk9iai5jbGllbnRJZCkge1xuICAgICAgICB0aGlzLmNsaWVudElkID0ganNvbk9iai5jbGllbnRJZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0SnNvbk9iamVjdChqc29uT2JqKTtcbiAgICAgIGlmICh0aGlzLnN1cnZleUlkKSB7XG4gICAgICAgIHRoaXMubG9hZFN1cnZleUZyb21TZXJ2aWNlKHRoaXMuc3VydmV5SWQsIHRoaXMuY2xpZW50SWQpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uQ3JlYXRpbmcoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInN1cnZleVwiO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBhbGwgcGFnZXMgaW4gdGhlIHN1cnZleSwgaW5jbHVkaW5nIGludmlzaWJsZS5cbiAgICogQHNlZSBQYWdlTW9kZWxcbiAgICogQHNlZSB2aXNpYmxlUGFnZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFnZXMoKTogQXJyYXk8UGFnZU1vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMucGFnZXNWYWx1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgdHJpZ2dlcnMgaW4gdGhlIHN1cnZleS5cbiAgICogQHNlZSBTdXJ2ZXlUcmlnZ2VyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRyaWdnZXJzKCk6IEFycmF5PFN1cnZleVRyaWdnZXI+IHtcbiAgICByZXR1cm4gdGhpcy50cmlnZ2Vyc1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgdHJpZ2dlcnModmFsOiBBcnJheTxTdXJ2ZXlUcmlnZ2VyPikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRyaWdnZXJzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGF1dG9tYXRpY2FsbHkgbG9hZCBzdXJ2ZXkgSnNvbiBmcm9tIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlLlxuICAgKiBAc2VlIGxvYWRTdXJ2ZXlGcm9tU2VydmljZVxuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXlJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdXJ2ZXlJZFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN1cnZleUlkKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5SWRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gYXV0b21hdGljYWxseSBzYXZlIHRoZSBkYXRhIGludG8gdGhlIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlLlxuICAgKiBAc2VlIG9uQ29tcGxldGVcbiAgICogQHNlZSBzdXJ2ZXlTaG93RGF0YVNhdmluZ1xuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXlQb3N0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5UG9zdElkXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3VydmV5UG9zdElkKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5UG9zdElkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IGFzIGluZGVudGlmaWNhdG9yIGZvciBhIHVzZXIsIGZvciBleGFtcGxlIGUtbWFpbCBvciB1bmlxdWUgY3VzdG9tZXIgaWQgaW4geW91ciB3ZWIgYXBwbGljYXRpb24uIElmIHlvdSBhcmUgbG9hZGluZyBzdXJ2ZXkgb3IgcG9zdGluZyBzdXJ2ZXkgcmVzdWx0cyAgZnJvbS90byBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZSwgdGhlbiB0aGUgbGlicmFyeSBkbyBub3QgYWxsb3cgdG8gcnVuIHRoZSBzYW1lIHN1cnZleSB0aGUgc2Vjb25kIHRpbWUuIE9uIHRoZSBzZWNvbmQgcnVuLCB0aGUgdXNlciB3aWxsIHNlZSB0aGUgJ1RoYW5rIHlvdScgcGFnZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2xpZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2xpZW50SWRcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBjbGllbnRJZCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNsaWVudElkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIElmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZW1wdHksIGJlZm9yZSBzdGFydGluZyB0byBydW4gdGhlIHN1cnZleSwgdGhlIGxpYnJhcnkgY2hlY2tlcyBpZiB0aGUgY29va2llIHdpdGggdGhpcyBuYW1lIGV4aXN0cy4gSWYgaXQgaXMgdHJ1ZSwgdGhlIHN1cnZleSBnb2VzIHRvIGNvbXBsZXRlIG1vZGUgYW5kIGFuIHVzZXIgc2VlcyB0aGUgJ1RoYW5rIHlvdScgcGFnZS4gT24gY29tcGxldGluZyB0aGUgc3VydmV5IHRoZSBjb29raWUgd2l0aCB0aGlzIG5hbWUgaXMgY3JlYXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29va2llTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb29raWVOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29va2llTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvb2tpZU5hbWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUsIHRvIHNhdmUgcmVzdWx0cyBvbiBjb21wbGV0aW5nIGV2ZXJ5IHBhZ2UuIG9uUGFydGlhbFNlbmQgZXZlbnQgaXMgZmlyZWQuXG4gICAqIEBzZWUgb25QYXJ0aWFsU2VuZFxuICAgKiBAc2VlIGNsaWVudElkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNlbmRSZXN1bHRPblBhZ2VOZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzZW5kUmVzdWx0T25QYWdlTmV4dFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBzZW5kUmVzdWx0T25QYWdlTmV4dCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzZW5kUmVzdWx0T25QYWdlTmV4dFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCB0byBzaG93IHRoZSBwcm9ncmVzcyBvbiBzYXZpbmcvc2VuZGluZyBkYXRhIGludG8gdGhlIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlLlxuICAgKiBAc2VlIHN1cnZleVBvc3RJZFxuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXlTaG93RGF0YVNhdmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5U2hvd0RhdGFTYXZpbmdcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3VydmV5U2hvd0RhdGFTYXZpbmcodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5U2hvd0RhdGFTYXZpbmdcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogT24gc2hvd2luZyB0aGUgbmV4dCBvciBwcmV2aW91cyBwYWdlLCBhIGZpcnN0IGlucHV0IGlzIGZvY3VzZWQsIGlmIHRoZSBwcm9wZXJ0eSBzZXQgdG8gdHJ1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWNcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIChkZWZhdWx0IHZhbHVlIGlzIHRydWUpIGlmIHlvdSBkbyBub3Qgd2FudCB0byBicmluZyB0aGUgZm9jdXMgdG8gdGhlIGZpcnN0IHF1ZXN0aW9uIHRoYXQgaGFzIGVycm9yIG9uIHRoZSBwYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBmb2N1c09uRmlyc3RFcnJvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZm9jdXNPbkZpcnN0RXJyb3JcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBmb2N1c09uRmlyc3RFcnJvcih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJmb2N1c09uRmlyc3RFcnJvclwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBQb3NzaWJsZSB2YWx1ZXM6ICdib3R0b20nIChkZWZhdWx0KSwgJ3RvcCcsICdib3RoJyBhbmQgJ25vbmUnLiBTZXQgaXQgdG8gJ25vbmUnIHRvIGhpZGUgJ1ByZXYnLCAnTmV4dCcgYW5kICdDb21wbGV0ZScgYnV0dG9ucy4gSXQgbWFrZXMgc2Vuc2UgaWYgeW91IGFyZSBnb2luZyB0byBjcmVhdGUgYSBjdXN0b20gbmF2aWdhdGlvbiBvciBoYXZlIGp1c3Qgb25lIHBhZ2Ugb3Igb24gc2V0dGluZyBnb05leHRQYWdlQXV0b21hdGljIHByb3BlcnR5LlxuICAgKiBAc2VlIGdvTmV4dFBhZ2VBdXRvbWF0aWNcbiAgICogQHNlZSBzaG93UHJldkJ1dHRvblxuICAgKi9cbiAgcHVibGljIGdldCBzaG93TmF2aWdhdGlvbkJ1dHRvbnMoKTogc3RyaW5nIHwgYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd05hdmlnYXRpb25CdXR0b25zXCIsIFwiYm90dG9tXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd05hdmlnYXRpb25CdXR0b25zKHZhbDogc3RyaW5nIHwgYW55KSB7XG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsID0gXCJib3R0b21cIjtcbiAgICB9XG4gICAgaWYgKHZhbCA9PT0gZmFsc2UpIHtcbiAgICAgIHZhbCA9IFwibm9uZVwiO1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93TmF2aWdhdGlvbkJ1dHRvbnNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIGZhbHNlIHRvIGhpZGUgdGhlICdQcmV2JyB0byBkaXNhYmxlIGZvciBlbmQtdXNlcnMgZ28gYmFjayB0byB0aGVpciBhbnN3ZXJzLlxuICAgKiBAc2VlIHNob3dOYXZpZ2F0aW9uQnV0dG9uc1xuICAgKi9cbiAgcHVibGljIGdldCBzaG93UHJldkJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1ByZXZCdXR0b25cIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UHJldkJ1dHRvbih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UHJldkJ1dHRvblwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gZmFsc2UgaGlkZSBzdXJ2ZXkgdGl0bGUuXG4gICAqIEBzZWUgdGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1RpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93VGl0bGVcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93VGl0bGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpdGxlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byBmYWxzZSB0byBoaWRlIHBhZ2UgdGl0bGVzLlxuICAgKiBAc2VlIFBhZ2VNb2RlbC50aXRsZVxuICAgKi9cbiAgcHVibGljIGdldCBzaG93UGFnZVRpdGxlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1BhZ2VUaXRsZXNcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UGFnZVRpdGxlcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UGFnZVRpdGxlc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBPbiBmaW5pc2hpbmcgdGhlIHN1cnZleSB0aGUgJ1RoYW5rIHlvdScsIHBhZ2Ugb24gY29tcGxldGUsIGlzIHNob3duLiBTZXQgdGhlIHByb3BlcnR5IHRvIGZhbHNlLCB0byBoaWRlIHRoZSAnVGhhbmsgeW91JyBwYWdlLlxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBvbkNvbXBsZXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dDb21wbGV0ZWRQYWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93Q29tcGxldGVkUGFnZVwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dDb21wbGV0ZWRQYWdlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dDb21wbGV0ZWRQYWdlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEEgY2hhci9zdHJpbmcgdGhhdCB3aWxsIGJlIHJlbmRlcmVkIGluIHRoZSB0aXRsZSByZXF1aXJlZCBxdWVzdGlvbnMuXG4gICAqIEBzZWUgUXVlc3Rpb24udGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJlcXVpcmVkVGV4dFwiLCBcIipcIik7XG4gIH1cbiAgcHVibGljIHNldCByZXF1aXJlZFRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZXF1aXJlZFRleHRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQnkgZGVmYXVsdCB0aGUgZmlyc3QgcXVlc3Rpb24gaW5kZXggaXMgMS4gWW91IG1heSBzdGFydCBpdCBmcm9tIDEwMCBvciBmcm9tICdBJywgYnkgc2V0dGluZyAxMDAgb3IgJ0EnIHRvIHRoaXMgcHJvcGVydHkuXG4gICAqIEBzZWUgUXVlc3Rpb24udGl0bGVcbiAgICogQHNlZSByZXF1aXJlZFRleHRcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25TdGFydEluZGV4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uU3RhcnRJbmRleFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uU3RhcnRJbmRleCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uU3RhcnRJbmRleFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHRoZSBlbnRlcmVkIHRleHQgaW4gdGhlIG90aGVycyBpbnB1dCBpbiB0aGUgY2hlY2tib3gvcmFkaW9ncm91cC9kcm9wZG93biBhcmUgc3RvcmVkIGFzIFwicXVlc3Rpb24gbmFtZSBcIiArIFwiLUNvbW1lbnRcIi4gVGhlIHZhbHVlIGl0c2VsZiBpcyBcInF1ZXN0aW9uIG5hbWVcIjogXCJvdGhlcnNcIi4gU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UsIHRvIHN0b3JlIHRoZSBlbnRlcmVkIHRleHQgZGlyZWN0bHkgaW4gdGhlIFwicXVlc3Rpb24gbmFtZVwiIGtleS5cbiAgICogQHNlZSBjb21tZW50UHJlZml4XG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0b3JlT3RoZXJzQXNDb21tZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0b3JlT3RoZXJzQXNDb21tZW50KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0b3JlT3RoZXJzQXNDb21tZW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IG1heGltdW0gbGVuZ3RoIGZvciBxdWVzdGlvbnMgbGlrZSB0ZXh0IGFuZCBjb21tZW50LCBpbmNsdWRpbmcgbWF0cml4IGNlbGwgcXVlc3Rpb25zLlxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLCBpdCBpcyB1bmxpbWl0ZWQgbWF4TGVuZ3RoIC0gNTI0Mjg4IGNoYXJhY3RlcnM6IGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vdGFncy9hdHRfaW5wdXRfbWF4bGVuZ3RoLmFzcFxuICAgKiBAc2VlIG1heE90aGVyc0xlbmd0aFxuICAgKi9cbiAgcHVibGljIGdldCBtYXhUZXh0TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heFRleHRMZW5ndGhcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhUZXh0TGVuZ3RoKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGV4dExlbmd0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBtYXhpbXVtIGxlbmd0aCBmb3IgcXVlc3Rpb24gY29tbWVudHMgYW5kIG90aGVyc1xuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLCBpdCBpcyB1bmxpbWl0ZWQgbWF4TGVuZ3RoIC0gNTI0Mjg4IGNoYXJhY3RlcnM6IGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vdGFncy9hdHRfaW5wdXRfbWF4bGVuZ3RoLmFzcFxuICAgKiBAc2VlIFF1ZXN0aW9uLmhhc0NvbW1lbnRcbiAgICogQHNlZSBRdWVzdGlvbi5oYXNPdGhlclxuICAgKiBAc2VlIG1heFRleHRMZW5ndGhcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4T3RoZXJzTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heE90aGVyc0xlbmd0aFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heE90aGVyc0xlbmd0aCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heE90aGVyc0xlbmd0aFwiLCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0aGUgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGlmIHlvdSB3YW50IHRvIGdvIHRvIHRoZSBuZXh0IHBhZ2Ugd2l0aG91dCBwcmVzc2luZyAnTmV4dCcgYnV0dG9uIHdoZW4gYWxsIHF1ZXN0aW9ucyBhcmUgYW53ZXJlZC5cbiAgICogdHJ1ZSAtIGdvIG5leHQgcGFnZSBhbmQgc3VibWl0IGF1dG9tYXRpY2FsbHlcbiAgICogXCJhdXRvZ29uZXh0XCIgLSBnbyBuZXh0IHBhZ2UgYXV0b21hdGljYWxseSBidXQgZG8gbm90IHN1Ym1pdFxuICAgKiBmYWxzZSAtIGRvIG5vdCBnbyBuZXh0IHBhZ2UgYW5kIG5vdCBzdWJtaXQgYXV0b21hdGljYWxseVxuICAgKiBAc2VlIHNob3dOYXZpZ2F0aW9uQnV0dG9uc1xuICAgKi9cbiAgcHVibGljIGdldCBnb05leHRQYWdlQXV0b21hdGljKCk6IGJvb2xlYW4gfCBcImF1dG9nb25leHRcIiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImdvTmV4dFBhZ2VBdXRvbWF0aWNcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgZ29OZXh0UGFnZUF1dG9tYXRpYyh2YWw6IGJvb2xlYW4gfCBcImF1dG9nb25leHRcIikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImdvTmV4dFBhZ2VBdXRvbWF0aWNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQ2hhbmdlIHRoaXMgcHJvcGVydHkgZnJvbSAnb25OZXh0UGFnZScgdG8gJ29uVmFsdWVDaGFuZ2VkJyB0byBjaGVjayBlcm9ycnMgb24gZXZlcnkgcXVlc3Rpb24gdmFsdWUgY2hhbmdpbmcuXG4gICAqIEJ5IGRlZmF1bHQsIGxpYnJhcnkgY2hlY2tzIGVycm9ycyBvbiBjaGFuZ2luZyBjdXJyZW50IHBhZ2UgdG8gdGhlIG5leHQgb3Igb24gY29tcGxldGluZyB0aGUgc3VydmV5LlxuICAgKi9cbiAgcHVibGljIGdldCBjaGVja0Vycm9yc01vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hlY2tFcnJvcnNNb2RlXCIsIFwib25OZXh0UGFnZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNoZWNrRXJyb3JzTW9kZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNoZWNrRXJyb3JzTW9kZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gJ25vbmUnIHRvIGluY2x1ZGUgdGhlIGludmlzaWJsZSB2YWx1ZXMgaW50byB0aGUgc3VydmV5IGRhdGEuXG4gICAqIDwvYnI+IFNldCBpdCB0byAnb25IaWRkZW4nIHRvIGNsZWFyIHRoZSBxdWVzdGlvbiB2YWx1ZSB3aGVuIGl0IGJlY29tZXMgaW52aXNpYmxlLlxuICAgKiA8L2JyPiBMZWF2ZSBpdCBlcXVhbHMgdG8gJ29uQ29tcGxldGUnLCB0byByZW1vdmUgZnJvbSBkYXRhIHByb3BlcnR5IHZhbHVlcyBvZiBpbnZpc2libGUgcXVlc3Rpb25zIG9uIHN1cnZleSBjb21wbGV0ZS4gSW4gdGhpcyBjYXNlLCB0aGUgaW52aXNpYmxlIHF1ZXN0aW9ucyB3aWxsIG5vdCBiZSBzdG9yZWQgb24gdGhlIHNlcnZlci5cbiAgICogPC9icj4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgJ29uQ29tcGxldGUnLlxuICAgKiBAc2VlIFF1ZXN0aW9uLnZpc2libGVcbiAgICogQHNlZSBvbkNvbXBsZXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNsZWFySW52aXNpYmxlVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNsZWFySW52aXNpYmxlVmFsdWVzXCIsIFwib25Db21wbGV0ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNsZWFySW52aXNpYmxlVmFsdWVzKHZhbDogYW55KSB7XG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSkgdmFsID0gXCJvbkNvbXBsZXRlXCI7XG4gICAgaWYgKHZhbCA9PT0gZmFsc2UpIHZhbCA9IFwibm9uZVwiO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNsZWFySW52aXNpYmxlVmFsdWVzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZW1vdmUgYWxsIHF1ZXN0aW9uIHZhbHVlcyBmcm9tIHRoZSBzdXJ2ZXksIHRoYXQgZW5kLXVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlci5cbiAgICogRm9yIGV4YW1wbGUgdGhlIHZhbHVlIHRoYXQgZG9lc24ndCBleGlzdHMgaW4gYSByYWRpZ3JvdXAvZHJvcGRvd24vY2hlY2tib3ggY2hvaWNlcyBvciBtYXRyaXggcm93cy9jb2x1bW5zLlxuICAgKiBQbGVhc2Ugbm90ZSwgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNsZWFyIHZhbHVlcyBmb3IgaW52aXNpYmxlIHF1ZXN0aW9ucyBvciB2YWx1ZXMgdGhhdCBkb2Vzbid0IGFzc29jaWF0ZWQgd2l0aCBxdWVzdGlvbnMuXG4gICAqIEluIGZhY3QgdGhpcyBmdW5jdGlvbiBqdXN0IGNhbGwgY2xlYXJJbmNvcnJlY3RWYWx1ZXMgZnVuY3Rpb24gb2YgYWxsIHF1ZXN0aW9ucyBpbiB0aGUgc3VydmVyeVxuICAgKiBAc2VlIFF1ZXN0aW9uLmNsZWFySW5jb3JyZWN0VmFsdWVzXG4gICAqIEBzZWUgUGFnZS5jbGVhckluY29ycmVjdFZhbHVlc1xuICAgKiBAc2VlIFBhbmVsLmNsZWFySW5jb3JyZWN0VmFsdWVzXG4gICAqL1xuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzW2ldLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBjaGFuZ2UgdGhlIHN1cnZleSBsb2NhbGUuIEJ5IGRlZmF1bHQgaXQgaXMgZW1wdHksICdlbicuIFlvdSBtYXkgc2V0IGl0IHRvICdkZScgLSBnZXJtYW4sICdmcicgLSBmcmVuY2ggYW5kIHNvIG9uLiBUaGUgbGlicmFyeSBoYXMgYnVpbHQtaW4gbG9jYWxpemF0aW9uIGZvciBzZXZlcmFsIGxhbmd1YWdlcy4gVGhlIGxpYnJhcnkgaGFzIGEgbXVsdGktbGFuZ3VhZ2Ugc3VwcG9ydCBhcyB3ZWxsLlxuICAgKi9cbiAgcHVibGljIGdldCBsb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGVWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGxvY2FsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5xdWVzdGlvblRpdGxlVGVtcGxhdGVDYWNoZSA9IHVuZGVmaW5lZDtcbiAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uY3VycmVudExvY2FsZSA9IHZhbHVlO1xuICAgIHRoaXMubG9jYWxlVmFsdWUgPSBzdXJ2ZXlMb2NhbGl6YXRpb24uY3VycmVudExvY2FsZTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJsb2NhbGVcIiwgdGhpcy5sb2NhbGVWYWx1ZSk7XG4gICAgdGhpcy5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIHRoaXMub25Mb2NhbGVDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTG9jYWxlQ2hhbmdlZCgpIHt9XG4gIC8vSUxvY2FsaXphYmxlT3duZXJcbiAgZ2V0TG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLmxvY2FsZTtcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZS5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3VydmV5TWFya2Rvd25IdG1sKHRoaXMsIHRleHQpO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9jZXNzZWRUZXh0KHRleHQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NUZXh0KHRleHQsIHRydWUpO1xuICB9XG4gIGdldExvY1N0cmluZyhzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKHN0cik7XG4gIH1cbiAgLy9JU3VydmV5RXJyb3JPd25lclxuICBnZXRFcnJvckN1c3RvbVRleHQodGV4dDogc3RyaW5nLCBlcnJvcjogU3VydmV5RXJyb3IpOiBzdHJpbmcge1xuICAgIHZhciBvcHRpb25zID0geyB0ZXh0OiB0ZXh0LCBuYW1lOiBlcnJvci5nZXRFcnJvclR5cGUoKSwgZXJyb3I6IGVycm9yIH07XG4gICAgdGhpcy5vbkVycm9yQ3VzdG9tVGV4dC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLnRleHQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRleHQgdGhhdCByZW5kZXJzIHdoZW4gdGhlcmUgaXMgbm8gYW55IHZpc2libGUgcGFnZSBhbmQgcXVlc3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVtcHR5U3VydmV5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcImVtcHR5U3VydmV5XCIpO1xuICB9XG4gIC8qKlxuICAgKiBTdXJ2ZXkgdGl0bGUuXG4gICAqIEBzZWUgZGVzY3JpcHRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgdGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0aXRsZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRpdGxlXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jVGl0bGUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIik7XG4gIH1cbiAgLyoqXG4gICAqIFN1cnZleSBkZXNjcmlwdGlvbi4gSXQgc2hvd3MgdW5kZXIgc3VydmV5IHRpdGxlXG4gICAqIEBzZWUgdGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJkZXNjcmlwdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlc2NyaXB0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImRlc2NyaXB0aW9uXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiZGVzY3JpcHRpb25cIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBodG1sIHRoYXQgc2hvd3Mgb24gY29tcGxldGVkICgnVGhhbmsgeW91JykgcGFnZS4gU2V0IGl0IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgKiBAc2VlIHNob3dDb21wbGV0ZWRQYWdlXG4gICAqIEBzZWUgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbXBsZXRlZEh0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRIdG1sXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tcGxldGVkSHRtbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRIdG1sXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jQ29tcGxldGVkSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZWRIdG1sXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBodG1sIGNvbmRpdGlvbiBpdGVtcy4gSWYgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBpdGVtIHJldHVybnMgdHJ1ZSwgdGhlbiBzdXJ2ZXkgd2lsbCB1c2UgdGhpcyBpdGVtIGh0bWwgaW5zdGVhZCBvZiBjb21wbGV0ZWRIdG1sXG4gICAqIEBzZWUgSHRtbENvbmRpdGlvbkl0ZW1cbiAgICogQHNlZSBjb21wbGV0ZUh0bWxcbiAgICovXG4gIHB1YmxpYyBnZXQgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uKCk6IEFycmF5PEh0bWxDb25kaXRpb25JdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBjb21wbGV0ZWRIdG1sT25Db25kaXRpb24odmFsOiBBcnJheTxIdG1sQ29uZGl0aW9uSXRlbT4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb25cIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24gYW5kIHJldHVybnMgdGhlIHJlc3VsdCB2YWx1ZVxuICAgKiBAcGFyYW0gZXhwcmVzc2lvblxuICAgKi9cbiAgcHVibGljIHJ1bkV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIWV4cHJlc3Npb24pIHJldHVybiBudWxsO1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmdldEZpbHRlcmVkVmFsdWVzKCk7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEZpbHRlcmVkUHJvcGVydGllcygpO1xuICAgIHJldHVybiBuZXcgRXhwcmVzc2lvblJ1bm5lcihleHByZXNzaW9uKS5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24gYW5kIHRydWUgb3IgZmFsc2VcbiAgICogQHBhcmFtIGV4cHJlc3Npb25cbiAgICovXG4gIHB1YmxpYyBydW5Db25kaXRpb24oZXhwcmVzc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFleHByZXNzaW9uKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb25SdW5uZXIoZXhwcmVzc2lvbikucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHVibGljIGdldCByZW5kZXJlZENvbXBsZXRlZEh0bWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jb21wbGV0ZWRIdG1sT25Db25kaXRpb24ubGVuZ3RoID09IDApIHJldHVybiB0aGlzLmNvbXBsZXRlZEh0bWw7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbltpXTtcbiAgICAgIGlmIChpdGVtLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpKSB7XG4gICAgICAgIHJldHVybiBpdGVtLmh0bWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXBsZXRlZEh0bWw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGh0bWwgdGhhdCBzaG93cyBpZiB0aGUgZW5kIHVzZXIgaGFzIGFscmVhZHkgY29tcGxldGVkIHRoZSBzdXJ2ZXkuXG4gICAqIEBzZWUgY2xpZW50SWRcbiAgICogQHNlZSBsb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY29tcGxldGVkQmVmb3JlSHRtbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbXBsZXRlZEJlZm9yZUh0bWxcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb21wbGV0ZWRCZWZvcmVIdG1sKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbXBsZXRlZEJlZm9yZUh0bWxcIiwgdmFsdWUpO1xuICB9XG4gIGdldCBsb2NDb21wbGV0ZWRCZWZvcmVIdG1sKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImNvbXBsZXRlZEJlZm9yZUh0bWxcIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBodG1sIHRoYXQgc2hvd3Mgb24gbG9hZGluZyBzdXJ2ZXkgSnNvbiBmcm9tIHRoZSBkeHN1cnZleS5jb20gc2VydmljZS5cbiAgICogQHNlZSBzdXJ2ZXlJZFxuICAgKiBAc2VlIGxvY2FsZVxuICAgKi9cbiAgcHVibGljIGdldCBsb2FkaW5nSHRtbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxvYWRpbmdIdG1sXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbG9hZGluZ0h0bWwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibG9hZGluZ0h0bWxcIiwgdmFsdWUpO1xuICB9XG4gIGdldCBsb2NMb2FkaW5nSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJsb2FkaW5nSHRtbFwiKTtcbiAgfVxuICAvKipcbiAgICogQSB0ZXh0IHRoYXQgcmVuZGVycyBvbiB0aGUgJ1N0YXJ0JyBidXR0b24uIFNldCBpdCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICogVGhlIHN0YXJ0IGJ1dHRvbiBpcyBzaG93biBvbiB0aGUgc3RhcnRlZCBwYWdlLiBZb3UgaGF2ZSB0byBzZXQgZmlyc3RQYWdlSXNTdGFydGVkIHByb3BlcnR5IHRvIHRydWUsIHRvIGhhdmUgdGhlIHN0YXJ0ZWQgcGFnZS5cbiAgICogQHNlZSBmaXJzdFBhZ2VJc1N0YXJ0ZWRcbiAgICogQHNlZSBsb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhcnRTdXJ2ZXlUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJzdGFydFN1cnZleVwiLFxuICAgICAgdGhpcy5nZXRMb2NTdHJpbmcoXCJzdGFydFN1cnZleVRleHRcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RhcnRTdXJ2ZXlUZXh0KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInN0YXJ0U3VydmV5XCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBnZXQgbG9jU3RhcnRTdXJ2ZXlUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInN0YXJ0U3VydmV5XCIpO1xuICB9XG4gIC8qKlxuICAgKiBBIHRleHQgdGhhdCByZW5kZXJzIG9uIHRoZSAnUHJldicgYnV0dG9uLiBTZXQgaXQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQuXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhZ2VQcmV2VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwicGFnZVByZXZcIixcbiAgICAgIHRoaXMuZ2V0TG9jU3RyaW5nKFwicGFnZVByZXZUZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhZ2VQcmV2VGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwYWdlUHJldlwiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY1BhZ2VQcmV2VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwYWdlUHJldlwiKTtcbiAgfVxuICAvKipcbiAgICogQSB0ZXh0IHRoYXQgcmVuZGVycyBvbiB0aGUgJ05leHQnIGJ1dHRvbi4gU2V0IGl0IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgKiBAc2VlIGxvY2FsZVxuICAgKi9cbiAgcHVibGljIGdldCBwYWdlTmV4dFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcInBhZ2VOZXh0XCIsXG4gICAgICB0aGlzLmdldExvY1N0cmluZyhcInBhZ2VOZXh0VGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBwYWdlTmV4dFRleHQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFnZU5leHRcIiwgbmV3VmFsdWUpO1xuICB9XG4gIGdldCBsb2NQYWdlTmV4dFRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGFnZU5leHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIEEgdGV4dCB0aGF0IHJlbmRlcnMgb24gdGhlICdDb21wbGV0ZScgYnV0dG9uLiBTZXQgaXQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQuXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbXBsZXRlVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwiY29tcGxldGVcIixcbiAgICAgIHRoaXMuZ2V0TG9jU3RyaW5nKFwiY29tcGxldGVUZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbXBsZXRlVGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZVwiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY0NvbXBsZXRlVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZVwiKTtcbiAgfVxuICAvKipcbiAgICogQSB0ZW1wbGF0ZSBmb3IgYSBxdWVzdGlvbiB0aXRsZS5cbiAgICogQHNlZSBRdWVzdGlvbk1vZGVsLnRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCEhdmFsdWUgJiYgdmFsdWUuaW5kZXhPZihcIntub31cIikgIT09IC0xKSB7XG4gICAgICB2YXIgbm9JbmRleCA9IHZhbHVlLmluZGV4T2YoXCJ7bm99XCIpO1xuICAgICAgdmFyIHByZXZCckluZGV4ID0gbm9JbmRleDtcbiAgICAgIHZhciBuZXh0QnJJbmRleCA9IG5vSW5kZXggKyA0O1xuICAgICAgd2hpbGUgKHByZXZCckluZGV4ID49IDAgJiYgdmFsdWVbcHJldkJySW5kZXhdICE9PSBcIn1cIikgcHJldkJySW5kZXgtLTtcbiAgICAgIHdoaWxlIChuZXh0QnJJbmRleCA8IHZhbHVlLmxlbmd0aCAmJiB2YWx1ZVtuZXh0QnJJbmRleF0gIT09IFwie1wiKVxuICAgICAgICBuZXh0QnJJbmRleCsrO1xuICAgICAgdmFsdWUgPVxuICAgICAgICB2YWx1ZS5zdWJzdHJpbmcoMCwgcHJldkJySW5kZXggKyAxKSArIHZhbHVlLnN1YnN0cmluZyhuZXh0QnJJbmRleCk7XG4gICAgfVxuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicXVlc3Rpb25UaXRsZVRlbXBsYXRlXCIsIHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZUNhY2hlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBxdWVzdGlvbiB0aXRsZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVxuICAgKiBAc2VlIFF1ZXN0aW9uTW9kZWwudGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXRRdWVzdGlvblRpdGxlVGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5xdWVzdGlvblRpdGxlVGVtcGxhdGVDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uVGl0bGVUZW1wbGF0ZUNhY2hlID0gdGhpcy5sb2NRdWVzdGlvblRpdGxlVGVtcGxhdGUudGV4dE9ySHRtbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25UaXRsZVRlbXBsYXRlQ2FjaGU7XG4gIH1cbiAgZ2V0IGxvY1F1ZXN0aW9uVGl0bGVUZW1wbGF0ZSgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJxdWVzdGlvblRpdGxlVGVtcGxhdGVcIik7XG4gIH1cbiAgZ2V0VXBkYXRlZFF1ZXN0aW9uVGl0bGUocXVlc3Rpb246IElRdWVzdGlvbiwgdGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMub25HZXRRdWVzdGlvblRpdGxlLmlzRW1wdHkpIHJldHVybiB0aXRsZTtcbiAgICB2YXIgb3B0aW9ucyA9IHsgcXVlc3Rpb246IHF1ZXN0aW9uLCB0aXRsZTogdGl0bGUgfTtcbiAgICB0aGlzLm9uR2V0UXVlc3Rpb25UaXRsZS5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLnRpdGxlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byB0dXJuIG9mZiB0aGUgbnVtYmVyaW5nIG9uIHBhZ2VzIHRpdGxlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1BhZ2VOdW1iZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UGFnZU51bWJlcnNcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1BhZ2VOdW1iZXJzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLnNob3dQYWdlTnVtYmVycykgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dQYWdlTnVtYmVyc1wiLCB2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBcIm9mZlwiIHRvIHR1cm4gb2ZmIHRoZSBudW1iZXJpbmcgb24gcXVlc3Rpb25zIHRpdGxlcyBvciBcIm9ucGFnZVwiIHRvIHN0YXJ0IG51bWJlcmluZyBvbiBldmVyeSBwYWdlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBcIm9uXCIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dRdWVzdGlvbk51bWJlcnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLCBcIm9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1F1ZXN0aW9uTnVtYmVycyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbHVlID0gdmFsdWUgPT09IFwib25wYWdlXCIgPyBcIm9uUGFnZVwiIDogdmFsdWU7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsIHZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIFwidG9wXCIgdG8gc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyIG9uIHRoZSBib3R0b20gb3IgdG8gXCJib3R0b21cIiB0byBzaG93IGl0IG9uIHRoZSBib3R0b20uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dQcm9ncmVzc0JhcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UHJvZ3Jlc3NCYXJcIiwgXCJvZmZcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UHJvZ3Jlc3NCYXIobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dQcm9ncmVzc0JhclwiLCBuZXdWYWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuICAvKipcbiAgICogVHlwZSBvZiBpbmZvIGluIHRoZSBwcm9ncmVzcyBiYXI6IFwicGFnZXNcIiAoZGVmYXVsdCksIFwicXVlc3Rpb25zXCIgb3IgXCJjb3JyZWN0UXVlc3Rpb25zXCIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByb2dyZXNzQmFyVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwcm9ncmVzc0JhclR5cGVcIiwgXCJwYWdlc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHByb2dyZXNzQmFyVHlwZShuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicHJvZ3Jlc3NCYXJUeXBlXCIsIG5ld1ZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNTaG93UHJvZ3Jlc3NCYXJPblRvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93UHJvZ3Jlc3NCYXIgPT09IFwidG9wXCIgfHwgdGhpcy5zaG93UHJvZ3Jlc3NCYXIgPT09IFwiYm90aFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNTaG93UHJvZ3Jlc3NCYXJPbkJvdHRvbSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93UHJvZ3Jlc3NCYXIgPT09IFwiYm90dG9tXCIgfHwgdGhpcy5zaG93UHJvZ3Jlc3NCYXIgPT09IFwiYm90aFwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZXh0L2h0bWwgdGhhdCByZW5kZXJzIGFzIHN1cnZleSB0aXRsZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkVGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGl0bGUucmVuZGVyZWRIdG1sO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byAnYm90dG9tJyBvciAnbGVmdCcgdG8gc2hvdyBxdWVzdGlvbiB0aXRsZSB1bmRlciB0aGUgcXVlc3Rpb24gb3Igb24gdGhlIGxlZnQuXG4gICAqIDxici8+PGI+Tm90ZTo8L2I+IFNvbWUgcXVlc3Rpb25zLCBmb3IgZXhhbXBsZSBtYXRyaXhlcywgZG8gbm90IHN1cHBvcnQgJ2xlZnQnIHZhbHVlLiBUaGUgdGl0bGUgZm9yIHRoZW0gd2lsbCBiZSBkaXNwbGF5ZWQgb24gdGhlIHRvcC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLCBcInRvcFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uVGl0bGVMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byAnYm90dG9tJyB0byBzaG93IHF1ZXN0aW9uIGVycm9yKHMpIHVuZGVyIHRoZSBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25FcnJvckxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uRXJyb3JMb2NhdGlvblwiLCBcInRvcFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uRXJyb3JMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25FcnJvckxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBtb2RlIHRvICdkaXNwbGF5JyB0byBtYWtlIHRoZSBzdXJ2ZXkgcmVhZC1vbmx5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAnZWRpdCcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibW9kZVwiLCBcImVkaXRcIik7XG4gIH1cbiAgcHVibGljIHNldCBtb2RlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHZhbHVlID09IHRoaXMubW9kZSkgcmV0dXJuO1xuICAgIGlmICh2YWx1ZSAhPSBcImVkaXRcIiAmJiB2YWx1ZSAhPSBcImRpc3BsYXlcIikgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1vZGVcIiwgdmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBBbiBvYmplY3QgdGhhdCBzdG9yZXMgdGhlIHN1cnZleSByZXN1bHRzL2RhdGEuIFlvdSBtYXkgc2V0IGl0IGRpcmVjdGx5IGFzIHsgJ3F1ZXN0aW9uIG5hbWUnOiBxdWVzdGlvblZhbHVlLCAuLi4gfVxuICAgKiBAc2VlIHNldFZhbHVlXG4gICAqIEBzZWUgZ2V0VmFsdWVcbiAgICovXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBhbnkge1xuICAgIHZhciByZXN1bHQ6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnZhbHVlc0hhc2gpIHtcbiAgICAgIHZhciBkYXRhVmFsdWUgPSB0aGlzLmdldERhdGFWYWx1ZUNvcmUodGhpcy52YWx1ZXNIYXNoLCBrZXkpO1xuICAgICAgaWYgKGRhdGFWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gZGF0YVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGdldEFsbFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmRhdGE7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgc3VydmV5IHJlc3VsdCBkYXRhIGFzIGFuIGFycmF5IG9mIHBsYWluIG9iamVjdHM6IHdpdGggcXVlc3Rpb24gdGl0bGUsIG5hbWUsIHZhbHVlIGFuZCBkaXNwbGF5VmFsdWUuXG4gICAqIEZvciBjb21wbGV4IHF1ZXN0aW9ucyAobGlrZSBtYXRyaXgsIGV0Yy4pIGlzTm9kZSBmbGFnIGlzIHNldCB0byB0cnVlIGFuZCBkYXRhIGNvbnRhaW5zIGFycmF5IG9mIG5lc3RlZCBvYmplY3RzIChyb3dzKVxuICAgKiBzZXQgb3B0aW9ucy5pbmNsdWRlRW1wdHkgdG8gZmFsc2UgaWYgeW91IHdhbnQgdG8gc2tpcCBlbXB0eSBhbnN3ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0UGxhaW5EYXRhKFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGluY2x1ZGVFbXB0eT86IGJvb2xlYW47XG4gICAgICBjYWxjdWxhdGlvbnM/OiBBcnJheTx7XG4gICAgICAgIHByb3BlcnR5TmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgfSA9IHtcbiAgICAgIGluY2x1ZGVFbXB0eTogdHJ1ZVxuICAgIH1cbiAgKSB7XG4gICAgdmFyIHJlc3VsdDogQXJyYXk8YW55PiA9IFtdO1xuICAgIHRoaXMuZ2V0QWxsUXVlc3Rpb25zKCkuZm9yRWFjaChxdWVzdGlvbiA9PiB7XG4gICAgICB2YXIgcmVzdWx0SXRlbSA9ICg8UXVlc3Rpb24+cXVlc3Rpb24pLmdldFBsYWluRGF0YShvcHRpb25zKTtcbiAgICAgIGlmICghIXJlc3VsdEl0ZW0pIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocmVzdWx0SXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIGNvbmRpdGlvblZlcnNpb24gPSAwO1xuICBnZXRGaWx0ZXJlZFZhbHVlcygpOiBhbnkge1xuICAgIHZhciB2YWx1ZXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnZhcmlhYmxlc0hhc2gpIHZhbHVlc1trZXldID0gdGhpcy52YXJpYWJsZXNIYXNoW2tleV07XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsdWVzSGFzaClcbiAgICAgIHZhbHVlc1trZXldID0gdGhpcy5nZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwga2V5KTtcbiAgICB2YWx1ZXNbXCJjb25kaXRpb25WZXJzaW9uXCJdID0gKyt0aGlzLmNvbmRpdGlvblZlcnNpb247XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuICBnZXRGaWx0ZXJlZFByb3BlcnRpZXMoKTogYW55IHtcbiAgICByZXR1cm4geyBzdXJ2ZXk6IHRoaXMgfTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgZGF0YShkYXRhOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlc0hhc2ggPSB7fTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHtcbiAgICAgICAgdGhpcy5zZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwga2V5LCBkYXRhW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUFsbFF1ZXN0aW9uc1ZhbHVlKCk7XG4gICAgdGhpcy5jaGVja1RyaWdnZXJzKHRoaXMudmFsdWVzSGFzaCwgZmFsc2UpO1xuICAgIHRoaXMubm90aWZ5QWxsUXVlc3Rpb25zT25WYWx1ZUNoYW5nZWQoKTtcbiAgICB0aGlzLm5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkKFwiXCIpO1xuICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICB9XG4gIHB1YmxpYyBnZXREYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2g6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdmFsdWVzSGFzaFtrZXldO1xuICB9XG4gIHB1YmxpYyBzZXREYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2g6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB2YWx1ZXNIYXNoW2tleV0gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgZGVsZXRlRGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoOiBhbnksIGtleTogc3RyaW5nKSB7XG4gICAgZGVsZXRlIHZhbHVlc0hhc2hba2V5XTtcbiAgfVxuICAvLyBwcm90ZWN0ZWQgaXRlcmF0ZURhdGFWYWx1ZXNIYXNoKGZ1bmM6IChoYXNoOiBhbnksIGtleTogYW55KSA9PiB2b2lkKSB7XG4gIC8vICAgdmFyIGtleXM6IGFueVtdID0gW107XG4gIC8vICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsdWVzSGFzaCkge1xuICAvLyAgICAga2V5cy5wdXNoKGtleSk7XG4gIC8vICAgfVxuICAvLyAgIGtleXMuZm9yRWFjaChrZXkgPT4gZnVuYyh0aGlzLnZhbHVlc0hhc2gsIGtleSkpO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGNvbW1lbnRzIGZyb20gdGhlIGRhdGEuXG4gICAqIEBzZWUgZGF0YVxuICAgKi9cbiAgcHVibGljIGdldCBjb21tZW50cygpOiBhbnkge1xuICAgIHZhciByZXN1bHQ6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnZhbHVlc0hhc2gpIHtcbiAgICAgIGlmIChrZXkuaW5kZXhPZih0aGlzLmNvbW1lbnRQcmVmaXgpID4gMCkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHRoaXMuZ2V0RGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdmlzaWJsZSBwYWdlcy4gSWYgYWxsIHBhZ2VzIGFyZSB2aXNpYmxlIHRoZW4gaXQgaXMgdGhlIHNhbWUgYXMgcGFnZXMgcHJvcGVydHkuXG4gICAqIEBzZWUgcGFnZXNcbiAgICogQHNlZSBQYWdlTW9kZWwudmlzaWJsZVxuICAgKiBAc2VlIFBhZ2VNb2RlbC52aXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZVBhZ2VzKCk6IEFycmF5PFBhZ2VNb2RlbD4ge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIHRoaXMucGFnZXM7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxQYWdlTW9kZWw+KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5wYWdlc1tpXS5pc1Zpc2libGUpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5wYWdlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBubyBhbnkgcGFnZSBpbiB0aGUgc3VydmV5LiBUaGUgc3VydmV5IGlzIGVtcHR5LlxuICAgKi9cbiAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBhZ2VzLmxlbmd0aCA9PSAwO1xuICB9XG4gIC8qKlxuICAgKiBkZXByaWNhdGVkLCBtaXNzcGVsbGluZywgdXNlIHBhZ2VDb3VudCBwcm9wZXJ0eVxuICAgKi9cbiAgZ2V0IFBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhZ2VDb3VudDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3VydmV5IHBhZ2VzIGNvdW50LlxuICAgKiBAc2VlIHZpc2libGVQYWdlQ291bnRcbiAgICogQHNlZSBwYWdlc1xuICAgKi9cbiAgcHVibGljIGdldCBwYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlcy5sZW5ndGg7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN1cnZleSB2aXNpYmxlIHBhZ2VzIGNvdW50XG4gICAqIEBzZWUgcGFnZUNvdW50XG4gICAqIEBzZWUgdmlzaWJsZVBhZ2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVQYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlUGFnZXMubGVuZ3RoO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdGFydGVkIFBhZ2UuIGZpcnN0UGFnZUlzU3RhcnRlZCBwcm9wZXJ0eSBzaG91bGQgYmUgZXF1YWxzIHRvIHRydWVcbiAgICogQHNlZSBmaXJzdFBhZ2VJc1N0YXJ0ZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhcnRlZFBhZ2UoKTogUGFnZU1vZGVsIHtcbiAgICB2YXIgcGFnZSA9XG4gICAgICB0aGlzLmZpcnN0UGFnZUlzU3RhcnRlZCAmJiB0aGlzLnBhZ2VzLmxlbmd0aCA+IDAgPyB0aGlzLnBhZ2VzWzBdIDogbnVsbDtcbiAgICBpZiAoISFwYWdlKSB7XG4gICAgICBwYWdlLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhZ2U7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3VydmV5IHBhZ2UuIElmIHN1cnZleSBpcyByZW5kcmVkIHRoZW4gaXQgaXMgYSBwYWdlIHRoYXQgYSB1c2VyIGNhbiBzZWUvZWRpdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFBhZ2UoKTogYW55IHtcbiAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2VWYWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAodlBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZVZhbHVlKSA8IDApIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlVmFsdWUgPT0gbnVsbCAmJiB2UGFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHZQYWdlc1swXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2VWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGN1cnJlbnRQYWdlKHZhbHVlOiBhbnkpIHtcbiAgICB2YXIgbmV3UGFnZSA9IHRoaXMuZ2V0UGFnZUJ5T2JqZWN0KHZhbHVlKTtcbiAgICBpZiAoISF2YWx1ZSAmJiAhbmV3UGFnZSkgcmV0dXJuO1xuICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICBpZiAobmV3UGFnZSAhPSBudWxsICYmIHZQYWdlcy5pbmRleE9mKG5ld1BhZ2UpIDwgMCkgcmV0dXJuO1xuICAgIGlmIChuZXdQYWdlID09IHRoaXMuY3VycmVudFBhZ2VWYWx1ZSkgcmV0dXJuO1xuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuY3VycmVudFBhZ2VWYWx1ZTtcbiAgICBpZiAoIXRoaXMuY3VycmVudFBhZ2VDaGFuZ2luZyhuZXdQYWdlLCBvbGRWYWx1ZSkpIHJldHVybjtcbiAgICBpZiAoISFuZXdQYWdlKSB7XG4gICAgICBuZXdQYWdlLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50UGFnZVZhbHVlID0gbmV3UGFnZTtcbiAgICBpZiAoISFuZXdQYWdlKSB7XG4gICAgICBuZXdQYWdlLnVwZGF0ZUN1c3RvbVdpZGdldHMoKTtcbiAgICAgIG5ld1BhZ2Uuc2V0V2FzU2hvd24odHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlQ2hhbmdlZChuZXdQYWdlLCBvbGRWYWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRQYWdlQnlPYmplY3QodmFsdWU6IGFueSk6IFBhZ2VNb2RlbCB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHZhbHVlLmdldFR5cGUgJiYgdmFsdWUuZ2V0VHlwZSgpID09IFwicGFnZVwiKSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZylcbiAgICAgIHJldHVybiB0aGlzLmdldFBhZ2VCeU5hbWUoU3RyaW5nKHZhbHVlKSk7XG4gICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgIHZhciBpbmRleCA9IE51bWJlcih2YWx1ZSk7XG4gICAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID49IHZQYWdlcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHZQYWdlc1tpbmRleF07XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHBhZ2UgaW4gdGhlIHZpc2libGUgcGFnZXMgYXJyYXkuIEl0IHN0YXJ0cyBmcm9tIDAuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRQYWdlTm8oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlUGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGN1cnJlbnRQYWdlTm8odmFsdWU6IG51bWJlcikge1xuICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID49IHZQYWdlcy5sZW5ndGgpIHJldHVybjtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gdlBhZ2VzW3ZhbHVlXTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gcmFuZG9taXplIHF1ZXN0aW9ucy4gU2V0IGl0IHRvICdyYW5kb20nIHRvIHJhbmRvbWl6ZSBxdWVzdGlvbnMsICdpbml0aWFsJyB0byBrZWVwIHRoZW0gaW4gdGhlIHNhbWUgb3JkZXIuIFlvdSBjYW4gcmFuZG9taXplIHF1ZXN0aW9ucyBvbiBhIHNwZWNpZmljIHBhZ2UuXG4gICAqIEBzZWUgU3VydmV5UGFnZS5xdWVzdGlvbnNPcmRlclxuICAgKi9cbiAgcHVibGljIGdldCBxdWVzdGlvbnNPcmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25zT3JkZXJcIiwgXCJpbml0aWFsXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcXVlc3Rpb25zT3JkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbnNPcmRlclwiLCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgaW5wdXQgZm9jdXMgdG8gdGhlIGZpcnN0IHF1ZXN0aW9uIHdpdGggdGhlIGlucHV0LlxuICAgKi9cbiAgcHVibGljIGZvY3VzRmlyc3RRdWVzdGlvbigpIHtcbiAgICB2YXIgcGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgaWYgKHBhZ2UpIHtcbiAgICAgIHBhZ2Uuc2Nyb2xsVG9Ub3AoKTtcbiAgICAgIHBhZ2UuZm9jdXNGaXJzdFF1ZXN0aW9uKCk7XG4gICAgfVxuICB9XG4gIHNjcm9sbFRvVG9wT25QYWdlQ2hhbmdlKCkge1xuICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICBpZiAoIXBhZ2UpIHJldHVybjtcbiAgICBwYWdlLnNjcm9sbFRvVG9wKCk7XG4gICAgaWYgKHRoaXMuZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljKSB7XG4gICAgICBwYWdlLmZvY3VzRmlyc3RRdWVzdGlvbigpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdXJ2ZXkgc3RhdGU6ICdsb2FkaW5nJyAtIGxvYWRpbmcgZnJvbSB0aGUganNvbiwgJ2NvbXBsZXRlZCcgLSBhIHVzZXIgaGFzIGNvbXBsZXRlZCB0aGUgc3VydmV5LFxuICAgKiAnc3RhcnRpbmcnIC0gdGhlIHN0YXJ0ZWQgcGFnZSBpcyBzaG93aW5nLCBydW5uaW5nJyAtIGEgdXNlciBhbnN3ZXJzIGEgcXVlc3Rpb25zIHJpZ2h0IG5vdywgJ2VtcHR5JyAtIHRoZXJlIGlzIG5vdGhpbmcgdG8gc2hvdyBpbiB0aGUgY3VycmVudCBzdXJ2ZXkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXRlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nKSByZXR1cm4gXCJsb2FkaW5nXCI7XG4gICAgaWYgKHRoaXMuaXNDb21wbGV0ZWQpIHJldHVybiBcImNvbXBsZXRlZFwiO1xuICAgIGlmICh0aGlzLmlzQ29tcGxldGVkQmVmb3JlKSByZXR1cm4gXCJjb21wbGV0ZWRiZWZvcmVcIjtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5pc0Rlc2lnbk1vZGUgJiZcbiAgICAgIHRoaXMuaXNFZGl0TW9kZSAmJlxuICAgICAgdGhpcy5pc1N0YXJ0ZWRTdGF0ZSAmJlxuICAgICAgdGhpcy5zdGFydGVkUGFnZVxuICAgIClcbiAgICAgIHJldHVybiBcInN0YXJ0aW5nXCI7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2UgPyBcInJ1bm5pbmdcIiA6IFwiZW1wdHlcIjtcbiAgfVxuICBwcml2YXRlIGdldCBpc0NvbXBsZXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNDb21wbGV0ZWRcIiwgZmFsc2UpO1xuICB9XG4gIHByaXZhdGUgc2V0IGlzQ29tcGxldGVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzQ29tcGxldGVkXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNTdGFydGVkU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzU3RhcnRlZFN0YXRlXCIsIGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIHNldCBpc1N0YXJ0ZWRTdGF0ZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1N0YXJ0ZWRTdGF0ZVwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzQ29tcGxldGVkQmVmb3JlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc0NvbXBsZXRlZEJlZm9yZVwiLCBmYWxzZSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgaXNDb21wbGV0ZWRCZWZvcmUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNDb21wbGV0ZWRCZWZvcmVcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIGdldCBpc0xvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzTG9hZGluZ1wiLCBmYWxzZSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgaXNMb2FkaW5nKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzTG9hZGluZ1wiLCB2YWwpO1xuICB9XG5cbiAgcHVibGljIGdldCBjb21wbGV0ZWRTdGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbXBsZXRlZFN0YXRlVmFsdWU7XG4gIH1cbiAgZ2V0IGNvbXBsZXRlZFN0YXRlVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbXBsZXRlZFN0YXRlVGV4dFZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBzZXRDb21wbGV0ZWRTdGF0ZSh2YWx1ZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbXBsZXRlZFN0YXRlVmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAoIXRleHQpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBcInNhdmluZ1wiKSB0ZXh0ID0gdGhpcy5nZXRMb2NTdHJpbmcoXCJzYXZpbmdEYXRhXCIpO1xuICAgICAgaWYgKHZhbHVlID09IFwiZXJyb3JcIikgdGV4dCA9IHRoaXMuZ2V0TG9jU3RyaW5nKFwic2F2aW5nRGF0YUVycm9yXCIpO1xuICAgICAgaWYgKHZhbHVlID09IFwic3VjY2Vzc1wiKSB0ZXh0ID0gdGhpcy5nZXRMb2NTdHJpbmcoXCJzYXZpbmdEYXRhU3VjY2Vzc1wiKTtcbiAgICB9XG4gICAgdGhpcy5jb21wbGV0ZWRTdGF0ZVRleHRWYWx1ZSA9IHRleHQ7XG4gIH1cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBzdXJ2ZXkgZGF0YSBhbmQgc3RhdGUuIElmIHRoZSBzdXJ2ZXkgaGFzIGEgJ2NvbXBsZXRlZCcgc3RhdGUsIGl0IHdpbGwgaGF2ZSBhICdydW5uaW5nJyBzdGF0ZS5cbiAgICogQHBhcmFtIGNsZWFyRGF0YSBjbGVhciB0aGUgZGF0YVxuICAgKiBAcGFyYW0gZ290b0ZpcnN0UGFnZSBtYWtlIHRoZSBmaXJzdCBwYWdlIGFzIGEgY3VycmVudCBwYWdlLlxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBzdGF0ZVxuICAgKiBAc2VlIGN1cnJlbnRQYWdlXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoY2xlYXJEYXRhOiBib29sZWFuID0gdHJ1ZSwgZ290b0ZpcnN0UGFnZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAoY2xlYXJEYXRhKSB7XG4gICAgICB0aGlzLmRhdGEgPSBudWxsO1xuICAgICAgdGhpcy52YXJpYWJsZXNIYXNoID0ge307XG4gICAgfVxuICAgIHRoaXMudGltZVNwZW50ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0udGltZVNwZW50ID0gMDtcbiAgICAgIHRoaXMucGFnZXNbaV0uc2V0V2FzU2hvd24oZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLmlzQ29tcGxldGVkID0gZmFsc2U7XG4gICAgdGhpcy5pc0NvbXBsZXRlZEJlZm9yZSA9IGZhbHNlO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5pc1N0YXJ0ZWRTdGF0ZSA9IHRoaXMuZmlyc3RQYWdlSXNTdGFydGVkO1xuICAgIGlmIChnb3RvRmlyc3RQYWdlICYmIHRoaXMudmlzaWJsZVBhZ2VDb3VudCA+IDApIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnZpc2libGVQYWdlc1swXTtcbiAgICB9XG4gICAgaWYgKGNsZWFyRGF0YSkge1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZXNXaXRoRGVmYXVsdHMoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIG1lcmdlVmFsdWVzKHNyYzogYW55LCBkZXN0OiBhbnkpIHtcbiAgICBpZiAoIWRlc3QgfHwgIXNyYykgcmV0dXJuO1xuICAgIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHNyY1trZXldO1xuICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoIWRlc3Rba2V5XSkgZGVzdFtrZXldID0ge307XG4gICAgICAgIHRoaXMubWVyZ2VWYWx1ZXModmFsdWUsIGRlc3Rba2V5XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXN0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVWYWx1ZXNXaXRoRGVmYXVsdHMoKSB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlIHx8IHRoaXMuaXNMb2FkaW5nKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5wYWdlc1tpXS5xdWVzdGlvbnM7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICBxdWVzdGlvbnNbal0udXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1c3RvbVdpZGdldHMocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgaWYgKCFwYWdlKSByZXR1cm47XG4gICAgcGFnZS51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGN1cnJlbnRQYWdlQ2hhbmdpbmcobmV3VmFsdWU6IFBhZ2VNb2RlbCwgb2xkVmFsdWU6IFBhZ2VNb2RlbCkge1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgb2xkQ3VycmVudFBhZ2U6IG9sZFZhbHVlLFxuICAgICAgbmV3Q3VycmVudFBhZ2U6IG5ld1ZhbHVlLFxuICAgICAgYWxsb3dDaGFuZ2luZzogdHJ1ZVxuICAgIH07XG4gICAgdGhpcy5vbkN1cnJlbnRQYWdlQ2hhbmdpbmcuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5hbGxvd0NoYW5naW5nO1xuICB9XG4gIHByb3RlY3RlZCBjdXJyZW50UGFnZUNoYW5nZWQobmV3VmFsdWU6IFBhZ2VNb2RlbCwgb2xkVmFsdWU6IFBhZ2VNb2RlbCkge1xuICAgIHRoaXMub25DdXJyZW50UGFnZUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICBvbGRDdXJyZW50UGFnZTogb2xkVmFsdWUsXG4gICAgICBuZXdDdXJyZW50UGFnZTogbmV3VmFsdWVcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcHJvZ3Jlc3MgdGhhdCBhIHVzZXIgbWFkZSBieSBhbnN3ZXJpbmcgb24gdGhlIHN1cnZleS5cbiAgICovXG4gIHB1YmxpYyBnZXRQcm9ncmVzcygpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID09IG51bGwpIHJldHVybiAwO1xuICAgIGlmICh0aGlzLnByb2dyZXNzQmFyVHlwZSA9PT0gXCJxdWVzdGlvbnNcIikge1xuICAgICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0QWxsUXVlc3Rpb25zKCk7XG4gICAgICB2YXIgYW5zd2VyZWRRdWVzdGlvbnNDb3VudCA9IHF1ZXN0aW9ucy5yZWR1Y2UoXG4gICAgICAgIChhOiBudW1iZXIsIGI6IFF1ZXN0aW9uKSA9PiBhICsgKGIuaXNFbXB0eSgpID8gMCA6IDEpLFxuICAgICAgICAwXG4gICAgICApO1xuICAgICAgcmV0dXJuIE1hdGguY2VpbChhbnN3ZXJlZFF1ZXN0aW9uc0NvdW50ICogMTAwIC8gcXVlc3Rpb25zLmxlbmd0aCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2dyZXNzQmFyVHlwZSA9PT0gXCJjb3JyZWN0UXVlc3Rpb25zXCIpIHtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xuICAgICAgdmFyIGNvcnJlY3RBbnN3ZXJzQ291bnQgPSB0aGlzLmdldENvcnJlY3RlZEFuc3dlckNvdW50KCk7XG4gICAgICByZXR1cm4gTWF0aC5jZWlsKGNvcnJlY3RBbnN3ZXJzQ291bnQgKiAxMDAgLyBxdWVzdGlvbnMubGVuZ3RoKTtcbiAgICB9XG4gICAgdmFyIGluZGV4ID0gdGhpcy52aXNpYmxlUGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSArIDE7XG4gICAgcmV0dXJuIE1hdGguY2VpbChpbmRleCAqIDEwMCAvIHRoaXMudmlzaWJsZVBhZ2VDb3VudCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBuYXZpZ2F0aW9uIGJ1dHRvbnM6ICdQcmV2JywgJ05leHQnIG9yICdDb21wbGV0ZScgYXJlIHNob3duLlxuICAgKi9cbiAgcHVibGljIGdldCBpc05hdmlnYXRpb25CdXR0b25zU2hvd2luZygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIFwibm9uZVwiO1xuICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICBpZiAoIXBhZ2UpIHJldHVybiBcIm5vbmVcIjtcbiAgICBpZiAocGFnZS5uYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHkgPT09IFwic2hvd1wiKSB7XG4gICAgICByZXR1cm4gXCJib3R0b21cIjtcbiAgICB9XG4gICAgaWYgKHBhZ2UubmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5ID09PSBcImhpZGVcIikge1xuICAgICAgcmV0dXJuIFwibm9uZVwiO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaG93TmF2aWdhdGlvbkJ1dHRvbnM7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3VydmV5IGluIHRoZSBlZGl0IG1vZGUuXG4gICAqIEBzZWUgbW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBpc0VkaXRNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT0gXCJlZGl0XCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3VydmV5IGluIHRoZSBkaXNwbGF5IG1vZGUuXG4gICAqIEBzZWUgbW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBpc0Rpc3BsYXlNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT0gXCJkaXNwbGF5XCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3VydmV5IGluIHRoZSBkZXNpZ24gbW9kZS4gSXQgaXMgdXNlZCBieSBTdXJ2ZXlKUyBFZGl0b3JcbiAgICogQHNlZSBzZXREZXNpZ25Nb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRGVzaWduTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNEZXNpZ25Nb2RlXCIsIGZhbHNlKTtcbiAgfVxuICAvKipcbiAgICogQ2FsbCBpdCB0byBzZXQgdGhlIHN1cnZleSBpbnRvIHRoZSBkZXNpZ24gbW9kZS5cbiAgICogQHBhcmFtIHZhbHVlIHVzZSB0cnVlIHRvIHNldCB0aGUgc3VydmV5IGludG8gdGhlIGRlc2lnbiBtb2RlLlxuICAgKi9cbiAgcHVibGljIHNldERlc2lnbk1vZGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc0Rlc2lnbk1vZGVcIiwgdmFsdWUpO1xuICAgIHRoaXMub25Jc1NpbmdsZVBhZ2VDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHRvIHNob3cgYWxsIGVsZW1lbnRzIGluIHRoZSBzdXJ2ZXksIHJlZ2FyZGxlc3MgdGhlaXIgdmlzaWJpbGl0eS4gSXQgaXMgZmFsc2UgYnkgZGVmYXVsdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd0ludmlzaWJsZUVsZW1lbnRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93SW52aXNpYmxlRWxlbWVudHNcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd0ludmlzaWJsZUVsZW1lbnRzKHZhbDogYm9vbGVhbikge1xuICAgIHZhciB2aXNQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dJbnZpc2libGVFbGVtZW50c1wiLCB2YWwpO1xuICAgIHRoaXMudXBkYXRlQWxsRWxlbWVudHNWaXNpYmlsaXR5KHZpc1BhZ2VzKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZUFsbEVsZW1lbnRzVmlzaWJpbGl0eSh2aXNQYWdlczogQXJyYXk8UGFnZU1vZGVsPikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhZ2UgPSB0aGlzLnBhZ2VzW2ldO1xuICAgICAgcGFnZS51cGRhdGVFbGVtZW50VmlzaWJpbGl0eSgpO1xuICAgICAgaWYgKHZpc1BhZ2VzLmluZGV4T2YocGFnZSkgPiAtMSAhPSBwYWdlLmlzVmlzaWJsZSkge1xuICAgICAgICB0aGlzLm9uUGFnZVZpc2libGVDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgICAgICAgdmlzaWJsZTogcGFnZS5pc1Zpc2libGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRGVzaWduTW9kZSB8fCB0aGlzLnNob3dJbnZpc2libGVFbGVtZW50cztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiBhIHVzZXIgaGFzIGFscmVhZHkgY29tcGxldGVkIHRoZSBzdXJ2ZXkgb24gdGhpcyBicm93c2VyIGFuZCB0aGVyZSBpcyBhIGNvb2tpZSBhYm91dCBpdC4gU3VydmV5IGdvZXMgdG8gJ2NvbXBsZXRlZCcgc3RhdGUgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS5cbiAgICogQHNlZSBjb29raWVOYW1lXG4gICAqIEBzZWUgc2V0Q29va2llXG4gICAqIEBzZWUgZGVsZXRlQ29va2llXG4gICAqIEBzZWUgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzQ29va2llKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jb29raWVOYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWU7XG4gICAgcmV0dXJuIGNvb2tpZXMgJiYgY29va2llcy5pbmRleE9mKHRoaXMuY29va2llTmFtZSArIFwiPXRydWVcIikgPiAtMTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoZSBjb29raWUgd2l0aCBjb29raWVOYW1lIGluIHRoZSBicm93c2VyLiBJdCBpcyBkb25lIGF1dG9tYXRpY2FsbHkgb24gc3VydmV5IGNvbXBsZXRlIGlmIGNvb2tpZU5hbWUgaXMgbm90IGVtcHR5LlxuICAgKiBAc2VlIGNvb2tpZU5hbWVcbiAgICogQHNlZSBoYXNDb29raWVcbiAgICogQHNlZSBkZWxldGVDb29raWVcbiAgICovXG4gIHB1YmxpYyBzZXRDb29raWUoKSB7XG4gICAgaWYgKCF0aGlzLmNvb2tpZU5hbWUpIHJldHVybjtcbiAgICBkb2N1bWVudC5jb29raWUgPVxuICAgICAgdGhpcy5jb29raWVOYW1lICsgXCI9dHJ1ZTsgZXhwaXJlcz1GcmksIDMxIERlYyA5OTk5IDA6MDowIEdNVFwiO1xuICB9XG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGNvb2tpZSB3aXRoIGNvb2tpZU5hbWUgaW4gdGhlIGJyb3dzZXIuXG4gICAqIEBzZWUgY29va2llTmFtZVxuICAgKiBAc2VlIGhhc0Nvb2tpZVxuICAgKiBAc2VlIHNldENvb2tpZVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUNvb2tpZSgpIHtcbiAgICBpZiAoIXRoaXMuY29va2llTmFtZSkgcmV0dXJuO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IHRoaXMuY29va2llTmFtZSArIFwiPTtcIjtcbiAgfVxuICAvKipcbiAgICogQ2FsbCBpdCB0byBnbyB0byB0aGUgbmV4dCBwYWdlLiBJdCByZXR1cm5zIGZhbHNlLCBpZiBpdCBpcyB0aGUgbGFzdCBwYWdlLiBJZiB0aGVyZSBpcyBhbiBlcnJvciwgZm9yIGV4YW1wbGUgcmVxdWlyZWQgcXVlc3Rpb24gaXMgZW1wdHksIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIGFzIHdlbGwuXG4gICAqIEBzZWUgaXNDdXJyZW50UGFnZUhhc0Vycm9yc1xuICAgKiBAc2VlIHByZXZQYWdlXG4gICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgKi9cbiAgcHVibGljIG5leHRQYWdlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzTGFzdFBhZ2UpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlICYmIHRoaXMuaXNDdXJyZW50UGFnZUhhc0Vycm9ycykgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmRvU2VydmVyVmFsaWRhdGlvbigpKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5kb05leHRQYWdlKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlcmUgaXMgYW55IGVycm9yIG9uIHRoZSBjdXJyZW50IHBhZ2UuIEZvciBleGFtcGxlLCB0aGUgcmVxdWlyZWQgcXVlc3Rpb24gaXMgZW1wdHkgb3IgYSBxdWVzdGlvbiB2YWxpZGF0aW9uIGlzIGZhaWxlZC5cbiAgICogQHNlZSBuZXh0UGFnZVxuICAgKi9cbiAgcHVibGljIGdldCBpc0N1cnJlbnRQYWdlSGFzRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrSXNDdXJyZW50UGFnZUhhc0Vycm9ycygpO1xuICB9XG4gIHByaXZhdGUgY2hlY2tJc0N1cnJlbnRQYWdlSGFzRXJyb3JzKFxuICAgIGlzRm9jdXNlT25GaXJzdEVycm9yOiBib29sZWFuID0gdW5kZWZpbmVkXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChpc0ZvY3VzZU9uRmlyc3RFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpc0ZvY3VzZU9uRmlyc3RFcnJvciA9IHRoaXMuZm9jdXNPbkZpcnN0RXJyb3I7XG4gICAgfVxuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID09IG51bGwpIHJldHVybiB0cnVlO1xuICAgIHZhciByZXMgPSB0aGlzLmN1cnJlbnRQYWdlLmhhc0Vycm9ycyh0cnVlLCBpc0ZvY3VzZU9uRmlyc3RFcnJvcik7XG4gICAgdGhpcy5maXJlVmFsaWRhdGVkRXJyb3JzT25DdXJyZW50UGFnZSgpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBmaXJlVmFsaWRhdGVkRXJyb3JzT25DdXJyZW50UGFnZSgpIHtcbiAgICBpZiAodGhpcy5vblZhbGlkYXRlZEVycm9yc09uQ3VycmVudFBhZ2UuaXNFbXB0eSkgcmV0dXJuO1xuICAgIHZhciBxdWVzdGlvbnNPblBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlLnF1ZXN0aW9ucztcbiAgICB2YXIgcXVlc3Rpb25zID0gbmV3IEFycmF5PFF1ZXN0aW9uPigpO1xuICAgIHZhciBlcnJvcnMgPSBuZXcgQXJyYXk8U3VydmV5RXJyb3I+KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnNPblBhZ2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxID0gcXVlc3Rpb25zT25QYWdlW2ldO1xuICAgICAgaWYgKHEuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcXVlc3Rpb25zLnB1c2gocSk7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcS5lcnJvcnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChxLmVycm9yc1tqXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vblZhbGlkYXRlZEVycm9yc09uQ3VycmVudFBhZ2UuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbnM6IHF1ZXN0aW9ucyxcbiAgICAgIGVycm9yczogZXJyb3JzXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gZ28gdG8gdGhlIHByZXZpb3VzIHBhZ2UuIEl0IHJldHVybnMgZmFsc2UgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgZmlyc3QgcGFnZSBhbHJlYWR5LiBJdCBkb2Vzbid0IHBlcmZvcm0gYW55IGNoZWNrcywgcmVxdWlyZWQgcXVlc3Rpb25zIGNhbiBiZSBlbXB0eS5cbiAgICogQHNlZSBpc0ZpcnN0UGFnZVxuICAgKi9cbiAgcHVibGljIHByZXZQYWdlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzRmlyc3RQYWdlKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgIHZhciBpbmRleCA9IHZQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB2UGFnZXNbaW5kZXggLSAxXTtcbiAgfVxuICAvKipcbiAgICogQ2FsbCBpdCB0byBjb21wbGV0ZSB0aGUgc3VydmV5LCBpZiB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBsYXN0IG9uZS4gSXQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSBpcyBhbiBlcnJvciBvbiB0aGUgcGFnZS4gSWYgdGhlcmUgaXMgbm8gZXJyb3JzIG9uIHRoZSBwYWdlLCBpdCBjYWxscyBkb0NvbXBsZXRlIGFuZCByZXR1cm5zIHRydWUuXG4gICAqIEBzZWUgaXNDdXJyZW50UGFnZUhhc0Vycm9yc1xuICAgKiBAc2VlIG5leHRQYWdlXG4gICAqIEBzZWUgZG9Db21wbGV0ZVxuICAgKi9cbiAgcHVibGljIGNvbXBsZXRlTGFzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNFZGl0TW9kZSAmJiB0aGlzLmlzQ3VycmVudFBhZ2VIYXNFcnJvcnMpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5kb1NlcnZlclZhbGlkYXRpb24oKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMuZG9Db21wbGV0ZSgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCBpZiB5b3Ugd2FudCB0byBjb21iaW5lIGFsbCB5b3VyIHBhZ2VzIGluIG9uZSBwYWdlLiBQYWdlcyB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIHBhbmVscy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNTaW5nbGVQYWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1NpbmdsZVBhZ2VcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNTaW5nbGVQYWdlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzU2luZ2xlUGFnZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCB0byBtYWtlIHRoZSBmaXJzdCBwYWdlIHlvdXIgc3RhcnRpbmcgcGFnZS4gVGhlIGVuZC11c2VyIGNvdWxkIG5vdCBjb21lYmFjayB0byB0aGUgc3RhcnQgcGFnZSBhbmQgaXQgaXMgbm90IGNvdW50IGluIHRoZSBwcm9ncmVzcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgZmlyc3RQYWdlSXNTdGFydGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJmaXJzdFBhZ2VJc1N0YXJ0ZWRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgZmlyc3RQYWdlSXNTdGFydGVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImZpcnN0UGFnZUlzU3RhcnRlZFwiLCB2YWwpO1xuICB9XG4gIGlzUGFnZVN0YXJ0ZWQocGFnZTogSVBhZ2UpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQgJiYgdGhpcy5wYWdlcy5sZW5ndGggPiAwICYmIHRoaXMucGFnZXNbMF0gPT09IHBhZ2VcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBvbkZpcnN0UGFnZUlzU3RhcnRlZENoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMucGFnZXMubGVuZ3RoID09IDApIHJldHVybjtcbiAgICB0aGlzLmlzU3RhcnRlZFN0YXRlID0gdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQ7XG4gICAgdGhpcy5wYWdlVmlzaWJpbGl0eUNoYW5nZWQodGhpcy5wYWdlc1swXSwgIXRoaXMuZmlyc3RQYWdlSXNTdGFydGVkKTtcbiAgfVxuICBvcmlnaW9uYWxQYWdlczogYW55ID0gbnVsbDtcbiAgcHJvdGVjdGVkIG9uSXNTaW5nbGVQYWdlQ2hhbmdlZCgpIHtcbiAgICBpZiAoIXRoaXMuaXNTaW5nbGVQYWdlIHx8IHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICBpZiAodGhpcy5vcmlnaW9uYWxQYWdlcykge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzQ2xlYXIoKTtcbiAgICAgICAgdGhpcy5wYWdlcy5zcGxpY2UoMCwgdGhpcy5wYWdlcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3JpZ2lvbmFsUGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0aGlzLnBhZ2VzLnB1c2godGhpcy5vcmlnaW9uYWxQYWdlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMub3JpZ2lvbmFsUGFnZXMgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzQ2xlYXIoKTtcbiAgICAgIHRoaXMub3JpZ2lvbmFsUGFnZXMgPSB0aGlzLnBhZ2VzLnNsaWNlKDAsIHRoaXMucGFnZXMubGVuZ3RoKTtcbiAgICAgIHZhciBzdGFydEluZGV4ID0gdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQgPyAxIDogMDtcbiAgICAgIHN1cGVyLnN0YXJ0TG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgICB2YXIgc2luZ2xlUGFnZSA9IHRoaXMuY3JlYXRlU2luZ2xlUGFnZShzdGFydEluZGV4KTtcbiAgICAgIHZhciBkZWxldGVkTGVuID0gdGhpcy5wYWdlcy5sZW5ndGggLSBzdGFydEluZGV4O1xuICAgICAgdGhpcy5wYWdlcy5zcGxpY2Uoc3RhcnRJbmRleCwgZGVsZXRlZExlbiwgc2luZ2xlUGFnZSk7XG4gICAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICAgIHNpbmdsZVBhZ2UuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgICBzaW5nbGVQYWdlLnNldFN1cnZleUltcGwodGhpcyk7XG4gICAgICB0aGlzLmRvRWxlbWVudHNPbkxvYWQoKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlU2luZ2xlUGFnZShzdGFydEluZGV4OiBudW1iZXIpOiBQYWdlTW9kZWwge1xuICAgIHZhciBzaW5nbGUgPSB0aGlzLmNyZWF0ZU5ld1BhZ2UoXCJhbGxcIik7XG4gICAgc2luZ2xlLnNldFN1cnZleUltcGwodGhpcyk7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFnZSA9IHRoaXMucGFnZXNbaV07XG4gICAgICB2YXIgcGFuZWwgPSBTZXJpYWxpemVyLmNyZWF0ZUNsYXNzKFwicGFuZWxcIik7XG4gICAgICBzaW5nbGUuYWRkUGFuZWwocGFuZWwpO1xuICAgICAgdmFyIGpzb24gPSBuZXcgSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdChwYWdlKTtcbiAgICAgIG5ldyBKc29uT2JqZWN0KCkudG9PYmplY3QoanNvbiwgcGFuZWwpO1xuICAgIH1cbiAgICByZXR1cm4gc2luZ2xlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgZmlyc3Qgb25lLlxuICAgKi9cbiAgcHVibGljIGdldCBpc0ZpcnN0UGFnZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlUGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSA9PSAwO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNTaG93UHJldkJ1dHRvbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0ZpcnN0UGFnZSB8fCAhdGhpcy5zaG93UHJldkJ1dHRvbikgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBwYWdlID0gdGhpcy52aXNpYmxlUGFnZXNbdGhpcy5jdXJyZW50UGFnZU5vIC0gMV07XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFnZU1heFRpbWVUb0ZpbmlzaChwYWdlKSA8PSAwO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgbGFzdCBvbmUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTGFzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgIHJldHVybiB2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSA9PSB2UGFnZXMubGVuZ3RoIC0gMTtcbiAgfVxuICAvKipcbiAgICogQ2FsbCBpdCB0byBjb21wbGV0ZSB0aGUgc3VydmV5LiBJdCB3cml0ZXMgY29va2llIGlmIGNvb2tpZU5hbWUgcHJvcGVydHkgaXMgbm90IGVtcHR5LCBzZXQgdGhlIHN1cnZleSBpbnRvICdjb21wbGV0ZWQnIHN0YXRlLCBmaXJlIG9uQ29tcGxldGUgZXZlbnQgYW5kIHNlbmRSZXN1bHQgaW50byBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZSBpZiBzdXJ2ZXlQb3N0SWQgcHJvcGVydHkgaXMgbm90IGVtcHR5LiBJdCBkb2Vzbid0IHBlcmZvcm0gYW55IHZhbGlkYXRpb24sIHVubGlrZSBjb21wbGV0ZUxhc3RQYWdlIGZ1bmN0aW9uLlxuICAgKiBAc2VlIGNvb2tpZU5hbWVcbiAgICogQHNlZSBzdGF0ZVxuICAgKiBAc2VlIG9uQ29tcGxldGVcbiAgICogQHNlZSBzdXJ2ZXlQb3N0SWRcbiAgICogQHNlZSBjb21wbGV0ZUxhc3RQYWdlXG4gICAqL1xuICBwdWJsaWMgZG9Db21wbGV0ZSgpIHtcbiAgICB2YXIgb25Db21wbGV0aW5nT3B0aW9ucyA9IHsgYWxsb3dDb21wbGV0ZTogdHJ1ZSB9O1xuICAgIHRoaXMub25Db21wbGV0aW5nLmZpcmUodGhpcywgb25Db21wbGV0aW5nT3B0aW9ucyk7XG4gICAgaWYgKCFvbkNvbXBsZXRpbmdPcHRpb25zLmFsbG93Q29tcGxldGUpIHJldHVybjtcbiAgICBsZXQgcHJldmlvdXNDb29raWUgPSB0aGlzLmhhc0Nvb2tpZTtcbiAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgIHRoaXMuc2V0Q29tcGxldGVkKCk7XG4gICAgdGhpcy5jbGVhclVudXNlZFZhbHVlcygpO1xuICAgIHRoaXMuc2V0Q29va2llKCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBvbkNvbXBsZXRlT3B0aW9ucyA9IHtcbiAgICAgIHNob3dEYXRhU2F2aW5nOiBmdW5jdGlvbih0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc2VsZi5zZXRDb21wbGV0ZWRTdGF0ZShcInNhdmluZ1wiLCB0ZXh0KTtcbiAgICAgIH0sXG4gICAgICBzaG93RGF0YVNhdmluZ0Vycm9yOiBmdW5jdGlvbih0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc2VsZi5zZXRDb21wbGV0ZWRTdGF0ZShcImVycm9yXCIsIHRleHQpO1xuICAgICAgfSxcbiAgICAgIHNob3dEYXRhU2F2aW5nU3VjY2VzczogZnVuY3Rpb24odGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHNlbGYuc2V0Q29tcGxldGVkU3RhdGUoXCJzdWNjZXNzXCIsIHRleHQpO1xuICAgICAgfSxcbiAgICAgIHNob3dEYXRhU2F2aW5nQ2xlYXI6IGZ1bmN0aW9uKHRleHQ6IHN0cmluZykge1xuICAgICAgICBzZWxmLnNldENvbXBsZXRlZFN0YXRlKFwiXCIsIFwiXCIpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5vbkNvbXBsZXRlLmZpcmUodGhpcywgb25Db21wbGV0ZU9wdGlvbnMpO1xuICAgIGlmICghcHJldmlvdXNDb29raWUgJiYgdGhpcy5zdXJ2ZXlQb3N0SWQpIHtcbiAgICAgIHRoaXMuc2VuZFJlc3VsdCgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU3RhcnQgdGhlIHN1cnZleS4gQ2hhbmdlIHRoZSBtb2RlIGZyb20gXCJzdGFydGluZ1wiIHRvIFwicnVubmluZ1wiLiBZb3UgbmVlZCB0byBjYWxsIGl0LCBpZiB0aGVyZSBpcyBhIHN0YXJ0ZWQgcGFnZSBpbiB5b3VyIHN1cnZleSwgb3RoZXJ3aXNlIGl0IGRvZXMgbm90aGluZy5cbiAgICogQHNlZSBmaXJzdFBhZ2VJc1N0YXJ0ZWRcbiAgICovXG4gIHB1YmxpYyBzdGFydCgpIHtcbiAgICBpZiAoIXRoaXMuZmlyc3RQYWdlSXNTdGFydGVkKSByZXR1cm47XG4gICAgdGhpcy5pc1N0YXJ0ZWRTdGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuc3RhcnRUaW1lckZyb21VSSgpO1xuICAgIHRoaXMub25TdGFydGVkLmZpcmUodGhpcywge30pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUsIGlmIGF0IHRoZSBjdXJyZW50IG1vbWVudCB0aGUgcXVlc3Rpb24gdmFsdWVzIG9uIHRoZSBjdXJyZW50IHBhZ2UgYXJlIHZhbGlkYXRpbmcgb24gdGhlIHNlcnZlci5cbiAgICogQHNlZSBvblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzVmFsaWRhdGluZ09uU2VydmVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1ZhbGlkYXRpbmdPblNlcnZlclwiLCBmYWxzZSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRJc1ZhbGlkYXRpbmdPblNlcnZlcih2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsID09IHRoaXMuaXNWYWxpZGF0aW5nT25TZXJ2ZXIpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1ZhbGlkYXRpbmdPblNlcnZlclwiLCB2YWwpO1xuICAgIHRoaXMub25Jc1ZhbGlkYXRpbmdPblNlcnZlckNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Jc1ZhbGlkYXRpbmdPblNlcnZlckNoYW5nZWQoKSB7fVxuICBwcm90ZWN0ZWQgZG9TZXJ2ZXJWYWxpZGF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICF0aGlzLm9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnMgfHxcbiAgICAgIHRoaXMub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucy5pc0VtcHR5XG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIGRhdGE6IDx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+e30sXG4gICAgICBlcnJvcnM6IHt9LFxuICAgICAgc3VydmV5OiB0aGlzLFxuICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLmNvbXBsZXRlU2VydmVyVmFsaWRhdGlvbihvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jdXJyZW50UGFnZS5xdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuY3VycmVudFBhZ2UucXVlc3Rpb25zW2ldO1xuICAgICAgaWYgKCFxdWVzdGlvbi52aXNpYmxlKSBjb250aW51ZTtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUocXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCkpO1xuICAgICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eSh2YWx1ZSkpXG4gICAgICAgIG9wdGlvbnMuZGF0YVtxdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5zZXRJc1ZhbGlkYXRpbmdPblNlcnZlcih0cnVlKTtcblxuICAgIGlmICh0eXBlb2YgdGhpcy5vblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBjb21wbGV0ZVNlcnZlclZhbGlkYXRpb24ob3B0aW9uczogYW55KSB7XG4gICAgdGhpcy5zZXRJc1ZhbGlkYXRpbmdPblNlcnZlcihmYWxzZSk7XG4gICAgaWYgKCFvcHRpb25zICYmICFvcHRpb25zLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBzZWxmID0gb3B0aW9ucy5zdXJ2ZXk7XG4gICAgdmFyIGhhc0Vycm9ycyA9IGZhbHNlO1xuICAgIGlmIChvcHRpb25zLmVycm9ycykge1xuICAgICAgZm9yICh2YXIgbmFtZSBpbiBvcHRpb25zLmVycm9ycykge1xuICAgICAgICB2YXIgcXVlc3Rpb24gPSBzZWxmLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWUpO1xuICAgICAgICBpZiAocXVlc3Rpb24gJiYgcXVlc3Rpb25bXCJlcnJvcnNcIl0pIHtcbiAgICAgICAgICBoYXNFcnJvcnMgPSB0cnVlO1xuICAgICAgICAgIHF1ZXN0aW9uW1wiYWRkRXJyb3JcIl0obmV3IEN1c3RvbUVycm9yKG9wdGlvbnMuZXJyb3JzW25hbWVdLCB0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFoYXNFcnJvcnMpIHtcbiAgICAgIGlmIChzZWxmLmlzTGFzdFBhZ2UpIHNlbGYuZG9Db21wbGV0ZSgpO1xuICAgICAgZWxzZSBzZWxmLmRvTmV4dFBhZ2UoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGRvTmV4dFBhZ2UoKSB7XG4gICAgdGhpcy5jaGVja09uUGFnZVRyaWdnZXJzKCk7XG4gICAgaWYgKCF0aGlzLmlzQ29tcGxldGVkKSB7XG4gICAgICBpZiAodGhpcy5zZW5kUmVzdWx0T25QYWdlTmV4dCkge1xuICAgICAgICB0aGlzLnNlbmRSZXN1bHQodGhpcy5zdXJ2ZXlQb3N0SWQsIHRoaXMuY2xpZW50SWQsIHRydWUpO1xuICAgICAgfVxuICAgICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgICAgdmFyIGluZGV4ID0gdlBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZSk7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdlBhZ2VzW2luZGV4ICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG9Db21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc2V0Q29tcGxldGVkKCkge1xuICAgIHRoaXMuaXNDb21wbGV0ZWQgPSB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBodG1sIGZvciBjb21wbGV0ZWQgJ1RoYW5rIHlvdScgcGFnZS5cbiAgICogQHNlZSBjb21wbGV0ZWRIdG1sXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByb2Nlc3NlZENvbXBsZXRlZEh0bWwoKTogc3RyaW5nIHtcbiAgICB2YXIgaHRtbCA9IHRoaXMucmVuZGVyZWRDb21wbGV0ZWRIdG1sO1xuICAgIGlmIChodG1sKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzSHRtbChodG1sKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiPGgzPlwiICsgdGhpcy5nZXRMb2NTdHJpbmcoXCJjb21wbGV0aW5nU3VydmV5XCIpICsgXCI8L2gzPlwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBodG1sIHNob3dpbmcgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSBjb21wbGV0ZWQgdGhlIHN1cnZleVxuICAgKiBAc2VlIGNvbXBsZXRlZEh0bWxcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkQ29tcGxldGVkQmVmb3JlSHRtbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmNvbXBsZXRlZEJlZm9yZUh0bWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NIdG1sKHRoaXMuY29tcGxldGVkQmVmb3JlSHRtbCk7XG4gICAgfVxuICAgIHJldHVybiBcIjxoMz5cIiArIHRoaXMuZ2V0TG9jU3RyaW5nKFwiY29tcGxldGluZ1N1cnZleUJlZm9yZVwiKSArIFwiPC9oMz5cIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaHRtbCB0aGF0IHNob3dzIG9uIGxvYWRpbmcgdGhlIGpzb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByb2Nlc3NlZExvYWRpbmdIdG1sKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubG9hZGluZ0h0bWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NIdG1sKHRoaXMubG9hZGluZ0h0bWwpO1xuICAgIH1cbiAgICByZXR1cm4gXCI8aDM+XCIgKyB0aGlzLmdldExvY1N0cmluZyhcImxvYWRpbmdTdXJ2ZXlcIikgKyBcIjwvaDM+XCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBjdXJyZW50IHByb2dyZXNzLlxuICAgKi9cbiAgcHVibGljIGdldCBwcm9ncmVzc1RleHQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgICBpZiAodGhpcy5wcm9ncmVzc0JhclR5cGUgPT09IFwicXVlc3Rpb25zXCIpIHtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xuICAgICAgdmFyIGFuc3dlcmVkUXVlc3Rpb25zQ291bnQgPSBxdWVzdGlvbnMucmVkdWNlKFxuICAgICAgICAoYTogbnVtYmVyLCBiOiBRdWVzdGlvbikgPT4gYSArIChiLmlzRW1wdHkoKSA/IDAgOiAxKSxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcInF1ZXN0aW9uc1Byb2dyZXNzVGV4dFwiKVtcImZvcm1hdFwiXShcbiAgICAgICAgYW5zd2VyZWRRdWVzdGlvbnNDb3VudCxcbiAgICAgICAgcXVlc3Rpb25zLmxlbmd0aFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvZ3Jlc3NCYXJUeXBlID09PSBcImNvcnJlY3RRdWVzdGlvbnNcIikge1xuICAgICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0QWxsUXVlc3Rpb25zKCk7XG4gICAgICB2YXIgY29ycmVjdEFuc3dlcnNDb3VudCA9IHRoaXMuZ2V0Q29ycmVjdGVkQW5zd2VyQ291bnQoKTtcbiAgICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcInF1ZXN0aW9uc1Byb2dyZXNzVGV4dFwiKVtcImZvcm1hdFwiXShcbiAgICAgICAgY29ycmVjdEFuc3dlcnNDb3VudCxcbiAgICAgICAgcXVlc3Rpb25zLmxlbmd0aFxuICAgICAgKTtcbiAgICB9XG4gICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgIHZhciBpbmRleCA9IHZQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpICsgMTtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJwcm9ncmVzc1RleHRcIilbXCJmb3JtYXRcIl0oaW5kZXgsIHZQYWdlcy5sZW5ndGgpO1xuICB9XG4gIHByb3RlY3RlZCBhZnRlclJlbmRlclN1cnZleShodG1sRWxlbWVudDogYW55KSB7XG4gICAgdGhpcy5vbkFmdGVyUmVuZGVyU3VydmV5LmZpcmUodGhpcywge1xuICAgICAgc3VydmV5OiB0aGlzLFxuICAgICAgaHRtbEVsZW1lbnQ6IGh0bWxFbGVtZW50XG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNzc0NsYXNzZXM6IGFueSkge1xuICAgIHRoaXMub25VcGRhdGVRdWVzdGlvbkNzc0NsYXNzZXMuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBjc3NDbGFzc2VzOiBjc3NDbGFzc2VzXG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlUGFuZWxDc3NDbGFzc2VzKHBhbmVsOiBJUGFuZWwsIGNzc0NsYXNzZXM6IGFueSkge1xuICAgIHRoaXMub25VcGRhdGVQYW5lbENzc0NsYXNzZXMuZmlyZSh0aGlzLCB7XG4gICAgICBwYW5lbDogcGFuZWwsXG4gICAgICBjc3NDbGFzc2VzOiBjc3NDbGFzc2VzXG4gICAgfSk7XG4gIH1cbiAgYWZ0ZXJSZW5kZXJQYWdlKGh0bWxFbGVtZW50OiBhbnkpIHtcbiAgICBpZiAodGhpcy5vbkFmdGVyUmVuZGVyUGFnZS5pc0VtcHR5KSByZXR1cm47XG4gICAgdGhpcy5vbkFmdGVyUmVuZGVyUGFnZS5maXJlKHRoaXMsIHtcbiAgICAgIHBhZ2U6IHRoaXMuY3VycmVudFBhZ2UsXG4gICAgICBodG1sRWxlbWVudDogaHRtbEVsZW1lbnRcbiAgICB9KTtcbiAgfVxuICBhZnRlclJlbmRlclF1ZXN0aW9uKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGh0bWxFbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLm9uQWZ0ZXJSZW5kZXJRdWVzdGlvbi5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIGh0bWxFbGVtZW50OiBodG1sRWxlbWVudFxuICAgIH0pO1xuICB9XG4gIGFmdGVyUmVuZGVyUGFuZWwocGFuZWw6IElFbGVtZW50LCBodG1sRWxlbWVudDogYW55KSB7XG4gICAgdGhpcy5vbkFmdGVyUmVuZGVyUGFuZWwuZmlyZSh0aGlzLCB7XG4gICAgICBwYW5lbDogcGFuZWwsXG4gICAgICBodG1sRWxlbWVudDogaHRtbEVsZW1lbnRcbiAgICB9KTtcbiAgfVxuICBtYXRyaXhCZWZvcmVSb3dBZGRlZChvcHRpb25zOiBhbnkpIHtcbiAgICB0aGlzLm9uTWF0cml4QmVmb3JlUm93QWRkZWQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBtYXRyaXhSb3dBZGRlZChxdWVzdGlvbjogSVF1ZXN0aW9uKSB7XG4gICAgdGhpcy5vbk1hdHJpeFJvd0FkZGVkLmZpcmUodGhpcywgeyBxdWVzdGlvbjogcXVlc3Rpb24gfSk7XG4gIH1cbiAgZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZUZyb21BcnJheShcbiAgICB2YWx1ZU5hbWU6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaW5kZXg6IG51bWJlclxuICApOiBJUXVlc3Rpb24ge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldFF1ZXN0aW9uc0J5VmFsdWVOYW1lQ29yZSh2YWx1ZU5hbWUpO1xuICAgIGlmICghcXVlc3Rpb25zKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZXMgPSBxdWVzdGlvbnNbaV0uZ2V0UXVlc3Rpb25Gcm9tQXJyYXkobmFtZSwgaW5kZXgpO1xuICAgICAgaWYgKCEhcmVzKSByZXR1cm4gcmVzO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBtYXRyaXhSb3dSZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHJvd0luZGV4OiBudW1iZXIsIHJvdzogYW55KSB7XG4gICAgdGhpcy5vbk1hdHJpeFJvd1JlbW92ZWQuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICByb3dJbmRleDogcm93SW5kZXgsXG4gICAgICByb3c6IHJvd1xuICAgIH0pO1xuICB9XG4gIG1hdHJpeENlbGxDcmVhdGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSkge1xuICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB0aGlzLm9uTWF0cml4Q2VsbENyZWF0ZWQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBtYXRyaXhBZnRlckNlbGxSZW5kZXIocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KSB7XG4gICAgb3B0aW9ucy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIHRoaXMub25NYXRyaXhBZnRlckNlbGxSZW5kZXIuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBtYXRyaXhDZWxsVmFsdWVDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSkge1xuICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB0aGlzLm9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdlZC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIG1hdHJpeENlbGxWYWx1ZUNoYW5naW5nKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSkge1xuICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB0aGlzLm9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdpbmcuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBtYXRyaXhDZWxsVmFsaWRhdGUocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTogU3VydmV5RXJyb3Ige1xuICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB0aGlzLm9uTWF0cml4Q2VsbFZhbGlkYXRlLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuZXJyb3IgPyBuZXcgQ3VzdG9tRXJyb3Iob3B0aW9ucy5lcnJvciwgdGhpcykgOiBudWxsO1xuICB9XG4gIGR5bmFtaWNQYW5lbEFkZGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pIHtcbiAgICB0aGlzLm9uRHluYW1pY1BhbmVsQWRkZWQuZmlyZSh0aGlzLCB7IHF1ZXN0aW9uOiBxdWVzdGlvbiB9KTtcbiAgfVxuICBkeW5hbWljUGFuZWxSZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHBhbmVsSW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMub25EeW5hbWljUGFuZWxSZW1vdmVkLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgcGFuZWxJbmRleDogcGFuZWxJbmRleFxuICAgIH0pO1xuICB9XG4gIGR5bmFtaWNQYW5lbEl0ZW1WYWx1ZUNoYW5nZWQocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KSB7XG4gICAgb3B0aW9ucy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIHRoaXMub25EeW5hbWljUGFuZWxJdGVtVmFsdWVDaGFuZ2VkLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgZHJhZ0FuZERyb3BBbGxvdyhvcHRpb25zOiBhbnkpOiBib29sZWFuIHtcbiAgICBvcHRpb25zLmFsbG93ID0gdHJ1ZTtcbiAgICB0aGlzLm9uRHJhZ0Ryb3BBbGxvdy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmFsbG93O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZCB0aGUgZmlsZSBpbnRvIHNlcnZlclxuICAgKiBAcGFyYW0gbmFtZSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBmaWxlIHVwbG9hZGluZyBmaWxlXG4gICAqIEBwYXJhbSBzdG9yZURhdGFBc1RleHQgc2V0IGl0IHRvIHRydWUgdG8gZW5jb2RlIGZpbGUgY29udGVudCBpbnRvIHRoZSBzdXJ2ZXkgcmVzdWx0c1xuICAgKiBAcGFyYW0gdXBsb2FkaW5nQ2FsbGJhY2sgYSBjYWxsIGJhY2sgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdGF0dXMgb24gdXBsb2FkaW5nIHRoZSBmaWxlXG4gICAqL1xuICBwdWJsaWMgdXBsb2FkRmlsZXMoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZpbGVzOiBGaWxlW10sXG4gICAgdXBsb2FkaW5nQ2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZywgZGF0YTogYW55KSA9PiBhbnlcbiAgKSB7XG4gICAgaWYgKHRoaXMub25VcGxvYWRGaWxlcy5pc0VtcHR5KSB7XG4gICAgICB1cGxvYWRpbmdDYWxsYmFjayhcImVycm9yXCIsIGZpbGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vblVwbG9hZEZpbGVzLmZpcmUodGhpcywge1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICBmaWxlczogZmlsZXMgfHwgW10sXG4gICAgICAgIGNhbGxiYWNrOiB1cGxvYWRpbmdDYWxsYmFja1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN1cnZleVBvc3RJZCkge1xuICAgICAgdGhpcy51cGxvYWRGaWxlc0NvcmUobmFtZSwgZmlsZXMsIHVwbG9hZGluZ0NhbGxiYWNrKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIERvd25sb2FkIHRoZSBmaWxlIGZyb20gc2VydmVyXG4gICAqIEBwYXJhbSBuYW1lIHF1ZXN0aW9uIG5hbWVcbiAgICogQHBhcmFtIGZpbGVWYWx1ZSBzaW5nbGUgZmlsZSBxdWVzdGlvbiB2YWx1ZVxuICAgKiBAcGFyYW0gY2FsbGJhY2sgYSBjYWxsIGJhY2sgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdGF0dXMgb24gZG93bmxvYWRpbmcgdGhlIGZpbGUgYW5kIHRoZSBkb3dubG9hZGVkIGZpbGUgY29udGVudFxuICAgKi9cbiAgcHVibGljIGRvd25sb2FkRmlsZShcbiAgICBxdWVzdGlvbk5hbWU6IHN0cmluZyxcbiAgICBmaWxlVmFsdWU6IGFueSxcbiAgICBjYWxsYmFjazogKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkpID0+IGFueVxuICApIHtcbiAgICBpZiAodGhpcy5vbkRvd25sb2FkRmlsZS5pc0VtcHR5KSB7XG4gICAgICAhIWNhbGxiYWNrICYmIGNhbGxiYWNrKFwic3VjY2Vzc1wiLCBmaWxlVmFsdWUuY29udGVudCB8fCBmaWxlVmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLm9uRG93bmxvYWRGaWxlLmZpcmUodGhpcywge1xuICAgICAgbmFtZTogcXVlc3Rpb25OYW1lLFxuICAgICAgY29udGVudDogZmlsZVZhbHVlLmNvbnRlbnQgfHwgZmlsZVZhbHVlLFxuICAgICAgZmlsZVZhbHVlOiBmaWxlVmFsdWUsXG4gICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ2xlYXIgZmlsZXMgZnJvbSBzZXJ2ZXJcbiAgICogQHBhcmFtIG5hbWUgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgZmlsZSBxdWVzdGlvbiB2YWx1ZVxuICAgKiBAcGFyYW0gY2FsbGJhY2sgYSBjYWxsIGJhY2sgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdGF0dXMgb2YgdGhlIGNsZWFyaW5nIG9wZXJhdGlvblxuICAgKi9cbiAgcHVibGljIGNsZWFyRmlsZXMoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnksXG4gICAgZmlsZU5hbWU6IHN0cmluZyxcbiAgICBjYWxsYmFjazogKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkpID0+IGFueVxuICApIHtcbiAgICBpZiAodGhpcy5vbkNsZWFyRmlsZXMuaXNFbXB0eSkge1xuICAgICAgISFjYWxsYmFjayAmJiBjYWxsYmFjayhcInN1Y2Nlc3NcIiwgdmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLm9uQ2xlYXJGaWxlcy5maXJlKHRoaXMsIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBmaWxlTmFtZTogZmlsZU5hbWUsXG4gICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICB9KTtcbiAgfVxuICB1cGRhdGVDaG9pY2VzRnJvbVNlcnZlcihcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIGNob2ljZXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgc2VydmVyUmVzdWx0OiBhbnlcbiAgKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBjaG9pY2VzOiBjaG9pY2VzLFxuICAgICAgc2VydmVyUmVzdWx0OiBzZXJ2ZXJSZXN1bHRcbiAgICB9O1xuICAgIHRoaXMub25Mb2FkQ2hvaWNlc0Zyb21TZXJ2ZXIuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5jaG9pY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVN1cnZleVNlcnZpY2UoKTogZHhTdXJ2ZXlTZXJ2aWNlIHtcbiAgICByZXR1cm4gbmV3IGR4U3VydmV5U2VydmljZSgpO1xuICB9XG4gIHByb3RlY3RlZCB1cGxvYWRGaWxlc0NvcmUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZpbGVzOiBGaWxlW10sXG4gICAgdXBsb2FkaW5nQ2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZywgZGF0YTogYW55KSA9PiBhbnlcbiAgKSB7XG4gICAgdmFyIHJlc3BvbnNlczogQXJyYXk8YW55PiA9IFtdO1xuICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBpZiAodXBsb2FkaW5nQ2FsbGJhY2spIHVwbG9hZGluZ0NhbGxiYWNrKFwidXBsb2FkaW5nXCIsIGZpbGUpO1xuICAgICAgdGhpcy5jcmVhdGVTdXJ2ZXlTZXJ2aWNlKCkuc2VuZEZpbGUoXG4gICAgICAgIHRoaXMuc3VydmV5UG9zdElkLFxuICAgICAgICBmaWxlLFxuICAgICAgICAoc3VjY2VzczogYm9vbGVhbiwgcmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICByZXNwb25zZXMucHVzaCh7IGNvbnRlbnQ6IHJlc3BvbnNlLCBmaWxlOiBmaWxlIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlcy5sZW5ndGggPT09IGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBpZiAodXBsb2FkaW5nQ2FsbGJhY2spIHVwbG9hZGluZ0NhbGxiYWNrKFwic3VjY2Vzc1wiLCByZXNwb25zZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodXBsb2FkaW5nQ2FsbGJhY2spXG4gICAgICAgICAgICAgIHVwbG9hZGluZ0NhbGxiYWNrKFwiZXJyb3JcIiwgeyByZXNwb25zZTogcmVzcG9uc2UsIGZpbGU6IGZpbGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIGdldFBhZ2UoaW5kZXg6IG51bWJlcik6IFBhZ2VNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucGFnZXNbaW5kZXhdO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgYSBwYWdlIGludG8gdGhlIHN1cnZleVxuICAgKiBAcGFyYW0gcGFnZVxuICAgKiBAc2VlIGFkZE5ld1BhZ2VcbiAgICovXG4gIHB1YmxpYyBhZGRQYWdlKHBhZ2U6IFBhZ2VNb2RlbCkge1xuICAgIGlmIChwYWdlID09IG51bGwpIHJldHVybjtcbiAgICB0aGlzLnBhZ2VzLnB1c2gocGFnZSk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBhZ2UgYW5kIGFkZHMgaXQgaW50byB0aGUgc3VydmV5LiBHZW5hcmF0ZXMgYSBuZXcgbmFtZSBpZiB0aGUgbmFtZSBwYXJhbWV0ZXIgaXMgbm90IHNldC5cbiAgICogQHBhcmFtIG5hbWUgYSBwYWdlIG5hbWVcbiAgICogQHNlZSBhZGRQYWdlXG4gICAqL1xuICBwdWJsaWMgYWRkTmV3UGFnZShuYW1lOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmNyZWF0ZU5ld1BhZ2UobmFtZSk7XG4gICAgdGhpcy5hZGRQYWdlKHBhZ2UpO1xuICAgIHJldHVybiBwYWdlO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIHBhZ2UgZnJvbSB0aGUgc3VydmV5XG4gICAqIEBwYXJhbSBwYWdlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlUGFnZShwYWdlOiBQYWdlTW9kZWwpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLnBhZ2VzLmluZGV4T2YocGFnZSk7XG4gICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuO1xuICAgIHRoaXMucGFnZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZVZhbHVlID09IHBhZ2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnBhZ2VzLmxlbmd0aCA+IDAgPyB0aGlzLnBhZ2VzWzBdIDogbnVsbDtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcXVlc3Rpb24gYnkgaXRzIG5hbWVcbiAgICogQHBhcmFtIG5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBjYXNlSW5zZW5zaXRpdmVcbiAgICogQHNlZSBnZXRRdWVzdGlvbkJ5VmFsdWVOYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0UXVlc3Rpb25CeU5hbWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNhc2VJbnNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IElRdWVzdGlvbiB7XG4gICAgdmFyIGhhc2g6IEhhc2hUYWJsZTxhbnk+ID0gISFjYXNlSW5zZW5zaXRpdmVcbiAgICAgID8gdGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lc0luc2Vuc2l0aXZlXG4gICAgICA6IHRoaXMucXVlc3Rpb25IYXNoZXMubmFtZXM7XG4gICAgdmFyIHJlcyA9IGhhc2hbbmFtZV07XG4gICAgaWYgKCFyZXMpIHJldHVybiBudWxsO1xuICAgIHJldHVybiByZXNbMF07XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBxdWVzdGlvbiBieSBpdHMgdmFsdWUgbmFtZVxuICAgKiBAcGFyYW0gdmFsdWVOYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gY2FzZUluc2Vuc2l0aXZlXG4gICAqIEBzZWUgZ2V0UXVlc3Rpb25CeU5hbWVcbiAgICogQHNlZSBRdWVzdGlvbi52YWx1ZU5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKFxuICAgIHZhbHVlTmFtZTogc3RyaW5nLFxuICAgIGNhc2VJbnNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IElRdWVzdGlvbiB7XG4gICAgdmFyIHJlcyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWVDb3JlKHZhbHVlTmFtZSwgY2FzZUluc2Vuc2l0aXZlKTtcbiAgICByZXR1cm4gISFyZXMgPyByZXNbMF0gOiBudWxsO1xuICB9XG4gIHByaXZhdGUgZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWVDb3JlKFxuICAgIHZhbHVlTmFtZTogc3RyaW5nLFxuICAgIGNhc2VJbnNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEFycmF5PFF1ZXN0aW9uPiB7XG4gICAgdmFyIGhhc2g6IEhhc2hUYWJsZTxhbnk+ID0gISFjYXNlSW5zZW5zaXRpdmVcbiAgICAgID8gdGhpcy5xdWVzdGlvbkhhc2hlcy52YWx1ZU5hbWVzSW5zZW5zaXRpdmVcbiAgICAgIDogdGhpcy5xdWVzdGlvbkhhc2hlcy52YWx1ZU5hbWVzO1xuICAgIHZhciByZXMgPSBoYXNoW3ZhbHVlTmFtZV07XG4gICAgaWYgKCFyZXMpIHJldHVybiBudWxsO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBhIGxpc3Qgb2YgcXVlc3Rpb25zIGJ5IHRoZWlyIG5hbWVzXG4gICAqIEBwYXJhbSBuYW1lcyB0aGUgYXJyYXkgb2YgbmFtZXNcbiAgICogQHBhcmFtIGNhc2VJbnNlbnNpdGl2ZVxuICAgKi9cbiAgcHVibGljIGdldFF1ZXN0aW9uc0J5TmFtZXMoXG4gICAgbmFtZXM6IHN0cmluZ1tdLFxuICAgIGNhc2VJbnNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IElRdWVzdGlvbltdIHtcbiAgICB2YXIgcmVzdWx0OiBJUXVlc3Rpb25bXSA9IFtdO1xuICAgIGlmICghbmFtZXMpIHJldHVybiByZXN1bHQ7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIW5hbWVzW2ldKSBjb250aW51ZTtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZXNbaV0sIGNhc2VJbnNlbnNpdGl2ZSk7XG4gICAgICBpZiAocXVlc3Rpb24pIHJlc3VsdC5wdXNoKHF1ZXN0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHBhZ2Ugb24gd2hpY2ggYW4gZWxlbWVudCAocXVlc3Rpb24gb3IgcGFuZWwpIGlzIHBsYWNlZC5cbiAgICogQHBhcmFtIGVsZW1lbnQgUXVlc3Rpb24gb3IgUGFuZWxcbiAgICovXG4gIHB1YmxpYyBnZXRQYWdlQnlFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogUGFnZU1vZGVsIHtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhZ2UgPSB0aGlzLnBhZ2VzW2ldO1xuICAgICAgaWYgKHBhZ2UuY29udGFpbnNFbGVtZW50KGVsZW1lbnQpKSByZXR1cm4gcGFnZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwYWdlIG9uIHdoaWNoIGEgcXVlc3Rpb24gaXMgbG9jYXRlZFxuICAgKiBAcGFyYW0gcXVlc3Rpb25cbiAgICovXG4gIHB1YmxpYyBnZXRQYWdlQnlRdWVzdGlvbihxdWVzdGlvbjogSVF1ZXN0aW9uKTogUGFnZU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYWdlQnlFbGVtZW50KHF1ZXN0aW9uKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHBhZ2UgYnkgaXQncyBuYW1lLlxuICAgKiBAcGFyYW0gbmFtZVxuICAgKi9cbiAgcHVibGljIGdldFBhZ2VCeU5hbWUobmFtZTogc3RyaW5nKTogUGFnZU1vZGVsIHtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMucGFnZXNbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gdGhpcy5wYWdlc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJlcnR1bnMgYSBsaXN0IG9mIHBhZ2VzIGJ5IHRoZWlyIG5hbWVzXG4gICAqIEBwYXJhbSBuYW1lcyBhIGxpc3Qgb2YgcGFnZXMgbmFtZXNcbiAgICovXG4gIHB1YmxpYyBnZXRQYWdlc0J5TmFtZXMobmFtZXM6IHN0cmluZ1tdKTogUGFnZU1vZGVsW10ge1xuICAgIHZhciByZXN1bHQ6IFBhZ2VNb2RlbFtdID0gW107XG4gICAgaWYgKCFuYW1lcykgcmV0dXJuIHJlc3VsdDtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghbmFtZXNbaV0pIGNvbnRpbnVlO1xuICAgICAgdmFyIHBhZ2UgPSB0aGlzLmdldFBhZ2VCeU5hbWUobmFtZXNbaV0pO1xuICAgICAgaWYgKHBhZ2UpIHJlc3VsdC5wdXNoKHBhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBxdWVzdGlvbnMgaW4gdGhlIHN1cnZleVxuICAgKiBAcGFyYW0gdmlzaWJsZU9ubHkgc2V0IGl0IHRydWUsIGlmIHlvdSB3YW50IHRvIGdldCBvbmx5IHZpc2libGUgcXVlc3Rpb25zXG4gICAqL1xuICBwdWJsaWMgZ2V0QWxsUXVlc3Rpb25zKFxuICAgIHZpc2libGVPbmx5OiBib29sZWFuID0gZmFsc2UsXG4gICAgaW5jbHVkaW5nRGVzaWduVGltZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEFycmF5PElRdWVzdGlvbj4ge1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8SVF1ZXN0aW9uPigpO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzW2ldLmFkZFF1ZXN0aW9uc1RvTGlzdChcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICB2aXNpYmxlT25seSxcbiAgICAgICAgaW5jbHVkaW5nRGVzaWduVGltZVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBxdWl6IHF1ZXN0aW9ucy4gQWxsIHZpc2libGUgcXVlc3Rpb25zIHRoYXQgaGFzIGlucHV0KHMpIHdpZGdldHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0UXVpelF1ZXN0aW9ucygpOiBBcnJheTxJUXVlc3Rpb24+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PElRdWVzdGlvbj4oKTtcbiAgICB2YXIgc3RhcnRJbmRleCA9IHRoaXMuZmlyc3RQYWdlSXNTdGFydGVkID8gMSA6IDA7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMucGFnZXNbaV0uaXNWaXNpYmxlKSBjb250aW51ZTtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnBhZ2VzW2ldLnF1ZXN0aW9ucztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBxID0gcXVlc3Rpb25zW2pdO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcS5pc1Zpc2libGUgJiZcbiAgICAgICAgICBxLmhhc0lucHV0ICYmXG4gICAgICAgICAgIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHEuY29ycmVjdEFuc3dlcilcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2gocSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHBhbmVsIGJ5IGl0cyBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIGEgcGFuZWwgbmFtZVxuICAgKiBAcGFyYW0gY2FzZUluc2Vuc2l0aXZlXG4gICAqIEBzZWUgZ2V0UXVlc3Rpb25CeU5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRQYW5lbEJ5TmFtZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY2FzZUluc2Vuc2l0aXZlOiBib29sZWFuID0gZmFsc2VcbiAgKTogSVBhbmVsIHtcbiAgICB2YXIgcGFuZWxzID0gdGhpcy5nZXRBbGxQYW5lbHMoKTtcbiAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYW5lbE5hbWUgPSBwYW5lbHNbaV0ubmFtZTtcbiAgICAgIGlmIChjYXNlSW5zZW5zaXRpdmUpIHBhbmVsTmFtZSA9IHBhbmVsTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHBhbmVsTmFtZSA9PSBuYW1lKSByZXR1cm4gcGFuZWxzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgcGFuZWxzIGluIHRoZSBzdXJ2ZXlcbiAgICovXG4gIHB1YmxpYyBnZXRBbGxQYW5lbHMoXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8SVBhbmVsPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxJUGFuZWw+KCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0uYWRkUGFuZWxzSW50b0xpc3QocmVzdWx0LCB2aXNpYmxlT25seSwgaW5jbHVkaW5nRGVzaWduVGltZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1BhZ2UobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBQYWdlTW9kZWwobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIHF1ZXN0aW9uT25WYWx1ZUNoYW5naW5nKHZhbHVlTmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5vblZhbHVlQ2hhbmdpbmcuaXNFbXB0eSkgcmV0dXJuIG5ld1ZhbHVlO1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgbmFtZTogdmFsdWVOYW1lLFxuICAgICAgcXVlc3Rpb246IHRoaXMuZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZSh2YWx1ZU5hbWUpLFxuICAgICAgdmFsdWU6IG5ld1ZhbHVlLFxuICAgICAgb2xkVmFsdWU6IHRoaXMuZ2V0VmFsdWUodmFsdWVOYW1lKVxuICAgIH07XG4gICAgdGhpcy5vblZhbHVlQ2hhbmdpbmcuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy52YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlUXVlc3Rpb25WYWx1ZSh2YWx1ZU5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWVDb3JlKHZhbHVlTmFtZSk7XG4gICAgaWYgKCEhcXVlc3Rpb25zKSB7XG4gICAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLmlzVHdvVmFsdWVFcXVhbHMocXVlc3Rpb25zW2ldLnZhbHVlLCBuZXdWYWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgICBxdWVzdGlvbnNbaV0udXBkYXRlVmFsdWVGcm9tU3VydmV5KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIG5vdGlmeVF1ZXN0aW9uT25WYWx1ZUNoYW5nZWQodmFsdWVOYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldFF1ZXN0aW9uc0J5VmFsdWVOYW1lQ29yZSh2YWx1ZU5hbWUpO1xuICAgIGlmICghIXF1ZXN0aW9ucykge1xuICAgICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcXVlc3Rpb24gPSBxdWVzdGlvbnNbaV07XG4gICAgICAgIGlmICh0aGlzLmNoZWNrRXJyb3JzTW9kZSA9PSBcIm9uVmFsdWVDaGFuZ2VkXCIpIHtcbiAgICAgICAgICB2YXIgb2xkRXJyb3JDb3VudCA9IHF1ZXN0aW9uLmVycm9ycy5sZW5ndGg7XG4gICAgICAgICAgcXVlc3Rpb24uaGFzRXJyb3JzKHRydWUpO1xuICAgICAgICAgIGlmIChvbGRFcnJvckNvdW50ID4gMCB8fCBxdWVzdGlvbi5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5maXJlVmFsaWRhdGVkRXJyb3JzT25DdXJyZW50UGFnZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWVzdGlvbi5vblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZSk7XG4gICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgICAgbmFtZTogdmFsdWVOYW1lLFxuICAgICAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgICAgICB2YWx1ZTogbmV3VmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgIG5hbWU6IHZhbHVlTmFtZSxcbiAgICAgICAgcXVlc3Rpb246IG51bGwsXG4gICAgICAgIHZhbHVlOiBuZXdWYWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMubm90aWZ5RWxlbWVudHNPbkFueVZhbHVlT3JWYXJpYWJsZUNoYW5nZWQodmFsdWVOYW1lKTtcbiAgfVxuICBwcml2YXRlIG5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmlzRW5kTG9hZGluZ0Zyb21Kc29uID09PSBcInByb2Nlc3NpbmdcIikgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzRW5kTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgdXBkYXRlQWxsUXVlc3Rpb25zVmFsdWUoKSB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0QWxsUXVlc3Rpb25zKCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICBxLnVwZGF0ZVZhbHVlRnJvbVN1cnZleSh0aGlzLmdldFZhbHVlKHEuZ2V0VmFsdWVOYW1lKCkpKTtcbiAgICAgIHEudXBkYXRlQ29tbWVudEZyb21TdXJ2ZXkodGhpcy5nZXRDb21tZW50KHEuZ2V0VmFsdWVOYW1lKCkpKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBub3RpZnlBbGxRdWVzdGlvbnNPblZhbHVlQ2hhbmdlZCgpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0ub25TdXJ2ZXlWYWx1ZUNoYW5nZWQoXG4gICAgICAgIHRoaXMuZ2V0VmFsdWUocXVlc3Rpb25zW2ldLmdldFZhbHVlTmFtZSgpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjaGVja09uUGFnZVRyaWdnZXJzKCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEN1cnJlbnRQYWdlUXVlc3Rpb25zKCk7XG4gICAgdmFyIHZhbHVlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgIHZhciBuYW1lID0gcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCk7XG4gICAgICB2YWx1ZXNbbmFtZV0gPSB0aGlzLmdldFZhbHVlKG5hbWUpO1xuICAgIH1cbiAgICB0aGlzLmNoZWNrVHJpZ2dlcnModmFsdWVzLCB0cnVlKTtcbiAgfVxuICBwcml2YXRlIGdldEN1cnJlbnRQYWdlUXVlc3Rpb25zKCk6IEFycmF5PFF1ZXN0aW9uPiB7XG4gICAgdmFyIHJlc3VsdDogQXJyYXk8UXVlc3Rpb24+ID0gW107XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIGlmICghcGFnZSkgcmV0dXJuIHJlc3VsdDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2UucXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSBwYWdlLnF1ZXN0aW9uc1tpXTtcbiAgICAgIGlmICghcXVlc3Rpb24udmlzaWJsZSB8fCAhcXVlc3Rpb24ubmFtZSkgY29udGludWU7XG4gICAgICByZXN1bHQucHVzaChxdWVzdGlvbik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBjaGVja1RyaWdnZXJzKGtleTogYW55LCBpc09uTmV4dFBhZ2U6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5pc0NvbXBsZXRlZCB8fCB0aGlzLnRyaWdnZXJzLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMudHJpZ2dlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0cmlnZ2VyID0gdGhpcy50cmlnZ2Vyc1tpXTtcbiAgICAgIGlmICh0cmlnZ2VyLmlzT25OZXh0UGFnZSA9PSBpc09uTmV4dFBhZ2UpIHtcbiAgICAgICAgdHJpZ2dlci5jaGVja0V4cHJlc3Npb24oa2V5LCB2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGRvRWxlbWVudHNPbkxvYWQoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzW2ldLm9uU3VydmV5TG9hZCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHJ1bkNvbmRpdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuaXNDb21wbGV0ZWQgfHwgdGhpcy5pc0VuZExvYWRpbmdGcm9tSnNvbiA9PT0gXCJwcm9jZXNzaW5nXCIpIHJldHVybjtcbiAgICB2YXIgcGFnZXMgPSB0aGlzLnBhZ2VzO1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmdldEZpbHRlcmVkVmFsdWVzKCk7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEZpbHRlcmVkUHJvcGVydGllcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBhZ2VzW2ldLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU2VuZCB0aGUgc3VydmV5IHJlc3VsdCBpbnRvIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlLlxuICAgKiBAcGFyYW0gcG9zdElkIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlIHBvc3RJZFxuICAgKiBAcGFyYW0gY2xpZW50SWQgVHlwaWNhbGx5IGEgY3VzdG9tZXIgZS1tYWlsIG9yIGFuIGlkZW50aWZpY2F0b3JcbiAgICogQHBhcmFtIGlzUGFydGlhbENvbXBsZXRlZCBTZXQgaXQgdG8gdHJ1ZSBpZiB0aGUgc3VydmV5IGlzIG5vdCBjb21wbGV0ZWQgeWV0IGFuZCBpdCBpcyBhbiBpbnRlcm1lZGlhdGUgcmVzdWx0c1xuICAgKiBAc2VlIHN1cnZleVBvc3RJZFxuICAgKiBAc2VlIGNsaWVudElkXG4gICAqL1xuICBwdWJsaWMgc2VuZFJlc3VsdChcbiAgICBwb3N0SWQ6IHN0cmluZyA9IG51bGwsXG4gICAgY2xpZW50SWQ6IHN0cmluZyA9IG51bGwsXG4gICAgaXNQYXJ0aWFsQ29tcGxldGVkOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmlzRWRpdE1vZGUpIHJldHVybjtcbiAgICBpZiAoaXNQYXJ0aWFsQ29tcGxldGVkICYmIHRoaXMub25QYXJ0aWFsU2VuZCkge1xuICAgICAgdGhpcy5vblBhcnRpYWxTZW5kLmZpcmUodGhpcywgbnVsbCk7XG4gICAgfVxuXG4gICAgaWYgKCFwb3N0SWQgJiYgdGhpcy5zdXJ2ZXlQb3N0SWQpIHtcbiAgICAgIHBvc3RJZCA9IHRoaXMuc3VydmV5UG9zdElkO1xuICAgIH1cbiAgICBpZiAoIXBvc3RJZCkgcmV0dXJuO1xuICAgIGlmIChjbGllbnRJZCkge1xuICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkO1xuICAgIH1cbiAgICBpZiAoaXNQYXJ0aWFsQ29tcGxldGVkICYmICF0aGlzLmNsaWVudElkKSByZXR1cm47XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICh0aGlzLnN1cnZleVNob3dEYXRhU2F2aW5nKSB7XG4gICAgICB0aGlzLnNldENvbXBsZXRlZFN0YXRlKFwic2F2aW5nXCIsIFwiXCIpO1xuICAgIH1cbiAgICB0aGlzLmNyZWF0ZVN1cnZleVNlcnZpY2UoKS5zZW5kUmVzdWx0KFxuICAgICAgcG9zdElkLFxuICAgICAgdGhpcy5kYXRhLFxuICAgICAgZnVuY3Rpb24oc3VjY2VzczogYm9vbGVhbiwgcmVzcG9uc2U6IGFueSwgcmVxdWVzdDogYW55KSB7XG4gICAgICAgIGlmIChzZWxmLnN1cnZleVNob3dEYXRhU2F2aW5nKSB7XG4gICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHNlbGYuc2V0Q29tcGxldGVkU3RhdGUoXCJzdWNjZXNzXCIsIFwiXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLnNldENvbXBsZXRlZFN0YXRlKFwiZXJyb3JcIiwgXCJcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNlbGYub25TZW5kUmVzdWx0LmZpcmUoc2VsZiwge1xuICAgICAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3MsXG4gICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLFxuICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgdGhpcy5jbGllbnRJZCxcbiAgICAgIGlzUGFydGlhbENvbXBsZXRlZFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIEl0IGNhbGxzIHRoZSBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZSBhbmQgb24gY2FsbGJhY2sgZmlyZXMgb25HZXRSZXN1bHQgZXZlbnQgd2l0aCBhbGwgYW5zd2VycyB0aGF0IHlvdXIgdXNlcnMgbWFkZSBmb3IgYSBxdWVzdGlvbi5cbiAgICogQHBhcmFtIHJlc3VsdElkIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlIHJlc3VsdElkXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBxdWVzdGlvbiBuYW1lXG4gICAqIEBzZWUgb25HZXRSZXN1bHRcbiAgICovXG4gIHB1YmxpYyBnZXRSZXN1bHQocmVzdWx0SWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuY3JlYXRlU3VydmV5U2VydmljZSgpLmdldFJlc3VsdChyZXN1bHRJZCwgbmFtZSwgZnVuY3Rpb24oXG4gICAgICBzdWNjZXNzOiBib29sZWFuLFxuICAgICAgZGF0YTogYW55LFxuICAgICAgZGF0YUxpc3Q6IGFueVtdLFxuICAgICAgcmVzcG9uc2U6IGFueVxuICAgICkge1xuICAgICAgc2VsZi5vbkdldFJlc3VsdC5maXJlKHNlbGYsIHtcbiAgICAgICAgc3VjY2Vzczogc3VjY2VzcyxcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgZGF0YUxpc3Q6IGRhdGFMaXN0LFxuICAgICAgICByZXNwb25zZTogcmVzcG9uc2VcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgc3VydmV5IEpzb24gZnJvbSB0aGUgW2R4c3VydmV5LmNvbV0oaHR0cDovL3d3dy5keHN1cnZleS5jb20pIHNlcnZpY2UuIElmIGNsaWVudElkIGlzIG5vdCBudWxsIGFuZCB1c2VyIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCB0aGUgc3VydmV5LCB0aGUgc3VydmV5IHdpbGwgZ28gaW50byBcImNvbXBsZXRlZGJlZm9yZVwiIHN0YXRlLlxuICAgKiBAcGFyYW0gc3VydmV5SWQgW2R4c3VydmV5LmNvbV0oaHR0cDovL3d3dy5keHN1cnZleS5jb20pIHNlcnZpY2Ugc3VydmV5SWRcbiAgICogQHBhcmFtIGNsaWVudElkIGluZGVudGlmaWNhdG9yIGZvciBhIHVzZXIsIGZvciBleGFtcGxlIGUtbWFpbCBvciB1bmlxdWUgY3VzdG9tZXIgaWQgaW4geW91ciB3ZWIgYXBwbGljYXRpb24uXG4gICAqIEBzZWUgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBsb2FkU3VydmV5RnJvbVNlcnZpY2UoXG4gICAgc3VydmV5SWQ6IHN0cmluZyA9IG51bGwsXG4gICAgY2xpZW5kSWQ6IHN0cmluZyA9IG51bGxcbiAgKSB7XG4gICAgaWYgKHN1cnZleUlkKSB7XG4gICAgICB0aGlzLnN1cnZleUlkID0gc3VydmV5SWQ7XG4gICAgfVxuICAgIGlmIChjbGllbmRJZCkge1xuICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVuZElkO1xuICAgIH1cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMub25Mb2FkaW5nU3VydmV5RnJvbVNlcnZpY2UoKTtcbiAgICBpZiAoY2xpZW5kSWQpIHtcbiAgICAgIHRoaXMuY3JlYXRlU3VydmV5U2VydmljZSgpLmdldFN1cnZleUpzb25BbmRJc0NvbXBsZXRlZChcbiAgICAgICAgdGhpcy5zdXJ2ZXlJZCxcbiAgICAgICAgdGhpcy5jbGllbnRJZCxcbiAgICAgICAgZnVuY3Rpb24oXG4gICAgICAgICAgc3VjY2VzczogYm9vbGVhbixcbiAgICAgICAgICBqc29uOiBzdHJpbmcsXG4gICAgICAgICAgaXNDb21wbGV0ZWQ6IHN0cmluZyxcbiAgICAgICAgICByZXNwb25zZTogYW55XG4gICAgICAgICkge1xuICAgICAgICAgIHNlbGYuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHNlbGYuaXNDb21wbGV0ZWRCZWZvcmUgPSBpc0NvbXBsZXRlZCA9PSBcImNvbXBsZXRlZFwiO1xuICAgICAgICAgICAgc2VsZi5sb2FkU3VydmV5RnJvbVNlcnZpY2VKc29uKGpzb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jcmVhdGVTdXJ2ZXlTZXJ2aWNlKCkubG9hZFN1cnZleSh0aGlzLnN1cnZleUlkLCBmdW5jdGlvbihcbiAgICAgICAgc3VjY2VzczogYm9vbGVhbixcbiAgICAgICAgcmVzdWx0OiBzdHJpbmcsXG4gICAgICAgIHJlc3BvbnNlOiBhbnlcbiAgICAgICkge1xuICAgICAgICBzZWxmLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIHNlbGYubG9hZFN1cnZleUZyb21TZXJ2aWNlSnNvbihyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBsb2FkU3VydmV5RnJvbVNlcnZpY2VKc29uKGpzb246IGFueSkge1xuICAgIGlmICghanNvbikgcmV0dXJuO1xuICAgIHRoaXMuc2V0SnNvbk9iamVjdChqc29uKTtcbiAgICB0aGlzLm5vdGlmeUFsbFF1ZXN0aW9uc09uVmFsdWVDaGFuZ2VkKCk7XG4gICAgdGhpcy5vbkxvYWRTdXJ2ZXlGcm9tU2VydmljZSgpO1xuICB9XG4gIHByb3RlY3RlZCBvbkxvYWRpbmdTdXJ2ZXlGcm9tU2VydmljZSgpIHt9XG4gIHByb3RlY3RlZCBvbkxvYWRTdXJ2ZXlGcm9tU2VydmljZSgpIHt9XG4gIHByaXZhdGUgdXBkYXRlVmlzaWJsZUluZGV4ZXMoKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHwgISF0aGlzLmlzRW5kTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy51cGRhdGVQYWdlVmlzaWJsZUluZGV4ZXModGhpcy5zaG93UGFnZU51bWJlcnMpO1xuICAgIGlmICh0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgPT0gXCJvblBhZ2VcIikge1xuICAgICAgdmFyIHZpc1BhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpc1BhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZpc1BhZ2VzW2ldLnNldFZpc2libGVJbmRleCgwKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGluZGV4ID0gdGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzID09IFwib25cIiA/IDAgOiAtMTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpbmRleCArPSB0aGlzLnBhZ2VzW2ldLnNldFZpc2libGVJbmRleChpbmRleCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgdXBkYXRlUGFnZVZpc2libGVJbmRleGVzKHNob3dJbmRleDogYm9vbGVhbikge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzW2ldLnZpc2libGVJbmRleCA9IHRoaXMucGFnZXNbaV0udmlzaWJsZSA/IGluZGV4KysgOiAtMTtcbiAgICAgIHRoaXMucGFnZXNbaV0ubnVtID1cbiAgICAgICAgc2hvd0luZGV4ICYmIHRoaXMucGFnZXNbaV0udmlzaWJsZVxuICAgICAgICAgID8gdGhpcy5wYWdlc1tpXS52aXNpYmxlSW5kZXggKyAxXG4gICAgICAgICAgOiAtMTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHNldEpzb25PYmplY3QoanNvbk9iajogYW55KSB7XG4gICAgaWYgKCFqc29uT2JqKSByZXR1cm47XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlc0NsZWFyKCk7XG4gICAgdGhpcy5qc29uRXJyb3JzID0gbnVsbDtcbiAgICB2YXIganNvbkNvbnZlcnRlciA9IG5ldyBKc29uT2JqZWN0KCk7XG4gICAganNvbkNvbnZlcnRlci50b09iamVjdChqc29uT2JqLCB0aGlzKTtcbiAgICBpZiAoanNvbkNvbnZlcnRlci5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5qc29uRXJyb3JzID0ganNvbkNvbnZlcnRlci5lcnJvcnM7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaXNFbmRMb2FkaW5nRnJvbUpzb246IHN0cmluZyA9IG51bGw7XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICB0aGlzLmlzRW5kTG9hZGluZ0Zyb21Kc29uID0gXCJwcm9jZXNzaW5nXCI7XG4gICAgdGhpcy5pc1N0YXJ0ZWRTdGF0ZSA9IHRoaXMuZmlyc3RQYWdlSXNTdGFydGVkO1xuICAgIHRoaXMub25Jc1NpbmdsZVBhZ2VDaGFuZ2VkKCk7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgaWYgKHRoaXMuaGFzQ29va2llKSB7XG4gICAgICB0aGlzLmRvQ29tcGxldGUoKTtcbiAgICB9XG4gICAgdGhpcy5kb0VsZW1lbnRzT25Mb2FkKCk7XG4gICAgdGhpcy5pc0VuZExvYWRpbmdGcm9tSnNvbiA9IFwiY29uZGl0aW9uc1wiO1xuICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICAgIHRoaXMubm90aWZ5RWxlbWVudHNPbkFueVZhbHVlT3JWYXJpYWJsZUNoYW5nZWQoXCJcIik7XG4gICAgdGhpcy5pc0VuZExvYWRpbmdGcm9tSnNvbiA9IG51bGw7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICB9XG4gIHByb3RlY3RlZCBvbkJlZm9yZUNyZWF0aW5nKCkge31cbiAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7fVxuICBwcml2YXRlIGdldFByb2Nlc3NlZFRleHRWYWx1ZSh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMuZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlQ29yZSh0ZXh0VmFsdWUpO1xuICAgIGlmICghdGhpcy5vblByb2Nlc3NUZXh0VmFsdWUuaXNFbXB0eSkge1xuICAgICAgdmFyIHdhc0VtcHR5ID0gdGhpcy5pc1ZhbHVlRW1wdHkodGV4dFZhbHVlLnZhbHVlKTtcbiAgICAgIHRoaXMub25Qcm9jZXNzVGV4dFZhbHVlLmZpcmUodGhpcywgdGV4dFZhbHVlKTtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9XG4gICAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyB8fCAod2FzRW1wdHkgJiYgIXRoaXMuaXNWYWx1ZUVtcHR5KHRleHRWYWx1ZS52YWx1ZSkpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFByb2Nlc3NlZFRleHRWYWx1ZUNvcmUodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpOiB2b2lkIHtcbiAgICB2YXIgbmFtZSA9IHRleHRWYWx1ZS5uYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgaWYgKFtcIm5vXCIsIFwicmVxdWlyZVwiLCBcInRpdGxlXCJdLmluZGV4T2YobmFtZSkgIT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcInBhZ2Vub1wiKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gcGFnZSAhPSBudWxsID8gdGhpcy52aXNpYmxlUGFnZXMuaW5kZXhPZihwYWdlKSArIDEgOiAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJwYWdlY291bnRcIikge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHRoaXMudmlzaWJsZVBhZ2VDb3VudDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwibG9jYWxlXCIpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSAhIXRoaXMubG9jYWxlXG4gICAgICAgID8gdGhpcy5sb2NhbGVcbiAgICAgICAgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZGVmYXVsdExvY2FsZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiY29ycmVjdGVkYW5zd2Vyc1wiIHx8IG5hbWUgPT09IFwiY29ycmVjdGVkYW5zd2VyY291bnRcIikge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHRoaXMuZ2V0Q29ycmVjdGVkQW5zd2VyQ291bnQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaW5jb3JyZWN0ZWRhbnN3ZXJzXCIgfHwgbmFtZSA9PT0gXCJpbmNvcnJlY3RlZGFuc3dlcmNvdW50XCIpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSB0aGlzLmdldEluQ29ycmVjdGVkQW5zd2VyQ291bnQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwicXVlc3Rpb25jb3VudFwiKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gdGhpcy5nZXRRdWl6UXVlc3Rpb25zKCkubGVuZ3RoO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZmlyc3ROYW1lID0gbmV3IFByb2Nlc3NWYWx1ZSgpLmdldEZpcnN0TmFtZShuYW1lLCB0aGlzLmRhdGEpO1xuICAgIHZhciB2YXJpYWJsZSA9IHRoaXMuZ2V0VmFyaWFibGUobmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSB2YXJpYWJsZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCEhZmlyc3ROYW1lKSBmaXJzdE5hbWUgPSBmaXJzdE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUoZmlyc3ROYW1lLCB0cnVlKTtcbiAgICBpZiAocXVlc3Rpb24pIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICBuYW1lID0gcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCkgKyBuYW1lLnN1YnN0cihmaXJzdE5hbWUubGVuZ3RoKTtcbiAgICAgIG5hbWUgPSBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgdmFsdWVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICAgIHZhbHVlc1tmaXJzdE5hbWVdID0gdGV4dFZhbHVlLnJldHVybkRpc3BsYXlWYWx1ZVxuICAgICAgICA/IHF1ZXN0aW9uLmdldERpc3BsYXlWYWx1ZShmYWxzZSlcbiAgICAgICAgOiBxdWVzdGlvbi52YWx1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRWYWx1ZShuYW1lLCB2YWx1ZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKHRleHRWYWx1ZS5uYW1lKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNsZWFyVW51c2VkVmFsdWVzKCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5jbGVhclVudXNlZFZhbHVlcygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jbGVhckludmlzaWJsZVZhbHVlcyAhPSBcIm5vbmVcIikge1xuICAgICAgdGhpcy5jbGVhckludmlzaWJsZVF1ZXN0aW9uVmFsdWVzKCk7XG4gICAgfVxuICB9XG4gIGhhc1Zpc2libGVRdWVzdGlvbkJ5VmFsdWVOYW1lKHZhbHVlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWVDb3JlKHZhbHVlTmFtZSk7XG4gICAgaWYgKCFxdWVzdGlvbnMpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocXVlc3Rpb25zW2ldLmlzVmlzaWJsZSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBxdWVzdGlvbkNvdW50QnlWYWx1ZU5hbWUodmFsdWVOYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldFF1ZXN0aW9uc0J5VmFsdWVOYW1lQ29yZSh2YWx1ZU5hbWUpO1xuICAgIHJldHVybiAhIXF1ZXN0aW9ucyA/IHF1ZXN0aW9ucy5sZW5ndGggOiAwO1xuICB9XG4gIHByaXZhdGUgY2xlYXJJbnZpc2libGVRdWVzdGlvblZhbHVlcygpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0uY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdmFyaWFibGUgdmFsdWUuIFZhcmlhYmxlLCB1bmxpa2UgdmFsdWVzLCBhcmUgbm90IHN0b3JlZCBpbiB0aGUgc3VydmV5IHJlc3VsdHMuXG4gICAqIEBwYXJhbSBuYW1lIEEgdmFyaWFibGUgbmFtZVxuICAgKiBAc2VlIFNldFZhcmlhYmxlXG4gICAqL1xuICBwdWJsaWMgZ2V0VmFyaWFibGUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIW5hbWUpIHJldHVybiBudWxsO1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHRoaXMudmFyaWFibGVzSGFzaFtuYW1lXTtcbiAgfVxuICAvKipcbiAgICogU2V0cyBhIHZhcmlhYmxlIHZhbHVlLiBWYXJpYWJsZSwgdW5saWtlIHZhbHVlcywgYXJlIG5vdCBzdG9yZWQgaW4gdGhlIHN1cnZleSByZXN1bHRzLlxuICAgKiBAcGFyYW0gbmFtZSBBIHZhcmlhYmxlIG5hbWVcbiAgICogQHBhcmFtIG5ld1ZhbHVlXG4gICAqIEBzZWUgR2V0VmFyaWFibGVcbiAgICovXG4gIHB1YmxpYyBzZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybjtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMudmFyaWFibGVzSGFzaFtuYW1lXSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMubm90aWZ5RWxlbWVudHNPbkFueVZhbHVlT3JWYXJpYWJsZUNoYW5nZWQobmFtZSk7XG4gICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gIH1cbiAgLy9JU3VydmV5IGRhdGFcbiAgcHJvdGVjdGVkIGdldFVuYmluZFZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBIZWxwZXJzLmdldFVuYmluZFZhbHVlKHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHF1ZXN0aW9uIHZhbHVlXG4gICAqIEBwYXJhbSBuYW1lIEEgcXVlc3Rpb24gbmFtZVxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBzZXRWYWx1ZVxuICAgKi9cbiAgcHVibGljIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFuYW1lIHx8IG5hbWUubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0RGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIG5hbWUpO1xuICAgIHJldHVybiB0aGlzLmdldFVuYmluZFZhbHVlKHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogU2V0cyBhIHF1ZXN0aW9uIHZhbHVlLiBJdCBydW5zIGFsbCB0cmlnZ2VycyBhbmQgY29uZGl0aW9ucyAodmlzaWJsZUlmIHByb3BlcnRpZXMpLiBHb2VzIHRvIHRoZSBuZXh0IHBhZ2UgaWYgZ29OZXh0UGFnZUF1dG9tYXRpYyBpcyB0cnVlIGFuZCBhbGwgcXVlc3Rpb25zIG9uIHRoZSBjdXJyZW50IHBhZ2UgYXJlIGFuc3dlcmVkIGNvcnJlY3RseS5cbiAgICogQHBhcmFtIG5hbWUgQSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBuZXdWYWx1ZVxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBnZXRWYWx1ZVxuICAgKiBAc2VlIFBhZ2VNb2RlbC52aXNpYmxlSWZcbiAgICogQHNlZSBRdWVzdGlvbi52aXNpYmxlSWZcbiAgICogQHNlZSBnb05leHRQYWdlQXV0b21hdGljXG4gICAqL1xuICBwdWJsaWMgc2V0VmFsdWUobmFtZTogc3RyaW5nLCBuZXdRdWVzdGlvblZhbHVlOiBhbnkpIHtcbiAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLnF1ZXN0aW9uT25WYWx1ZUNoYW5naW5nKG5hbWUsIG5ld1F1ZXN0aW9uVmFsdWUpO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNWYWx1ZUVxdWFsKG5hbWUsIG5ld1ZhbHVlKSAmJlxuICAgICAgdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKG5ld1ZhbHVlLCBuZXdRdWVzdGlvblZhbHVlKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkobmV3VmFsdWUpKSB7XG4gICAgICB0aGlzLmRlbGV0ZURhdGFWYWx1ZUNvcmUodGhpcy52YWx1ZXNIYXNoLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3VmFsdWUgPSB0aGlzLmdldFVuYmluZFZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgIHRoaXMuc2V0RGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIG5hbWUsIG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVRdWVzdGlvblZhbHVlKG5hbWUsIG5ld1ZhbHVlKTtcbiAgICB2YXIgdHJpZ2dlcktleXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIHRyaWdnZXJLZXlzW25hbWVdID0gbmV3VmFsdWU7XG4gICAgdGhpcy5jaGVja1RyaWdnZXJzKHRyaWdnZXJLZXlzLCBmYWxzZSk7XG4gICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gICAgdGhpcy5ub3RpZnlRdWVzdGlvbk9uVmFsdWVDaGFuZ2VkKG5hbWUsIG5ld1ZhbHVlKTtcbiAgICB0aGlzLnRyeUdvTmV4dFBhZ2VBdXRvbWF0aWMobmFtZSk7XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlRXF1YWwobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKG5ld1ZhbHVlID09PSBcIlwiIHx8IG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIG5ld1ZhbHVlID0gbnVsbDtcbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKG5hbWUpO1xuICAgIGlmIChvbGRWYWx1ZSA9PT0gXCJcIiB8fCBvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSBvbGRWYWx1ZSA9IG51bGw7XG4gICAgaWYgKG5ld1ZhbHVlID09PSBudWxsIHx8IG9sZFZhbHVlID09PSBudWxsKSByZXR1cm4gbmV3VmFsdWUgPT09IG9sZFZhbHVlO1xuICAgIHJldHVybiB0aGlzLmlzVHdvVmFsdWVFcXVhbHMobmV3VmFsdWUsIG9sZFZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9PblBhZ2VBZGRlZChwYWdlOiBQYWdlTW9kZWwpIHtcbiAgICBwYWdlLnNldFN1cnZleUltcGwodGhpcyk7XG4gICAgaWYgKCFwYWdlLm5hbWUpIHBhZ2UubmFtZSA9IHRoaXMuZ2VuZXJhdGVOZXdOYW1lKHRoaXMucGFnZXMsIFwicGFnZVwiKTtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzUGFuZWxBZGRlZChwYWdlKTtcbiAgICB2YXIgb3B0aW9ucyA9IHsgcGFnZTogcGFnZSB9O1xuICAgIHRoaXMub25QYWdlQWRkZWQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBwcml2YXRlIGdlbmVyYXRlTmV3TmFtZShlbGVtZW50czogQXJyYXk8YW55PiwgYmFzZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIGtleXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIGtleXNbZWxlbWVudHNbaV1bXCJuYW1lXCJdXSA9IHRydWU7XG4gICAgdmFyIGluZGV4ID0gMTtcbiAgICB3aGlsZSAoa2V5c1tiYXNlTmFtZSArIGluZGV4XSkgaW5kZXgrKztcbiAgICByZXR1cm4gYmFzZU5hbWUgKyBpbmRleDtcbiAgfVxuICBwcm90ZWN0ZWQgdHJ5R29OZXh0UGFnZUF1dG9tYXRpYyhuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24gfHxcbiAgICAgICF0aGlzLmdvTmV4dFBhZ2VBdXRvbWF0aWMgfHxcbiAgICAgICF0aGlzLmN1cnJlbnRQYWdlXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIHZhciBxdWVzdGlvbiA9IDxRdWVzdGlvbj50aGlzLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUobmFtZSk7XG4gICAgaWYgKFxuICAgICAgIXF1ZXN0aW9uIHx8XG4gICAgICAoISFxdWVzdGlvbiAmJlxuICAgICAgICAoIXF1ZXN0aW9uLnZpc2libGUgfHwgIXF1ZXN0aW9uLnN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkpKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRDdXJyZW50UGFnZVF1ZXN0aW9ucygpO1xuICAgIGlmIChxdWVzdGlvbnMuaW5kZXhPZihxdWVzdGlvbikgPCAwKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChxdWVzdGlvbnNbaV0uaGFzSW5wdXQgJiYgcXVlc3Rpb25zW2ldLmlzRW1wdHkoKSkgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY2hlY2tJc0N1cnJlbnRQYWdlSGFzRXJyb3JzKGZhbHNlKSkge1xuICAgICAgaWYgKCF0aGlzLmlzTGFzdFBhZ2UpIHtcbiAgICAgICAgdGhpcy5uZXh0UGFnZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuZ29OZXh0UGFnZUF1dG9tYXRpYyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMuY29tcGxldGVMYXN0UGFnZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb21tZW50IHZhbHVlXG4gICAqIEBwYXJhbSBuYW1lXG4gICAqIEBzZWUgc2V0Q29tbWVudFxuICAgKi9cbiAgcHVibGljIGdldENvbW1lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhW25hbWUgKyB0aGlzLmNvbW1lbnRQcmVmaXhdO1xuICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gXCJcIjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIGNvbW1lbnQgdmFsdWVcbiAgICogQHBhcmFtIG5hbWVcbiAgICogQHBhcmFtIG5ld1ZhbHVlXG4gICAqIEBzZWUgZ2V0Q29tbWVudFxuICAgKi9cbiAgcHVibGljIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCFuZXdWYWx1ZSkgbmV3VmFsdWUgPSBcIlwiO1xuICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMobmV3VmFsdWUsIHRoaXMuZ2V0Q29tbWVudChuYW1lKSkpIHJldHVybjtcbiAgICB2YXIgY29tbWVudE5hbWUgPSBuYW1lICsgdGhpcy5jb21tZW50UHJlZml4O1xuICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eShuZXdWYWx1ZSkpIHtcbiAgICAgIHRoaXMuZGVsZXRlRGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIGNvbW1lbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwgY29tbWVudE5hbWUsIG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWVDb3JlKG5hbWUpO1xuICAgIGlmICghIXF1ZXN0aW9ucykge1xuICAgICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBxdWVzdGlvbnNbaV0udXBkYXRlQ29tbWVudEZyb21TdXJ2ZXkobmV3VmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnRyeUdvTmV4dFBhZ2VBdXRvbWF0aWMobmFtZSk7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICBpZiAocXVlc3Rpb24pIHtcbiAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgIG5hbWU6IGNvbW1lbnROYW1lLFxuICAgICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICAgIHZhbHVlOiBuZXdWYWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIHZhbHVlIGZyb20gdGhlIHN1cnZleSByZXN1bHQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWx1ZS4gVHlwaWNhbGx5IGl0IGlzIGEgcXVlc3Rpb24gbmFtZVxuICAgKi9cbiAgcHVibGljIGNsZWFyVmFsdWUobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRWYWx1ZShuYW1lLCBudWxsKTtcbiAgICB0aGlzLnNldENvbW1lbnQobmFtZSwgbnVsbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHZhbHVlIHRvIHRydWUsIHRvIGNsZWFyIHZhbHVlIG9uIGRpc2FibGUgaXRlbXMgaW4gY2hlY2tib3gsIGRyb3Bkb3duIGFuZCByYWRpb2dyb3VwIHF1ZXN0aW9ucy5cbiAgICogQnkgZGVmYXVsdCB2YWx1ZXMgYXJlIG5vdCBjbGVhcmVkIG9uIGRpc2FibGVkIHRoZSBjb3JyZXNwb25kZWQgaXRlbXMuIFRoaXMgcHJvcGVydHkgaXMgbm90IHBlcnNpc3RlZCBpbiBzdXJ2ZXkganNvbiBhbmQgeW91IGhhdmUgdG8gc2V0IGl0IGluIGNvZGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNsZWFyVmFsdWVPbkRpc2FibGVJdGVtcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2xlYXJWYWx1ZU9uRGlzYWJsZUl0ZW1zXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNsZWFyVmFsdWVPbkRpc2FibGVJdGVtcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjbGVhclZhbHVlT25EaXNhYmxlSXRlbXNcIiwgdmFsKTtcbiAgfVxuICBxdWVzdGlvblZpc2liaWxpdHlDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMub25WaXNpYmxlQ2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIG5hbWU6IHF1ZXN0aW9uLm5hbWUsXG4gICAgICB2aXNpYmxlOiBuZXdWYWx1ZVxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIHF1ZXN0aW9uICYmXG4gICAgICAhcXVlc3Rpb24udmlzaWJsZSAmJlxuICAgICAgdGhpcy5jbGVhckludmlzaWJsZVZhbHVlcyA9PSBcIm9uSGlkZGVuXCJcbiAgICApIHtcbiAgICAgIHF1ZXN0aW9uLmNsZWFyVmFsdWUoKTtcbiAgICB9XG4gIH1cbiAgcGFnZVZpc2liaWxpdHlDaGFuZ2VkKHBhZ2U6IElQYWdlLCBuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB0aGlzLm9uUGFnZVZpc2libGVDaGFuZ2VkLmZpcmUodGhpcywgeyBwYWdlOiBwYWdlLCB2aXNpYmxlOiBuZXdWYWx1ZSB9KTtcbiAgfVxuICBwYW5lbFZpc2liaWxpdHlDaGFuZ2VkKHBhbmVsOiBJUGFuZWwsIG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMub25QYW5lbFZpc2libGVDaGFuZ2VkLmZpcmUodGhpcywgeyBwYW5lbDogcGFuZWwsIHZpc2libGU6IG5ld1ZhbHVlIH0pO1xuICB9XG4gIHF1ZXN0aW9uQWRkZWQoXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhcmVudFBhbmVsOiBhbnksXG4gICAgcm9vdFBhbmVsOiBhbnlcbiAgKSB7XG4gICAgaWYgKCFxdWVzdGlvbi5uYW1lKSB7XG4gICAgICBxdWVzdGlvbi5uYW1lID0gdGhpcy5nZW5lcmF0ZU5ld05hbWUoXG4gICAgICAgIHRoaXMuZ2V0QWxsUXVlc3Rpb25zKGZhbHNlLCB0cnVlKSxcbiAgICAgICAgXCJxdWVzdGlvblwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoISEoPFF1ZXN0aW9uPnF1ZXN0aW9uKS5wYWdlKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzQWRkZWQoPFF1ZXN0aW9uPnF1ZXN0aW9uKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgfVxuICAgIHRoaXMub25RdWVzdGlvbkFkZGVkLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgbmFtZTogcXVlc3Rpb24ubmFtZSxcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIHBhcmVudFBhbmVsOiBwYXJlbnRQYW5lbCxcbiAgICAgIHJvb3RQYW5lbDogcm9vdFBhbmVsXG4gICAgfSk7XG4gIH1cbiAgcXVlc3Rpb25SZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pIHtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzUmVtb3ZlZChcbiAgICAgIDxRdWVzdGlvbj5xdWVzdGlvbixcbiAgICAgIHF1ZXN0aW9uLm5hbWUsXG4gICAgICBxdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKVxuICAgICk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMub25RdWVzdGlvblJlbW92ZWQuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBuYW1lOiBxdWVzdGlvbi5uYW1lXG4gICAgfSk7XG4gIH1cbiAgcXVlc3Rpb25SZW5hbWVkKFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgb2xkTmFtZTogc3RyaW5nLFxuICAgIG9sZFZhbHVlTmFtZTogc3RyaW5nXG4gICk6IGFueSB7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlc1JlbW92ZWQoPFF1ZXN0aW9uPnF1ZXN0aW9uLCBvbGROYW1lLCBvbGRWYWx1ZU5hbWUpO1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXNBZGRlZCg8UXVlc3Rpb24+cXVlc3Rpb24pO1xuICB9XG4gIHByaXZhdGUgcXVlc3Rpb25IYXNoZXMgPSB7XG4gICAgbmFtZXM6IHt9LFxuICAgIG5hbWVzSW5zZW5zaXRpdmU6IHt9LFxuICAgIHZhbHVlTmFtZXM6IHt9LFxuICAgIHZhbHVlTmFtZXNJbnNlbnNpdGl2ZToge31cbiAgfTtcbiAgcHJpdmF0ZSBxdWVzdGlvbkhhc2hlc0NsZWFyKCkge1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXMubmFtZXMgPSB7fTtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLm5hbWVzSW5zZW5zaXRpdmUgPSB7fTtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXMgPSB7fTtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXNJbnNlbnNpdGl2ZSA9IHt9O1xuICB9XG4gIHByaXZhdGUgcXVlc3Rpb25IYXNoZXNQYW5lbEFkZGVkKHBhbmVsOiBQYW5lbE1vZGVsQmFzZSkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHBhbmVsLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlc0FkZGVkKHF1ZXN0aW9uc1tpXSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcXVlc3Rpb25IYXNoZXNBZGRlZChxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaEFkZGVkQ29yZShcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoZXMubmFtZXMsXG4gICAgICBxdWVzdGlvbixcbiAgICAgIHF1ZXN0aW9uLm5hbWVcbiAgICApO1xuICAgIHRoaXMucXVlc3Rpb25IYXNoQWRkZWRDb3JlKFxuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lc0luc2Vuc2l0aXZlLFxuICAgICAgcXVlc3Rpb24sXG4gICAgICBxdWVzdGlvbi5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICApO1xuICAgIHRoaXMucXVlc3Rpb25IYXNoQWRkZWRDb3JlKFxuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlcy52YWx1ZU5hbWVzLFxuICAgICAgcXVlc3Rpb24sXG4gICAgICBxdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKVxuICAgICk7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hBZGRlZENvcmUoXG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXNJbnNlbnNpdGl2ZSxcbiAgICAgIHF1ZXN0aW9uLFxuICAgICAgcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCkudG9Mb3dlckNhc2UoKVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBxdWVzdGlvbkhhc2hlc1JlbW92ZWQoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZU5hbWU6IHN0cmluZ1xuICApIHtcbiAgICBpZiAoISFuYW1lKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaFJlbW92ZWRDb3JlKHRoaXMucXVlc3Rpb25IYXNoZXMubmFtZXMsIHF1ZXN0aW9uLCBuYW1lKTtcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoUmVtb3ZlZENvcmUoXG4gICAgICAgIHRoaXMucXVlc3Rpb25IYXNoZXMubmFtZXNJbnNlbnNpdGl2ZSxcbiAgICAgICAgcXVlc3Rpb24sXG4gICAgICAgIG5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEhdmFsdWVOYW1lKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaFJlbW92ZWRDb3JlKFxuICAgICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXMsXG4gICAgICAgIHF1ZXN0aW9uLFxuICAgICAgICB2YWx1ZU5hbWVcbiAgICAgICk7XG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaFJlbW92ZWRDb3JlKFxuICAgICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXNJbnNlbnNpdGl2ZSxcbiAgICAgICAgcXVlc3Rpb24sXG4gICAgICAgIHZhbHVlTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHF1ZXN0aW9uSGFzaEFkZGVkQ29yZShoYXNoOiBhbnksIHF1ZXN0aW9uOiBRdWVzdGlvbiwgbmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHJlcyA9IGhhc2hbbmFtZV07XG4gICAgaWYgKCEhcmVzKSB7XG4gICAgICB2YXIgcmVzID0gaGFzaFtuYW1lXTtcbiAgICAgIGlmIChyZXMuaW5kZXhPZihxdWVzdGlvbikgPCAwKSB7XG4gICAgICAgIHJlcy5wdXNoKHF1ZXN0aW9uKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGFzaFtuYW1lXSA9IFtxdWVzdGlvbl07XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcXVlc3Rpb25IYXNoUmVtb3ZlZENvcmUoaGFzaDogYW55LCBxdWVzdGlvbjogUXVlc3Rpb24sIG5hbWU6IHN0cmluZykge1xuICAgIHZhciByZXMgPSBoYXNoW25hbWVdO1xuICAgIGlmICghcmVzKSByZXR1cm47XG4gICAgdmFyIGluZGV4ID0gcmVzLmluZGV4T2YocXVlc3Rpb24pO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICByZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgaWYgKHJlcy5sZW5ndGggPT0gMCkge1xuICAgICAgZGVsZXRlIGhhc2hbbmFtZV07XG4gICAgfVxuICB9XG4gIHBhbmVsQWRkZWQocGFuZWw6IElFbGVtZW50LCBpbmRleDogbnVtYmVyLCBwYXJlbnRQYW5lbDogYW55LCByb290UGFuZWw6IGFueSkge1xuICAgIGlmICghcGFuZWwubmFtZSkge1xuICAgICAgcGFuZWwubmFtZSA9IHRoaXMuZ2VuZXJhdGVOZXdOYW1lKFxuICAgICAgICB0aGlzLmdldEFsbFBhbmVscyhmYWxzZSwgdHJ1ZSksXG4gICAgICAgIFwicGFuZWxcIlxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlc1BhbmVsQWRkZWQoPFBhbmVsTW9kZWxCYXNlPig8YW55PnBhbmVsKSk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMub25QYW5lbEFkZGVkLmZpcmUodGhpcywge1xuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgICAgbmFtZTogcGFuZWwubmFtZSxcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIHBhcmVudFBhbmVsOiBwYXJlbnRQYW5lbCxcbiAgICAgIHJvb3RQYW5lbDogcm9vdFBhbmVsXG4gICAgfSk7XG4gIH1cbiAgcGFuZWxSZW1vdmVkKHBhbmVsOiBJRWxlbWVudCkge1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB0aGlzLm9uUGFuZWxSZW1vdmVkLmZpcmUodGhpcywgeyBwYW5lbDogcGFuZWwsIG5hbWU6IHBhbmVsLm5hbWUgfSk7XG4gIH1cbiAgdmFsaWRhdGVRdWVzdGlvbihxdWVzdGlvbjogSVF1ZXN0aW9uKTogU3VydmV5RXJyb3Ige1xuICAgIGlmICh0aGlzLm9uVmFsaWRhdGVRdWVzdGlvbi5pc0VtcHR5KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIG5hbWU6IHF1ZXN0aW9uLm5hbWUsXG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICB2YWx1ZTogcXVlc3Rpb24udmFsdWUsXG4gICAgICBlcnJvcjogPGFueT5udWxsXG4gICAgfTtcbiAgICB0aGlzLm9uVmFsaWRhdGVRdWVzdGlvbi5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmVycm9yID8gbmV3IEN1c3RvbUVycm9yKG9wdGlvbnMuZXJyb3IsIHRoaXMpIDogbnVsbDtcbiAgfVxuICB2YWxpZGF0ZVBhbmVsKHBhbmVsOiBJUGFuZWwpOiBTdXJ2ZXlFcnJvciB7XG4gICAgaWYgKHRoaXMub25WYWxpZGF0ZVBhbmVsLmlzRW1wdHkpIHJldHVybiBudWxsO1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgbmFtZTogcGFuZWwubmFtZSxcbiAgICAgIHBhbmVsOiBwYW5lbCxcbiAgICAgIGVycm9yOiA8YW55Pm51bGxcbiAgICB9O1xuICAgIHRoaXMub25WYWxpZGF0ZVBhbmVsLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuZXJyb3IgPyBuZXcgQ3VzdG9tRXJyb3Iob3B0aW9ucy5lcnJvciwgdGhpcykgOiBudWxsO1xuICB9XG4gIHByb2Nlc3NIdG1sKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIG9wdGlvbnMgPSB7IGh0bWw6IGh0bWwgfTtcbiAgICB0aGlzLm9uUHJvY2Vzc0h0bWwuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzVGV4dChvcHRpb25zLmh0bWwsIHRydWUpO1xuICB9XG4gIHByb2Nlc3NUZXh0KHRleHQ6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzVGV4dEV4KHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSwgZmFsc2UpLnRleHQ7XG4gIH1cbiAgcHJvY2Vzc1RleHRFeChcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuLFxuICAgIGRvRW5jb2Rpbmc6IGJvb2xlYW5cbiAgKTogYW55IHtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgdGV4dDogdGhpcy5wcm9jZXNzVGV4dENvcmUodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlLCBkb0VuY29kaW5nKSxcbiAgICAgIGhhc0FsbFZhbHVlc09uTGFzdFJ1bjogdHJ1ZVxuICAgIH07XG4gICAgcmVzLmhhc0FsbFZhbHVlc09uTGFzdFJ1biA9IHRoaXMudGV4dFByZVByb2Nlc3Nvci5oYXNBbGxWYWx1ZXNPbkxhc3RSdW47XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHByb2Nlc3NUZXh0Q29yZShcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuLFxuICAgIGRvRW5jb2Rpbmc6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIHRleHQ7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByZVByb2Nlc3Nvci5wcm9jZXNzKHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSwgZG9FbmNvZGluZyk7XG4gIH1cbiAgZ2V0U3VydmV5TWFya2Rvd25IdG1sKGVsZW1lbnQ6IEJhc2UsIHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIG9wdGlvbnMgPSB7IGVsZW1lbnQ6IGVsZW1lbnQsIHRleHQ6IHRleHQsIGh0bWw6IDxhbnk+bnVsbCB9O1xuICAgIHRoaXMub25UZXh0TWFya2Rvd24uZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5odG1sO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29ycmVjdGVkIGFuc3dlcnMgb24gcXVpelxuICAgKi9cbiAgcHVibGljIGdldENvcnJlY3RlZEFuc3dlckNvdW50KCk6IG51bWJlciB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVpelF1ZXN0aW9ucygpO1xuICAgIHZhciBjb3VudGVyID0gMDtcbiAgICB2YXIgb3B0aW9ucyA9IHsgcXVlc3Rpb246IDxJUXVlc3Rpb24+bnVsbCwgcmVzdWx0OiBmYWxzZSB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvcHRpb25zLnF1ZXN0aW9uID0gcXVlc3Rpb25zW2ldO1xuICAgICAgb3B0aW9ucy5yZXN1bHQgPSBvcHRpb25zLnF1ZXN0aW9uLmlzQW5zd2VyQ29ycmVjdCgpO1xuICAgICAgdGhpcy5vbklzQW5zd2VyQ29ycmVjdC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgaWYgKG9wdGlvbnMucmVzdWx0KSBjb3VudGVyKys7XG4gICAgfVxuICAgIHJldHVybiBjb3VudGVyO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaW5jb3JyZWN0ZWQgYW5zd2VycyBvbiBxdWl6XG4gICAqL1xuICBwdWJsaWMgZ2V0SW5Db3JyZWN0ZWRBbnN3ZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldFF1aXpRdWVzdGlvbnMoKTtcbiAgICByZXR1cm4gcXVlc3Rpb25zLmxlbmd0aCAtIHRoaXMuZ2V0Q29ycmVjdGVkQW5zd2VyQ291bnQoKTtcbiAgfVxuICBnZXRDb3JyZWN0ZWRBbnN3ZXJzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29ycmVjdGVkQW5zd2VyQ291bnQoKTtcbiAgfVxuICBnZXRJbkNvcnJlY3RlZEFuc3dlcnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJbkNvcnJlY3RlZEFuc3dlckNvdW50KCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byAndG9wJyBvciAnYm90dG9tJyBpZiB5b3Ugd2FudCB0byBzaG93IHRoZSBQYW5lbCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGhvdyBtdWNoIHRpbWUgdGhlIGVuZC11c2VyIHNwZW50IG9mIHRoZSBzdXJ2ZXkvcGFnZS5cbiAgICogSWYgdGhlIHZhbHVlIGRvZXNuJ3QgZXF1YWwgJ25vbmUnIHRoZW4gc3VydmV5IGNhbGxzIHN0YXJ0VGltZXIoKSBtZXRob2Qgb24gc3VydmV5IHJlbmRlcmluZy5cbiAgICogQHNlZSBzaG93VGltZXJQYW5lbE1vZGVcbiAgICogQHNlZSBzdGFydFRpbWVyXG4gICAqIEBzZWUgc3RvcFRpbWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dUaW1lclBhbmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dUaW1lclBhbmVsXCIsIFwibm9uZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dUaW1lclBhbmVsKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpbWVyUGFuZWxcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVGltZXJQYW5lbFNob3dpbmdPblRvcCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RpbWVyU3RhcnRlZCAmJiB0aGlzLnNob3dUaW1lclBhbmVsID09IFwidG9wXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1RpbWVyUGFuZWxTaG93aW5nT25Cb3R0b20oKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUaW1lclN0YXJ0ZWQgJiYgdGhpcy5zaG93VGltZXJQYW5lbCA9PSBcImJvdHRvbVwiO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byAncGFnZScgb3IgJ3N1cnZleScgdG8gc2hvdyB0aGUgdGltZXIgaW5mb3JtYXRpb24gZm9yIHBhZ2Ugb3Igc3VydmV5IG9ubHkuXG4gICAqIFVzZSBvblRpbWVyUGFuZWxJbmZvVGV4dCBldmVudCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICogQHNlZSBzaG93VGltZXJQYW5lbFxuICAgKiBAc2VlIG9uVGltZXJQYW5lbEluZm9UZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dUaW1lclBhbmVsTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93VGltZXJQYW5lbE1vZGVcIiwgXCJhbGxcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93VGltZXJQYW5lbE1vZGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93VGltZXJQYW5lbE1vZGVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRpbWVySW5mb1RleHQoKTogc3RyaW5nIHtcbiAgICB2YXIgb3B0aW9ucyA9IHsgdGV4dDogdGhpcy5nZXRUaW1lckluZm9UZXh0KCkgfTtcbiAgICB0aGlzLm9uVGltZXJQYW5lbEluZm9UZXh0LmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgdmFyIGxvYyA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyh0aGlzLCB0cnVlKTtcbiAgICBsb2MudGV4dCA9IG9wdGlvbnMudGV4dDtcbiAgICByZXR1cm4gbG9jLnRleHRPckh0bWw7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUaW1lckluZm9UZXh0KCkge1xuICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICBpZiAoIXBhZ2UpIHJldHVybiBcIlwiO1xuICAgIHZhciBwYWdlU3BlbnQgPSB0aGlzLmdldERpc3BsYXlUaW1lKHBhZ2UudGltZVNwZW50KTtcbiAgICB2YXIgc3VydmV5U3BlbnQgPSB0aGlzLmdldERpc3BsYXlUaW1lKHRoaXMudGltZVNwZW50KTtcbiAgICB2YXIgcGFnZUxpbWl0U2VjID0gdGhpcy5nZXRQYWdlTWF4VGltZVRvRmluaXNoKHBhZ2UpO1xuICAgIHZhciBwYWdlTGltaXQgPSB0aGlzLmdldERpc3BsYXlUaW1lKHBhZ2VMaW1pdFNlYyk7XG4gICAgdmFyIHN1cnZleUxpbWl0ID0gdGhpcy5nZXREaXNwbGF5VGltZSh0aGlzLm1heFRpbWVUb0ZpbmlzaCk7XG4gICAgaWYgKHRoaXMuc2hvd1RpbWVyUGFuZWxNb2RlID09IFwicGFnZVwiKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0VGltZXJJbmZvUGFnZVRleHQocGFnZSwgcGFnZVNwZW50LCBwYWdlTGltaXQpO1xuICAgIGlmICh0aGlzLnNob3dUaW1lclBhbmVsTW9kZSA9PSBcInN1cnZleVwiKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0VGltZXJJbmZvU3VydmV5VGV4dChzdXJ2ZXlTcGVudCwgc3VydmV5TGltaXQpO1xuICAgIGlmICh0aGlzLnNob3dUaW1lclBhbmVsTW9kZSA9PSBcImFsbFwiKSB7XG4gICAgICBpZiAocGFnZUxpbWl0U2VjIDw9IDAgJiYgdGhpcy5tYXhUaW1lVG9GaW5pc2ggPD0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lclNwZW50QWxsXCIpW1wiZm9ybWF0XCJdKFxuICAgICAgICAgIHBhZ2VTcGVudCxcbiAgICAgICAgICBzdXJ2ZXlTcGVudFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHBhZ2VMaW1pdFNlYyA+IDAgJiYgdGhpcy5tYXhUaW1lVG9GaW5pc2ggPiAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyTGltaXRBbGxcIilbXCJmb3JtYXRcIl0oXG4gICAgICAgICAgcGFnZVNwZW50LFxuICAgICAgICAgIHBhZ2VMaW1pdCxcbiAgICAgICAgICBzdXJ2ZXlTcGVudCxcbiAgICAgICAgICBzdXJ2ZXlMaW1pdFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbGV0IHBhZ2VUZXh0ID0gdGhpcy5nZXRUaW1lckluZm9QYWdlVGV4dChwYWdlLCBwYWdlU3BlbnQsIHBhZ2VMaW1pdCk7XG4gICAgICBsZXQgc3VydmV5VGV4dCA9IHRoaXMuZ2V0VGltZXJJbmZvU3VydmV5VGV4dChzdXJ2ZXlTcGVudCwgc3VydmV5TGltaXQpO1xuICAgICAgcmV0dXJuIHBhZ2VUZXh0ICsgXCIgXCIgKyBzdXJ2ZXlUZXh0O1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwcml2YXRlIGdldFRpbWVySW5mb1BhZ2VUZXh0KFxuICAgIHBhZ2U6IFBhZ2VNb2RlbCxcbiAgICBwYWdlU3BlbnQ6IHN0cmluZyxcbiAgICBwYWdlTGltaXQ6IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFBhZ2VNYXhUaW1lVG9GaW5pc2gocGFnZSkgPiAwXG4gICAgICA/IHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJMaW1pdFBhZ2VcIilbXCJmb3JtYXRcIl0ocGFnZVNwZW50LCBwYWdlTGltaXQpXG4gICAgICA6IHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJTcGVudFBhZ2VcIilbXCJmb3JtYXRcIl0ocGFnZVNwZW50LCBwYWdlTGltaXQpO1xuICB9XG4gIHByaXZhdGUgZ2V0VGltZXJJbmZvU3VydmV5VGV4dChcbiAgICBzdXJ2ZXlTcGVudDogc3RyaW5nLFxuICAgIHN1cnZleUxpbWl0OiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tYXhUaW1lVG9GaW5pc2ggPiAwXG4gICAgICA/IHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJMaW1pdFN1cnZleVwiKVtcImZvcm1hdFwiXShcbiAgICAgICAgICBzdXJ2ZXlTcGVudCxcbiAgICAgICAgICBzdXJ2ZXlMaW1pdFxuICAgICAgICApXG4gICAgICA6IHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJTcGVudFN1cnZleVwiKVtcImZvcm1hdFwiXShcbiAgICAgICAgICBzdXJ2ZXlTcGVudCxcbiAgICAgICAgICBzdXJ2ZXlMaW1pdFxuICAgICAgICApO1xuICB9XG4gIHByaXZhdGUgZ2V0RGlzcGxheVRpbWUodmFsOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHZhciBtaW4gPSBNYXRoLmZsb29yKHZhbCAvIDYwKTtcbiAgICB2YXIgc2VjID0gdmFsICUgNjA7XG4gICAgdmFyIHJlcyA9IFwiXCI7XG4gICAgaWYgKG1pbiA+IDApIHtcbiAgICAgIHJlcyArPSBtaW4gKyBcIiBcIiArIHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJNaW5cIik7XG4gICAgfVxuICAgIGlmIChyZXMgJiYgc2VjID09IDApIHJldHVybiByZXM7XG4gICAgaWYgKHJlcykgcmVzICs9IFwiIFwiO1xuICAgIHJldHVybiByZXMgKyBzZWMgKyBcIiBcIiArIHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJTZWNcIik7XG4gIH1cbiAgcHJpdmF0ZSB0aW1lckZ1bmM6IGFueSA9IG51bGw7XG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgbWV0aG9kIHRvIHN0YXJ0IHRpbWVyIHRoYXQgd2lsbCBjYWxjdWxhdGUgaG93IG11Y2ggdGltZSBlbmQtdXNlciBzcGVuZHMgb24gdGhlIHN1cnZleSBvciBvbiBwYWdlc1xuICAgKiBAc2VlIHN0b3BUaW1lclxuICAgKiBAc2VlIHRpbWVTcGVudFxuICAgKi9cbiAgcHVibGljIHN0YXJ0VGltZXIoKSB7XG4gICAgaWYgKHRoaXMuaXNUaW1lclN0YXJ0ZWQgfHwgdGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy50aW1lckZ1bmMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuZG9UaW1lcigpO1xuICAgIH07XG4gICAgdGhpcy5pc1RpbWVyU3RhcnRlZCA9IHRydWU7XG4gICAgU3VydmV5VGltZXIuaW5zdGFuY2Uuc3RhcnQodGhpcy50aW1lckZ1bmMpO1xuICB9XG4gIHN0YXJ0VGltZXJGcm9tVUkoKSB7XG4gICAgaWYgKHRoaXMuc2hvd1RpbWVyUGFuZWwgIT0gXCJub25lXCIgJiYgdGhpcy5zdGF0ZSA9PT0gXCJydW5uaW5nXCIpIHtcbiAgICAgIHRoaXMuc3RhcnRUaW1lcigpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU3RvcCB0aGUgdGltZXIuXG4gICAqIEBzZWUgc3RhcnRUaW1lclxuICAgKiBAc2VlIHRpbWVTcGVudFxuICAgKi9cbiAgcHVibGljIHN0b3BUaW1lcigpIHtcbiAgICBpZiAoIXRoaXMuaXNUaW1lclN0YXJ0ZWQpIHJldHVybjtcbiAgICB0aGlzLmlzVGltZXJTdGFydGVkID0gZmFsc2U7XG4gICAgU3VydmV5VGltZXIuaW5zdGFuY2Uuc3RvcCh0aGlzLnRpbWVyRnVuYyk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRpbWUgaW4gc2Vjb25kcyBlbmQtdXNlciBzcGVuZHMgb24gdGhlIHN1cnZleVxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSBQYWdlTW9kZWwudGltZVNwZW50XG4gICAqL1xuICBwdWJsaWMgdGltZVNwZW50ID0gMDtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyB0aGF0IGVuZC11c2VyIGhhcyB0byBjb21wbGV0ZSB0aGUgc3VydmV5LiBJZiB0aGUgdmFsdWUgaXMgMCBvciBsZXNzLCB0aGUgZW5kLXVzZXIgaGFzIHVubGltaXRlZCBudW1iZXIgb2YgdGltZSB0byBmaW5pc2ggdGhlIHN1cnZleS5cbiAgICogQHNlZSBzdGFydFRpbWVyXG4gICAqIEBzZWUgbWF4VGltZVRvRmluaXNoUGFnZVxuICAgKi9cbiAgcHVibGljIGdldCBtYXhUaW1lVG9GaW5pc2goKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGltZVRvRmluaXNoXCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4VGltZVRvRmluaXNoKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGltZVRvRmluaXNoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyB0aGF0IGVuZC11c2VyIGhhcyB0byBjb21wbGV0ZSBhIHBhZ2UgaW4gdGhlIHN1cnZleS4gSWYgdGhlIHZhbHVlIGlzIDAgb3IgbGVzcywgdGhlIGVuZC11c2VyIGhhcyB1bmxpbWl0ZWQgdGltZS4gWW91IG1heSBvdmVycmlkZSB0aGlzIHZhbHVlIGZvciBldmVyeSBwYWdlLlxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSBtYXhUaW1lVG9GaW5pc2hcbiAgICogQHNlZSBQYWdlTW9kZWwubWF4VGltZVRvRmluaXNoXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFRpbWVUb0ZpbmlzaFBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGltZVRvRmluaXNoUGFnZVwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFRpbWVUb0ZpbmlzaFBhZ2UodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hQYWdlXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRQYWdlTWF4VGltZVRvRmluaXNoKHBhZ2U6IFBhZ2VNb2RlbCkge1xuICAgIGlmICghcGFnZSB8fCBwYWdlLm1heFRpbWVUb0ZpbmlzaCA8IDApIHJldHVybiAwO1xuICAgIHJldHVybiBwYWdlLm1heFRpbWVUb0ZpbmlzaCA+IDBcbiAgICAgID8gcGFnZS5tYXhUaW1lVG9GaW5pc2hcbiAgICAgIDogdGhpcy5tYXhUaW1lVG9GaW5pc2hQYWdlO1xuICB9XG4gIHByb3RlY3RlZCBkb1RpbWVyKCkge1xuICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICBpZiAocGFnZSkge1xuICAgICAgcGFnZS50aW1lU3BlbnQgPSBwYWdlLnRpbWVTcGVudCArIDE7XG4gICAgfVxuICAgIHRoaXMudGltZVNwZW50ID0gdGhpcy50aW1lU3BlbnQgKyAxO1xuICAgIHRoaXMub25UaW1lci5maXJlKHRoaXMsIHt9KTtcbiAgICBpZiAodGhpcy5tYXhUaW1lVG9GaW5pc2ggPiAwICYmIHRoaXMubWF4VGltZVRvRmluaXNoID09IHRoaXMudGltZVNwZW50KSB7XG4gICAgICB0aGlzLmNvbXBsZXRlTGFzdFBhZ2UoKTtcbiAgICB9XG4gICAgaWYgKHBhZ2UpIHtcbiAgICAgIHZhciBwYWdlTGltaXQgPSB0aGlzLmdldFBhZ2VNYXhUaW1lVG9GaW5pc2gocGFnZSk7XG4gICAgICBpZiAocGFnZUxpbWl0ID4gMCAmJiBwYWdlTGltaXQgPT0gcGFnZS50aW1lU3BlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNMYXN0UGFnZSkge1xuICAgICAgICAgIHRoaXMuY29tcGxldGVMYXN0UGFnZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubmV4dFBhZ2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvL0lTdXJ2ZXlJbXBsZW1lbnRvclxuICBnZVN1cnZleURhdGEoKTogSVN1cnZleURhdGEge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdldFN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZXRUZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvL0lTdXJ2ZXlUcmlnZ2VyT3duZXJcbiAgZ2V0T2JqZWN0cyhwYWdlczogc3RyaW5nW10sIHF1ZXN0aW9uczogc3RyaW5nW10pOiBhbnlbXSB7XG4gICAgdmFyIHJlc3VsdDogYW55W10gPSBbXTtcbiAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShyZXN1bHQsIHRoaXMuZ2V0UGFnZXNCeU5hbWVzKHBhZ2VzKSk7XG4gICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkocmVzdWx0LCB0aGlzLmdldFF1ZXN0aW9uc0J5TmFtZXMocXVlc3Rpb25zKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBzZXRUcmlnZ2VyVmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBpc1ZhcmlhYmxlOiBib29sZWFuKSB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm47XG4gICAgaWYgKGlzVmFyaWFibGUpIHtcbiAgICAgIHRoaXMuc2V0VmFyaWFibGUobmFtZSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcHJvY2Vzc29yID0gbmV3IFByb2Nlc3NWYWx1ZSgpO1xuICAgICAgdmFyIGZpcnN0TmFtZSA9IHByb2Nlc3Nvci5nZXRGaXJzdE5hbWUobmFtZSk7XG4gICAgICBpZiAoZmlyc3ROYW1lID09IG5hbWUpIHtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMuZ2V0VmFsdWUoZmlyc3ROYW1lKSkgcmV0dXJuO1xuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuZ2V0VW5iaW5kVmFsdWUodGhpcy5nZXRGaWx0ZXJlZFZhbHVlcygpKTtcbiAgICAgICAgcHJvY2Vzc29yLnNldFZhbHVlKGRhdGEsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZShmaXJzdE5hbWUsIGRhdGFbZmlyc3ROYW1lXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvcHlUcmlnZ2VyVmFsdWUobmFtZTogc3RyaW5nLCBmcm9tTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCFuYW1lIHx8ICFmcm9tTmFtZSkgcmV0dXJuO1xuICAgIHZhciBwcm9jZXNzb3IgPSBuZXcgUHJvY2Vzc1ZhbHVlKCk7XG4gICAgdmFyIHZhbHVlID0gcHJvY2Vzc29yLmdldFZhbHVlKGZyb21OYW1lLCB0aGlzLmdldEZpbHRlcmVkVmFsdWVzKCkpO1xuICAgIHRoaXMuc2V0VHJpZ2dlclZhbHVlKG5hbWUsIHZhbHVlLCBmYWxzZSk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcInN1cnZleVwiLCBbXG4gIHtcbiAgICBuYW1lOiBcImxvY2FsZVwiLFxuICAgIGNob2ljZXM6ICgpID0+IHtcbiAgICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0TG9jYWxlcygpO1xuICAgIH0sXG4gICAgb25HZXRWYWx1ZTogKG9iajogYW55KTogYW55ID0+IHtcbiAgICAgIHJldHVybiBvYmoubG9jYWxlID09IHN1cnZleUxvY2FsaXphdGlvbi5kZWZhdWx0TG9jYWxlID8gbnVsbCA6IG9iai5sb2NhbGU7XG4gICAgfVxuICB9LFxuICB7IG5hbWU6IFwidGl0bGVcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RpdGxlXCIgfSxcbiAgeyBuYW1lOiBcImRlc2NyaXB0aW9uOnRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0Rlc2NyaXB0aW9uXCIgfSxcbiAgeyBuYW1lOiBcImZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBuYW1lOiBcImZvY3VzT25GaXJzdEVycm9yOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IG5hbWU6IFwiY29tcGxldGVkSHRtbDpodG1sXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NDb21wbGV0ZWRIdG1sXCIgfSxcbiAge1xuICAgIG5hbWU6IFwiY29tcGxldGVkQmVmb3JlSHRtbDpodG1sXCIsXG4gICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbXBsZXRlZEJlZm9yZUh0bWxcIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb246aHRtbGNvbmRpdGlvbnNcIixcbiAgICBjbGFzc05hbWU6IFwiaHRtbGNvbmRpdGlvbml0ZW1cIlxuICB9LFxuICB7IG5hbWU6IFwibG9hZGluZ0h0bWw6aHRtbFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jTG9hZGluZ0h0bWxcIiB9LFxuICB7IG5hbWU6IFwicGFnZXNcIiwgY2xhc3NOYW1lOiBcInBhZ2VcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAge1xuICAgIG5hbWU6IFwicXVlc3Rpb25zXCIsXG4gICAgYWx0ZXJuYXRpdmVOYW1lOiBcImVsZW1lbnRzXCIsXG4gICAgYmFzZUNsYXNzTmFtZTogXCJxdWVzdGlvblwiLFxuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIGlzTGlnaHRTZXJpYWxpemFibGU6IGZhbHNlLFxuICAgIG9uR2V0VmFsdWU6IGZ1bmN0aW9uKG9iajogYW55KTogYW55IHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgb25TZXRWYWx1ZTogZnVuY3Rpb24ob2JqOiBhbnksIHZhbHVlOiBhbnksIGpzb25Db252ZXJ0ZXI6IGFueSkge1xuICAgICAgdmFyIHBhZ2UgPSBvYmouYWRkTmV3UGFnZShcIlwiKTtcbiAgICAgIGpzb25Db252ZXJ0ZXIudG9PYmplY3QoeyBxdWVzdGlvbnM6IHZhbHVlIH0sIHBhZ2UpO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwidHJpZ2dlcnM6dHJpZ2dlcnNcIixcbiAgICBiYXNlQ2xhc3NOYW1lOiBcInN1cnZleXRyaWdnZXJcIixcbiAgICBjbGFzc05hbWVQYXJ0OiBcInRyaWdnZXJcIlxuICB9LFxuICB7IG5hbWU6IFwic3VydmV5SWRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgeyBuYW1lOiBcInN1cnZleVBvc3RJZFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICB7IG5hbWU6IFwic3VydmV5U2hvd0RhdGFTYXZpbmc6Ym9vbGVhblwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICBcImNvb2tpZU5hbWVcIixcbiAgXCJzZW5kUmVzdWx0T25QYWdlTmV4dDpib29sZWFuXCIsXG4gIHtcbiAgICBuYW1lOiBcInNob3dOYXZpZ2F0aW9uQnV0dG9uc1wiLFxuICAgIGRlZmF1bHQ6IFwiYm90dG9tXCIsXG4gICAgY2hvaWNlczogW1wibm9uZVwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcImJvdGhcIl1cbiAgfSxcbiAgeyBuYW1lOiBcInNob3dQcmV2QnV0dG9uOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IG5hbWU6IFwic2hvd1RpdGxlOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IG5hbWU6IFwic2hvd1BhZ2VUaXRsZXM6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJzaG93Q29tcGxldGVkUGFnZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAge1xuICAgIG5hbWU6IFwicXVlc3Rpb25zT3JkZXJcIixcbiAgICBkZWZhdWx0OiBcImluaXRpYWxcIixcbiAgICBjaG9pY2VzOiBbXCJpbml0aWFsXCIsIFwicmFuZG9tXCJdXG4gIH0sXG4gIFwic2hvd1BhZ2VOdW1iZXJzOmJvb2xlYW5cIixcbiAge1xuICAgIG5hbWU6IFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLFxuICAgIGRlZmF1bHQ6IFwib25cIixcbiAgICBjaG9pY2VzOiBbXCJvblwiLCBcIm9uUGFnZVwiLCBcIm9mZlwiXVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIixcbiAgICBkZWZhdWx0OiBcInRvcFwiLFxuICAgIGNob2ljZXM6IFtcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIl1cbiAgfSxcbiAgeyBuYW1lOiBcInF1ZXN0aW9uRXJyb3JMb2NhdGlvblwiLCBkZWZhdWx0OiBcInRvcFwiLCBjaG9pY2VzOiBbXCJ0b3BcIiwgXCJib3R0b21cIl0gfSxcbiAge1xuICAgIG5hbWU6IFwic2hvd1Byb2dyZXNzQmFyXCIsXG4gICAgZGVmYXVsdDogXCJvZmZcIixcbiAgICBjaG9pY2VzOiBbXCJvZmZcIiwgXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJib3RoXCJdXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInByb2dyZXNzQmFyVHlwZVwiLFxuICAgIGRlZmF1bHQ6IFwicGFnZXNcIixcbiAgICBjaG9pY2VzOiBbXCJwYWdlc1wiLCBcInF1ZXN0aW9uc1wiLCBcImNvcnJlY3RRdWVzdGlvbnNcIl1cbiAgfSxcbiAgeyBuYW1lOiBcIm1vZGVcIiwgZGVmYXVsdDogXCJlZGl0XCIsIGNob2ljZXM6IFtcImVkaXRcIiwgXCJkaXNwbGF5XCJdIH0sXG4gIHsgbmFtZTogXCJzdG9yZU90aGVyc0FzQ29tbWVudDpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBuYW1lOiBcIm1heFRleHRMZW5ndGg6bnVtYmVyXCIsIGRlZmF1bHQ6IDAgfSxcbiAgeyBuYW1lOiBcIm1heE90aGVyc0xlbmd0aDpudW1iZXJcIiwgZGVmYXVsdDogMCB9LFxuICBcImdvTmV4dFBhZ2VBdXRvbWF0aWM6Ym9vbGVhblwiLFxuICB7XG4gICAgbmFtZTogXCJjbGVhckludmlzaWJsZVZhbHVlc1wiLFxuICAgIGRlZmF1bHQ6IFwib25Db21wbGV0ZVwiLFxuICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJvbkNvbXBsZXRlXCIsIFwib25IaWRkZW5cIl1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiY2hlY2tFcnJvcnNNb2RlXCIsXG4gICAgZGVmYXVsdDogXCJvbk5leHRQYWdlXCIsXG4gICAgY2hvaWNlczogW1wib25OZXh0UGFnZVwiLCBcIm9uVmFsdWVDaGFuZ2VkXCJdXG4gIH0sXG4gIHsgbmFtZTogXCJzdGFydFN1cnZleVRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1N0YXJ0U3VydmV5VGV4dFwiIH0sXG4gIHsgbmFtZTogXCJwYWdlUHJldlRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhZ2VQcmV2VGV4dFwiIH0sXG4gIHsgbmFtZTogXCJwYWdlTmV4dFRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhZ2VOZXh0VGV4dFwiIH0sXG4gIHsgbmFtZTogXCJjb21wbGV0ZVRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbXBsZXRlVGV4dFwiIH0sXG4gIHsgbmFtZTogXCJyZXF1aXJlZFRleHRcIiwgZGVmYXVsdDogXCIqXCIgfSxcbiAgXCJxdWVzdGlvblN0YXJ0SW5kZXhcIixcbiAge1xuICAgIG5hbWU6IFwicXVlc3Rpb25UaXRsZVRlbXBsYXRlXCIsXG4gICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1F1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiXG4gIH0sXG4gIHsgbmFtZTogXCJmaXJzdFBhZ2VJc1N0YXJ0ZWQ6Ym9vbGVhblwiLCBkZWZhdWx0OiBmYWxzZSB9LFxuICB7IG5hbWU6IFwiaXNTaW5nbGVQYWdlOmJvb2xlYW5cIiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgeyBuYW1lOiBcIm1heFRpbWVUb0ZpbmlzaDpudW1iZXJcIiwgZGVmYXVsdDogMCB9LFxuICB7IG5hbWU6IFwibWF4VGltZVRvRmluaXNoUGFnZTpudW1iZXJcIiwgZGVmYXVsdDogMCB9LFxuICB7XG4gICAgbmFtZTogXCJzaG93VGltZXJQYW5lbFwiLFxuICAgIGRlZmF1bHQ6IFwibm9uZVwiLFxuICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJ0b3BcIiwgXCJib3R0b21cIl1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwic2hvd1RpbWVyUGFuZWxNb2RlXCIsXG4gICAgZGVmYXVsdDogXCJhbGxcIixcbiAgICBjaG9pY2VzOiBbXCJhbGxcIiwgXCJwYWdlXCIsIFwic3VydmV5XCJdXG4gIH1cbl0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N1cnZleS50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUGFnZU1vZGVsIH0gZnJvbSBcIi4uL3BhZ2VcIjtcbmltcG9ydCB7IFBhbmVsTW9kZWxCYXNlLCBQYW5lbE1vZGVsLCBRdWVzdGlvblJvd01vZGVsIH0gZnJvbSBcIi4uL3BhbmVsXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFN1cnZleUVsZW1lbnQsIElFbGVtZW50IH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgSW1wbGVtZW50b3JCYXNlIH0gZnJvbSBcIi4va29iYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblJvdyBleHRlbmRzIFF1ZXN0aW9uUm93TW9kZWwge1xuICBrb0dldFR5cGU6IGFueTtcbiAga29FbGVtZW50QWZ0ZXJSZW5kZXI6IGFueTtcbiAgY29uc3RydWN0b3IocHVibGljIHBhbmVsOiBQYW5lbE1vZGVsQmFzZSkge1xuICAgIHN1cGVyKHBhbmVsKTtcbiAgICBuZXcgSW1wbGVtZW50b3JCYXNlKHRoaXMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvR2V0VHlwZSA9IGZ1bmN0aW9uKGVsOiBhbnkpIHtcbiAgICAgIHJldHVybiBzZWxmLmdldEVsZW1lbnRUeXBlKGVsKTtcbiAgICB9O1xuICAgIHRoaXMua29FbGVtZW50QWZ0ZXJSZW5kZXIgPSBmdW5jdGlvbihlbDogYW55LCBjb246IGFueSkge1xuICAgICAgcmV0dXJuIHNlbGYuZWxlbWVudEFmdGVyUmVuZGVyKGVsLCBjb24pO1xuICAgIH07XG4gIH1cbiAgcHVibGljIGdldEVsZW1lbnRUeXBlKGVsOiBhbnkpIHtcbiAgICByZXR1cm4gZWwuaXNQYW5lbCA/IFwic3VydmV5LXBhbmVsXCIgOiBcInN1cnZleS1xdWVzdGlvblwiO1xuICB9XG4gIHB1YmxpYyBrb0FmdGVyUmVuZGVyKGVsOiBhbnksIGNvbjogYW55KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRFbCA9IGVsW2ldO1xuICAgICAgdmFyIG5OYW1lID0gdEVsLm5vZGVOYW1lO1xuICAgICAgaWYgKG5OYW1lID09IFwiI3RleHRcIikgdEVsLmRhdGEgPSBcIlwiO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGVsZW1lbnRBZnRlclJlbmRlcihlbGVtZW50czogYW55LCBjb246IGFueSkge1xuICAgIGlmICghdGhpcy5wYW5lbCB8fCAhdGhpcy5wYW5lbC5zdXJ2ZXkpIHJldHVybjtcbiAgICB2YXIgZWwgPSBTdXJ2ZXlFbGVtZW50LkdldEZpcnN0Tm9uVGV4dEVsZW1lbnQoZWxlbWVudHMpO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICB2YXIgZWxlbWVudCA9IDxJRWxlbWVudD5jb247XG4gICAgaWYgKGVsZW1lbnQuaXNQYW5lbCkge1xuICAgICAgdGhpcy5wYW5lbC5zdXJ2ZXkuYWZ0ZXJSZW5kZXJQYW5lbChjb24sIGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYW5lbC5zdXJ2ZXkuYWZ0ZXJSZW5kZXJRdWVzdGlvbihjb24sIGVsKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhbmVsSW1wbGVtZW50b3JCYXNlIGV4dGVuZHMgSW1wbGVtZW50b3JCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHBhbmVsOiBQYW5lbE1vZGVsQmFzZSkge1xuICAgIHN1cGVyKHBhbmVsKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFuZWwgZXh0ZW5kcyBQYW5lbE1vZGVsIHtcbiAga29FbGVtZW50VHlwZTogYW55O1xuICBrb0NzczogYW55O1xuICBrb0lzRXhwYW5kZWQ6IGFueTtcbiAga29Jc0NvbGxhcHNlZDogYW55O1xuICBkb0V4cGFuZDogYW55O1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgbmV3IFBhbmVsSW1wbGVtZW50b3JCYXNlKHRoaXMpO1xuICAgIHRoaXMub25DcmVhdGluZygpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvRWxlbWVudFR5cGUgPSBrby5vYnNlcnZhYmxlKFwic3VydmV5LXBhbmVsXCIpO1xuICAgIHRoaXMua29Dc3MgPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc2VsZi5jc3NDbGFzc2VzO1xuICAgIH0pO1xuICAgIHRoaXMua29Jc0NvbGxhcHNlZCA9IGtvLm9ic2VydmFibGUodGhpcy5pc0NvbGxhcHNlZCk7XG4gICAgdGhpcy5rb0lzRXhwYW5kZWQgPSBrby5vYnNlcnZhYmxlKHRoaXMuaXNFeHBhbmRlZCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vblN0YXRlQ2hhbmdlZCgpO1xuICAgIH07XG4gICAgdGhpcy5kb0V4cGFuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5jaGFuZ2VFeHBhbmRlZCgpO1xuICAgIH07XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVJvdygpOiBRdWVzdGlvblJvd01vZGVsIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uUm93KHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBvbkNyZWF0aW5nKCkge31cbiAgcHJvdGVjdGVkIG9uTnVtQ2hhbmdlZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5sb2NUaXRsZS5vbkNoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIG9uU3RhdGVDaGFuZ2VkKCkge1xuICAgIHRoaXMua29Jc0NvbGxhcHNlZCh0aGlzLmlzQ29sbGFwc2VkKTtcbiAgICB0aGlzLmtvSXNFeHBhbmRlZCh0aGlzLmlzRXhwYW5kZWQpO1xuICB9XG4gIHByaXZhdGUgY2hhbmdlRXhwYW5kZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlzQ29sbGFwc2VkICYmICF0aGlzLmlzRXhwYW5kZWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc0NvbGxhcHNlZCkge1xuICAgICAgdGhpcy5leHBhbmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2xsYXBzZSgpO1xuICAgIH1cbiAgfVxuICBnZXRUaXRsZVN0eWxlKCkge1xuICAgIHZhciByZXN1bHQgPSB0aGlzLmNzc0NsYXNzZXMucGFuZWwudGl0bGU7XG4gICAgaWYgKHRoaXMua29Jc0NvbGxhcHNlZCgpIHx8IHRoaXMua29Jc0V4cGFuZGVkKCkpIHtcbiAgICAgIHJlc3VsdCArPSBcIiBzdl9wX3RpdGxlX2V4cGFuZGFibGVcIjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgdGhpcy5vblN0YXRlQ2hhbmdlZCgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQYWdlIGV4dGVuZHMgUGFnZU1vZGVsIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBJbXBsZW1lbnRvckJhc2UodGhpcyk7XG4gICAgdGhpcy5vbkNyZWF0aW5nKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVJvdygpOiBRdWVzdGlvblJvd01vZGVsIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uUm93KHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdQYW5lbChuYW1lOiBzdHJpbmcpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFBhbmVsKG5hbWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7fVxuICBwcm90ZWN0ZWQgb25OdW1DaGFuZ2VkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLmxvY1RpdGxlLm9uQ2hhbmdlZCgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJwYW5lbFwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBQYW5lbCgpO1xufSk7XG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwicGFnZVwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBQYWdlKCk7XG59KTtcblxuRWxlbWVudEZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJFbGVtZW50KFwicGFuZWxcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUGFuZWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3BhZ2UudHMiLCJpbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgRnVuY3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL2Z1bmN0aW9uc2ZhY3RvcnlcIjtcbmltcG9ydCB7IFByb2Nlc3NWYWx1ZSB9IGZyb20gXCIuLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE9wZXJhbmQge1xuICBwdWJsaWMgYWJzdHJhY3QgdG9TdHJpbmcoKTogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgZXZhbHVhdGUocHJvY2Vzc1ZhbHVlPzogUHJvY2Vzc1ZhbHVlKTogYW55O1xuICBwdWJsaWMgYWJzdHJhY3Qgc2V0VmFyaWFibGVzKHZhcmlhYmxlczogQXJyYXk8c3RyaW5nPik6IGFueTtcbiAgcHVibGljIGhhc0Z1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmluYXJ5T3BlcmFuZCBleHRlbmRzIE9wZXJhbmQge1xuICBwcml2YXRlIGNvbnN1bWVyOiBGdW5jdGlvbjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBvcGVyYXRvck5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIGxlZnQ6IGFueSA9IG51bGwsXG4gICAgcHJpdmF0ZSByaWdodDogYW55ID0gbnVsbCxcbiAgICBpc0FyaXRobWV0aWNPcDogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKGlzQXJpdGhtZXRpY09wKSB7XG4gICAgICB0aGlzLmNvbnN1bWVyID0gT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9uc1tcImFyaXRobWV0aWNPcFwiXShcbiAgICAgICAgb3BlcmF0b3JOYW1lXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnN1bWVyID0gT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9uc1tvcGVyYXRvck5hbWVdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbnN1bWVyID09IG51bGwpIHtcbiAgICAgIE9wZXJhbmRNYWtlci50aHJvd0ludmFsaWRPcGVyYXRvckVycm9yKG9wZXJhdG9yTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBldmFsdWF0ZVBhcmFtKHg6IGFueSwgcHJvY2Vzc1ZhbHVlPzogUHJvY2Vzc1ZhbHVlKTogYW55IHtcbiAgICByZXR1cm4geCA9PSBudWxsID8gbnVsbCA6IHguZXZhbHVhdGUocHJvY2Vzc1ZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBldmFsdWF0ZShwcm9jZXNzVmFsdWU/OiBQcm9jZXNzVmFsdWUpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmNvbnN1bWVyLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5ldmFsdWF0ZVBhcmFtKHRoaXMubGVmdCwgcHJvY2Vzc1ZhbHVlKSxcbiAgICAgIHRoaXMuZXZhbHVhdGVQYXJhbSh0aGlzLnJpZ2h0LCBwcm9jZXNzVmFsdWUpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICBcIihcIiArXG4gICAgICBPcGVyYW5kTWFrZXIuc2FmZVRvU3RyaW5nKHRoaXMubGVmdCkgK1xuICAgICAgXCIgXCIgK1xuICAgICAgT3BlcmFuZE1ha2VyLm9wZXJhdG9yVG9TdHJpbmcodGhpcy5vcGVyYXRvck5hbWUpICtcbiAgICAgIFwiIFwiICtcbiAgICAgIE9wZXJhbmRNYWtlci5zYWZlVG9TdHJpbmcodGhpcy5yaWdodCkgK1xuICAgICAgXCIpXCJcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNldFZhcmlhYmxlcyh2YXJpYWJsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBpZiAodGhpcy5sZWZ0ICE9IG51bGwpIHRoaXMubGVmdC5zZXRWYXJpYWJsZXModmFyaWFibGVzKTtcbiAgICBpZiAodGhpcy5yaWdodCAhPSBudWxsKSB0aGlzLnJpZ2h0LnNldFZhcmlhYmxlcyh2YXJpYWJsZXMpO1xuICB9XG5cbiAgcHVibGljIGhhc0Z1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAoISF0aGlzLmxlZnQgJiYgdGhpcy5sZWZ0Lmhhc0Z1bmN0aW9uKCkpIHx8XG4gICAgICAoISF0aGlzLnJpZ2h0ICYmIHRoaXMucmlnaHQuaGFzRnVuY3Rpb24oKSlcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmFyeU9wZXJhbmQgZXh0ZW5kcyBPcGVyYW5kIHtcbiAgcHJpdmF0ZSBjb25zdW1lcjogRnVuY3Rpb247XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXhwcmVzc2lvbjogT3BlcmFuZCwgcHJpdmF0ZSBvcGVyYXRvck5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25zdW1lciA9IE9wZXJhbmRNYWtlci51bmFyeUZ1bmN0aW9uc1tvcGVyYXRvck5hbWVdO1xuICAgIGlmICh0aGlzLmNvbnN1bWVyID09IG51bGwpIHtcbiAgICAgIE9wZXJhbmRNYWtlci50aHJvd0ludmFsaWRPcGVyYXRvckVycm9yKG9wZXJhdG9yTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgIE9wZXJhbmRNYWtlci5vcGVyYXRvclRvU3RyaW5nKHRoaXMub3BlcmF0b3JOYW1lKSArXG4gICAgICB0aGlzLmV4cHJlc3Npb24udG9TdHJpbmcoKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZXZhbHVhdGUocHJvY2Vzc1ZhbHVlPzogUHJvY2Vzc1ZhbHVlKTogYm9vbGVhbiB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKHByb2Nlc3NWYWx1ZSk7XG4gICAgcmV0dXJuIHRoaXMuY29uc3VtZXIuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgc2V0VmFyaWFibGVzKHZhcmlhYmxlczogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMuZXhwcmVzc2lvbi5zZXRWYXJpYWJsZXModmFyaWFibGVzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXJyYXlPcGVyYW5kIGV4dGVuZHMgT3BlcmFuZCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdmFsdWVzOiBBcnJheTxPcGVyYW5kPikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgXCJbXCIgK1xuICAgICAgdGhpcy52YWx1ZXNcbiAgICAgICAgLm1hcChmdW5jdGlvbihlbDogT3BlcmFuZCkge1xuICAgICAgICAgIHJldHVybiBlbC50b1N0cmluZygpO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihcIiwgXCIpICtcbiAgICAgIFwiXVwiXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBldmFsdWF0ZShwcm9jZXNzVmFsdWU/OiBQcm9jZXNzVmFsdWUpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMubWFwKGZ1bmN0aW9uKGVsOiBPcGVyYW5kKSB7XG4gICAgICByZXR1cm4gZWwuZXZhbHVhdGUocHJvY2Vzc1ZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWYXJpYWJsZXModmFyaWFibGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdGhpcy52YWx1ZXMuZm9yRWFjaChlbCA9PiB7XG4gICAgICBlbC5zZXRWYXJpYWJsZXModmFyaWFibGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMuc29tZShvcGVyYW5kID0+IG9wZXJhbmQuaGFzRnVuY3Rpb24oKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbnN0IGV4dGVuZHMgT3BlcmFuZCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdmFsdWU6IGFueSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZS50b1N0cmluZygpO1xuICB9XG5cbiAgcHVibGljIGV2YWx1YXRlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29ycmVjdFZhbHVlKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgcHVibGljIHNldFZhcmlhYmxlcyh2YXJpYWJsZXM6IEFycmF5PHN0cmluZz4pIHt9XG4gIHByb3RlY3RlZCBnZXRDb3JyZWN0VmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh0aGlzLmlzQm9vbGVhblZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlID09PSBcInRydWVcIjtcbiAgICBpZiAodGhpcy5pc051bWVyaWNWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIGlmICh2YWx1ZS5pbmRleE9mKFwiMHhcIikgPT0gMCkgcmV0dXJuIHBhcnNlSW50KHZhbHVlKTtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHByaXZhdGUgaXNCb29sZWFuVmFsdWUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB2YWx1ZSAmJlxuICAgICAgKHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiIHx8IHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwiZmFsc2VcIilcbiAgICApO1xuICB9XG4gIHByaXZhdGUgaXNOdW1lcmljVmFsdWUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIHZhbHVlICYmXG4gICAgICAodmFsdWUuaW5kZXhPZihcIi1cIikgPiAtMSB8fFxuICAgICAgICB2YWx1ZS5pbmRleE9mKFwiK1wiKSA+IDEgfHxcbiAgICAgICAgdmFsdWUuaW5kZXhPZihcIipcIikgPiAtMSB8fFxuICAgICAgICB2YWx1ZS5pbmRleE9mKFwiXlwiKSA+IC0xIHx8XG4gICAgICAgIHZhbHVlLmluZGV4T2YoXCIvXCIpID4gLTEgfHxcbiAgICAgICAgdmFsdWUuaW5kZXhPZihcIiVcIikgPiAtMSlcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHZhbCA9IE51bWJlcih2YWx1ZSk7XG4gICAgaWYgKGlzTmFOKHZhbCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gaXNGaW5pdGUodmFsKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVmFyaWFibGUgZXh0ZW5kcyBDb25zdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdmFyaWFibGVOYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcih2YXJpYWJsZU5hbWUpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwie1wiICsgdGhpcy52YXJpYWJsZU5hbWUgKyBcIn1cIjtcbiAgfVxuXG4gIHB1YmxpYyBldmFsdWF0ZShwcm9jZXNzVmFsdWU/OiBQcm9jZXNzVmFsdWUpOiBhbnkge1xuICAgIHJldHVybiBwcm9jZXNzVmFsdWUuaGFzVmFsdWUodGhpcy52YXJpYWJsZU5hbWUpXG4gICAgICA/IHRoaXMuZ2V0Q29ycmVjdFZhbHVlKHByb2Nlc3NWYWx1ZS5nZXRWYWx1ZSh0aGlzLnZhcmlhYmxlTmFtZSkpXG4gICAgICA6IG51bGw7XG4gIH1cbiAgcHVibGljIHNldFZhcmlhYmxlcyh2YXJpYWJsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICB2YXJpYWJsZXMucHVzaCh0aGlzLnZhcmlhYmxlTmFtZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uT3BlcmFuZCBleHRlbmRzIE9wZXJhbmQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG9yaWdpb25hbFZhbHVlOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBwYXJhbWV0ZXJzOiBBcnJheU9wZXJhbmRcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbWV0ZXJzKSAmJiBwYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gbmV3IEFycmF5T3BlcmFuZChbXSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGV2YWx1YXRlKHByb2Nlc3NWYWx1ZT86IFByb2Nlc3NWYWx1ZSk6IGFueSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5ydW4oXG4gICAgICB0aGlzLm9yaWdpb25hbFZhbHVlLFxuICAgICAgdGhpcy5wYXJhbWV0ZXJzLmV2YWx1YXRlKHByb2Nlc3NWYWx1ZSksXG4gICAgICBwcm9jZXNzVmFsdWUucHJvcGVydGllc1xuICAgICk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMub3JpZ2lvbmFsVmFsdWUgKyBcIihcIiArIHRoaXMucGFyYW1ldGVycy50b1N0cmluZygpICsgXCIpXCI7XG4gIH1cblxuICBwdWJsaWMgc2V0VmFyaWFibGVzKHZhcmlhYmxlczogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMucGFyYW1ldGVycy5zZXRWYXJpYWJsZXModmFyaWFibGVzKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT3BlcmFuZE1ha2VyIHtcbiAgc3RhdGljIHRocm93SW52YWxpZE9wZXJhdG9yRXJyb3Iob3A6IHN0cmluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgb3BlcmF0b3I6ICdcIiArIG9wICsgXCInXCIpO1xuICB9XG5cbiAgc3RhdGljIHNhZmVUb1N0cmluZyhvcGVyYW5kOiBPcGVyYW5kKTogc3RyaW5nIHtcbiAgICByZXR1cm4gb3BlcmFuZCA9PSBudWxsID8gXCJcIiA6IG9wZXJhbmQudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHN0YXRpYyB0b09wZXJhbmRTdHJpbmcodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKFxuICAgICAgISF2YWx1ZSAmJlxuICAgICAgKCFPcGVyYW5kTWFrZXIuaXNOdW1lcmljKHZhbHVlKSAmJiAhT3BlcmFuZE1ha2VyLmlzQm9vbGVhblZhbHVlKHZhbHVlKSlcbiAgICApXG4gICAgICB2YWx1ZSA9IFwiJ1wiICsgdmFsdWUgKyBcIidcIjtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBzdGF0aWMgaXNOdW1lcmljKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICAhIXZhbHVlICYmXG4gICAgICAodmFsdWUuaW5kZXhPZihcIi1cIikgPiAtMSB8fFxuICAgICAgICB2YWx1ZS5pbmRleE9mKFwiK1wiKSA+IDEgfHxcbiAgICAgICAgdmFsdWUuaW5kZXhPZihcIipcIikgPiAtMSB8fFxuICAgICAgICB2YWx1ZS5pbmRleE9mKFwiXlwiKSA+IC0xIHx8XG4gICAgICAgIHZhbHVlLmluZGV4T2YoXCIvXCIpID4gLTEgfHxcbiAgICAgICAgdmFsdWUuaW5kZXhPZihcIiVcIikgPiAtMSlcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHZhbCA9IE51bWJlcih2YWx1ZSk7XG4gICAgaWYgKGlzTmFOKHZhbCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gaXNGaW5pdGUodmFsKTtcbiAgfVxuXG4gIHN0YXRpYyBpc0Jvb2xlYW5WYWx1ZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdmFsdWUgJiZcbiAgICAgICh2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIiB8fCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcImZhbHNlXCIpXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyB1bmFyeUZ1bmN0aW9uczogSGFzaFRhYmxlPEZ1bmN0aW9uPiA9IHtcbiAgICBlbXB0eTogZnVuY3Rpb24odmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuICF2YWx1ZTtcbiAgICB9LFxuICAgIG5vdGVtcHR5OiBmdW5jdGlvbih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gIU9wZXJhbmRNYWtlci51bmFyeUZ1bmN0aW9ucy5lbXB0eSh2YWx1ZSk7XG4gICAgfSxcbiAgICBuZWdhdGU6IGZ1bmN0aW9uKHZhbHVlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gIXZhbHVlO1xuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgYmluYXJ5RnVuY3Rpb25zOiBIYXNoVGFibGU8RnVuY3Rpb24+ID0ge1xuICAgIGFyaXRobWV0aWNPcChvcGVyYXRvck5hbWU6IHN0cmluZykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGE6IGFueSwgYjogYW55KTogYW55IHtcbiAgICAgICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KGEpKSBhID0gMDtcbiAgICAgICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KGIpKSBiID0gMDtcblxuICAgICAgICBsZXQgY29uc3VtZXIgPSBPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zW29wZXJhdG9yTmFtZV07XG4gICAgICAgIHJldHVybiBjb25zdW1lciA9PSBudWxsID8gbnVsbCA6IGNvbnN1bWVyLmNhbGwodGhpcywgYSwgYik7XG4gICAgICB9O1xuICAgIH0sXG4gICAgYW5kOiBmdW5jdGlvbihhOiBib29sZWFuLCBiOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gYSAmJiBiO1xuICAgIH0sXG4gICAgb3I6IGZ1bmN0aW9uKGE6IGJvb2xlYW4sIGI6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBhIHx8IGI7XG4gICAgfSxcbiAgICBwbHVzOiBmdW5jdGlvbihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICByZXR1cm4gYSArIGI7XG4gICAgfSxcbiAgICBtaW51czogZnVuY3Rpb24oYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH0sXG4gICAgbXVsOiBmdW5jdGlvbihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICByZXR1cm4gYSAqIGI7XG4gICAgfSxcbiAgICBkaXY6IGZ1bmN0aW9uKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgIGlmICghYikgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gYSAvIGI7XG4gICAgfSxcbiAgICBtb2Q6IGZ1bmN0aW9uKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgIGlmICghYikgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gYSAlIGI7XG4gICAgfSxcbiAgICBwb3dlcjogZnVuY3Rpb24oYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIE1hdGgucG93KGEsIGIpO1xuICAgIH0sXG4gICAgZ3JlYXRlcjogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55KTogYm9vbGVhbiB7XG4gICAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBsZWZ0ID4gcmlnaHQ7XG4gICAgfSxcbiAgICBsZXNzOiBmdW5jdGlvbihsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpOiBib29sZWFuIHtcbiAgICAgIGlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGxlZnQgPCByaWdodDtcbiAgICB9LFxuICAgIGdyZWF0ZXJvcmVxdWFsOiBmdW5jdGlvbihsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpOiBib29sZWFuIHtcbiAgICAgIGlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGxlZnQgPj0gcmlnaHQ7XG4gICAgfSxcbiAgICBsZXNzb3JlcXVhbDogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55KTogYm9vbGVhbiB7XG4gICAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBsZWZ0IDw9IHJpZ2h0O1xuICAgIH0sXG4gICAgZXF1YWw6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhsZWZ0LCByaWdodCwgdHJ1ZSk7XG4gICAgfSxcbiAgICBub3RlcXVhbDogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhsZWZ0LCByaWdodCwgdHJ1ZSk7XG4gICAgfSxcbiAgICBjb250YWluczogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9ucy5jb250YWluc0NvcmUobGVmdCwgcmlnaHQsIHRydWUpO1xuICAgIH0sXG4gICAgbm90Y29udGFpbnM6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKCFsZWZ0ICYmICFIZWxwZXJzLmlzVmFsdWVFbXB0eShyaWdodCkpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnMuY29udGFpbnNDb3JlKGxlZnQsIHJpZ2h0LCBmYWxzZSk7XG4gICAgfSxcbiAgICBhbnlvZjogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55KTogYm9vbGVhbiB7XG4gICAgICBpZiAoIWxlZnQgJiYgSGVscGVycy5pc1ZhbHVlRW1wdHkocmlnaHQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICghbGVmdCB8fCAhQXJyYXkuaXNBcnJheShsZWZ0KSB8fCBsZWZ0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHJpZ2h0KSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmlnaHQpKVxuICAgICAgICByZXR1cm4gT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9ucy5jb250YWlucyhsZWZ0LCByaWdodCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJpZ2h0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmNvbnRhaW5zKGxlZnQsIHJpZ2h0W2ldKSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBhbGxvZjogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55KTogYm9vbGVhbiB7XG4gICAgICBpZiAoIWxlZnQgJiYgIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHJpZ2h0KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJpZ2h0KSlcbiAgICAgICAgcmV0dXJuIE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnMuY29udGFpbnMobGVmdCwgcmlnaHQpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaWdodC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIU9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnMuY29udGFpbnMobGVmdCwgcmlnaHRbaV0pKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgY29udGFpbnNDb3JlOiBmdW5jdGlvbihsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIGlzQ29udGFpbnM6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKCFsZWZ0KSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIWxlZnQubGVuZ3RoKSB7XG4gICAgICAgIGxlZnQgPSBsZWZ0LnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxlZnQgPT09IFwic3RyaW5nXCIgfHwgbGVmdCBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgICBpZiAoIXJpZ2h0KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJpZ2h0ID0gcmlnaHQudG9TdHJpbmcoKTtcbiAgICAgICAgdmFyIGZvdW5kID0gbGVmdC5pbmRleE9mKHJpZ2h0KSA+IC0xO1xuICAgICAgICByZXR1cm4gaXNDb250YWlucyA/IGZvdW5kIDogIWZvdW5kO1xuICAgICAgfVxuICAgICAgdmFyIHJpZ2h0QXJyYXkgPSBBcnJheS5pc0FycmF5KHJpZ2h0KSA/IHJpZ2h0IDogW3JpZ2h0XTtcbiAgICAgIGZvciAodmFyIHJJbmRleCA9IDA7IHJJbmRleCA8IHJpZ2h0QXJyYXkubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHJpZ2h0ID0gcmlnaHRBcnJheVtySW5kZXhdO1xuICAgICAgICBmb3IgKDsgaSA8IGxlZnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKGxlZnRbaV0sIHJpZ2h0KSkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPT0gbGVmdC5sZW5ndGgpIHJldHVybiAhaXNDb250YWlucztcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0NvbnRhaW5zO1xuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgb3BlcmF0b3JUb1N0cmluZyhvcGVyYXRvck5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IG9wU3RyID0gT3BlcmFuZE1ha2VyLnNpZ25zW29wZXJhdG9yTmFtZV07XG4gICAgcmV0dXJuIG9wU3RyID09IG51bGwgPyBvcGVyYXRvck5hbWUgOiBvcFN0cjtcbiAgfVxuXG4gIHN0YXRpYyBzaWduczogSGFzaFRhYmxlPHN0cmluZz4gPSB7XG4gICAgbGVzczogXCI8XCIsXG4gICAgbGVzc29yZXF1YWw6IFwiPD1cIixcbiAgICBncmVhdGVyOiBcIj5cIixcbiAgICBncmVhdGVyb3JlcXVhbDogXCI+PVwiLFxuICAgIGVxdWFsOiBcIj09XCIsXG4gICAgbm90ZXF1YWw6IFwiIT1cIixcbiAgICBwbHVzOiBcIitcIixcbiAgICBtaW51czogXCItXCIsXG4gICAgbXVsOiBcIipcIixcbiAgICBkaXY6IFwiL1wiLFxuICAgIGFuZDogXCImJlwiLFxuICAgIG9yOiBcInx8XCIsXG4gICAgcG93ZXI6IFwiXlwiLFxuICAgIG1vZDogXCIlXCIsXG4gICAgbmVnYXRlOiBcIiFcIlxuICB9O1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V4cHJlc3Npb25zL2V4cHJlc3Npb25zLnRzIiwiaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25GYWN0b3J5IHtcbiAgcHVibGljIHN0YXRpYyBJbnN0YW5jZTogRnVuY3Rpb25GYWN0b3J5ID0gbmV3IEZ1bmN0aW9uRmFjdG9yeSgpO1xuICBwcml2YXRlIGZ1bmN0aW9uSGFzaDogSGFzaFRhYmxlPChwYXJhbXM6IGFueVtdKSA9PiBhbnk+ID0ge307XG5cbiAgcHVibGljIHJlZ2lzdGVyKG5hbWU6IHN0cmluZywgZnVuYzogKHBhcmFtczogYW55W10pID0+IGFueSkge1xuICAgIHRoaXMuZnVuY3Rpb25IYXNoW25hbWVdID0gZnVuYztcbiAgfVxuICBwdWJsaWMgdW5yZWdpc3RlcihuYW1lOiBzdHJpbmcpIHtcbiAgICBkZWxldGUgdGhpcy5mdW5jdGlvbkhhc2hbbmFtZV07XG4gIH1cbiAgcHVibGljIGhhc0Z1bmN0aW9uKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZnVuY3Rpb25IYXNoW25hbWVdO1xuICB9XG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICB0aGlzLmZ1bmN0aW9uSGFzaCA9IHt9O1xuICB9XG4gIHB1YmxpYyBnZXRBbGwoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmZ1bmN0aW9uSGFzaCkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KCk7XG4gIH1cbiAgcHVibGljIHJ1bihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBhbnlbXSxcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGxcbiAgKTogYW55IHtcbiAgICB2YXIgZnVuYyA9IHRoaXMuZnVuY3Rpb25IYXNoW25hbWVdO1xuICAgIGlmICghZnVuYykgcmV0dXJuIG51bGw7XG4gICAgbGV0IGNsYXNzUnVubmVyID0ge1xuICAgICAgZnVuYzogZnVuY1xuICAgIH07XG5cbiAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgZm9yICh2YXIga2V5IGluIHByb3BlcnRpZXMpIHtcbiAgICAgICAgKDxhbnk+Y2xhc3NSdW5uZXIpW2tleV0gPSBwcm9wZXJ0aWVzW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbGFzc1J1bm5lci5mdW5jKHBhcmFtcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3VtKHBhcmFtczogYW55W10pOiBhbnkge1xuICB2YXIgcmVzID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICByZXMgKz0gcGFyYW1zW2ldO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJzdW1cIiwgc3VtKTtcblxuZnVuY3Rpb24gYXZnKHBhcmFtczogYW55W10pOiBhbnkge1xuICB2YXIgcmVzID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICByZXMgKz0gcGFyYW1zW2ldO1xuICB9XG4gIHJldHVybiBwYXJhbXMubGVuZ3RoID4gMCA/IHJlcyAvIHBhcmFtcy5sZW5ndGggOiAwO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiYXZnXCIsIGF2Zyk7XG5cbmZ1bmN0aW9uIGdldEluQXJyYXlQYXJhbXMocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIGlmIChwYXJhbXMubGVuZ3RoICE9IDIpIHJldHVybiBudWxsO1xuICB2YXIgYXJyID0gcGFyYW1zWzBdO1xuICBpZiAoIWFycikgcmV0dXJuIG51bGw7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnIpICYmICFBcnJheS5pc0FycmF5KE9iamVjdC5rZXlzKGFycikpKSByZXR1cm4gbnVsbDtcbiAgdmFyIG5hbWUgPSBwYXJhbXNbMV07XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIiAmJiAhKG5hbWUgaW5zdGFuY2VvZiBTdHJpbmcpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHsgZGF0YTogYXJyLCBuYW1lOiBuYW1lIH07XG59XG5cbmZ1bmN0aW9uIGNhbGNJbkFycmF5KFxuICBwYXJhbXM6IGFueVtdLFxuICBmdW5jOiAocmVzOiBudW1iZXIsIHZhbDogbnVtYmVyKSA9PiBudW1iZXJcbik6IGFueSB7XG4gIHZhciB2ID0gZ2V0SW5BcnJheVBhcmFtcyhwYXJhbXMpO1xuICBpZiAoIXYpIHJldHVybiB1bmRlZmluZWQ7XG4gIHZhciByZXMgPSB1bmRlZmluZWQ7XG4gIGlmIChBcnJheS5pc0FycmF5KHYuZGF0YSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHYuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSB2LmRhdGFbaV07XG4gICAgICBpZiAoISFpdGVtICYmIGl0ZW1bPHN0cmluZz52Lm5hbWVdKSB7XG4gICAgICAgIHJlcyA9IGZ1bmMocmVzLCBpdGVtWzxzdHJpbmc+di5uYW1lXSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGtleSBpbiB2LmRhdGEpIHtcbiAgICAgIHZhciBpdGVtID0gdi5kYXRhW2tleV07XG4gICAgICBpZiAoISFpdGVtICYmIGl0ZW1bPHN0cmluZz52Lm5hbWVdKSB7XG4gICAgICAgIHJlcyA9IGZ1bmMocmVzLCBpdGVtWzxzdHJpbmc+di5uYW1lXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIHN1bUluQXJyYXkocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIHZhciByZXMgPSBjYWxjSW5BcnJheShwYXJhbXMsIGZ1bmN0aW9uKHJlczogbnVtYmVyLCB2YWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHJlcyA9PSB1bmRlZmluZWQpIHJlcyA9IDA7XG4gICAgcmV0dXJuIHJlcyArIHZhbDtcbiAgfSk7XG4gIHJldHVybiByZXMgIT09IHVuZGVmaW5lZCA/IHJlcyA6IDA7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJzdW1JbkFycmF5XCIsIHN1bUluQXJyYXkpO1xuXG5mdW5jdGlvbiBtaW5JbkFycmF5KHBhcmFtczogYW55W10pOiBhbnkge1xuICByZXR1cm4gY2FsY0luQXJyYXkocGFyYW1zLCBmdW5jdGlvbihyZXM6IG51bWJlciwgdmFsOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmIChyZXMgPT0gdW5kZWZpbmVkKSByZXR1cm4gdmFsO1xuICAgIHJldHVybiByZXMgPCB2YWwgPyByZXMgOiB2YWw7XG4gIH0pO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwibWluSW5BcnJheVwiLCBtaW5JbkFycmF5KTtcblxuZnVuY3Rpb24gbWF4SW5BcnJheShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgcmV0dXJuIGNhbGNJbkFycmF5KHBhcmFtcywgZnVuY3Rpb24ocmVzOiBudW1iZXIsIHZhbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAocmVzID09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbDtcbiAgICByZXR1cm4gcmVzID4gdmFsID8gcmVzIDogdmFsO1xuICB9KTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcIm1heEluQXJyYXlcIiwgbWF4SW5BcnJheSk7XG5cbmZ1bmN0aW9uIGNvdW50SW5BcnJheShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgdmFyIHJlcyA9IGNhbGNJbkFycmF5KHBhcmFtcywgZnVuY3Rpb24ocmVzOiBudW1iZXIsIHZhbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAocmVzID09IHVuZGVmaW5lZCkgcmVzID0gMDtcbiAgICByZXR1cm4gcmVzICsgMTtcbiAgfSk7XG4gIHJldHVybiByZXMgIT09IHVuZGVmaW5lZCA/IHJlcyA6IDA7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJjb3VudEluQXJyYXlcIiwgY291bnRJbkFycmF5KTtcblxuZnVuY3Rpb24gYXZnSW5BcnJheShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgdmFyIGNvdW50ID0gY291bnRJbkFycmF5KHBhcmFtcyk7XG4gIGlmIChjb3VudCA9PSAwKSByZXR1cm4gMDtcbiAgcmV0dXJuIHN1bUluQXJyYXkocGFyYW1zKSAvIGNvdW50O1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiYXZnSW5BcnJheVwiLCBhdmdJbkFycmF5KTtcblxuZnVuY3Rpb24gaWlmKHBhcmFtczogYW55W10pOiBhbnkge1xuICBpZiAoIXBhcmFtcyAmJiBwYXJhbXMubGVuZ3RoICE9PSAzKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIHBhcmFtc1swXSA/IHBhcmFtc1sxXSA6IHBhcmFtc1syXTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcImlpZlwiLCBpaWYpO1xuXG5mdW5jdGlvbiBnZXREYXRlKHBhcmFtczogYW55W10pOiBhbnkge1xuICBpZiAoIXBhcmFtcyAmJiBwYXJhbXMubGVuZ3RoIDwgMSkgcmV0dXJuIG51bGw7XG4gIGlmICghcGFyYW1zWzBdKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIG5ldyBEYXRlKHBhcmFtc1swXSk7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJnZXREYXRlXCIsIGdldERhdGUpO1xuXG5mdW5jdGlvbiBhZ2UocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIGlmICghcGFyYW1zICYmIHBhcmFtcy5sZW5ndGggPCAxKSByZXR1cm4gbnVsbDtcbiAgaWYgKCFwYXJhbXNbMF0pIHJldHVybiBudWxsO1xuICB2YXIgYmlydGhEYXkgPSBuZXcgRGF0ZShwYXJhbXNbMF0pO1xuICB2YXIgYWdlRGlmTXMgPSBEYXRlLm5vdygpIC0gYmlydGhEYXkuZ2V0VGltZSgpO1xuICB2YXIgYWdlRGF0ZSA9IG5ldyBEYXRlKGFnZURpZk1zKTsgLy8gbWlsaXNlY29uZHMgZnJvbSBlcG9jaFxuICByZXR1cm4gTWF0aC5hYnMoYWdlRGF0ZS5nZXRVVENGdWxsWWVhcigpIC0gMTk3MCk7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJhZ2VcIiwgYWdlKTtcblxuZnVuY3Rpb24gaXNDb250YWluZXJSZWFkeShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgaWYgKCFwYXJhbXMgJiYgcGFyYW1zLmxlbmd0aCA8IDEpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFwYXJhbXNbMF0gfHwgIXRoaXMuc3VydmV5KSByZXR1cm4gZmFsc2U7XG4gIHZhciBuYW1lID0gcGFyYW1zWzBdO1xuICB2YXIgY29udGFpbmVyID0gdGhpcy5zdXJ2ZXkuZ2V0UGFnZUJ5TmFtZShuYW1lKTtcbiAgaWYgKCFjb250YWluZXIpIGNvbnRhaW5lciA9IHRoaXMuc3VydmV5LmdldFBhbmVsQnlOYW1lKG5hbWUpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuIGZhbHNlO1xuICB2YXIgcXVlc3Rpb25zID0gY29udGFpbmVyLnF1ZXN0aW9ucztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocXVlc3Rpb25zW2ldLmhhc0Vycm9ycyhmYWxzZSkpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcImlzQ29udGFpbmVyUmVhZHlcIiwgaXNDb250YWluZXJSZWFkeSk7XG5cbmZ1bmN0aW9uIGlzRGlzcGxheU1vZGUoKSB7XG4gIHJldHVybiB0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rpc3BsYXlNb2RlO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiaXNEaXNwbGF5TW9kZVwiLCBpc0Rpc3BsYXlNb2RlKTtcblxuZnVuY3Rpb24gY3VycmVudERhdGUoKSB7XG4gIHJldHVybiBuZXcgRGF0ZSgpO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiY3VycmVudERhdGVcIiwgY3VycmVudERhdGUpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Z1bmN0aW9uc2ZhY3RvcnkudHMiLCJpbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgSVBhZ2UsXG4gIElQYW5lbCxcbiAgSUVsZW1lbnQsXG4gIElTdXJ2ZXlFbGVtZW50LFxuICBJUXVlc3Rpb24sXG4gIFN1cnZleUVsZW1lbnRcbn0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbmZvLCBQYW5lbE1vZGVsQmFzZSwgUXVlc3Rpb25Sb3dNb2RlbCB9IGZyb20gXCIuL3BhbmVsXCI7XG5cbi8qKlxuICogVGhlIHBhZ2Ugb2JqZWN0LiBJdCBoYXMgZWxlbWVudHMgY29sbGVjdGlvbiwgdGhhdCBjb250YWlucyBxdWVzdGlvbnMgYW5kIHBhbmVscy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VNb2RlbCBleHRlbmRzIFBhbmVsTW9kZWxCYXNlIGltcGxlbWVudHMgSVBhZ2Uge1xuICBwcml2YXRlIGhhc1Nob3duVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZyA9IFwiXCIpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5sb2NUaXRsZS5vblJlbmRlcmVkSHRtbENhbGxiYWNrID0gZnVuY3Rpb24odGV4dCkge1xuICAgICAgaWYgKHNlbGYubnVtID4gMCkgcmV0dXJuIHNlbGYubnVtICsgXCIuIFwiICsgdGV4dDtcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH07XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJwYWdlXCI7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUGFnZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgb25GaXJzdFJlbmRlcmluZygpIHtcbiAgICBpZiAodGhpcy53YXNTaG93bikgcmV0dXJuO1xuICAgIHN1cGVyLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHZpc2libGUgaW5kZXggb2YgdGhlIHBhZ2UuIEl0IGhhcyB2YWx1ZXMgZnJvbSAwIHRvIHZpc2libGUgcGFnZSBjb3VudCAtIDEuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwudmlzaWJsZVBhZ2VzXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucGFnZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJbmRleFwiLCAtMSk7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlSW5kZXgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiB0aGUgcGFnZSBpcyBzdGFydGVkIHBhZ2UgaW4gdGhlIHN1cnZleS4gSXQgY2FuIGJlIHNob3duIG9uIHRoZSBzdGFydCBvbmx5IGFuZCB0aGUgZW5kLXVzZXIgY291bGQgbm90IGNvbWViYWNrIHRvIGl0IGFmdGVyIGl0IHBhc3NlZCBpdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNTdGFydGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc1BhZ2VTdGFydGVkKHRoaXMpO1xuICB9XG4gIGdldElzUGFnZVZpc2libGUoZXhjZXB0aW9uUXVlc3Rpb246IElRdWVzdGlvbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzU3RhcnRlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBzdXBlci5nZXRJc1BhZ2VWaXNpYmxlKGV4Y2VwdGlvblF1ZXN0aW9uKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG51bSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibnVtXCIsIC0xKTtcbiAgfVxuICBwdWJsaWMgc2V0IG51bSh2YWw6IG51bWJlcikge1xuICAgIGlmICh0aGlzLm51bSA9PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJudW1cIiwgdmFsKTtcbiAgICB0aGlzLm9uTnVtQ2hhbmdlZCh2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBcImhpZGVcIiB0byBtYWtlIFwiUHJldlwiLCBcIk5leHRcIiBhbmQgXCJDb21wbGV0ZVwiIGJ1dHRvbnMgYXJlIGludmlzaWJsZSBmb3IgdGhpcyBwYWdlLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBcInNob3dcIiB0byBtYWtlIHRoZXNlIGJ1dHRvbnMgdmlzaWJsZSwgZXZlbiBpZiBzdXJ2ZXkgc2hvd05hdmlnYXRpb25CdXR0b25zIHByb3BlcnR5IGlzIGZhbHNlLlxuICAgKiBAc2VlIFN1cnZleU1vZGUuc2hvd05hdmlnYXRpb25CdXR0b25zXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHlcIiwgXCJpbmhlcml0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5XCIsIHZhbC50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHByb3BlcnR5IHJldHVybnMgdHJ1ZSwgaWYgdGhlIHBhZ2UgaGFzIGJlZW4gc2hvd24gdG8gdGhlIGVuZC11c2VyLlxuICAgKi9cbiAgcHVibGljIGdldCB3YXNTaG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNTaG93blZhbHVlO1xuICB9XG4gIGdldCBoYXNTaG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy53YXNTaG93bjtcbiAgfVxuICBwdWJsaWMgc2V0V2FzU2hvd24odmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbCA9PSB0aGlzLmhhc1Nob3duVmFsdWUpIHJldHVybjtcbiAgICB0aGlzLmhhc1Nob3duVmFsdWUgPSB2YWw7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgaWYgKHZhbCA9PSB0cnVlICYmIHRoaXMuYXJlUXVlc3Rpb25zUmFuZG9taXplZCkge1xuICAgICAgdGhpcy5yYW5kb21pemVFbGVtZW50cygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzUmFuZG9taXppbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSByYW5kb21pemVFbGVtZW50cygpIHtcbiAgICBpZiAodGhpcy5pc1JhbmRvbWl6aW5nKSByZXR1cm47XG4gICAgdGhpcy5pc1JhbmRvbWl6aW5nID0gdHJ1ZTtcbiAgICB2YXIgb2xkRWxlbWVudHMgPSBbXTtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9sZEVsZW1lbnRzLnB1c2goZWxlbWVudHNbaV0pO1xuICAgIH1cbiAgICB2YXIgbmV3RWxlbWVudHMgPSBIZWxwZXJzLnJhbmRvbWl6ZUFycmF5PElFbGVtZW50PihvbGRFbGVtZW50cyk7XG4gICAgdGhpcy5lbGVtZW50cy5zcGxpY2UoMCwgdGhpcy5lbGVtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHMucHVzaChuZXdFbGVtZW50c1tpXSk7XG4gICAgfVxuICAgIHRoaXMuaXNSYW5kb21pemluZyA9IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgcmV0dXJucyB0cnVlLCBpZiB0aGUgZWxlbWVudHMgYXJlIHJhbmRvbWl6ZWQgb24gdGhlIHBhZ2VcbiAgICogQHNlZSBoYXNTaG93blxuICAgKiBAc2VlIHF1ZXN0aW9uc09yZGVyXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25zT3JkZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgYXJlUXVlc3Rpb25zUmFuZG9taXplZCgpOiBib29sZWFuIHtcbiAgICB2YXIgb3JkZXIgPVxuICAgICAgdGhpcy5xdWVzdGlvbnNPcmRlciA9PSBcImRlZmF1bHRcIiAmJiB0aGlzLnN1cnZleVxuICAgICAgICA/IHRoaXMuc3VydmV5LnF1ZXN0aW9uc09yZGVyXG4gICAgICAgIDogdGhpcy5xdWVzdGlvbnNPcmRlcjtcbiAgICByZXR1cm4gb3JkZXIgPT0gXCJyYW5kb21cIjtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gcmFuZG9taXplIHF1ZXN0aW9ucy4gU2V0IGl0IHRvICdyYW5kb20nIHRvIHJhbmRvbWl6ZSBxdWVzdGlvbnMsICdpbml0aWFsJyB0byBrZWVwIHRoZW0gaW4gdGhlIHNhbWUgb3JkZXIgb3IgJ2RlZmF1bHQnIHRvIHVzZSB0aGUgU3VydmV5IHF1ZXN0aW9uc09yZGVyIHByb3BlcnR5XG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25zT3JkZXJcbiAgICogQHNlZSBhcmVRdWVzdGlvbnNSYW5kb21pemVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uc09yZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbnNPcmRlclwiLCBcImRlZmF1bHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvbnNPcmRlcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uc09yZGVyXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gZm9jdXMgdGhlIGlucHV0IG9uIHRoZSBmaXJzdCBxdWVzdGlvblxuICAgKi9cbiAgcHVibGljIGZvY3VzRmlyc3RRdWVzdGlvbigpIHtcbiAgICB2YXIgcSA9IHRoaXMuZ2V0Rmlyc3RRdWVzdGlvblRvRm9jdXMoKTtcbiAgICBpZiAoISFxKSB7XG4gICAgICBxLmZvY3VzKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDYWxsIGl0IHRvIGZvY3VzIHRoZSBpbnB1dCBvZiB0aGUgZmlyc3QgcXVlc3Rpb24gdGhhdCBoYXMgYW4gZXJyb3IuXG4gICAqL1xuICBwdWJsaWMgZm9jdXNGaXJzdEVycm9yUXVlc3Rpb24oKSB7XG4gICAgdmFyIHEgPSB0aGlzLmdldEZpcnN0UXVlc3Rpb25Ub0ZvY3VzKHRydWUpO1xuICAgIGlmICghIXEpIHtcbiAgICAgIHEuZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gc2Nyb2xsIHRvIHRoZSBwYWdlIHRvcC5cbiAgICovXG4gIHB1YmxpYyBzY3JvbGxUb1RvcCgpIHtcbiAgICBTdXJ2ZXlFbGVtZW50LlNjcm9sbEVsZW1lbnRUb1RvcCh0aGlzLmlkKTtcbiAgfVxuICAvKipcbiAgICogVGltZSBpbiBzZWNvbmRzIGVuZC11c2VyIHNwZW50IG9uIHRoaXMgcGFnZVxuICAgKi9cbiAgcHVibGljIHRpbWVTcGVudCA9IDA7XG4gIC8vIHB1YmxpYyBnZXQgdGltZVNwZW50KCk6IG51bWJlciB7XG4gIC8vICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRpbWVTcGVudFwiLCAwKTtcbiAgLy8gfVxuICAvLyBwdWJsaWMgc2V0IHRpbWVTcGVudCh2YWw6IG51bWJlcikge1xuICAvLyAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRpbWVTcGVudFwiLCB2YWwpO1xuICAvLyB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBwYW5lbHMgaW4gdGhlIHBhZ2VcbiAgICovXG4gIHB1YmxpYyBnZXRQYW5lbHMoXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8SVBhbmVsPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxJUGFuZWw+KCk7XG4gICAgdGhpcy5hZGRQYW5lbHNJbnRvTGlzdChyZXN1bHQsIHZpc2libGVPbmx5LCBpbmNsdWRpbmdEZXNpZ25UaW1lKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0aW1lIGluIHNlY29uZHMgdGhhdCBlbmQtdXNlciBoYXMgdG8gY29tcGxldGUgdGhlIHBhZ2UuIElmIHRoZSB2YWx1ZSBpcyAwIG9yIGxlc3MsIHRoZSBlbmQtdXNlciBoYXMgdW5saW1pdGVkIG51bWJlciBvZiB0aW1lIHRvIGZpbmlzaCB0aGUgcGFnZS5cbiAgICogQHNlZSBzdGFydFRpbWVyXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubWF4VGltZVRvRmluaXNoUGFnZVxuICAgKi9cbiAgcHVibGljIGdldCBtYXhUaW1lVG9GaW5pc2goKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGltZVRvRmluaXNoXCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4VGltZVRvRmluaXNoKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGltZVRvRmluaXNoXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTnVtQ2hhbmdlZCh2YWx1ZTogbnVtYmVyKSB7fVxuICBwcm90ZWN0ZWQgb25WaXNpYmxlQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5pc1JhbmRvbWl6aW5nKSByZXR1cm47XG4gICAgc3VwZXIub25WaXNpYmxlQ2hhbmdlZCgpO1xuICAgIGlmICh0aGlzLnN1cnZleSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnN1cnZleS5wYWdlVmlzaWJpbGl0eUNoYW5nZWQodGhpcywgdGhpcy5pc1Zpc2libGUpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvO1xuICBwdWJsaWMgZHJhZ0Ryb3BTdGFydChcbiAgICBzcmM6IElFbGVtZW50LFxuICAgIHRhcmdldDogSUVsZW1lbnQsXG4gICAgbmVzdGVkUGFuZWxEZXB0aDogbnVtYmVyID0gLTFcbiAgKSB7XG4gICAgdGhpcy5kcmFnRHJvcEluZm8gPSBuZXcgRHJhZ0Ryb3BJbmZvKHNyYywgdGFyZ2V0LCBuZXN0ZWRQYW5lbERlcHRoKTtcbiAgfVxuICBwdWJsaWMgZHJhZ0Ryb3BNb3ZlVG8oXG4gICAgZGVzdGluYXRpb246IElTdXJ2ZXlFbGVtZW50LFxuICAgIGlzQm90dG9tOiBib29sZWFuID0gZmFsc2UsXG4gICAgaXNFZGdlOiBib29sZWFuID0gZmFsc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmRyYWdEcm9wSW5mbykgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMuZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247XG4gICAgdGhpcy5kcmFnRHJvcEluZm8uaXNCb3R0b20gPSBpc0JvdHRvbTtcbiAgICB0aGlzLmRyYWdEcm9wSW5mby5pc0VkZ2UgPSBpc0VkZ2U7XG4gICAgdGhpcy5jb3JyZWN0RHJhZ0Ryb3BJbmZvKHRoaXMuZHJhZ0Ryb3BJbmZvKTtcbiAgICBpZiAoIXRoaXMuZHJhZ0Ryb3BDYW5Ecm9wVGFnZXJ0KCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIXRoaXMuZHJhZ0Ryb3BDYW5Ecm9wU291cmNlKCkgfHwgIXRoaXMuZHJhZ0Ryb3BBbGxvd0Zyb21TdXJ2ZXkoKSkge1xuICAgICAgaWYgKCEhdGhpcy5kcmFnRHJvcEluZm8uc291cmNlKSB7XG4gICAgICAgIHZhciByb3cgPSB0aGlzLmRyYWdEcm9wRmluZFJvdyh0aGlzLmRyYWdEcm9wSW5mby50YXJnZXQpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJvd3NSZW1vdmVFbGVtZW50RnJvbVJvdyh0aGlzLmRyYWdEcm9wSW5mby50YXJnZXQsIHJvdyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXQodGhpcy5kcmFnRHJvcEluZm8pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgY29ycmVjdERyYWdEcm9wSW5mbyhkcmFnRHJvcEluZm86IERyYWdEcm9wSW5mbykge1xuICAgIGlmICghZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uKSByZXR1cm47XG4gICAgdmFyIHBhbmVsID0gKDxJRWxlbWVudD5kcmFnRHJvcEluZm8uZGVzdGluYXRpb24pLmlzUGFuZWxcbiAgICAgID8gPElQYW5lbD4oPGFueT5kcmFnRHJvcEluZm8uZGVzdGluYXRpb24pXG4gICAgICA6IG51bGw7XG4gICAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuICAgIGlmIChcbiAgICAgICFkcmFnRHJvcEluZm8udGFyZ2V0LmlzTGF5b3V0VHlwZVN1cHBvcnRlZChwYW5lbC5nZXRDaGlsZHJlbkxheW91dFR5cGUoKSlcbiAgICApIHtcbiAgICAgIGRyYWdEcm9wSW5mby5pc0VkZ2UgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQWxsb3dGcm9tU3VydmV5KCk6IGJvb2xlYW4ge1xuICAgIHZhciBkZXN0ID0gdGhpcy5kcmFnRHJvcEluZm8uZGVzdGluYXRpb247XG4gICAgaWYgKCFkZXN0IHx8ICF0aGlzLnN1cnZleSkgcmV0dXJuIHRydWU7XG4gICAgdmFyIGluc2VydEJlZm9yZTogSUVsZW1lbnQgPSBudWxsO1xuICAgIHZhciBpbnNlcnRBZnRlcjogSUVsZW1lbnQgPSBudWxsO1xuICAgIHZhciBwYXJlbnQgPVxuICAgICAgZGVzdC5pc1BhZ2UgfHwgKCF0aGlzLmRyYWdEcm9wSW5mby5pc0VkZ2UgJiYgKDxJRWxlbWVudD5kZXN0KS5pc1BhbmVsKVxuICAgICAgICA/IGRlc3RcbiAgICAgICAgOiAoPElFbGVtZW50PmRlc3QpLnBhcmVudDtcbiAgICBpZiAoIWRlc3QuaXNQYWdlKSB7XG4gICAgICB2YXIgY29udGFpbmVyID0gKDxJRWxlbWVudD5kZXN0KS5wYXJlbnQ7XG4gICAgICBpZiAoISFjb250YWluZXIpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRzID0gKDxQYW5lbE1vZGVsQmFzZT5jb250YWluZXIpLmVsZW1lbnRzO1xuICAgICAgICB2YXIgaW5kZXggPSBlbGVtZW50cy5pbmRleE9mKDxJRWxlbWVudD5kZXN0KTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICBpbnNlcnRCZWZvcmUgPSA8SUVsZW1lbnQ+ZGVzdDtcbiAgICAgICAgICBpbnNlcnRBZnRlciA9IDxJRWxlbWVudD5kZXN0O1xuICAgICAgICAgIGlmICh0aGlzLmRyYWdEcm9wSW5mby5pc0JvdHRvbSkge1xuICAgICAgICAgICAgaW5zZXJ0QmVmb3JlID1cbiAgICAgICAgICAgICAgaW5kZXggPCBlbGVtZW50cy5sZW5ndGggLSAxID8gZWxlbWVudHNbaW5kZXggKyAxXSA6IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluc2VydEFmdGVyID0gaW5kZXggPiAwID8gZWxlbWVudHNbaW5kZXggLSAxXSA6IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgdGFyZ2V0OiB0aGlzLmRyYWdEcm9wSW5mby50YXJnZXQsXG4gICAgICBzb3VyY2U6IHRoaXMuZHJhZ0Ryb3BJbmZvLnNvdXJjZSxcbiAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgaW5zZXJ0QWZ0ZXI6IGluc2VydEFmdGVyLFxuICAgICAgaW5zZXJ0QmVmb3JlOiBpbnNlcnRCZWZvcmVcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnN1cnZleS5kcmFnQW5kRHJvcEFsbG93KG9wdGlvbnMpO1xuICB9XG4gIHB1YmxpYyBkcmFnRHJvcEZpbmlzaChpc0NhbmNlbDogYm9vbGVhbiA9IGZhbHNlKTogSUVsZW1lbnQge1xuICAgIGlmICghdGhpcy5kcmFnRHJvcEluZm8pIHJldHVybjtcbiAgICB2YXIgdGFyZ2V0ID0gdGhpcy5kcmFnRHJvcEluZm8udGFyZ2V0O1xuICAgIHZhciByb3cgPSB0aGlzLmRyYWdEcm9wRmluZFJvdyh0YXJnZXQpO1xuICAgIHZhciB0YXJnZXRJbmRleCA9IHRoaXMuZHJhZ0Ryb3BHZXRFbGVtZW50SW5kZXgodGFyZ2V0LCByb3cpO1xuICAgIHRoaXMudXBkYXRlUm93c1JlbW92ZUVsZW1lbnRGcm9tUm93KHRhcmdldCwgcm93KTtcbiAgICBpZiAoIWlzQ2FuY2VsICYmICEhcm93KSB7XG4gICAgICB2YXIgc3JjID0gdGhpcy5kcmFnRHJvcEluZm8uc291cmNlO1xuICAgICAgdmFyIGlzU2FtZVBhbmVsID0gZmFsc2U7XG4gICAgICBpZiAoISFzcmMgJiYgISFzcmMucGFyZW50KSB7XG4gICAgICAgIGlzU2FtZVBhbmVsID0gcm93LnBhbmVsID09IHNyYy5wYXJlbnQ7XG4gICAgICAgIGlmIChpc1NhbWVQYW5lbCkge1xuICAgICAgICAgIHJvdy5wYW5lbC5kcmFnRHJvcE1vdmVFbGVtZW50KHNyYywgdGFyZ2V0LCB0YXJnZXRJbmRleCk7XG4gICAgICAgICAgdGFyZ2V0SW5kZXggPSAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcmMucGFyZW50LnJlbW92ZUVsZW1lbnQoc3JjKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRhcmdldEluZGV4ID4gLTEpIHtcbiAgICAgICAgcm93LnBhbmVsLmFkZEVsZW1lbnQodGFyZ2V0LCB0YXJnZXRJbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZHJhZ0Ryb3BJbmZvID0gbnVsbDtcbiAgICByZXR1cm4gIWlzQ2FuY2VsID8gdGFyZ2V0IDogbnVsbDtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wR2V0RWxlbWVudEluZGV4KFxuICAgIHRhcmdldDogSUVsZW1lbnQsXG4gICAgcm93OiBRdWVzdGlvblJvd01vZGVsXG4gICk6IG51bWJlciB7XG4gICAgaWYgKCFyb3cpIHJldHVybiAtMTtcbiAgICB2YXIgaW5kZXggPSByb3cuZWxlbWVudHMuaW5kZXhPZih0YXJnZXQpO1xuICAgIGlmIChyb3cuaW5kZXggPT0gMCkgcmV0dXJuIGluZGV4O1xuICAgIHZhciBwcmV2Um93ID0gcm93LnBhbmVsLnJvd3Nbcm93LmluZGV4IC0gMV07XG4gICAgdmFyIHByZXZFbGVtZW50ID0gcHJldlJvdy5lbGVtZW50c1twcmV2Um93LmVsZW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiBpbmRleCArIHJvdy5wYW5lbC5lbGVtZW50cy5pbmRleE9mKHByZXZFbGVtZW50KSArIDE7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcENhbkRyb3BUYWdlcnQoKTogYm9vbGVhbiB7XG4gICAgdmFyIGRlc3RpbmF0aW9uID0gdGhpcy5kcmFnRHJvcEluZm8uZGVzdGluYXRpb247XG4gICAgaWYgKCFkZXN0aW5hdGlvbiB8fCBkZXN0aW5hdGlvbi5pc1BhZ2UpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLmRyYWdEcm9wQ2FuRHJvcENvcmUoXG4gICAgICB0aGlzLmRyYWdEcm9wSW5mby50YXJnZXQsXG4gICAgICA8SUVsZW1lbnQ+ZGVzdGluYXRpb25cbiAgICApO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BDYW5Ecm9wU291cmNlKCk6IGJvb2xlYW4ge1xuICAgIHZhciBzb3VyY2UgPSB0aGlzLmRyYWdEcm9wSW5mby5zb3VyY2U7XG4gICAgaWYgKCFzb3VyY2UpIHJldHVybiB0cnVlO1xuICAgIHZhciBkZXN0aW5hdGlvbiA9IDxJRWxlbWVudD50aGlzLmRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbjtcbiAgICBpZiAoIXRoaXMuZHJhZ0Ryb3BDYW5Ecm9wQ29yZShzb3VyY2UsIGRlc3RpbmF0aW9uKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmRyYWdEcm9wQ2FuRHJvcE5vdE5leHQoXG4gICAgICBzb3VyY2UsXG4gICAgICBkZXN0aW5hdGlvbixcbiAgICAgIHRoaXMuZHJhZ0Ryb3BJbmZvLmlzRWRnZSxcbiAgICAgIHRoaXMuZHJhZ0Ryb3BJbmZvLmlzQm90dG9tXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQ2FuRHJvcENvcmUoXG4gICAgdGFyZ2V0OiBJRWxlbWVudCxcbiAgICBkZXN0aW5hdGlvbjogSUVsZW1lbnRcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFkZXN0aW5hdGlvbikgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuZHJhZ0Ryb3BJc1NhbWVFbGVtZW50KGRlc3RpbmF0aW9uLCB0YXJnZXQpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRhcmdldC5pc1BhbmVsKSB7XG4gICAgICB2YXIgcG5sID0gPFBhbmVsTW9kZWxCYXNlPig8YW55PnRhcmdldCk7XG4gICAgICBpZiAoXG4gICAgICAgIHBubC5jb250YWluc0VsZW1lbnQoZGVzdGluYXRpb24pIHx8XG4gICAgICAgICEhcG5sLmdldEVsZW1lbnRCeU5hbWUoZGVzdGluYXRpb24ubmFtZSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQ2FuRHJvcE5vdE5leHQoXG4gICAgc291cmNlOiBJRWxlbWVudCxcbiAgICBkZXN0aW5hdGlvbjogSUVsZW1lbnQsXG4gICAgaXNFZGdlOiBib29sZWFuLFxuICAgIGlzQm90dG9tOiBib29sZWFuXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghZGVzdGluYXRpb24gfHwgKGRlc3RpbmF0aW9uLmlzUGFuZWwgJiYgIWlzRWRnZSkpIHJldHVybiB0cnVlO1xuICAgIGlmIChzb3VyY2UucGFyZW50ICE9PSBkZXN0aW5hdGlvbi5wYXJlbnQpIHJldHVybiB0cnVlO1xuICAgIHZhciBwbmwgPSA8UGFuZWxNb2RlbEJhc2U+c291cmNlLnBhcmVudDtcbiAgICB2YXIgc3JjSW5kZXggPSBwbmwuZWxlbWVudHMuaW5kZXhPZihzb3VyY2UpO1xuICAgIHZhciBkZXN0SW5kZXggPSBwbmwuZWxlbWVudHMuaW5kZXhPZihkZXN0aW5hdGlvbik7XG4gICAgaWYgKGRlc3RJbmRleCA8IHNyY0luZGV4ICYmICFpc0JvdHRvbSkgZGVzdEluZGV4LS07XG4gICAgaWYgKGlzQm90dG9tKSBkZXN0SW5kZXgrKztcbiAgICByZXR1cm4gc3JjSW5kZXggPCBkZXN0SW5kZXhcbiAgICAgID8gZGVzdEluZGV4IC0gc3JjSW5kZXggPiAxXG4gICAgICA6IHNyY0luZGV4IC0gZGVzdEluZGV4ID4gMDtcbiAgfVxuXG4gIHByaXZhdGUgZHJhZ0Ryb3BJc1NhbWVFbGVtZW50KGVsMTogSUVsZW1lbnQsIGVsMjogSUVsZW1lbnQpIHtcbiAgICByZXR1cm4gZWwxID09IGVsMiB8fCBlbDEubmFtZSA9PSBlbDIubmFtZTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInBhZ2VcIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwibmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5XCIsXG4gICAgICBkZWZhdWx0OiBcImluaGVyaXRcIixcbiAgICAgIGNob2ljZXM6IFtcImluaGVyaXRcIiwgXCJzaG93XCIsIFwiaGlkZVwiXVxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJxdWVzdGlvbnNPcmRlclwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIFwiaW5pdGlhbFwiLCBcInJhbmRvbVwiXVxuICAgIH0sXG4gICAgeyBuYW1lOiBcIm1heFRpbWVUb0ZpbmlzaDpudW1iZXJcIiwgZGVmYXVsdDogMCB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUGFnZU1vZGVsKCk7XG4gIH0sXG4gIFwicGFuZWxiYXNlXCJcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGFnZS50cyIsImltcG9ydCB7IEJhc2UsIElRdWVzdGlvbiwgRXZlbnQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkN1c3RvbVdpZGdldCB7XG4gIHB1YmxpYyBodG1sVGVtcGxhdGU6IHN0cmluZztcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHdpZGdldEpzb246IGFueSkge1xuICAgIHRoaXMuaHRtbFRlbXBsYXRlID0gd2lkZ2V0SnNvbi5odG1sVGVtcGxhdGUgPyB3aWRnZXRKc29uLmh0bWxUZW1wbGF0ZSA6IFwiXCI7XG4gIH1cbiAgcHVibGljIGFmdGVyUmVuZGVyKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGVsOiBhbnkpIHtcbiAgICBpZiAodGhpcy53aWRnZXRKc29uLmFmdGVyUmVuZGVyKSB0aGlzLndpZGdldEpzb24uYWZ0ZXJSZW5kZXIocXVlc3Rpb24sIGVsKTtcbiAgfVxuICBwdWJsaWMgd2lsbFVubW91bnQocXVlc3Rpb246IElRdWVzdGlvbiwgZWw6IGFueSkge1xuICAgIGlmICh0aGlzLndpZGdldEpzb24ud2lsbFVubW91bnQpIHRoaXMud2lkZ2V0SnNvbi53aWxsVW5tb3VudChxdWVzdGlvbiwgZWwpO1xuICB9XG4gIHB1YmxpYyBnZXREaXNwbGF5VmFsdWUocXVlc3Rpb246IElRdWVzdGlvbik6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMud2lkZ2V0SnNvbi5nZXREaXNwbGF5VmFsdWUpXG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLmdldERpc3BsYXlWYWx1ZShxdWVzdGlvbik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGlzRml0KHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0xpYnJhcnlMb2FkZWQoKSAmJiB0aGlzLndpZGdldEpzb24uaXNGaXQpXG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLmlzRml0KHF1ZXN0aW9uKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGFjdGl2YXRlZEJ5Q2hhbmdlZChhY3RpdmF0ZWRCeTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaXNMaWJyYXJ5TG9hZGVkKCkgJiYgdGhpcy53aWRnZXRKc29uLmFjdGl2YXRlZEJ5Q2hhbmdlZCkge1xuICAgICAgdGhpcy53aWRnZXRKc29uLmFjdGl2YXRlZEJ5Q2hhbmdlZChhY3RpdmF0ZWRCeSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaXNMaWJyYXJ5TG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLndpZGdldEpzb24ud2lkZ2V0SXNMb2FkZWQpXG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLndpZGdldElzTG9hZGVkKCkgPT0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzRGVmYXVsdFJlbmRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLmlzRGVmYXVsdFJlbmRlcjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbiB7XG4gIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IEN1c3RvbVdpZGdldENvbGxlY3Rpb24gPSBuZXcgQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbigpO1xuICBwcml2YXRlIHdpZGdldHNWYWx1ZXM6IEFycmF5PFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0PiA9IFtdO1xuICBwcml2YXRlIHdpZGdldHNBY3RpdmF0ZWRCeSA9IHt9O1xuXG4gIHB1YmxpYyBvbkN1c3RvbVdpZGdldEFkZGVkOiBFdmVudDxcbiAgICAoY3VzdG9tV2lkZ2V0OiBRdWVzdGlvbkN1c3RvbVdpZGdldCkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChjdXN0b21XaWRnZXQ6IFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0KSA9PiBhbnksIGFueT4oKTtcblxuICBwdWJsaWMgZ2V0IHdpZGdldHMoKTogQXJyYXk8UXVlc3Rpb25DdXN0b21XaWRnZXQ+IHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRzVmFsdWVzO1xuICB9XG4gIHB1YmxpYyBhZGRDdXN0b21XaWRnZXQod2lkZ2V0SnNvbjogYW55LCBhY3RpdmF0ZWRCeTogc3RyaW5nID0gXCJwcm9wZXJ0eVwiKSB7XG4gICAgdmFyIG5hbWUgPSB3aWRnZXRKc29uLm5hbWU7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICBuYW1lID0gXCJ3aWRnZXRfXCIgKyB0aGlzLndpZGdldHMubGVuZ3RoICsgMTtcbiAgICB9XG4gICAgdmFyIGN1c3RvbVdpZGdldCA9IG5ldyBRdWVzdGlvbkN1c3RvbVdpZGdldChuYW1lLCB3aWRnZXRKc29uKTtcbiAgICB0aGlzLndpZGdldHNWYWx1ZXMucHVzaChjdXN0b21XaWRnZXQpO1xuICAgICg8YW55PnRoaXMpLndpZGdldHNBY3RpdmF0ZWRCeVtuYW1lXSA9IGFjdGl2YXRlZEJ5O1xuICAgIGN1c3RvbVdpZGdldC5hY3RpdmF0ZWRCeUNoYW5nZWQoYWN0aXZhdGVkQnkpO1xuICAgIHRoaXMub25DdXN0b21XaWRnZXRBZGRlZC5maXJlKGN1c3RvbVdpZGdldCwgbnVsbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHdheSB0aGUgY3VzdG9tIHdpZ2V0IGlzIGFjdGl2YXRlZC4gSXQgY2FuIGJlIGFjdGl2YXRlZCBieSBhIHByb3BlcnR5IChcInByb3BlcnR5XCIpLCBxdWVzdGlvbiB0eXBlIChcInR5cGVcIikgb3IgYnkgbmV3L2N1c3RvbSBxdWVzdGlvbiB0eXBlIChcImN1c3RvbXR5cGVcIikuXG4gICAqIEBwYXJhbSB3aWRnZXROYW1lIHRoZSBjdXN0b20gd2lkZ2V0IG5hbWVcbiAgICogQHNlZSBzZXRBY3RpdmF0ZWRCeVxuICAgKi9cbiAgcHVibGljIGdldEFjdGl2YXRlZEJ5KHdpZGdldE5hbWU6IHN0cmluZykge1xuICAgIHZhciByZXMgPSAoPGFueT50aGlzKS53aWRnZXRzQWN0aXZhdGVkQnlbd2lkZ2V0TmFtZV07XG4gICAgcmV0dXJuIHJlcyA/IHJlcyA6IFwicHJvcGVydHlcIjtcbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgd2F5IHRoZSBjdXN0b20gd2lnZXQgaXMgYWN0aXZhdGVkLiBUaGUgYWN0aXZhdGlvbiB0eXBlcyBhcmU6IHByb3BlcnR5IChcInByb3BlcnR5XCIpLCBxdWVzdGlvbiB0eXBlIChcInR5cGVcIikgb3IgbmV3L2N1c3RvbSBxdWVzdGlvbiB0eXBlIChcImN1c3RvbXR5cGVcIikuIEEgY3VzdG9tIHdpZ2V0IG1heSBzdXBwb3J0IGFsbCBvciBvbmx5IHNvbWUgb2YgdGhpcyBhY3RpdmF0aW9uIHR5cGVzLlxuICAgKiBAcGFyYW0gd2lkZ2V0TmFtZVxuICAgKiBAcGFyYW0gYWN0aXZhdGVkQnkgdGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHZhcmlhbnRzOiBcInByb3BlcnR5XCIsIFwidHlwZVwiIGFuZCBcImN1c3RvbXR5cGVcIlxuICAgKi9cbiAgcHVibGljIHNldEFjdGl2YXRlZEJ5KHdpZGdldE5hbWU6IHN0cmluZywgYWN0aXZhdGVkQnk6IHN0cmluZykge1xuICAgIGlmICghd2lkZ2V0TmFtZSB8fCAhYWN0aXZhdGVkQnkpIHJldHVybjtcbiAgICB2YXIgd2lkZ2V0ID0gdGhpcy5nZXRDdXN0b21XaWRnZXRCeU5hbWUod2lkZ2V0TmFtZSk7XG4gICAgaWYgKCF3aWRnZXQpIHJldHVybjtcbiAgICAoPGFueT50aGlzKS53aWRnZXRzQWN0aXZhdGVkQnlbd2lkZ2V0TmFtZV0gPSBhY3RpdmF0ZWRCeTtcbiAgICB3aWRnZXQuYWN0aXZhdGVkQnlDaGFuZ2VkKGFjdGl2YXRlZEJ5KTtcbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy53aWRnZXRzVmFsdWVzID0gW107XG4gIH1cbiAgcHVibGljIGdldEN1c3RvbVdpZGdldEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBRdWVzdGlvbkN1c3RvbVdpZGdldCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLndpZGdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLndpZGdldHNbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gdGhpcy53aWRnZXRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0Q3VzdG9tV2lkZ2V0KHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBRdWVzdGlvbkN1c3RvbVdpZGdldCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLndpZGdldHNWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLndpZGdldHNWYWx1ZXNbaV0uaXNGaXQocXVlc3Rpb24pKSByZXR1cm4gdGhpcy53aWRnZXRzVmFsdWVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uQ3VzdG9tV2lkZ2V0cy50cyIsImltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uU2VsZWN0QmFzZSB9IGZyb20gXCIuL3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgZHJvcGRvd24gcXVlc3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCBleHRlbmRzIFF1ZXN0aW9uU2VsZWN0QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwib3B0aW9uc0NhcHRpb25cIiwgdGhpcyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcImNob2ljZXNNaW5cIiwgXCJjaG9pY2VzTWF4XCIsIFwiY2hvaWNlc1N0ZXBcIl0sXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIHRvIHNob3cgb3B0aW9ucyBjYXB0aW9uIGl0ZW0gKCdDaG9vc2UuLi4nKS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd09wdGlvbnNDYXB0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93T3B0aW9uc0NhcHRpb25cIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93T3B0aW9uc0NhcHRpb24odmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd09wdGlvbnNDYXB0aW9uXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgb3B0aW9ucyBjYXB0aW9uIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0YWtlbiBmcm9tIGxvY2FsaXphdGlvbiBzdHJpbmdzLlxuICAgKi9cbiAgcHVibGljIGdldCBvcHRpb25zQ2FwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcIm9wdGlvbnNDYXB0aW9uXCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3B0aW9uc0NhcHRpb25cIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgb3B0aW9uc0NhcHRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm9wdGlvbnNDYXB0aW9uXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY09wdGlvbnNDYXB0aW9uKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZHJvcGRvd25cIjtcbiAgfVxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkSXRlbSgpOiBJdGVtVmFsdWUge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZSh0aGlzLnZpc2libGVDaG9pY2VzLCB0aGlzLnZhbHVlKTtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICB2YXIgaXRlbXMgPSBzdXBlci5nZXRDaG9pY2VzKCk7XG4gICAgaWYgKHRoaXMuY2hvaWNlc01heCA8PSB0aGlzLmNob2ljZXNNaW4pIHJldHVybiBpdGVtcztcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2goaXRlbXNbaV0pO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gdGhpcy5jaG9pY2VzTWluOyBpIDw9IHRoaXMuY2hvaWNlc01heDsgaSArPSB0aGlzLmNob2ljZXNTdGVwKSB7XG4gICAgICByZXMucHVzaChuZXcgSXRlbVZhbHVlKGkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgYW5kIGNob2ljZXNNYXggcHJvcGVydHkgdG8gYXV0b21hdGljYWxseSBhZGQgY2hvaWNlcy4gRm9yIGV4YW1wbGUgY2hvaWNlc01pbiA9IDEgYW5kIGNob2ljZXNNYXggPSAxMCB3aWxsIGdlbmVyYXRlIHRlbiBhZGRpdGlvbmFsIGNob2ljZXMgZnJvbSAxIHRvIDEwLlxuICAgKiBAc2VlIGNob2ljZXNNYXhcbiAgICogQHNlZSBjaG9pY2VzU3RlcFxuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzTWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNNaW5cIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzTWluKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc01pblwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBhbmQgY2hvaWNlc01heCBwcm9wZXJ0eSB0byBhdXRvbWF0aWNhbGx5IGFkZCBjaG9pY2VzLiBGb3IgZXhhbXBsZSBjaG9pY2VzTWluID0gMSBhbmQgY2hvaWNlc01heCA9IDEwIHdpbGwgZ2VuZXJhdGUgdGVuIGFkZGl0aW9uYWwgY2hvaWNlcyBmcm9tIDEgdG8gMTAuXG4gICAqIEBzZWUgY2hvaWNlc01pblxuICAgKiBAc2VlIGNob2ljZXNTdGVwXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXNNYXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc01heFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXNNYXgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzTWF4XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuIEl0IHRlbGxzIHRoZSB2YWx1ZSBvZiB0aGUgaXRlcmF0b3IgYmV0d2VlbiBjaG9pY2VzTWluIGFuZCBjaG9pY2VzTWF4IHByb3BlcnRpZXMuXG4gICAqIElmIGNob2ljZXNNaW4gPSAxMCwgY2hvaWNlc01heCA9IDMwIGFuZCBjaG9pY2VzU3RlcCA9IDEwIHRoZW4geW91IHdpbGwgaGF2ZSBvbmx5IHRocmVlIGFkZGl0aW9uYWwgY2hvaWNlczogWzEwLCAyMCwgMzBdLlxuICAgKiBAc2VlIGNob2ljZXNNaW5cbiAgICogQHNlZSBjaG9pY2VzTWF4XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXNTdGVwKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNTdGVwXCIsIDEpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hvaWNlc1N0ZXAodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgMSkgdmFsID0gMTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzU3RlcFwiLCB2YWwpO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImRyb3Bkb3duXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwib3B0aW9uc0NhcHRpb25cIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY09wdGlvbnNDYXB0aW9uXCIgfSxcbiAgICB7IG5hbWU6IFwic2hvd09wdGlvbnNDYXB0aW9uOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHsgbmFtZTogXCJjaG9pY2VzTWluOm51bWJlclwiLCBkZWZhdWx0OiAwIH0sXG4gICAgeyBuYW1lOiBcImNob2ljZXNNYXg6bnVtYmVyXCIsIGRlZmF1bHQ6IDAgfSxcbiAgICB7IG5hbWU6IFwiY2hvaWNlc1N0ZXA6bnVtYmVyXCIsIGRlZmF1bHQ6IDEgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJzZWxlY3RiYXNlXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImRyb3Bkb3duXCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbkRyb3Bkb3duTW9kZWwobmFtZSk7XG4gIHEuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlcztcbiAgcmV0dXJuIHE7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9kcm9wZG93bi50cyIsImltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEV4cHJlc3Npb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgZXhwcmVzc2lvbiBxdWVzdGlvbi4gSXQgaXMgYSByZWFkLW9ubHkgcXVlc3Rpb24uIEl0IGNhbGN1bGF0ZXMgdmFsdWUgYmFzZWQgb24gZXB4cmVzc2lvbiBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBwcml2YXRlIGV4cHJlc3Npb25Jc1J1bm5pbmc6IGJvb2xlYW47XG4gIHByaXZhdGUgZXhwcmVzc2lvblJ1bm5lcjogRXhwcmVzc2lvblJ1bm5lcjtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJmb3JtYXRcIiwgdGhpcyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJleHByZXNzaW9uXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuZXhwcmVzc2lvblJ1bm5lcikge1xuICAgICAgICBzZWxmLmV4cHJlc3Npb25SdW5uZXIgPSBuZXcgRXhwcmVzc2lvblJ1bm5lcihzZWxmLmV4cHJlc3Npb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZXhwcmVzc2lvblwiO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBkaXNwbGF5IHRoZSB2YWx1ZSBpbiB5b3VyIG93biBmb3JtYXQuIE1ha2Ugc3VyZSB5b3UgaGF2ZSBcInswfVwiIHN1YnN0cmluZyBpbiB5b3VyIHN0cmluZywgdG8gZGlzcGxheSB0aGUgYWN0dWFsIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGdldCBmb3JtYXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJmb3JtYXRcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBmb3JtYXQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImZvcm1hdFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NGb3JtYXQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiZm9ybWF0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgRXhwcmVzc2lvbiB0aGF0IHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBxdWVzdGlvbiB2YWx1ZS4gWW91IG1heSB1c2Ugc3RhbmRhcmQgb3BlcmF0b3JzIGxpa2UgKywgLSwgKiBhbmQgLywgc3F1YXJlcyAoKS4gSGVyZSBpcyB0aGUgZXhhbXBsZSBvZiBhY2Nlc3NpbmcgdGhlIHF1ZXN0aW9uIHZhbHVlIHtxdWVzdGlvbm5hbWV9LlxuICAgKiA8YnIvPkV4YW1wbGU6IFwiKHtxdWFudGl0eX0gKiB7cHJpY2V9KSAqICgxMDAgLSB7ZGlzY291bnR9KSAvIDEwMFwiXG4gICAqL1xuICBwdWJsaWMgZ2V0IGV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZXhwcmVzc2lvblwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4cHJlc3Npb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJleHByZXNzaW9uXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGxvY0NhbGN1bGF0aW9uKCkge1xuICAgIHRoaXMuZXhwcmVzc2lvbklzUnVubmluZyA9IHRydWU7XG4gIH1cbiAgcHVibGljIHVubG9jQ2FsY3VsYXRpb24oKSB7XG4gICAgdGhpcy5leHByZXNzaW9uSXNSdW5uaW5nID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIGlmICghdGhpcy5leHByZXNzaW9uIHx8IHRoaXMuZXhwcmVzc2lvbklzUnVubmluZykgcmV0dXJuO1xuICAgIHRoaXMubG9jQ2FsY3VsYXRpb24oKTtcbiAgICBpZiAoIXRoaXMuZXhwcmVzc2lvblJ1bm5lcilcbiAgICAgIHRoaXMuZXhwcmVzc2lvblJ1bm5lciA9IG5ldyBFeHByZXNzaW9uUnVubmVyKHRoaXMuZXhwcmVzc2lvbik7XG4gICAgdmFyIG5ld1ZhbHVlID0gdGhpcy5leHByZXNzaW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIGlmICghSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKG5ld1ZhbHVlLCB0aGlzLnZhbHVlKSkge1xuICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgICB0aGlzLnVubG9jQ2FsY3VsYXRpb24oKTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGZyYWN0aW9uIGRpZ2l0cyB0byB1c2UgaWYgZGlzcGxheVN0eWxlIGlzIG5vdCBcIm5vbmVcIi4gUG9zc2libGUgdmFsdWVzIGFyZSBmcm9tIDAgdG8gMjAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIC0xIGFuZCBpdCBtZWFucyB0aGF0IHRoaXMgcHJvcGVydHkgaXMgbm90IHVzZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heGltdW1GcmFjdGlvbkRpZ2l0cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhpbXVtRnJhY3Rpb25EaWdpdHNcIiwgLTEpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4aW11bUZyYWN0aW9uRGlnaXRzKHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IC0xIHx8IHZhbCA+IDIwKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4aW11bUZyYWN0aW9uRGlnaXRzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBmcmFjdGlvbiBkaWdpdHMgdG8gdXNlIGlmIGRpc3BsYXlTdHlsZSBpcyBub3QgXCJub25lXCIuIFBvc3NpYmxlIHZhbHVlcyBhcmUgZnJvbSAwIHRvIDIwLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAtMSBhbmQgaXQgbWVhbnMgdGhhdCB0aGlzIHByb3BlcnR5IGlzIG5vdCB1c2VkLlxuICAgKi9cbiAgcHVibGljIGdldCBtaW5pbXVtRnJhY3Rpb25EaWdpdHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWluaW11bUZyYWN0aW9uRGlnaXRzXCIsIC0xKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pbmltdW1GcmFjdGlvbkRpZ2l0cyh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAtMSB8fCB2YWwgPiAyMCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pbmltdW1GcmFjdGlvbkRpZ2l0c1wiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4pOiBhbnkge1xuICAgIHZhciB2YWwgPSB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLnZhbHVlKSA/IHRoaXMuZGVmYXVsdFZhbHVlIDogdGhpcy52YWx1ZTtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkodmFsKSkgcmV0dXJuIFwiXCI7XG4gICAgdmFyIHN0ciA9IHRoaXMuZ2V0VmFsdWVBc1N0cih2YWwpO1xuICAgIGlmICghdGhpcy5mb3JtYXQpIHJldHVybiBzdHI7XG4gICAgcmV0dXJuICg8YW55PnRoaXMuZm9ybWF0KVtcImZvcm1hdFwiXShzdHIpO1xuICB9XG4gIC8qKlxuICAgKiBZb3UgbWF5IHNldCB0aGlzIHByb3BlcnR5IHRvIFwiZGVjaW1hbFwiLCBcImN1cnJlbmN5XCIgb3IgXCJwZXJjZW50XCIuIElmIHlvdSBzZXQgaXQgdG8gXCJjdXJyZW5jeVwiLCB5b3UgbWF5IHVzZSB0aGUgY3VycmVuY3kgcHJvcGVydHkgdG8gZGlzcGxheSB0aGUgdmFsdWUgaW4gY3VycmVuY3kgZGlmZmVyZW50IGZyb20gVVNELlxuICAgKiBAc2VlIGN1cnJlbmN5XG4gICAqL1xuICBwdWJsaWMgZ2V0IGRpc3BsYXlTdHlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkaXNwbGF5U3R5bGVcIiwgXCJub25lXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGlzcGxheVN0eWxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVN0eWxlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBkaXNwbGF5IHRoZSB2YWx1ZSBpbiB0aGUgY3VycmVuY3kgZGlmZmVyZW4gZnJvbSBVU0QuIFRoZSBkaXNwbGF5U3R5cGUgc2hvdWxkIGJlIHNldCB0byBcImN1cnJlbmN5XCIuXG4gICAqIEBzZWUgZGlzcGxheVN0eWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbmN5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImN1cnJlbmN5XCIsIFwiVVNEXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY3VycmVuY3kodmFsOiBzdHJpbmcpIHtcbiAgICBpZiAoZ2V0Q3VycmVjeUNvZGVzKCkuaW5kZXhPZih2YWwpIDwgMCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImN1cnJlbmN5XCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB1c2VHcm91cGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidXNlR3JvdXBpbmdcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCB1c2VHcm91cGluZyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ1c2VHcm91cGluZ1wiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZUFzU3RyKHZhbDogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmRpc3BsYXlTdHlsZSAhPSBcIm5vbmVcIiAmJlxuICAgICAgIWlzTmFOKHBhcnNlRmxvYXQodmFsKSkgJiZcbiAgICAgIGlzRmluaXRlKHZhbClcbiAgICApIHtcbiAgICAgIHZhciBsb2NhbGUgPSB0aGlzLmdldExvY2FsZSgpO1xuICAgICAgaWYgKCFsb2NhbGUpIGxvY2FsZSA9IFwiZW5cIjtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBzdHlsZTogdGhpcy5kaXNwbGF5U3R5bGUsXG4gICAgICAgIGN1cnJlbmN5OiB0aGlzLmN1cnJlbmN5LFxuICAgICAgICB1c2VHcm91cGluZzogdGhpcy51c2VHcm91cGluZ1xuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLm1heGltdW1GcmFjdGlvbkRpZ2l0cyA+IC0xKSB7XG4gICAgICAgICg8YW55Pm9wdGlvbnMpW1wibWF4aW11bUZyYWN0aW9uRGlnaXRzXCJdID0gdGhpcy5tYXhpbXVtRnJhY3Rpb25EaWdpdHM7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5taW5pbXVtRnJhY3Rpb25EaWdpdHMgPiAtMSkge1xuICAgICAgICAoPGFueT5vcHRpb25zKVtcIm1pbmltdW1GcmFjdGlvbkRpZ2l0c1wiXSA9IHRoaXMubWluaW11bUZyYWN0aW9uRGlnaXRzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbC50b0xvY2FsZVN0cmluZyhsb2NhbGUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsLnRvU3RyaW5nKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlY3lDb2RlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgcmV0dXJuIFtcbiAgICBcIkFFRFwiLFxuICAgIFwiQUZOXCIsXG4gICAgXCJBTExcIixcbiAgICBcIkFNRFwiLFxuICAgIFwiQU5HXCIsXG4gICAgXCJBT0FcIixcbiAgICBcIkFSU1wiLFxuICAgIFwiQVVEXCIsXG4gICAgXCJBV0dcIixcbiAgICBcIkFaTlwiLFxuICAgIFwiQkFNXCIsXG4gICAgXCJCQkRcIixcbiAgICBcIkJEVFwiLFxuICAgIFwiQkdOXCIsXG4gICAgXCJCSERcIixcbiAgICBcIkJJRlwiLFxuICAgIFwiQk1EXCIsXG4gICAgXCJCTkRcIixcbiAgICBcIkJPQlwiLFxuICAgIFwiQk9WXCIsXG4gICAgXCJCUkxcIixcbiAgICBcIkJTRFwiLFxuICAgIFwiQlROXCIsXG4gICAgXCJCV1BcIixcbiAgICBcIkJZTlwiLFxuICAgIFwiQlpEXCIsXG4gICAgXCJDQURcIixcbiAgICBcIkNERlwiLFxuICAgIFwiQ0hFXCIsXG4gICAgXCJDSEZcIixcbiAgICBcIkNIV1wiLFxuICAgIFwiQ0xGXCIsXG4gICAgXCJDTFBcIixcbiAgICBcIkNOWVwiLFxuICAgIFwiQ09QXCIsXG4gICAgXCJDT1VcIixcbiAgICBcIkNSQ1wiLFxuICAgIFwiQ1VDXCIsXG4gICAgXCJDVVBcIixcbiAgICBcIkNWRVwiLFxuICAgIFwiQ1pLXCIsXG4gICAgXCJESkZcIixcbiAgICBcIkRLS1wiLFxuICAgIFwiRE9QXCIsXG4gICAgXCJEWkRcIixcbiAgICBcIkVHUFwiLFxuICAgIFwiRVJOXCIsXG4gICAgXCJFVEJcIixcbiAgICBcIkVVUlwiLFxuICAgIFwiRkpEXCIsXG4gICAgXCJGS1BcIixcbiAgICBcIkdCUFwiLFxuICAgIFwiR0VMXCIsXG4gICAgXCJHSFNcIixcbiAgICBcIkdJUFwiLFxuICAgIFwiR01EXCIsXG4gICAgXCJHTkZcIixcbiAgICBcIkdUUVwiLFxuICAgIFwiR1lEXCIsXG4gICAgXCJIS0RcIixcbiAgICBcIkhOTFwiLFxuICAgIFwiSFJLXCIsXG4gICAgXCJIVEdcIixcbiAgICBcIkhVRlwiLFxuICAgIFwiSURSXCIsXG4gICAgXCJJTFNcIixcbiAgICBcIklOUlwiLFxuICAgIFwiSVFEXCIsXG4gICAgXCJJUlJcIixcbiAgICBcIklTS1wiLFxuICAgIFwiSk1EXCIsXG4gICAgXCJKT0RcIixcbiAgICBcIkpQWVwiLFxuICAgIFwiS0VTXCIsXG4gICAgXCJLR1NcIixcbiAgICBcIktIUlwiLFxuICAgIFwiS01GXCIsXG4gICAgXCJLUFdcIixcbiAgICBcIktSV1wiLFxuICAgIFwiS1dEXCIsXG4gICAgXCJLWURcIixcbiAgICBcIktaVFwiLFxuICAgIFwiTEFLXCIsXG4gICAgXCJMQlBcIixcbiAgICBcIkxLUlwiLFxuICAgIFwiTFJEXCIsXG4gICAgXCJMU0xcIixcbiAgICBcIkxZRFwiLFxuICAgIFwiTUFEXCIsXG4gICAgXCJNRExcIixcbiAgICBcIk1HQVwiLFxuICAgIFwiTUtEXCIsXG4gICAgXCJNTUtcIixcbiAgICBcIk1OVFwiLFxuICAgIFwiTU9QXCIsXG4gICAgXCJNUk9cIixcbiAgICBcIk1VUlwiLFxuICAgIFwiTVZSXCIsXG4gICAgXCJNV0tcIixcbiAgICBcIk1YTlwiLFxuICAgIFwiTVhWXCIsXG4gICAgXCJNWVJcIixcbiAgICBcIk1aTlwiLFxuICAgIFwiTkFEXCIsXG4gICAgXCJOR05cIixcbiAgICBcIk5JT1wiLFxuICAgIFwiTk9LXCIsXG4gICAgXCJOUFJcIixcbiAgICBcIk5aRFwiLFxuICAgIFwiT01SXCIsXG4gICAgXCJQQUJcIixcbiAgICBcIlBFTlwiLFxuICAgIFwiUEdLXCIsXG4gICAgXCJQSFBcIixcbiAgICBcIlBLUlwiLFxuICAgIFwiUExOXCIsXG4gICAgXCJQWUdcIixcbiAgICBcIlFBUlwiLFxuICAgIFwiUk9OXCIsXG4gICAgXCJSU0RcIixcbiAgICBcIlJVQlwiLFxuICAgIFwiUldGXCIsXG4gICAgXCJTQVJcIixcbiAgICBcIlNCRFwiLFxuICAgIFwiU0NSXCIsXG4gICAgXCJTREdcIixcbiAgICBcIlNFS1wiLFxuICAgIFwiU0dEXCIsXG4gICAgXCJTSFBcIixcbiAgICBcIlNMTFwiLFxuICAgIFwiU09TXCIsXG4gICAgXCJTUkRcIixcbiAgICBcIlNTUFwiLFxuICAgIFwiU1REXCIsXG4gICAgXCJTVkNcIixcbiAgICBcIlNZUFwiLFxuICAgIFwiU1pMXCIsXG4gICAgXCJUSEJcIixcbiAgICBcIlRKU1wiLFxuICAgIFwiVE1UXCIsXG4gICAgXCJUTkRcIixcbiAgICBcIlRPUFwiLFxuICAgIFwiVFJZXCIsXG4gICAgXCJUVERcIixcbiAgICBcIlRXRFwiLFxuICAgIFwiVFpTXCIsXG4gICAgXCJVQUhcIixcbiAgICBcIlVHWFwiLFxuICAgIFwiVVNEXCIsXG4gICAgXCJVU05cIixcbiAgICBcIlVZSVwiLFxuICAgIFwiVVlVXCIsXG4gICAgXCJVWlNcIixcbiAgICBcIlZFRlwiLFxuICAgIFwiVk5EXCIsXG4gICAgXCJWVVZcIixcbiAgICBcIldTVFwiLFxuICAgIFwiWEFGXCIsXG4gICAgXCJYQUdcIixcbiAgICBcIlhBVVwiLFxuICAgIFwiWEJBXCIsXG4gICAgXCJYQkJcIixcbiAgICBcIlhCQ1wiLFxuICAgIFwiWEJEXCIsXG4gICAgXCJYQ0RcIixcbiAgICBcIlhEUlwiLFxuICAgIFwiWE9GXCIsXG4gICAgXCJYUERcIixcbiAgICBcIlhQRlwiLFxuICAgIFwiWFBUXCIsXG4gICAgXCJYU1VcIixcbiAgICBcIlhUU1wiLFxuICAgIFwiWFVBXCIsXG4gICAgXCJYWFhcIixcbiAgICBcIllFUlwiLFxuICAgIFwiWkFSXCIsXG4gICAgXCJaQVJcIixcbiAgICBcIlpNV1wiLFxuICAgIFwiWldMXCJcbiAgXTtcbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJleHByZXNzaW9uXCIsXG4gIFtcbiAgICBcImV4cHJlc3Npb246ZXhwcmVzc2lvblwiLFxuICAgIHsgbmFtZTogXCJmb3JtYXRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0Zvcm1hdFwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJkaXNwbGF5U3R5bGVcIixcbiAgICAgIGRlZmF1bHQ6IFwibm9uZVwiLFxuICAgICAgY2hvaWNlczogW1wibm9uZVwiLCBcImRlY2ltYWxcIiwgXCJjdXJyZW5jeVwiLCBcInBlcmNlbnRcIl1cbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY3VycmVuY3lcIixcbiAgICAgIGNob2ljZXM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldEN1cnJlY3lDb2RlcygpO1xuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IFwiVVNEXCJcbiAgICB9LFxuICAgIHsgbmFtZTogXCJtYXhpbXVtRnJhY3Rpb25EaWdpdHM6bnVtYmVyXCIsIGRlZmF1bHQ6IC0xIH0sXG4gICAgeyBuYW1lOiBcIm1pbmltdW1GcmFjdGlvbkRpZ2l0czpudW1iZXJcIiwgZGVmYXVsdDogLTEgfSxcbiAgICB7IG5hbWU6IFwidXNlR3JvdXBpbmc6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcImNvbW1lbnRUZXh0XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImVuYWJsZUlmXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImlzUmVxdWlyZWRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwicmVhZE9ubHlcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwicmVxdWlyZWRFcnJvclRleHRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwidmFsaWRhdG9yc1wiLCB2aXNpYmxlOiBmYWxzZSB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25FeHByZXNzaW9uTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiZXhwcmVzc2lvblwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2V4cHJlc3Npb24udHMiLCJpbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgRW1haWxWYWxpZGF0b3IgfSBmcm9tIFwiLi92YWxpZGF0b3JcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhbiBpbnB1dCB0ZXh0IHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25UZXh0TW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGxhY2VIb2xkZXJcIiwgdGhpcyk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBpbnB1dCB0eXBlLlxuICAgKi9cbiAgcHVibGljIGdldCBpbnB1dFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW5wdXRUeXBlXCIsIFwidGV4dFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlucHV0VHlwZSh2YWw6IHN0cmluZykge1xuICAgIHZhbCA9IHZhbC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh2YWwgPT0gXCJkYXRldGltZV9sb2NhbFwiKSB2YWwgPSBcImRhdGV0aW1lLWxvY2FsXCI7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW5wdXRUeXBlXCIsIHZhbC50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiAmJlxuICAgICAgdmFsID09PSBcImVtYWlsXCIgJiZcbiAgICAgICF0aGlzLnZhbGlkYXRvcnMuc29tZSh2ID0+IHYuZ2V0VHlwZSgpID09PSBcImVtYWlsdmFsaWRhdG9yXCIpXG4gICAgKSB7XG4gICAgICB0aGlzLnZhbGlkYXRvcnMucHVzaChuZXcgRW1haWxWYWxpZGF0b3IoKSk7XG4gICAgfVxuICB9XG4gIGlzTGF5b3V0VHlwZVN1cHBvcnRlZChsYXlvdXRUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heGltaW0gdGV4dCBsZW5ndGguIElmIGl0IGlzIC0xLCBkZWZhdWwgdmFsdWUsIHRoZW4gdGhlIHN1cnZleSBtYXhUZXh0TGVuZ3RoIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAgICogSWYgaXQgaXMgMCwgdGhlbiB0aGUgdmFsdWUgaXMgdW5saW1pdGVkXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubWF4VGV4dExlbmd0aFxuICAgKi9cbiAgcHVibGljIGdldCBtYXhMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4TGVuZ3RoXCIsIC0xKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heExlbmd0aCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heExlbmd0aFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRNYXhMZW5ndGgoKTogYW55IHtcbiAgICByZXR1cm4gSGVscGVycy5nZXRNYXhMZW5ndGgoXG4gICAgICB0aGlzLm1heExlbmd0aCxcbiAgICAgIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkubWF4VGV4dExlbmd0aCA6IC0xXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHRleHQgaW5wdXQgc2l6ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNpemVcIiwgMjUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2l6ZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNpemVcIiwgdmFsKTtcbiAgfVxuICBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5pc0VtcHR5KCkgfHwgdGhpcy52YWx1ZSA9PT0gXCJcIjtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIGlucHV0IHBsYWNlIGhvbGRlci5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGxhY2VIb2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwbGFjZUhvbGRlclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBsYWNlSG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwbGFjZUhvbGRlclwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NQbGFjZUhvbGRlcigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwbGFjZUhvbGRlclwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0TmV3VmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIG5ld1ZhbHVlID0gdGhpcy5jb3JyZWN0VmFsdWVUeXBlKG5ld1ZhbHVlKTtcbiAgICBzdXBlci5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNvcnJlY3RWYWx1ZVR5cGUobmV3VmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKCFuZXdWYWx1ZSkgcmV0dXJuIG5ld1ZhbHVlO1xuICAgIGlmICh0aGlzLmlucHV0VHlwZSA9PSBcIm51bWJlclwiIHx8IHRoaXMuaW5wdXRUeXBlID09IFwicmFuZ2VcIikge1xuICAgICAgcmV0dXJuIHRoaXMuaXNOdW1iZXIobmV3VmFsdWUpID8gcGFyc2VGbG9hdChuZXdWYWx1ZSkgOiBcIlwiO1xuICAgIH1cbiAgICByZXR1cm4gbmV3VmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBpc051bWJlcih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KHZhbHVlKSkgJiYgaXNGaW5pdGUodmFsdWUpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwidGV4dFwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJpbnB1dFR5cGVcIixcbiAgICAgIGRlZmF1bHQ6IFwidGV4dFwiLFxuICAgICAgY2hvaWNlczogW1xuICAgICAgICBcImNvbG9yXCIsXG4gICAgICAgIFwiZGF0ZVwiLFxuICAgICAgICBcImRhdGV0aW1lXCIsXG4gICAgICAgIFwiZGF0ZXRpbWUtbG9jYWxcIixcbiAgICAgICAgXCJlbWFpbFwiLFxuICAgICAgICBcIm1vbnRoXCIsXG4gICAgICAgIFwibnVtYmVyXCIsXG4gICAgICAgIFwicGFzc3dvcmRcIixcbiAgICAgICAgXCJyYW5nZVwiLFxuICAgICAgICBcInRlbFwiLFxuICAgICAgICBcInRleHRcIixcbiAgICAgICAgXCJ0aW1lXCIsXG4gICAgICAgIFwidXJsXCIsXG4gICAgICAgIFwid2Vla1wiXG4gICAgICBdXG4gICAgfSxcbiAgICB7IG5hbWU6IFwic2l6ZTpudW1iZXJcIiwgZGVmYXVsdDogMjUgfSxcbiAgICB7IG5hbWU6IFwibWF4TGVuZ3RoOm51bWJlclwiLCBkZWZhdWx0OiAtMSB9LFxuICAgIHsgbmFtZTogXCJwbGFjZUhvbGRlclwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGxhY2VIb2xkZXJcIiB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25UZXh0TW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJ0ZXh0XCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dE1vZGVsKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fdGV4dC50cyIsImltcG9ydCB7IEJhc2UsIFN1cnZleUVycm9yLCBJU3VydmV5RXJyb3JPd25lciB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IEN1c3RvbUVycm9yLCBSZXF1cmVOdW1lcmljRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVzdWx0IHtcbiAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBhbnksIHB1YmxpYyBlcnJvcjogU3VydmV5RXJyb3IgPSBudWxsKSB7fVxufVxuLyoqXG4gKiBCYXNlIFN1cnZleUpTIHZhbGlkYXRvciBjbGFzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVZhbGlkYXRvciBleHRlbmRzIEJhc2Uge1xuICBwdWJsaWMgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXI7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInRleHRcIiwgdGhpcywgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGV4dFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRleHQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGV4dFwiLCB2YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldCBpc1ZhbGlkYXRlQWxsVmFsdWVzKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBnZXQgbG9jVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ0ZXh0XCIpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRFcnJvclRleHQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy50ZXh0KSByZXR1cm4gdGhpcy50ZXh0O1xuICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRFcnJvclRleHQobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUodmFsdWU6IGFueSwgbmFtZTogc3RyaW5nID0gbnVsbCk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIHZhbGlkYXRlQWxsVmFsdWVzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgdmFsdWVzOiBhbnksXG4gICAgcHJvcGVydGllczogYW55LFxuICAgIG5hbWU6IHN0cmluZyA9IG51bGxcbiAgKTogVmFsaWRhdG9yUmVzdWx0IHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmVycm9yT3duZXIgPyB0aGlzLmVycm9yT3duZXIuZ2V0TG9jYWxlKCkgOiBcIlwiO1xuICB9XG4gIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMuZXJyb3JPd25lciA/IHRoaXMuZXJyb3JPd25lci5nZXRNYXJrZG93bkh0bWwodGV4dCkgOiBudWxsO1xuICB9XG4gIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmVycm9yT3duZXIgPyB0aGlzLmVycm9yT3duZXIuZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0KSA6IHRleHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUN1c3RvbUVycm9yKG5hbWU6IHN0cmluZyk6IFN1cnZleUVycm9yIHtcbiAgICByZXR1cm4gbmV3IEN1c3RvbUVycm9yKHRoaXMuZ2V0RXJyb3JUZXh0KG5hbWUpLCB0aGlzLmVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPSB0aGlzLmdldFR5cGUoKS5yZXBsYWNlKFwidmFsaWRhdG9yXCIsIFwiXCIpO1xuICAgIGlmICghIXRoaXMudGV4dCkge1xuICAgICAgcmVzICs9IFwiLCBcIiArIHRoaXMudGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBJVmFsaWRhdG9yT3duZXIge1xuICB2YWxpZGF0b3JzOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+O1xuICB2YWxpZGF0ZWRWYWx1ZTogYW55O1xuICBnZXRWYWxpZGF0b3JUaXRsZSgpOiBzdHJpbmc7XG4gIGdldERhdGFGaWx0ZXJlZFZhbHVlcygpOiBhbnk7XG4gIGdldERhdGFGaWx0ZXJlZFByb3BlcnRpZXMoKTogYW55O1xufVxuZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJ1bm5lciB7XG4gIHB1YmxpYyBydW4ob3duZXI6IElWYWxpZGF0b3JPd25lcik6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3duZXIudmFsaWRhdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbGlkYXRvclJlc3VsdCA9IG51bGw7XG4gICAgICB2YXIgdmFsaWRhdG9yID0gb3duZXIudmFsaWRhdG9yc1tpXTtcbiAgICAgIGlmICghdmFsaWRhdG9yLmlzVmFsaWRhdGVBbGxWYWx1ZXMpIHtcbiAgICAgICAgdmFsaWRhdG9yUmVzdWx0ID0gdmFsaWRhdG9yLnZhbGlkYXRlKFxuICAgICAgICAgIG93bmVyLnZhbGlkYXRlZFZhbHVlLFxuICAgICAgICAgIG93bmVyLmdldFZhbGlkYXRvclRpdGxlKClcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkYXRvclJlc3VsdCA9IHZhbGlkYXRvci52YWxpZGF0ZUFsbFZhbHVlcyhcbiAgICAgICAgICBvd25lci52YWxpZGF0ZWRWYWx1ZSxcbiAgICAgICAgICBvd25lci5nZXREYXRhRmlsdGVyZWRWYWx1ZXMoKSxcbiAgICAgICAgICBvd25lci5nZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKCksXG4gICAgICAgICAgb3duZXIuZ2V0VmFsaWRhdG9yVGl0bGUoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCEhdmFsaWRhdG9yUmVzdWx0ICYmICEhdmFsaWRhdG9yUmVzdWx0LmVycm9yKSB7XG4gICAgICAgIHJlcy5wdXNoKHZhbGlkYXRvclJlc3VsdC5lcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbn1cbi8qKlxuICogVmFsaWRhdGUgbnVtZXJpYyB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBOdW1lcmljVmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIG1pblZhbHVlOiBudW1iZXIgPSBudWxsLCBwdWJsaWMgbWF4VmFsdWU6IG51bWJlciA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibnVtZXJpY3ZhbGlkYXRvclwiO1xuICB9XG4gIHB1YmxpYyB2YWxpZGF0ZSh2YWx1ZTogYW55LCBuYW1lOiBzdHJpbmcgPSBudWxsKTogVmFsaWRhdG9yUmVzdWx0IHtcbiAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMuaXNOdW1iZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbmV3IFJlcXVyZU51bWVyaWNFcnJvcihudWxsLCB0aGlzLmVycm9yT3duZXIpXG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChwYXJzZUZsb2F0KHZhbHVlKSk7XG4gICAgaWYgKHRoaXMubWluVmFsdWUgIT09IG51bGwgJiYgdGhpcy5taW5WYWx1ZSA+IHJlc3VsdC52YWx1ZSkge1xuICAgICAgcmVzdWx0LmVycm9yID0gdGhpcy5jcmVhdGVDdXN0b21FcnJvcihuYW1lKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGlmICh0aGlzLm1heFZhbHVlICE9PSBudWxsICYmIHRoaXMubWF4VmFsdWUgPCByZXN1bHQudmFsdWUpIHtcbiAgICAgIHJlc3VsdC5lcnJvciA9IHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IobmFtZSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiID8gbnVsbCA6IHJlc3VsdDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdEVycm9yVGV4dChuYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgdk5hbWUgPSBuYW1lID8gbmFtZSA6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ2YWx1ZVwiKTtcbiAgICBpZiAodGhpcy5taW5WYWx1ZSAhPT0gbnVsbCAmJiB0aGlzLm1heFZhbHVlICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgIC5nZXRTdHJpbmcoXCJudW1lcmljTWluTWF4XCIpXG4gICAgICAgIFtcImZvcm1hdFwiXSh2TmFtZSwgdGhpcy5taW5WYWx1ZSwgdGhpcy5tYXhWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm1pblZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgICAgICAuZ2V0U3RyaW5nKFwibnVtZXJpY01pblwiKVxuICAgICAgICAgIFtcImZvcm1hdFwiXSh2TmFtZSwgdGhpcy5taW5WYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgIC5nZXRTdHJpbmcoXCJudW1lcmljTWF4XCIpXG4gICAgICAgIFtcImZvcm1hdFwiXSh2TmFtZSwgdGhpcy5tYXhWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaXNOdW1iZXIodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdCh2YWx1ZSkpICYmIGlzRmluaXRlKHZhbHVlKTtcbiAgfVxufVxuLyoqXG4gKiBWYWxpZGF0ZSB0ZXh0IHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRleHRWYWxpZGF0b3IgZXh0ZW5kcyBTdXJ2ZXlWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbWluTGVuZ3RoOiBudW1iZXIgPSAwLFxuICAgIHB1YmxpYyBtYXhMZW5ndGg6IG51bWJlciA9IDAsXG4gICAgcHVibGljIGFsbG93RGlnaXRzID0gdHJ1ZVxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwidGV4dHZhbGlkYXRvclwiO1xuICB9XG4gIHB1YmxpYyB2YWxpZGF0ZSh2YWx1ZTogYW55LCBuYW1lOiBzdHJpbmcgPSBudWxsKTogVmFsaWRhdG9yUmVzdWx0IHtcbiAgICBpZiAodmFsdWUgIT09IFwiXCIgJiYgSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMuYWxsb3dEaWdpdHMpIHtcbiAgICAgIHZhciByZWcgPSAvXltBLVphLXpcXHNdKiQvO1xuICAgICAgaWYgKCFyZWcudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQobnVsbCwgdGhpcy5jcmVhdGVDdXN0b21FcnJvcihuYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLm1pbkxlbmd0aCA+IDAgJiYgdmFsdWUubGVuZ3RoIDwgdGhpcy5taW5MZW5ndGgpIHtcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KG51bGwsIHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IobmFtZSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXhMZW5ndGggPiAwICYmIHZhbHVlLmxlbmd0aCA+IHRoaXMubWF4TGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdChudWxsLCB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMubWluTGVuZ3RoID4gMCAmJiB0aGlzLm1heExlbmd0aCA+IDApXG4gICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgIC5nZXRTdHJpbmcoXCJ0ZXh0TWluTWF4TGVuZ3RoXCIpXG4gICAgICAgIFtcImZvcm1hdFwiXSh0aGlzLm1pbkxlbmd0aCwgdGhpcy5tYXhMZW5ndGgpO1xuICAgIGlmICh0aGlzLm1pbkxlbmd0aCA+IDApXG4gICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgIC5nZXRTdHJpbmcoXCJ0ZXh0TWluTGVuZ3RoXCIpXG4gICAgICAgIFtcImZvcm1hdFwiXSh0aGlzLm1pbkxlbmd0aCk7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcInRleHRNYXhMZW5ndGhcIilcbiAgICAgIFtcImZvcm1hdFwiXSh0aGlzLm1heExlbmd0aCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFuc3dlckNvdW50VmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIG1pbkNvdW50OiBudW1iZXIgPSBudWxsLCBwdWJsaWMgbWF4Q291bnQ6IG51bWJlciA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiYW5zd2VyY291bnR2YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUodmFsdWU6IGFueSwgbmFtZTogc3RyaW5nID0gbnVsbCk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuY29uc3RydWN0b3IgIT0gQXJyYXkpIHJldHVybiBudWxsO1xuICAgIHZhciBjb3VudCA9IHZhbHVlLmxlbmd0aDtcbiAgICBpZiAodGhpcy5taW5Db3VudCAmJiBjb3VudCA8IHRoaXMubWluQ291bnQpIHtcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KFxuICAgICAgICBudWxsLFxuICAgICAgICB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKFxuICAgICAgICAgIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAgICAgLmdldFN0cmluZyhcIm1pblNlbGVjdEVycm9yXCIpXG4gICAgICAgICAgICBbXCJmb3JtYXRcIl0odGhpcy5taW5Db3VudClcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4Q291bnQgJiYgY291bnQgPiB0aGlzLm1heENvdW50KSB7XG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdGhpcy5jcmVhdGVDdXN0b21FcnJvcihcbiAgICAgICAgICBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgICAgICAgIC5nZXRTdHJpbmcoXCJtYXhTZWxlY3RFcnJvclwiKVxuICAgICAgICAgICAgW1wiZm9ybWF0XCJdKHRoaXMubWF4Q291bnQpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBuYW1lO1xuICB9XG59XG4vKipcbiAqIFVzZSBpdCB0byB2YWxpZGF0ZSB0aGUgdGV4dCBieSByZWd1bGFyIGV4cHJlc3Npb25zLlxuICovXG5leHBvcnQgY2xhc3MgUmVnZXhWYWxpZGF0b3IgZXh0ZW5kcyBTdXJ2ZXlWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVnZXg6IHN0cmluZyA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicmVnZXh2YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUodmFsdWU6IGFueSwgbmFtZTogc3RyaW5nID0gbnVsbCk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKCF0aGlzLnJlZ2V4IHx8ICF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHJlID0gbmV3IFJlZ0V4cCh0aGlzLnJlZ2V4KTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMuaGFzRXJyb3IocmUsIHZhbHVlW2ldLCBuYW1lKTtcbiAgICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaGFzRXJyb3IocmUsIHZhbHVlLCBuYW1lKTtcbiAgfVxuICBwcml2YXRlIGhhc0Vycm9yKHJlOiBSZWdFeHAsIHZhbHVlOiBhbnksIG5hbWU6IHN0cmluZyk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKHJlLnRlc3QodmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdCh2YWx1ZSwgdGhpcy5jcmVhdGVDdXN0b21FcnJvcihuYW1lKSk7XG4gIH1cbn1cbi8qKlxuICogVmFsaWRhdGUgZS1tYWlsIGFkZHJlc3MgaW4gdGhlIHRleHQgaW5wdXRcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYWlsVmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgcHJpdmF0ZSByZSA9IC9eKChbXjw+KClcXFtcXF1cXC4sOzpcXHNAXFxcIl0rKFxcLltePD4oKVxcW1xcXVxcLiw7Olxcc0BcXFwiXSspKil8KFxcXCIuK1xcXCIpKUAoKFtePD4oKVtcXF1cXC4sOzpcXHNAXFxcIl0rXFwuKStbXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdezIsfSkkL2k7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJlbWFpbHZhbGlkYXRvclwiO1xuICB9XG4gIHB1YmxpYyB2YWxpZGF0ZSh2YWx1ZTogYW55LCBuYW1lOiBzdHJpbmcgPSBudWxsKTogVmFsaWRhdG9yUmVzdWx0IHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5yZS50ZXN0KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQodmFsdWUsIHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IobmFtZSkpO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiaW52YWxpZEVtYWlsXCIpO1xuICB9XG59XG5cbi8qKlxuICogU2hvdyBlcnJvciBpZiBleHByZXNzaW9uIHJldHVybnMgZmFsc2VcbiAqL1xuZXhwb3J0IGNsYXNzIEV4cHJlc3Npb25WYWxpZGF0b3IgZXh0ZW5kcyBTdXJ2ZXlWYWxpZGF0b3Ige1xuICBwcml2YXRlIGNvbmRpdGlvblJ1bm5lcjogQ29uZGl0aW9uUnVubmVyID0gbnVsbDtcbiAgcHVibGljIGV4cHJlc3Npb246IHN0cmluZztcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImV4cHJlc3Npb252YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVmFsaWRhdGVBbGxWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIHZhbGlkYXRlQWxsVmFsdWVzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgdmFsdWVzOiBhbnksXG4gICAgcHJvcGVydGllczogYW55LFxuICAgIG5hbWU6IHN0cmluZyA9IG51bGxcbiAgKTogVmFsaWRhdG9yUmVzdWx0IHtcbiAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbikgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLmNvbmRpdGlvblJ1bm5lcikge1xuICAgICAgdGhpcy5jb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuZXhwcmVzc2lvbik7XG4gICAgfVxuICAgIHRoaXMuY29uZGl0aW9uUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLmV4cHJlc3Npb247XG4gICAgdmFyIHJlcyA9IHRoaXMuY29uZGl0aW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIGlmICghcmVzKSB7XG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdCh2YWx1ZSwgdGhpcy5jcmVhdGVDdXN0b21FcnJvcihuYW1lKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgIC5nZXRTdHJpbmcoXCJpbnZhbGlkRXhwcmVzc2lvblwiKVxuICAgICAgW1wiZm9ybWF0XCJdKHRoaXMuZXhwcmVzc2lvbik7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcInN1cnZleXZhbGlkYXRvclwiLCBbXG4gIHsgbmFtZTogXCJ0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUZXh0XCIgfVxuXSk7XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIm51bWVyaWN2YWxpZGF0b3JcIixcbiAgW1wibWluVmFsdWU6bnVtYmVyXCIsIFwibWF4VmFsdWU6bnVtYmVyXCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IE51bWVyaWNWYWxpZGF0b3IoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl2YWxpZGF0b3JcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwidGV4dHZhbGlkYXRvclwiLFxuICBbXCJtaW5MZW5ndGg6bnVtYmVyXCIsIFwibWF4TGVuZ3RoOm51bWJlclwiLCBcImFsbG93RGlnaXRzOmJvb2xlYW5cIl0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgVGV4dFZhbGlkYXRvcigpO1xuICB9LFxuICBcInN1cnZleXZhbGlkYXRvclwiXG4pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJhbnN3ZXJjb3VudHZhbGlkYXRvclwiLFxuICBbXCJtaW5Db3VudDpudW1iZXJcIiwgXCJtYXhDb3VudDpudW1iZXJcIl0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgQW5zd2VyQ291bnRWYWxpZGF0b3IoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl2YWxpZGF0b3JcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicmVnZXh2YWxpZGF0b3JcIixcbiAgW1wicmVnZXhcIl0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUmVnZXhWYWxpZGF0b3IoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl2YWxpZGF0b3JcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiZW1haWx2YWxpZGF0b3JcIixcbiAgW10sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgRW1haWxWYWxpZGF0b3IoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl2YWxpZGF0b3JcIlxuKTtcblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJleHByZXNzaW9udmFsaWRhdG9yXCIsXG4gIFtcImV4cHJlc3Npb246Y29uZGl0aW9uXCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25WYWxpZGF0b3IoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl2YWxpZGF0b3JcIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy92YWxpZGF0b3IudHMiLCIvLyByZW1vdmVkIGJ5IGV4dHJhY3QtdGV4dC13ZWJwYWNrLXBsdWdpblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL21haW4uc2Nzc1xuLy8gbW9kdWxlIGlkID0gMzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93blwiO1xuaW1wb3J0IHtcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSxcbiAgTWF0cml4RHJvcGRvd25DZWxsLFxuICBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxufSBmcm9tIFwiLi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhCYXNlSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkltcGxlbWVudG9yIHtcbiAga29DZWxsQWZ0ZXJSZW5kZXI6IGFueTtcbiAga29Sb3dzOiBhbnk7XG4gIGtvVmlzaWJsZUNvbHVtbnM6IGFueTtcbiAga29SZWNhbGM6IGFueTtcbiAga29BZGRSb3dDbGljazogYW55O1xuICBrb1JlbW92ZVJvd0NsaWNrOiBhbnk7XG4gIGtvSXNBZGRSb3dPblRvcDogYW55O1xuICBrb0lzQWRkUm93T25Cb3R0b206IGFueTtcbiAga29DYW5SZW1vdmVSb3c6IGFueTtcbiAga29Jc0hvcml6b250YWxDb2x1bW5MYXlvdXQ6IGFueTtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvQ2VsbEFmdGVyUmVuZGVyID0gZnVuY3Rpb24oZWw6IGFueSwgY29uOiBhbnkpIHtcbiAgICAgIHJldHVybiBzZWxmLmNlbGxBZnRlclJlbmRlcihlbCwgY29uKTtcbiAgICB9O1xuICAgIHRoaXMua29SZWNhbGMgPSBrby5vYnNlcnZhYmxlKDApO1xuICAgIHRoaXMua29Sb3dzID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5rb1JlY2FsYygpO1xuICAgICAgcmV0dXJuICg8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsPnRoaXMucXVlc3Rpb24pLnZpc2libGVSb3dzO1xuICAgIH0sIHRoaXMpO1xuICAgIHRoaXMua29WaXNpYmxlQ29sdW1ucyA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMua29SZWNhbGMoKTtcbiAgICAgIHJldHVybiAoPFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbD50aGlzLnF1ZXN0aW9uKS52aXNpYmxlQ29sdW1ucztcbiAgICB9LCB0aGlzKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgKDxRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWw+dGhpc1xuICAgICAgLnF1ZXN0aW9uKS52aXNpYmxlUm93c0NoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vblZpc2libGVSb3dzQ2hhbmdlZCgpO1xuICAgIH07XG4gICAgdGhpcy5rb0FkZFJvd0NsaWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmFkZFJvdygpO1xuICAgIH07XG4gICAgdGhpcy5rb1JlbW92ZVJvd0NsaWNrID0gZnVuY3Rpb24oZGF0YTogYW55KSB7XG4gICAgICBzZWxmLnJlbW92ZVJvdyhkYXRhKTtcbiAgICB9O1xuICAgIHRoaXMua29Jc0FkZFJvd09uVG9wID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5rb1JlY2FsYygpO1xuICAgICAgcmV0dXJuIHNlbGYuaXNBZGRSb3dUb3AoKTtcbiAgICB9KTtcbiAgICB0aGlzLmtvSXNBZGRSb3dPbkJvdHRvbSA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYua29SZWNhbGMoKTtcbiAgICAgIHJldHVybiBzZWxmLmlzQWRkUm93Qm90dG9tKCk7XG4gICAgfSk7XG4gICAgdGhpcy5rb0NhblJlbW92ZVJvdyA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYua29SZWNhbGMoKTtcbiAgICAgIHJldHVybiBzZWxmLmNhblJlbW92ZVJvdygpO1xuICAgIH0pO1xuICAgIHRoaXMua29Jc0hvcml6b250YWxDb2x1bW5MYXlvdXQgPSBrby5vYnNlcnZhYmxlKFxuICAgICAgKDxRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWw+dGhpcy5xdWVzdGlvbikuaXNDb2x1bW5MYXlvdXRIb3Jpem9udGFsXG4gICAgKTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvUm93c1wiXSA9IHRoaXMua29Sb3dzO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29WaXNpYmxlQ29sdW1uc1wiXSA9IHRoaXMua29WaXNpYmxlQ29sdW1ucztcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvQ2VsbEFmdGVyUmVuZGVyXCJdID0gdGhpcy5rb0NlbGxBZnRlclJlbmRlcjtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvQWRkUm93Q2xpY2tcIl0gPSB0aGlzLmtvQWRkUm93Q2xpY2s7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb1JlbW92ZVJvd0NsaWNrXCJdID0gdGhpcy5rb1JlbW92ZVJvd0NsaWNrO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29Jc0FkZFJvd09uVG9wXCJdID0gdGhpcy5rb0lzQWRkUm93T25Ub3A7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb0lzQWRkUm93T25Cb3R0b21cIl0gPSB0aGlzLmtvSXNBZGRSb3dPbkJvdHRvbTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvQ2FuUmVtb3ZlUm93XCJdID0gdGhpcy5rb0NhblJlbW92ZVJvdztcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcbiAgICAgIFwia29Jc0hvcml6b250YWxDb2x1bW5MYXlvdXRcIlxuICAgIF0gPSB0aGlzLmtvSXNIb3Jpem9udGFsQ29sdW1uTGF5b3V0O1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wiaGFzUm93VGV4dFwiXSA9IHRoaXMuaGFzUm93VGV4dCgpO1xuICAgICg8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsPnRoaXNcbiAgICAgIC5xdWVzdGlvbikuY29sdW1uc0NoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vbkNvbHVtbkNoYW5nZWQoKTtcbiAgICB9O1xuICAgICg8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsPnRoaXNcbiAgICAgIC5xdWVzdGlvbikudXBkYXRlQ2VsbHNDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vblVwZGF0ZUNlbGxzKCk7XG4gICAgfTtcbiAgICAoPFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbD50aGlzXG4gICAgICAucXVlc3Rpb24pLmNvbHVtbkxheW91dENoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vbkNvbHVtbkxheW91dENoYW5nZWQoKTtcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCBnZXRRdWVzdGlvblRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibWF0cml4ZHluYW1pY1wiO1xuICB9XG4gIHByaXZhdGUgY2VsbEFmdGVyUmVuZGVyKGVsZW1lbnRzOiBhbnksIGNvbjogYW55KSB7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBlbCA9IFN1cnZleUVsZW1lbnQuR2V0Rmlyc3ROb25UZXh0RWxlbWVudChlbGVtZW50cyk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIHZhciBjZWxsID0gPE1hdHJpeERyb3Bkb3duQ2VsbD5jb247XG4gICAgaWYgKGNlbGwucXVlc3Rpb24uY3VzdG9tV2lkZ2V0KSB7XG4gICAgICBjZWxsLnF1ZXN0aW9uLmN1c3RvbVdpZGdldC5hZnRlclJlbmRlcihjZWxsLnF1ZXN0aW9uLCBlbCk7XG4gICAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGVsLCAoKSA9PiB7XG4gICAgICAgIGNlbGwucXVlc3Rpb24uY3VzdG9tV2lkZ2V0LndpbGxVbm1vdW50KGNlbGwucXVlc3Rpb24sIGVsKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIGNlbGw6IGNlbGwsXG4gICAgICBjZWxsUXVlc3Rpb246IGNlbGwucXVlc3Rpb24sXG4gICAgICBodG1sRWxlbWVudDogZWwsXG4gICAgICByb3c6IGNlbGwucm93LFxuICAgICAgY29sdW1uOiBjZWxsLmNvbHVtblxuICAgIH07XG4gICAgdGhpcy5xdWVzdGlvbi5zdXJ2ZXkubWF0cml4QWZ0ZXJDZWxsUmVuZGVyKHRoaXMucXVlc3Rpb24sIG9wdGlvbnMpO1xuICB9XG4gIHByb3RlY3RlZCBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5vbkNvbHVtbkxheW91dENoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgaGFzUm93VGV4dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Db2x1bW5MYXlvdXRDaGFuZ2VkKCkge1xuICAgIHRoaXMua29Jc0hvcml6b250YWxDb2x1bW5MYXlvdXQoXG4gICAgICAoPFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2U+dGhpcy5xdWVzdGlvbikuaXNDb2x1bW5MYXlvdXRIb3Jpem9udGFsXG4gICAgKTtcbiAgICB0aGlzLmtvUmVjYWxjKHRoaXMua29SZWNhbGMoKSArIDEpO1xuICB9XG4gIHByb3RlY3RlZCBpc0FkZFJvd1RvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGlzQWRkUm93Qm90dG9tKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuUmVtb3ZlUm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Db2x1bW5DaGFuZ2VkKCkge1xuICAgIHZhciByb3dzID0gKDxRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlPnRoaXMucXVlc3Rpb24pLnZpc2libGVSb3dzO1xuICAgIHRoaXMub25WaXNpYmxlUm93c0NoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25WaXNpYmxlUm93c0NoYW5nZWQoKSB7XG4gICAgdGhpcy5rb1JlY2FsYyh0aGlzLmtvUmVjYWxjKCkgKyAxKTtcbiAgfVxuICBwcm90ZWN0ZWQgYWRkUm93KCkge31cbiAgcHJvdGVjdGVkIHJlbW92ZVJvdyhyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKSB7fVxuICBwcm90ZWN0ZWQgb25VcGRhdGVDZWxscygpIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duIGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBRdWVzdGlvbk1hdHJpeEJhc2VJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwibWF0cml4ZHJvcGRvd25cIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93bihcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeGRyb3Bkb3duXCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duKG5hbWUpO1xuICBxLmNob2ljZXMgPSBbMSwgMiwgMywgNCwgNV07XG4gIHEucm93cyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Um93cztcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZS5hZGREZWZhdWx0Q29sdW1ucyhxKTtcbiAgcmV0dXJuIHE7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duLnRzIiwiaW1wb3J0IHsgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fdGV4dFwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25UZXh0IGV4dGVuZHMgUXVlc3Rpb25UZXh0TW9kZWwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgbmV3IFF1ZXN0aW9uSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcInRleHRcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25UZXh0KFwiXCIpO1xufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwidGV4dFwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblRleHQobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX3RleHQudHMiLCJleHBvcnQgdmFyIGtvVGVtcGxhdGUgPSByZXF1aXJlKFwiaHRtbC1sb2FkZXI/aW50ZXJwb2xhdGUhdmFsLWxvYWRlciEuL3RlbXBsYXRlcy9lbnRyeS5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5VGVtcGxhdGVUZXh0IHtcbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHB1YmxpYyBhZGRUZXh0KG5ld1RleHQ6IHN0cmluZywgaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XG4gICAgaWQgPSB0aGlzLmdldElkKGlkLCBuYW1lKTtcbiAgICB0aGlzLnRleHQgPVxuICAgICAgdGhpcy50ZXh0ICtcbiAgICAgICc8c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiAnICtcbiAgICAgIGlkICtcbiAgICAgIFwiPlwiICtcbiAgICAgIG5ld1RleHQgK1xuICAgICAgXCI8L3NjcmlwdD5cIjtcbiAgfVxuICBwdWJsaWMgcmVwbGFjZVRleHQoXG4gICAgcmVwbGFjZVRleHQ6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIHF1ZXN0aW9uVHlwZTogc3RyaW5nID0gbnVsbFxuICApIHtcbiAgICB2YXIgcG9zSWQgPSB0aGlzLmdldElkKGlkLCBxdWVzdGlvblR5cGUpO1xuICAgIHZhciBwb3MgPSB0aGlzLnRleHQuaW5kZXhPZihwb3NJZCk7XG4gICAgaWYgKHBvcyA8IDApIHtcbiAgICAgIHRoaXMuYWRkVGV4dChyZXBsYWNlVGV4dCwgaWQsIHF1ZXN0aW9uVHlwZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBvcyA9IHRoaXMudGV4dC5pbmRleE9mKFwiPlwiLCBwb3MpO1xuICAgIGlmIChwb3MgPCAwKSByZXR1cm47XG4gICAgdmFyIHN0YXJ0UG9zID0gcG9zICsgMTtcbiAgICB2YXIgZW5kU3RyaW5nID0gXCI8L3NjcmlwdD5cIjtcbiAgICBwb3MgPSB0aGlzLnRleHQuaW5kZXhPZihlbmRTdHJpbmcsIHN0YXJ0UG9zKTtcbiAgICBpZiAocG9zIDwgMCkgcmV0dXJuO1xuICAgIHRoaXMudGV4dCA9XG4gICAgICB0aGlzLnRleHQuc3Vic3RyKDAsIHN0YXJ0UG9zKSArIHJlcGxhY2VUZXh0ICsgdGhpcy50ZXh0LnN1YnN0cihwb3MpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJZChpZDogc3RyaW5nLCBxdWVzdGlvblR5cGU6IHN0cmluZykge1xuICAgIHZhciByZXN1bHQgPSAnaWQ9XCJzdXJ2ZXktJyArIGlkO1xuICAgIGlmIChxdWVzdGlvblR5cGUpIHtcbiAgICAgIHJlc3VsdCArPSBcIi1cIiArIHF1ZXN0aW9uVHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdCArICdcIic7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGtvVGVtcGxhdGU7XG4gIH1cbiAgcHJvdGVjdGVkIHNldCB0ZXh0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBrb1RlbXBsYXRlID0gdmFsdWU7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZVRleHQudHMiLCJpbXBvcnQgeyBCYXNlLCBTdXJ2ZXlFcnJvciwgSVRleHRQcm9jZXNzb3IsIElRdWVzdGlvbiB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciwgSnNvbk9iamVjdFByb3BlcnR5IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgV2ViUmVxdWVzdEVycm9yLCBXZWJSZXF1ZXN0RW1wdHlFcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5cbmNsYXNzIFhtbFBhcnNlciB7XG4gIHByaXZhdGUgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICBwdWJsaWMgYXNzaWduVmFsdWUodGFyZ2V0OiBhbnksIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldFtuYW1lXSkpIHtcbiAgICAgIHRhcmdldFtuYW1lXS5wdXNoKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHRhcmdldFtuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSBbdGFyZ2V0W25hbWVdXS5jb25jYXQodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDEgJiZcbiAgICAgIE9iamVjdC5rZXlzKHZhbHVlKVswXSA9PT0gbmFtZVxuICAgICkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gdmFsdWVbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgeG1sMkpzb24oeG1sTm9kZTogYW55LCByZXN1bHQ6IGFueSkge1xuICAgIGlmICh4bWxOb2RlLmNoaWxkcmVuICYmIHhtbE5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4bWxOb2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjaGlsZE5vZGUgPSB4bWxOb2RlLmNoaWxkcmVuW2ldO1xuICAgICAgICBsZXQgY2hpbGRPYmplY3QgPSB7fTtcbiAgICAgICAgdGhpcy54bWwySnNvbihjaGlsZE5vZGUsIGNoaWxkT2JqZWN0KTtcbiAgICAgICAgdGhpcy5hc3NpZ25WYWx1ZShyZXN1bHQsIGNoaWxkTm9kZS5ub2RlTmFtZSwgY2hpbGRPYmplY3QpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFzc2lnblZhbHVlKHJlc3VsdCwgeG1sTm9kZS5ub2RlTmFtZSwgeG1sTm9kZS50ZXh0Q29udGVudCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBwYXJzZVhtbFN0cmluZyh4bWxTdHJpbmc6IHN0cmluZykge1xuICAgIGxldCB4bWxSb290ID0gdGhpcy5wYXJzZXIucGFyc2VGcm9tU3RyaW5nKHhtbFN0cmluZywgXCJ0ZXh0L3htbFwiKTtcbiAgICBsZXQganNvbiA9IHt9O1xuICAgIHRoaXMueG1sMkpzb24oeG1sUm9vdCwganNvbik7XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuLyoqXG4gKiBBIGRlZmluaXRpb24gZm9yIGZpbGxpbmcgY2hvaWNlcyBmb3IgY2hlY2tib3gsIGRyb3Bkb3duIGFuZCByYWRpb2dyb3VwIHF1ZXN0aW9ucyBmcm9tIHJlc2Z1bGwgc2VydmljZXMuXG4gKiBUaGUgcnVuIG1ldGhvZCBjYWxsIGEgcmVzdGZ1bGwgc2VydmljZSBhbmQgcmVzdWx0cyBjYW4gYmUgZ2V0IG9uIGdldFJlc3VsdENhbGxiYWNrLlxuICovXG5leHBvcnQgY2xhc3MgQ2hvaWNlc1Jlc3RmdWxsIGV4dGVuZHMgQmFzZSB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEVuY29kZVBhcmFtZXRlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNldHRpbmdzLndlYnNlcnZpY2VFbmNvZGVQYXJhbWV0ZXJzO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgc2V0IEVuY29kZVBhcmFtZXRlcnModmFsOiBib29sZWFuKSB7XG4gICAgc2V0dGluZ3Mud2Vic2VydmljZUVuY29kZVBhcmFtZXRlcnMgPSB2YWw7XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgaXRlbXNSZXN1bHQ6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBwdWJsaWMgc3RhdGljIG9uQmVmb3JlU2VuZFJlcXVlc3Q6IChcbiAgICBzZW5kZXI6IENob2ljZXNSZXN0ZnVsbCxcbiAgICBvcHRpb25zOiB7IHJlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0IH1cbiAgKSA9PiB2b2lkO1xuICBwcml2YXRlIHN0YXRpYyBnZXRDYWNoZWRJdGVtc1Jlc3VsdChvYmo6IENob2ljZXNSZXN0ZnVsbCk6IGJvb2xlYW4ge1xuICAgIHZhciBoYXNoID0gb2JqLm9iakhhc2g7XG4gICAgdmFyIHJlcyA9IENob2ljZXNSZXN0ZnVsbC5pdGVtc1Jlc3VsdFtoYXNoXTtcbiAgICBpZiAoIXJlcykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChvYmouZ2V0UmVzdWx0Q2FsbGJhY2spIHtcbiAgICAgIG9iai5nZXRSZXN1bHRDYWxsYmFjayhyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGxhc3RPYmpIYXNoOiBzdHJpbmcgPSBcIlwiO1xuICBwcml2YXRlIGlzUnVubmluZ1ZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBwcm9jZXNzZWRVcmw6IHN0cmluZyA9IFwiXCI7XG4gIHByb3RlY3RlZCBwcm9jZXNzZWRQYXRoOiBzdHJpbmcgPSBcIlwiO1xuICBwdWJsaWMgZ2V0UmVzdWx0Q2FsbGJhY2s6IChpdGVtczogQXJyYXk8SXRlbVZhbHVlPikgPT4gdm9pZDtcbiAgcHVibGljIHVwZGF0ZVJlc3VsdENhbGxiYWNrOiAoXG4gICAgaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgc2VydmVyUmVzdWx0OiBhbnlcbiAgKSA9PiBBcnJheTxJdGVtVmFsdWU+O1xuICBwdWJsaWMgZ2V0SXRlbVZhbHVlQ2FsbGJhY2s6IChpdGVtOiBhbnkpID0+IGFueTtcbiAgcHVibGljIGVycm9yOiBTdXJ2ZXlFcnJvciA9IG51bGw7XG4gIHB1YmxpYyBvd25lcjogSVF1ZXN0aW9uO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBydW4odGV4dFByb2Nlc3NvcjogSVRleHRQcm9jZXNzb3IgPSBudWxsKSB7XG4gICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy5nZXRSZXN1bHRDYWxsYmFjaykgcmV0dXJuO1xuICAgIHRoaXMucHJvY2Vzc2VkVGV4dCh0ZXh0UHJvY2Vzc29yKTtcbiAgICBpZiAoIXRoaXMucHJvY2Vzc2VkVXJsKSB7XG4gICAgICB0aGlzLmRvRW1wdHlSZXN1bHRDYWxsYmFjayh7fSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmxhc3RPYmpIYXNoID09IHRoaXMub2JqSGFzaCkgcmV0dXJuO1xuICAgIHRoaXMubGFzdE9iakhhc2ggPSB0aGlzLm9iakhhc2g7XG4gICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgaWYgKHRoaXMudXNlQ2hhbmdlZEl0ZW1zUmVzdWx0cygpKSByZXR1cm47XG4gICAgdGhpcy5zZW5kUmVxdWVzdCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSdW5uaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmlzUnVubmluZ1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNXYWl0aW5nRm9yUGFyYW1ldGVycygpIHtcbiAgICByZXR1cm4gdGhpcy51cmwgJiYgIXRoaXMucHJvY2Vzc2VkVXJsO1xuICB9XG4gIHByb3RlY3RlZCB1c2VDaGFuZ2VkSXRlbXNSZXN1bHRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBDaG9pY2VzUmVzdGZ1bGwuZ2V0Q2FjaGVkSXRlbXNSZXN1bHQodGhpcyk7XG4gIH1cbiAgcHJpdmF0ZSBkb0VtcHR5UmVzdWx0Q2FsbGJhY2soc2VydmVyUmVzdWx0OiBhbnkpIHtcbiAgICB2YXIgaXRlbXM6IEFycmF5PGFueT4gPSBbXTtcbiAgICBpZiAodGhpcy51cGRhdGVSZXN1bHRDYWxsYmFjaykge1xuICAgICAgaXRlbXMgPSB0aGlzLnVwZGF0ZVJlc3VsdENhbGxiYWNrKGl0ZW1zLCBzZXJ2ZXJSZXN1bHQpO1xuICAgIH1cbiAgICB0aGlzLmdldFJlc3VsdENhbGxiYWNrKGl0ZW1zKTtcbiAgfVxuICBwcml2YXRlIHByb2Nlc3NlZFRleHQodGV4dFByb2Nlc3NvcjogSVRleHRQcm9jZXNzb3IpIHtcbiAgICBpZiAodGV4dFByb2Nlc3Nvcikge1xuICAgICAgdmFyIHBVcmwgPSB0ZXh0UHJvY2Vzc29yLnByb2Nlc3NUZXh0RXgoXG4gICAgICAgIHRoaXMudXJsLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgc2V0dGluZ3Mud2Vic2VydmljZUVuY29kZVBhcmFtZXRlcnNcbiAgICAgICk7XG4gICAgICB2YXIgcFBhdGggPSB0ZXh0UHJvY2Vzc29yLnByb2Nlc3NUZXh0RXgoXG4gICAgICAgIHRoaXMucGF0aCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHNldHRpbmdzLndlYnNlcnZpY2VFbmNvZGVQYXJhbWV0ZXJzXG4gICAgICApO1xuICAgICAgaWYgKCFwVXJsLmhhc0FsbFZhbHVlc09uTGFzdFJ1biB8fCAhcFBhdGguaGFzQWxsVmFsdWVzT25MYXN0UnVuKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkVXJsID0gXCJcIjtcbiAgICAgICAgdGhpcy5wcm9jZXNzZWRQYXRoID0gXCJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkVXJsID0gcFVybC50ZXh0O1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFBhdGggPSBwUGF0aC50ZXh0O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb2Nlc3NlZFVybCA9IHRoaXMudXJsO1xuICAgICAgdGhpcy5wcm9jZXNzZWRQYXRoID0gdGhpcy5wYXRoO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgcGFyc2VSZXNwb25zZShyZXNwb25zZTogYW55KSB7XG4gICAgbGV0IHBhcnNlZFJlc3BvbnNlO1xuICAgIGlmIChcbiAgICAgICEhcmVzcG9uc2UgJiZcbiAgICAgIHR5cGVvZiByZXNwb25zZS5pbmRleE9mID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgIHJlc3BvbnNlLmluZGV4T2YoXCI8XCIpID09PSAwXG4gICAgKSB7XG4gICAgICB2YXIgcGFyc2VyID0gbmV3IFhtbFBhcnNlcigpO1xuICAgICAgcGFyc2VkUmVzcG9uc2UgPSBwYXJzZXIucGFyc2VYbWxTdHJpbmcocmVzcG9uc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZWRSZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHBhcnNlZFJlc3BvbnNlID0gKHJlc3BvbnNlIHx8IFwiXCIpXG4gICAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgICAgLm1hcCgoczogYW55KSA9PiBzLnRyaW0oXCIgXCIpKVxuICAgICAgICAgIC5maWx0ZXIoKHM6IGFueSkgPT4gISFzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZFJlc3BvbnNlO1xuICB9XG4gIHByb3RlY3RlZCBzZW5kUmVxdWVzdCgpIHtcbiAgICB0aGlzLmlzUnVubmluZ1ZhbHVlID0gdHJ1ZTtcbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyLm9wZW4oXCJHRVRcIiwgdGhpcy5wcm9jZXNzZWRVcmwpO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmlzUnVubmluZ1ZhbHVlID0gZmFsc2U7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgIHNlbGYub25Mb2FkKHNlbGYucGFyc2VSZXNwb25zZSh4aHIucmVzcG9uc2UpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYub25FcnJvcih4aHIuc3RhdHVzVGV4dCwgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgb3B0aW9ucyA9IHsgcmVxdWVzdDogeGhyIH07XG4gICAgaWYgKCEhQ2hvaWNlc1Jlc3RmdWxsLm9uQmVmb3JlU2VuZFJlcXVlc3QpIHtcbiAgICAgIENob2ljZXNSZXN0ZnVsbC5vbkJlZm9yZVNlbmRSZXF1ZXN0KHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBvcHRpb25zLnJlcXVlc3Quc2VuZCgpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiY2hvaWNlc0J5VXJsXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy51cmwgJiYgIXRoaXMucGF0aCAmJiAhdGhpcy52YWx1ZU5hbWUgJiYgIXRoaXMudGl0bGVOYW1lO1xuICB9XG4gIHB1YmxpYyBnZXRDdXN0b21Qcm9wZXJ0aWVzTmFtZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXMoKTtcbiAgICB2YXIgcmVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcy5wdXNoKHRoaXMuZ2V0Q3VzdG9tUHJvcGVydHlOYW1lKHByb3BlcnRpZXNbaV0ubmFtZSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgZ2V0Q3VzdG9tUHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcHJvcGVydHlOYW1lICsgXCJOYW1lXCI7XG4gIH1cbiAgcHJpdmF0ZSBnZXRDdXN0b21Qcm9wZXJ0aWVzKCk6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gU2VyaWFsaXplci5nZXRQcm9wZXJ0aWVzKHRoaXMuaXRlbVZhbHVlVHlwZSk7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICBwcm9wZXJ0aWVzW2ldLm5hbWUgPT09IFwidmFsdWVcIiB8fFxuICAgICAgICBwcm9wZXJ0aWVzW2ldLm5hbWUgPT09IFwidGV4dFwiIHx8XG4gICAgICAgIHByb3BlcnRpZXNbaV0ubmFtZSA9PT0gXCJ2aXNpYmxlSWZcIiB8fFxuICAgICAgICBwcm9wZXJ0aWVzW2ldLm5hbWUgPT09IFwiZW5hYmxlSWZcIlxuICAgICAgKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIHJlcy5wdXNoKHByb3BlcnRpZXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBzZXREYXRhKGpzb246IGFueSkge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICBpZiAoanNvbi51cmwpIHRoaXMudXJsID0ganNvbi51cmw7XG4gICAgaWYgKGpzb24ucGF0aCkgdGhpcy5wYXRoID0ganNvbi5wYXRoO1xuICAgIGlmIChqc29uLnZhbHVlTmFtZSkgdGhpcy52YWx1ZU5hbWUgPSBqc29uLnZhbHVlTmFtZTtcbiAgICBpZiAoanNvbi50aXRsZU5hbWUpIHRoaXMudGl0bGVOYW1lID0ganNvbi50aXRsZU5hbWU7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXNOYW1lcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGpzb25bcHJvcGVydGllc1tpXV0pICg8YW55PnRoaXMpW3Byb3BlcnRpZXNbaV1dID0ganNvbltwcm9wZXJ0aWVzW2ldXTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldERhdGEoKTogYW55IHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcmVzOiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy51cmwpIHJlc1tcInVybFwiXSA9IHRoaXMudXJsO1xuICAgIGlmICh0aGlzLnBhdGgpIHJlc1tcInBhdGhcIl0gPSB0aGlzLnBhdGg7XG4gICAgaWYgKHRoaXMudmFsdWVOYW1lKSByZXNbXCJ2YWx1ZU5hbWVcIl0gPSB0aGlzLnZhbHVlTmFtZTtcbiAgICBpZiAodGhpcy50aXRsZU5hbWUpIHJlc1tcInRpdGxlTmFtZVwiXSA9IHRoaXMudGl0bGVOYW1lO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRDdXN0b21Qcm9wZXJ0aWVzTmFtZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICgoPGFueT50aGlzKVtwcm9wZXJ0aWVzW2ldXSlcbiAgICAgICAgcmVzW3Byb3BlcnRpZXNbaV1dID0gKDxhbnk+dGhpcylbcHJvcGVydGllc1tpXV07XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldCB1cmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidXJsXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdXJsKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidXJsXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBwYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhdGhcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBwYXRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGF0aFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbHVlTmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZhbHVlTmFtZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgdGl0bGVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRpdGxlTmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRpdGxlTmFtZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgYWxsb3dFbXB0eVJlc3BvbnNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhbGxvd0VtcHR5UmVzcG9uc2VcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsb3dFbXB0eVJlc3BvbnNlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFsbG93RW1wdHlSZXNwb25zZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXRlbVZhbHVlVHlwZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5vd25lcikgcmV0dXJuIFwiaXRlbXZhbHVlXCI7XG4gICAgdmFyIHByb3AgPSBTZXJpYWxpemVyLmZpbmRQcm9wZXJ0eSh0aGlzLm93bmVyLmdldFR5cGUoKSwgXCJjaG9pY2VzXCIpO1xuICAgIGlmICghcHJvcCkgcmV0dXJuIFwiaXRlbXZhbHVlXCI7XG4gICAgaWYgKHByb3AudHlwZSA9PSBcIml0ZW12YWx1ZVtdXCIpIHJldHVybiBcIml0ZW12YWx1ZVwiO1xuICAgIHJldHVybiBwcm9wLnR5cGU7XG4gIH1cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMudXJsID0gXCJcIjtcbiAgICB0aGlzLnBhdGggPSBcIlwiO1xuICAgIHRoaXMudmFsdWVOYW1lID0gXCJcIjtcbiAgICB0aGlzLnRpdGxlTmFtZSA9IFwiXCI7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXNOYW1lcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCg8YW55PnRoaXMpW3Byb3BlcnRpZXNbaV1dKSAoPGFueT50aGlzKVtwcm9wZXJ0aWVzW2ldXSA9IFwiXCI7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvbkxvYWQocmVzdWx0OiBhbnkpIHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICB2YXIgdXBkYXRlZFJlc3VsdCA9IHRoaXMuZ2V0UmVzdWx0QWZ0ZXJQYXRoKHJlc3VsdCk7XG4gICAgaWYgKHVwZGF0ZWRSZXN1bHQgJiYgdXBkYXRlZFJlc3VsdFtcImxlbmd0aFwiXSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cGRhdGVkUmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBpdGVtVmFsdWUgPSB1cGRhdGVkUmVzdWx0W2ldO1xuICAgICAgICBpZiAoIWl0ZW1WYWx1ZSkgY29udGludWU7XG4gICAgICAgIHZhciB2YWx1ZSA9ICEhdGhpcy5nZXRJdGVtVmFsdWVDYWxsYmFja1xuICAgICAgICAgID8gdGhpcy5nZXRJdGVtVmFsdWVDYWxsYmFjayhpdGVtVmFsdWUpXG4gICAgICAgICAgOiB0aGlzLmdldFZhbHVlKGl0ZW1WYWx1ZSk7XG4gICAgICAgIHZhciB0aXRsZSA9IHRoaXMuZ2V0VGl0bGUoaXRlbVZhbHVlKTtcbiAgICAgICAgdmFyIGl0ZW0gPSBuZXcgSXRlbVZhbHVlKHZhbHVlLCB0aXRsZSk7XG4gICAgICAgIHRoaXMuc2V0Q3VzdG9tUHJvcGVydGllcyhpdGVtLCBpdGVtVmFsdWUpO1xuICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuYWxsb3dFbXB0eVJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBuZXcgV2ViUmVxdWVzdEVtcHR5RXJyb3IobnVsbCwgdGhpcy5vd25lcik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnVwZGF0ZVJlc3VsdENhbGxiYWNrKSB7XG4gICAgICBpdGVtcyA9IHRoaXMudXBkYXRlUmVzdWx0Q2FsbGJhY2soaXRlbXMsIHJlc3VsdCk7XG4gICAgfVxuICAgIENob2ljZXNSZXN0ZnVsbC5pdGVtc1Jlc3VsdFt0aGlzLm9iakhhc2hdID0gaXRlbXM7XG4gICAgdGhpcy5nZXRSZXN1bHRDYWxsYmFjayhpdGVtcyk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRDdXN0b21Qcm9wZXJ0aWVzKGl0ZW06IEl0ZW1WYWx1ZSwgaXRlbVZhbHVlOiBhbnkpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWVDb3JlKFxuICAgICAgICBpdGVtVmFsdWUsXG4gICAgICAgIHRoaXMuZ2V0UHJvcGVydHlCaW5kaW5nKHByb3AubmFtZSlcbiAgICAgICk7XG4gICAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHtcbiAgICAgICAgKDxhbnk+aXRlbSlbcHJvcC5uYW1lXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRQcm9wZXJ0eUJpbmRpbmcocHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoKDxhbnk+dGhpcylbdGhpcy5nZXRDdXN0b21Qcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKV0pXG4gICAgICByZXR1cm4gKDxhbnk+dGhpcylbdGhpcy5nZXRDdXN0b21Qcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKV07XG4gICAgaWYgKCg8YW55PnRoaXMpW3Byb3BlcnR5TmFtZV0pIHJldHVybiAoPGFueT50aGlzKVtwcm9wZXJ0eU5hbWVdO1xuICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7XG4gIH1cbiAgcHJpdmF0ZSBvbkVycm9yKHN0YXR1czogc3RyaW5nLCByZXNwb25zZTogc3RyaW5nKSB7XG4gICAgdGhpcy5lcnJvciA9IG5ldyBXZWJSZXF1ZXN0RXJyb3Ioc3RhdHVzLCByZXNwb25zZSwgdGhpcy5vd25lcik7XG4gICAgdGhpcy5kb0VtcHR5UmVzdWx0Q2FsbGJhY2socmVzcG9uc2UpO1xuICB9XG4gIHByaXZhdGUgZ2V0UmVzdWx0QWZ0ZXJQYXRoKHJlc3VsdDogYW55KSB7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgaWYgKCF0aGlzLnByb2Nlc3NlZFBhdGgpIHJldHVybiByZXN1bHQ7XG4gICAgdmFyIHBhdGhlcyA9IHRoaXMuZ2V0UGF0aGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdFtwYXRoZXNbaV1dO1xuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgZ2V0UGF0aGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciBwYXRoZXMgPSBbXTtcbiAgICBpZiAodGhpcy5wcm9jZXNzZWRQYXRoLmluZGV4T2YoXCI7XCIpID4gLTEpIHtcbiAgICAgIHBhdGhlcyA9IHRoaXMucGF0aC5zcGxpdChcIjtcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGhlcyA9IHRoaXMucHJvY2Vzc2VkUGF0aC5zcGxpdChcIixcIik7XG4gICAgfVxuICAgIGlmIChwYXRoZXMubGVuZ3RoID09IDApIHBhdGhlcy5wdXNoKHRoaXMucHJvY2Vzc2VkUGF0aCk7XG4gICAgcmV0dXJuIHBhdGhlcztcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlKGl0ZW06IGFueSk6IGFueSB7XG4gICAgaWYgKCFpdGVtKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy52YWx1ZU5hbWUpIHJldHVybiB0aGlzLmdldFZhbHVlQ29yZShpdGVtLCB0aGlzLnZhbHVlTmFtZSk7XG4gICAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIE9iamVjdCkpIHJldHVybiBpdGVtO1xuICAgIHZhciBsZW4gPSBPYmplY3Qua2V5cyhpdGVtKS5sZW5ndGg7XG4gICAgaWYgKGxlbiA8IDEpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBpdGVtW09iamVjdC5rZXlzKGl0ZW0pWzBdXTtcbiAgfVxuICBwcml2YXRlIGdldFRpdGxlKGl0ZW06IGFueSk6IGFueSB7XG4gICAgdmFyIHRpdGxlID0gdGhpcy50aXRsZU5hbWUgPyB0aGlzLnRpdGxlTmFtZSA6IFwidGl0bGVcIjtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZUNvcmUoaXRlbSwgdGl0bGUpO1xuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWVDb3JlKGl0ZW06IGFueSwgcHJvcGVydHk6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFpdGVtKSByZXR1cm4gbnVsbDtcbiAgICBpZiAocHJvcGVydHkuaW5kZXhPZihcIi5cIikgPCAwKSByZXR1cm4gaXRlbVtwcm9wZXJ0eV07XG4gICAgdmFyIHByb3BlcnRpZXMgPSBwcm9wZXJ0eS5zcGxpdChcIi5cIik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpdGVtID0gaXRlbVtwcm9wZXJ0aWVzW2ldXTtcbiAgICAgIGlmICghaXRlbSkgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xuICB9XG4gIHByaXZhdGUgZ2V0IG9iakhhc2goKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucHJvY2Vzc2VkVXJsICtcbiAgICAgIFwiO1wiICtcbiAgICAgIHRoaXMucHJvY2Vzc2VkUGF0aCArXG4gICAgICBcIjtcIiArXG4gICAgICB0aGlzLnZhbHVlTmFtZSArXG4gICAgICBcIjtcIiArXG4gICAgICB0aGlzLnRpdGxlTmFtZVxuICAgICk7XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiY2hvaWNlc0J5VXJsXCIsXG4gIFtcbiAgICBcInVybFwiLFxuICAgIFwicGF0aFwiLFxuICAgIFwidmFsdWVOYW1lXCIsXG4gICAgXCJ0aXRsZU5hbWVcIixcbiAgICB7IG5hbWU6IFwiYWxsb3dFbXB0eVJlc3BvbnNlOmJvb2xlYW5cIiwgZGVmYXVsdDogZmFsc2UgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IENob2ljZXNSZXN0ZnVsbCgpO1xuICB9XG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Nob2ljZXNSZXN0ZnVsbC50cyIsImltcG9ydCB7IE9wZXJhbmQgfSBmcm9tIFwiLi9leHByZXNzaW9ucy9leHByZXNzaW9uc1wiO1xuaW1wb3J0IHsgU3ludGF4RXJyb3IsIHBhcnNlIH0gZnJvbSBcIi4vZXhwcmVzc2lvbnMvZXhwcmVzc2lvblBhcnNlclwiO1xuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uc1BhcnNlckVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgYXQ6IG51bWJlciwgcHVibGljIGNvZGU6IHN0cmluZykge31cbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbnNQYXJzZXIge1xuICAgIHByaXZhdGUgY29uZGl0aW9uRXJyb3I6IENvbmRpdGlvbnNQYXJzZXJFcnJvcjtcblxuICAgIHB1YmxpYyBjcmVhdGVDb25kaXRpb24odGV4dDogc3RyaW5nKTogT3BlcmFuZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRXhwcmVzc2lvbih0ZXh0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VFeHByZXNzaW9uKHRleHQ6IHN0cmluZyk6IE9wZXJhbmQge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlKHRleHQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25kaXRpb25FcnJvciA9IG5ldyBDb25kaXRpb25zUGFyc2VyRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGUubG9jYXRpb24uc3RhcnQub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBlLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlcnJvcigpOiBDb25kaXRpb25zUGFyc2VyRXJyb3Ige1xuICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25FcnJvcjtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29uZGl0aW9uc1BhcnNlci50cyIsImltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcbi8qKlxuICogVGhlIGNsYXNzIGNvbnRhaW5zIG1ldGhvZHMgdG8gd29yayB3aXRoIHd3dy5keHN1cnZleS5jb20gc2VydmljZS5cbiAqL1xuZXhwb3J0IGNsYXNzIGR4U3VydmV5U2VydmljZSB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IHNlcnZpY2VVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2V0dGluZ3Muc3VydmV5U2VydmljZVVybDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldCBzZXJ2aWNlVXJsKHZhbDogc3RyaW5nKSB7XG4gICAgc2V0dGluZ3Muc3VydmV5U2VydmljZVVybCA9IHZhbDtcbiAgfVxuICBjb25zdHJ1Y3RvcigpIHt9XG4gIHB1YmxpYyBsb2FkU3VydmV5KFxuICAgIHN1cnZleUlkOiBzdHJpbmcsXG4gICAgb25Mb2FkOiAoc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIHJlc3BvbnNlOiBhbnkpID0+IHZvaWRcbiAgKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vcGVuKFxuICAgICAgXCJHRVRcIixcbiAgICAgIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgXCIvZ2V0U3VydmV5P3N1cnZleUlkPVwiICsgc3VydmV5SWRcbiAgICApO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZXN1bHQgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICBvbkxvYWQoeGhyLnN0YXR1cyA9PSAyMDAsIHJlc3VsdCwgeGhyLnJlc3BvbnNlKTtcbiAgICB9O1xuICAgIHhoci5zZW5kKCk7XG4gIH1cbiAgcHVibGljIGdldFN1cnZleUpzb25BbmRJc0NvbXBsZXRlZChcbiAgICBzdXJ2ZXlJZDogc3RyaW5nLFxuICAgIGNsaWVudElkOiBzdHJpbmcsXG4gICAgb25Mb2FkOiAoXG4gICAgICBzdWNjZXNzOiBib29sZWFuLFxuICAgICAgc3VydmV5SnNvbjogYW55LFxuICAgICAgcmVzdWx0OiBzdHJpbmcsXG4gICAgICByZXNwb25zZTogYW55XG4gICAgKSA9PiB2b2lkXG4gICkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHIub3BlbihcbiAgICAgIFwiR0VUXCIsXG4gICAgICBkeFN1cnZleVNlcnZpY2Uuc2VydmljZVVybCArXG4gICAgICAgIFwiL2dldFN1cnZleUFuZElzQ29tcGxldGVkP3N1cnZleUlkPVwiICtcbiAgICAgICAgc3VydmV5SWQgK1xuICAgICAgICBcIiZjbGllbnRJZD1cIiArXG4gICAgICAgIGNsaWVudElkXG4gICAgKTtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKTtcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xuICAgICAgdmFyIHN1cnZleUpzb24gPSByZXN1bHQgPyByZXN1bHQuc3VydmV5IDogbnVsbDtcbiAgICAgIHZhciBpc0NvbXBsZXRlZCA9IHJlc3VsdCA/IHJlc3VsdC5pc0NvbXBsZXRlZCA6IG51bGw7XG4gICAgICBvbkxvYWQoeGhyLnN0YXR1cyA9PSAyMDAsIHN1cnZleUpzb24sIGlzQ29tcGxldGVkLCB4aHIucmVzcG9uc2UpO1xuICAgIH07XG4gICAgeGhyLnNlbmQoKTtcbiAgfVxuICBwdWJsaWMgc2VuZFJlc3VsdChcbiAgICBwb3N0SWQ6IHN0cmluZyxcbiAgICByZXN1bHQ6IEpTT04sXG4gICAgb25TZW5kUmVzdWx0OiAoc3VjY2VzczogYm9vbGVhbiwgcmVzcG9uc2U6IGFueSwgcmVxdWVzdD86IGFueSkgPT4gdm9pZCxcbiAgICBjbGllbnRJZDogc3RyaW5nID0gbnVsbCxcbiAgICBpc1BhcnRpYWxDb21wbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyLm9wZW4oXCJQT1NUXCIsIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgXCIvcG9zdC9cIik7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgIHZhciBkYXRhID0geyBwb3N0SWQ6IHBvc3RJZCwgc3VydmV5UmVzdWx0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQpIH07XG4gICAgaWYgKGNsaWVudElkKSAoPGFueT5kYXRhKVtcImNsaWVudElkXCJdID0gY2xpZW50SWQ7XG4gICAgaWYgKGlzUGFydGlhbENvbXBsZXRlZCkgKDxhbnk+ZGF0YSlbXCJpc1BhcnRpYWxDb21wbGV0ZWRcIl0gPSB0cnVlO1xuICAgIHZhciBkYXRhU3RyaW5naWZ5OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgeGhyLm9ubG9hZCA9IHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIW9uU2VuZFJlc3VsdCkgcmV0dXJuO1xuICAgICAgb25TZW5kUmVzdWx0KHhoci5zdGF0dXMgPT09IDIwMCwgeGhyLnJlc3BvbnNlLCB4aHIpO1xuICAgIH07XG4gICAgeGhyLnNlbmQoZGF0YVN0cmluZ2lmeSk7XG4gIH1cbiAgcHVibGljIHNlbmRGaWxlKFxuICAgIHBvc3RJZDogc3RyaW5nLFxuICAgIGZpbGU6IEZpbGUsXG4gICAgb25TZW5kRmlsZTogKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3BvbnNlOiBhbnkpID0+IHZvaWRcbiAgKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vbmxvYWQgPSB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFvblNlbmRGaWxlKSByZXR1cm47XG4gICAgICBvblNlbmRGaWxlKHhoci5zdGF0dXMgPT0gMjAwLCBKU09OLnBhcnNlKHhoci5yZXNwb25zZSkpO1xuICAgIH07XG4gICAgeGhyLm9wZW4oXCJQT1NUXCIsIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgXCIvdXBsb2FkL1wiLCB0cnVlKTtcbiAgICB2YXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlXCIsIGZpbGUpO1xuICAgIGZvcm1EYXRhLmFwcGVuZChcInBvc3RJZFwiLCBwb3N0SWQpO1xuICAgIHhoci5zZW5kKGZvcm1EYXRhKTtcbiAgfVxuICBwdWJsaWMgZ2V0UmVzdWx0KFxuICAgIHJlc3VsdElkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9uR2V0UmVzdWx0OiAoXG4gICAgICBzdWNjZXNzOiBib29sZWFuLFxuICAgICAgZGF0YTogYW55LFxuICAgICAgZGF0YUxpc3Q6IEFycmF5PGFueT4sXG4gICAgICByZXNwb25zZTogYW55XG4gICAgKSA9PiB2b2lkXG4gICkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB2YXIgZGF0YSA9IFwicmVzdWx0SWQ9XCIgKyByZXN1bHRJZCArIFwiJm5hbWU9XCIgKyBuYW1lO1xuICAgIHhoci5vcGVuKFwiR0VUXCIsIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgXCIvZ2V0UmVzdWx0P1wiICsgZGF0YSk7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZXN1bHQgPSBudWxsO1xuICAgICAgdmFyIGxpc3QgPSBudWxsO1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwKSB7XG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgbGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcmVzdWx0LlF1ZXN0aW9uUmVzdWx0KSB7XG4gICAgICAgICAgdmFyIGVsID0geyBuYW1lOiBrZXksIHZhbHVlOiByZXN1bHQuUXVlc3Rpb25SZXN1bHRba2V5XSB9O1xuICAgICAgICAgIGxpc3QucHVzaChlbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9uR2V0UmVzdWx0KHhoci5zdGF0dXMgPT0gMjAwLCByZXN1bHQsIGxpc3QsIHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICB9XG4gIHB1YmxpYyBpc0NvbXBsZXRlZChcbiAgICByZXN1bHRJZDogc3RyaW5nLFxuICAgIGNsaWVudElkOiBzdHJpbmcsXG4gICAgb25Jc0NvbXBsZXRlZDogKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3VsdDogc3RyaW5nLCByZXNwb25zZTogYW55KSA9PiB2b2lkXG4gICkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB2YXIgZGF0YSA9IFwicmVzdWx0SWQ9XCIgKyByZXN1bHRJZCArIFwiJmNsaWVudElkPVwiICsgY2xpZW50SWQ7XG4gICAgeGhyLm9wZW4oXCJHRVRcIiwgZHhTdXJ2ZXlTZXJ2aWNlLnNlcnZpY2VVcmwgKyBcIi9pc0NvbXBsZXRlZD9cIiArIGRhdGEpO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09IDIwMCkge1xuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBvbklzQ29tcGxldGVkKHhoci5zdGF0dXMgPT0gMjAwLCByZXN1bHQsIHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZHhTdXJ2ZXlTZXJ2aWNlLnRzIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IElFbGVtZW50LCBJUXVlc3Rpb24gfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBQYW5lbE1vZGVsIH0gZnJvbSBcIi4vcGFuZWxcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcblxuLyoqXG4gKiBUaGUgZmxvdyBwYW5lbCBvYmplY3QuIEl0IGlzIGEgY29udGFpbmVyIHdpdGggZmxvdyBsYXlvdXQgd2hlcmUgeW91IGNhbiBtaXggcXVlc3Rpb25zIHdpdGggbWFyZG93biB0ZXh0LlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEZsb3dQYW5lbE1vZGVsIGV4dGVuZHMgUGFuZWxNb2RlbCB7XG4gIHN0YXRpYyBjb250ZW50RWxlbWVudE5hbWVQcmVmaXggPSBcImVsZW1lbnQ6XCI7XG4gIHB1YmxpYyBjb250ZW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBwdWJsaWMgb25HZXRIdG1sRm9yUXVlc3Rpb246IChxdWVzdGlvbjogUXVlc3Rpb24pID0+IHN0cmluZztcbiAgcHVibGljIG9uQ3VzdG9tSHRtbFByb2R1Y2luZzogKCkgPT4gc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImNvbnRlbnRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJjb250ZW50XCIsIGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vbkNvbnRlbnRDaGFuZ2VkKCk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmbG93cGFuZWxcIjtcbiAgfVxuICBnZXRDaGlsZHJlbkxheW91dFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmbG93XCI7XG4gIH1cbiAgb25TdXJ2ZXlMb2FkKCk6IGFueSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5vbkNvbnRlbnRDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIGdldCBjb250ZW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29udGVudFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbnRlbnQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbnRlbnRcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY0NvbnRlbnQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiY29udGVudFwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGh0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaHRtbFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGh0bWwodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJodG1sXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ29udGVudENoYW5nZWQoKTogYW55IHtcbiAgICB2YXIgaHRtbCA9IFwiXCI7XG4gICAgaWYgKCEhdGhpcy5vbkN1c3RvbUh0bWxQcm9kdWNpbmcpIHtcbiAgICAgIGh0bWwgPSB0aGlzLm9uQ3VzdG9tSHRtbFByb2R1Y2luZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBodG1sID0gdGhpcy5wcm9kdWNlSHRtbCgpO1xuICAgIH1cbiAgICB0aGlzLmh0bWwgPSBodG1sO1xuICAgIGlmICghIXRoaXMuY29udGVudENoYW5nZWRDYWxsYmFjaykgdGhpcy5jb250ZW50Q2hhbmdlZENhbGxiYWNrKCk7XG4gIH1cbiAgcHVibGljIHByb2R1Y2VIdG1sKCk6IHN0cmluZyB7XG4gICAgdmFyIGh0bWwgPSBbXTtcbiAgICAvL2NvbnRlbnRFbGVtZW50TmFtZVByZWZpeFxuICAgIHZhciByZWdFeCA9IC97KC4qPyhlbGVtZW50OilbXiRdLio/KX0vZztcbiAgICB2YXIgc3RyID0gdGhpcy5jb250ZW50O1xuICAgIHZhciBzdGFydEluZGV4ID0gMDtcbiAgICB2YXIgcmVzID0gbnVsbDtcbiAgICB3aGlsZSAoKHJlcyA9IHJlZ0V4LmV4ZWMoc3RyKSkgIT09IG51bGwpIHtcbiAgICAgIGlmIChyZXMuaW5kZXggPiBzdGFydEluZGV4KSB7XG4gICAgICAgIGh0bWwucHVzaChzdHIuc3Vic3RyKHN0YXJ0SW5kZXgsIHJlcy5pbmRleCAtIHN0YXJ0SW5kZXgpKTtcbiAgICAgICAgc3RhcnRJbmRleCA9IHJlcy5pbmRleDtcbiAgICAgIH1cbiAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25Gcm9tVGV4dChyZXNbMF0pO1xuICAgICAgaWYgKCEhcXVlc3Rpb24pIHtcbiAgICAgICAgaHRtbC5wdXNoKHRoaXMuZ2V0SHRtbEZvclF1ZXN0aW9uKHF1ZXN0aW9uKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBodG1sLnB1c2goXG4gICAgICAgICAgc3RyLnN1YnN0cihzdGFydEluZGV4LCByZXMuaW5kZXggKyByZXNbMF0ubGVuZ3RoIC0gc3RhcnRJbmRleClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0SW5kZXggPSByZXMuaW5kZXggKyByZXNbMF0ubGVuZ3RoO1xuICAgIH1cbiAgICBpZiAoc3RhcnRJbmRleCA8IHN0ci5sZW5ndGgpIHtcbiAgICAgIGh0bWwucHVzaChzdHIuc3Vic3RyKHN0YXJ0SW5kZXgsIHN0ci5sZW5ndGggLSBzdGFydEluZGV4KSk7XG4gICAgfVxuICAgIHJldHVybiBodG1sLmpvaW4oXCJcIikucmVwbGFjZShuZXcgUmVnRXhwKFwiPGJyPlwiLCBcImdcIiksIFwiPGJyLz5cIik7XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uRnJvbVRleHQoc3RyOiBzdHJpbmcpOiBRdWVzdGlvbiB7XG4gICAgc3RyID0gc3RyLnN1YnN0cigxLCBzdHIubGVuZ3RoIC0gMik7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UoRmxvd1BhbmVsTW9kZWwuY29udGVudEVsZW1lbnROYW1lUHJlZml4LCBcIlwiKS50cmltKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UXVlc3Rpb25CeU5hbWUoc3RyKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SHRtbEZvclF1ZXN0aW9uKHF1ZXN0aW9uOiBRdWVzdGlvbik6IHN0cmluZyB7XG4gICAgaWYgKCEhdGhpcy5vbkdldEh0bWxGb3JRdWVzdGlvbikgcmV0dXJuIHRoaXMub25HZXRIdG1sRm9yUXVlc3Rpb24ocXVlc3Rpb24pO1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXRRdWVzdGlvbkh0bWxJZChxdWVzdGlvbjogUXVlc3Rpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5hbWUgKyBcIl9cIiArIHF1ZXN0aW9uLmlkO1xuICB9XG4gIHByb3RlY3RlZCBvbkFkZEVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICBzdXBlci5vbkFkZEVsZW1lbnQoZWxlbWVudCwgaW5kZXgpO1xuICAgIHRoaXMuYWRkRWxlbWVudFRvQ29udGVudChlbGVtZW50KTtcbiAgICBlbGVtZW50LnJlbmRlcldpZHRoID0gXCJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgb25SZW1vdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KSB7XG4gICAgdmFyIHNlYXJjaFN0ciA9IHRoaXMuZ2V0RWxlbWVudENvbnRlbnRUZXh0KGVsZW1lbnQpO1xuICAgIHRoaXMuY29udGVudCA9IHRoaXMuY29udGVudC5yZXBsYWNlKHNlYXJjaFN0ciwgXCJcIik7XG4gICAgc3VwZXIub25SZW1vdmVFbGVtZW50KGVsZW1lbnQpO1xuICB9XG4gIGRyYWdEcm9wTW92ZUVsZW1lbnQoc3JjOiBJRWxlbWVudCwgdGFyZ2V0OiBJRWxlbWVudCwgdGFyZ2V0SW5kZXg6IG51bWJlcikge31cbiAgcHJpdmF0ZSBhZGRFbGVtZW50VG9Db250ZW50KGVsZW1lbnQ6IElFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgdGV4dCA9IHRoaXMuZ2V0RWxlbWVudENvbnRlbnRUZXh0KGVsZW1lbnQpO1xuICAgIGlmICghdGhpcy5pbnNlcnRUZXh0QXRDdXJzb3IodGV4dCkpIHtcbiAgICAgIHRoaXMuY29udGVudCA9IHRoaXMuY29udGVudCArIHRleHQ7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaW5zZXJ0VGV4dEF0Q3Vyc29yKHRleHQ6IHN0cmluZywgcHJldk5hbWU6IHN0cmluZyA9IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNEZXNpZ25Nb2RlIHx8ICghd2luZG93ICYmICF3aW5kb3cuZ2V0U2VsZWN0aW9uKSkgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKHNlbC5nZXRSYW5nZUF0ICYmIHNlbC5yYW5nZUNvdW50KSB7XG4gICAgICBsZXQgcmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTtcbiAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XG4gICAgICByYW5nZS5pbnNlcnROb2RlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpKTtcbiAgICAgIHZhciBzZWxmID0gPGFueT50aGlzO1xuICAgICAgaWYgKHNlbGYuZ2V0Q29udGVudCkge1xuICAgICAgICB2YXIgc3RyID0gc2VsZi5nZXRDb250ZW50KHByZXZOYW1lKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gc3RyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0RWxlbWVudENvbnRlbnRUZXh0KGVsZW1lbnQ6IElFbGVtZW50KSB7XG4gICAgcmV0dXJuIFwie1wiICsgRmxvd1BhbmVsTW9kZWwuY29udGVudEVsZW1lbnROYW1lUHJlZml4ICsgZWxlbWVudC5uYW1lICsgXCJ9XCI7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJmbG93cGFuZWxcIixcbiAgW3sgbmFtZTogXCJjb250ZW50Omh0bWxcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbnRlbnRcIiB9XSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBGbG93UGFuZWxNb2RlbCgpO1xuICB9LFxuICBcInBhbmVsXCJcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxvd3BhbmVsLnRzIiwiLy9VbmNvbW1lbnQgdGhpcyBsaW5lIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZVxuLy9pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGVuZ2xpc2hTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiUHJldmlvdXNcIixcbiAgcGFnZU5leHRUZXh0OiBcIk5leHRcIixcbiAgY29tcGxldGVUZXh0OiBcIkNvbXBsZXRlXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJTdGFydFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIk90aGVyIChkZXNjcmliZSlcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIk5vbmVcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiU2VsZWN0IEFsbFwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUGFnZSB7MH0gb2YgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJBbnN3ZXJlZCB7MH0vezF9IHF1ZXN0aW9uc1wiLFxuICBlbXB0eVN1cnZleTogXCJUaGVyZSBpcyBubyB2aXNpYmxlIHBhZ2Ugb3IgcXVlc3Rpb24gaW4gdGhlIHN1cnZleS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJUaGFuayB5b3UgZm9yIGNvbXBsZXRpbmcgdGhlIHN1cnZleSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIk91ciByZWNvcmRzIHNob3cgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IGNvbXBsZXRlZCB0aGlzIHN1cnZleS5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJMb2FkaW5nIFN1cnZleS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJDaG9vc2UuLi5cIixcbiAgdmFsdWU6IFwidmFsdWVcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJQbGVhc2UgYW5zd2VyIHRoZSBxdWVzdGlvbi5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiUGxlYXNlIGFuc3dlciBhdCBsZWFzdCBvbmUgcXVlc3Rpb24uXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiUGxlYXNlIGFuc3dlciBxdWVzdGlvbnMgaW4gYWxsIHJvd3MuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJUaGUgdmFsdWUgc2hvdWxkIGJlIG51bWVyaWMuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiUGxlYXNlIGVudGVyIGF0IGxlYXN0IHswfSBjaGFyYWN0ZXJzLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlBsZWFzZSBlbnRlciBsZXNzIHRoYW4gezB9IGNoYXJhY3RlcnMuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiUGxlYXNlIGVudGVyIG1vcmUgdGhhbiB7MH0gYW5kIGxlc3MgdGhhbiB7MX0gY2hhcmFjdGVycy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJQbGVhc2UgZmlsbCBpbiBhdCBsZWFzdCB7MH0gcm93cy5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCB7MH0gdmFyaWFudHMuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlBsZWFzZSBzZWxlY3Qgbm8gbW9yZSB0aGFuIHswfSB2YXJpYW50cy5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIlRoZSAnezB9JyBzaG91bGQgYmUgZXF1YWwgb3IgbW9yZSB0aGFuIHsxfSBhbmQgZXF1YWwgb3IgbGVzcyB0aGFuIHsyfVwiLFxuICBudW1lcmljTWluOiBcIlRoZSAnezB9JyBzaG91bGQgYmUgZXF1YWwgb3IgbW9yZSB0aGFuIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIlRoZSAnezB9JyBzaG91bGQgYmUgZXF1YWwgb3IgbGVzcyB0aGFuIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZS1tYWlsIGFkZHJlc3MuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIlRoZSBleHByZXNzaW9uOiB7MH0gc2hvdWxkIHJldHVybiAndHJ1ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJUaGUgcmVxdWVzdCByZXR1cm5lZCBlcnJvciAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIlRoZSByZXF1ZXN0IHJldHVybmVkIGVtcHR5IGRhdGEgb3IgdGhlICdwYXRoJyBwcm9wZXJ0eSBpcyBpbmNvcnJlY3RcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJUaGUgZmlsZSBzaXplIHNob3VsZCBub3QgZXhjZWVkIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlBsZWFzZSBlbnRlciB0aGUgb3RoZXIgdmFsdWUuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJZb3VyIGZpbGUgaXMgdXBsb2FkaW5nLiBQbGVhc2Ugd2FpdCBzZXZlcmFsIHNlY29uZHMgYW5kIHRyeSBhZ2Fpbi5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiTG9hZGluZy4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIkNob29zZSBmaWxlKHMpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJObyBmaWxlIGNob3NlblwiLFxuICBjb25maXJtRGVsZXRlOiBcIkRvIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgcmVjb3JkP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIlRoaXMgdmFsdWUgc2hvdWxkIGJlIHVuaXF1ZS5cIixcbiAgYWRkQ29sdW1uOiBcIkFkZCBjb2x1bW5cIixcbiAgYWRkUm93OiBcIkFkZCByb3dcIixcbiAgcmVtb3ZlUm93OiBcIlJlbW92ZVwiLFxuICBhZGRQYW5lbDogXCJBZGQgbmV3XCIsXG4gIHJlbW92ZVBhbmVsOiBcIlJlbW92ZVwiLFxuICBjaG9pY2VzX0l0ZW06IFwiaXRlbVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIkNvbHVtblwiLFxuICBtYXRyaXhfcm93OiBcIlJvd1wiLFxuICBzYXZpbmdEYXRhOiBcIlRoZSByZXN1bHRzIGFyZSBzYXZpbmcgb24gdGhlIHNlcnZlci4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiQW4gZXJyb3Igb2NjdXJyZWQgYW5kIHdlIGNvdWxkIG5vdCBzYXZlIHRoZSByZXN1bHRzLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJUaGUgcmVzdWx0cyB3ZXJlIHNhdmVkIHN1Y2Nlc3NmdWxseSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlRyeSBhZ2FpblwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VjXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9uIHRoaXMgcGFnZSBhbmQgezF9IGluIHRvdGFsLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJZb3UgaGF2ZSBzcGVudCB7MH0gb24gdGhpcyBwYWdlLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIllvdSBoYXZlIHNwZW50IHswfSBpbiB0b3RhbC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIllvdSBoYXZlIHNwZW50IHswfSBvZiB7MX0gb24gdGhpcyBwYWdlIGFuZCB7Mn0gb2YgezN9IGluIHRvdGFsLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJZb3UgaGF2ZSBzcGVudCB7MH0gb2YgezF9IG9uIHRoaXMgcGFnZS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJZb3UgaGF2ZSBzcGVudCB7MH0gb2YgezF9IGluIHRvdGFsLlwiLFxuICBjbGVhbkNhcHRpb246IFwiQ2xlYW5cIixcbiAgY2xlYXJDYXB0aW9uOiBcIkNsZWFyXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIlJlbW92ZSB0aGlzIGZpbGVcIlxufTtcblxuLy9VbmNvbW1lbnQgdGhlc2UgdHdvIGxpbmVzIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZS4gWW91IHNob3VsZCByZXBsYWNlIFwiZW5cIiBhbmQgZW5TdHJpbmdzIHdpdGggeW91ciBsb2NhbGUgKFwiZnJcIiwgXCJkZVwiIGFuZCBzbyBvbikgYW5kIHlvdXIgdmFyaWFibGUuXG4vL3N1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZW5cIl0gPSBlbmdsaXNoU3RyaW5ncztcbi8vc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZW5cIl0gPSBcIkVuZ2xpc2hcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vZW5nbGlzaC50cyIsImltcG9ydCB7IEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IENvbmRpdGlvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBtYXRyaXggYmFzZSBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4QmFzZU1vZGVsPFRSb3csIFRDb2x1bW4+IGV4dGVuZHMgUXVlc3Rpb24ge1xuICBwcm90ZWN0ZWQgZmlsdGVyZWRDb2x1bW5zOiBBcnJheTxUQ29sdW1uPjtcbiAgcHJvdGVjdGVkIGZpbHRlcmVkUm93czogQXJyYXk8SXRlbVZhbHVlPjtcbiAgcHJvdGVjdGVkIGdlbmVyYXRlZFZpc2libGVSb3dzOiBBcnJheTxUUm93PiA9IG51bGw7XG4gIHByb3RlY3RlZCBnZW5lcmF0ZWRUb3RhbFJvdzogVFJvdyA9IG51bGw7XG4gIHB1YmxpYyB2aXNpYmxlUm93c0NoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcblxuICBwcm90ZWN0ZWQgY3JlYXRlQ29sdW1uVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcImNvbHVtbnNcIik7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5maWx0ZXJlZFJvd3MgPSBudWxsO1xuICAgIHRoaXMuZmlsdGVyZWRDb2x1bW5zID0gbnVsbDtcbiAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNyZWF0ZUNvbHVtblZhbHVlcygpO1xuICAgIHRoaXMucm93cyA9IHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcInJvd3NcIik7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtYXRyaXhiYXNlXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0FsbG93VGl0bGVMZWZ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UsIHRvIGhpZGUgdGFibGUgaGVhZGVyLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93SGVhZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93SGVhZGVyXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd0hlYWRlcih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93SGVhZGVyXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGNvbHVtbnMuIEEgY29sdW1uIGhhcyBhIHZhbHVlIGFuZCBhbiBvcHRpb25hbCB0ZXh0XG4gICAqL1xuICBnZXQgY29sdW1ucygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uc1wiKTtcbiAgfVxuICBzZXQgY29sdW1ucyhuZXdWYWx1ZTogQXJyYXk8YW55Pikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbnNcIiwgbmV3VmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgdmlzaWJsZUNvbHVtbnMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuICEhdGhpcy5maWx0ZXJlZENvbHVtbnMgPyB0aGlzLmZpbHRlcmVkQ29sdW1ucyA6IHRoaXMuY29sdW1ucztcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2Ygcm93cy4gQSByb3cgaGFzIGEgdmFsdWUgYW5kIGFuIG9wdGlvbmFsIHRleHRcbiAgICovXG4gIGdldCByb3dzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyb3dzXCIpO1xuICB9XG4gIHNldCByb3dzKG5ld1ZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiLCBuZXdWYWx1ZSk7XG4gICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWaXNpYmxlUm93cygpOiBBcnJheTxUUm93PiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHZpc2libGUgcm93cyBhcyBtb2RlbCBvYmplY3RzLlxuICAgKiBAc2VlIHJvd3NWaXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZVJvd3MoKTogQXJyYXk8VFJvdz4ge1xuICAgIHJldHVybiB0aGlzLmdldFZpc2libGVSb3dzKCk7XG4gIH1cblxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSXQgcnVucyBhZ2FpbnN0IGVhY2ggcm93IGl0ZW0gYW5kIGlmIGZvciB0aGlzIGl0ZW0gaXQgcmV0dXJucyB0cnVlLCB0aGVuIHRoZSBpdGVtIGlzIHZpc2libGUgb3RoZXJ3aXNlIHRoZSBpdGVtIGJlY29tZXMgaW52aXNpYmxlLiBQbGVhc2UgdXNlIHtpdGVtfSB0byBnZXQgdGhlIGN1cnJlbnQgaXRlbSB2YWx1ZSBpbiB0aGUgZXhwcmVzc2lvbi5cbiAgICogQHNlZSB2aXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgcm93c1Zpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyb3dzVmlzaWJsZUlmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcm93c1Zpc2libGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd3NWaXNpYmxlSWZcIiwgdmFsKTtcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIEl0IHJ1bnMgYWdhaW5zdCBlYWNoIGNvbHVtbiBpdGVtIGFuZCBpZiBmb3IgdGhpcyBpdGVtIGl0IHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgaXRlbSBpcyB2aXNpYmxlIG90aGVyd2lzZSB0aGUgaXRlbSBiZWNvbWVzIGludmlzaWJsZS4gUGxlYXNlIHVzZSB7aXRlbX0gdG8gZ2V0IHRoZSBjdXJyZW50IGl0ZW0gdmFsdWUgaW4gdGhlIGV4cHJlc3Npb24uXG4gICAqIEBzZWUgcm93c1Zpc2libGVJZlxuICAgKi9cbiAgcHVibGljIGdldCBjb2x1bW5zVmlzaWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbnNWaXNpYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb2x1bW5zVmlzaWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uc1Zpc2libGVJZlwiLCB2YWwpO1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgc3VwZXIucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgdGhpcy5ydW5JdGVtc0NvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByb3RlY3RlZCBmaWx0ZXJJdGVtcygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcpIHtcbiAgICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fCAhdGhpcy5kYXRhKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucnVuSXRlbXNDb25kaXRpb24oXG4gICAgICB0aGlzLmdldERhdGFGaWx0ZXJlZFZhbHVlcygpLFxuICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKClcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBvbkNvbHVtbnNDaGFuZ2VkKCkge31cbiAgcHJvdGVjdGVkIG9uUm93c0NoYW5nZWQoKSB7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy52aXNpYmxlUm93c0NoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgcHJvdGVjdGVkIHJ1bkl0ZW1zQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIGhhc0NoYW5nZXMgPSB0aGlzLnJ1bkNvbmRpdGlvbnNGb3JSb3dzKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgaGFzQ2hhbmdlcyA9IHRoaXMucnVuQ29uZGl0aW9uc0ZvckNvbHVtbnModmFsdWVzLCBwcm9wZXJ0aWVzKSB8fCBoYXNDaGFuZ2VzO1xuICAgIGlmIChoYXNDaGFuZ2VzKSB7XG4gICAgICBpZiAoISF0aGlzLmZpbHRlcmVkQ29sdW1ucyB8fCAhIXRoaXMuZmlsdGVyZWRSb3dzKSB7XG4gICAgICAgIHRoaXMuY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSBudWxsO1xuICAgICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gICAgfVxuICAgIHJldHVybiBoYXNDaGFuZ2VzO1xuICB9XG4gIHByaXZhdGUgcnVuQ29uZGl0aW9uc0ZvclJvd3MoXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApOiBib29sZWFuIHtcbiAgICB2YXIgcnVubmVyID0gISF0aGlzLnJvd3NWaXNpYmxlSWZcbiAgICAgID8gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLnJvd3NWaXNpYmxlSWYpXG4gICAgICA6IG51bGw7XG4gICAgdGhpcy5maWx0ZXJlZFJvd3MgPSBbXTtcbiAgICB2YXIgaGFzQ2hhbmdlZCA9IEl0ZW1WYWx1ZS5ydW5Db25kaXRpb25zRm9ySXRlbXMoXG4gICAgICB0aGlzLnJvd3MsXG4gICAgICB0aGlzLmZpbHRlcmVkUm93cyxcbiAgICAgIHJ1bm5lcixcbiAgICAgIHZhbHVlcyxcbiAgICAgIHByb3BlcnRpZXNcbiAgICApO1xuICAgIGlmICh0aGlzLmZpbHRlcmVkUm93cy5sZW5ndGggPT09IHRoaXMucm93cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRSb3dzID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQ7XG4gIH1cbiAgcHJpdmF0ZSBydW5Db25kaXRpb25zRm9yQ29sdW1ucyhcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICk6IGJvb2xlYW4ge1xuICAgIHZhciBydW5uZXIgPSAhIXRoaXMuY29sdW1uc1Zpc2libGVJZlxuICAgICAgPyBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuY29sdW1uc1Zpc2libGVJZilcbiAgICAgIDogbnVsbDtcbiAgICB0aGlzLmZpbHRlcmVkQ29sdW1ucyA9IFtdO1xuICAgIHZhciBoYXNDaGFuZ2VkID0gSXRlbVZhbHVlLnJ1bkNvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICAgIHRoaXMuY29sdW1ucyxcbiAgICAgIDxhbnk+dGhpcy5maWx0ZXJlZENvbHVtbnMsXG4gICAgICBydW5uZXIsXG4gICAgICB2YWx1ZXMsXG4gICAgICBwcm9wZXJ0aWVzXG4gICAgKTtcbiAgICBpZiAodGhpcy5maWx0ZXJlZENvbHVtbnMubGVuZ3RoID09PSB0aGlzLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkQ29sdW1ucyA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBoYXNDaGFuZ2VkO1xuICB9XG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpIHtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCkgcmV0dXJuO1xuICAgIHZhciBuZXdWYWwgPSBudWxsO1xuICAgIHZhciBpc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgcm93cyA9ICEhdGhpcy5maWx0ZXJlZFJvd3MgPyB0aGlzLmZpbHRlcmVkUm93cyA6IHRoaXMucm93cztcbiAgICB2YXIgY29sdW1ucyA9ICEhdGhpcy5maWx0ZXJlZENvbHVtbnMgPyB0aGlzLmZpbHRlcmVkQ29sdW1ucyA6IHRoaXMuY29sdW1ucztcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsKSB7XG4gICAgICBpZiAoXG4gICAgICAgIEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShyb3dzLCBrZXkpICYmXG4gICAgICAgIEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShjb2x1bW5zLCB2YWxba2V5XSlcbiAgICAgICkge1xuICAgICAgICBpZiAobmV3VmFsID09IG51bGwpIG5ld1ZhbCA9IHt9O1xuICAgICAgICAoPGFueT5uZXdWYWwpW2tleV0gPSB2YWxba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYW5nZWQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWw7XG4gICAgfVxuICAgIHN1cGVyLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNsZWFySW52aXNpYmxlVmFsdWVzSW5Sb3dzKCkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuO1xuICAgIHZhciBvbGREYXRhID0gSGVscGVycy5nZXRVbmJpbmRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICB2YXIgbmV3RGF0YSA9IHt9O1xuICAgIHZhciByb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmdldFJvd05hbWUocm93c1tpXSk7XG4gICAgICBpZiAoISFvbGREYXRhW2tleV0pIHtcbiAgICAgICAgKDxhbnk+bmV3RGF0YSlba2V5XSA9IG9sZERhdGFba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhuZXdEYXRhLCB0aGlzLnZhbHVlKSkgcmV0dXJuO1xuICAgIHRoaXMudmFsdWUgPSBuZXdEYXRhO1xuICB9XG4gIHByb3RlY3RlZCBnZXRSb3dOYW1lKHJvdzogYW55KSB7XG4gICAgcmV0dXJuIHJvdy5uYW1lO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwibWF0cml4YmFzZVwiLFxuICBbXG4gICAgXCJjb2x1bW5zVmlzaWJsZUlmOmNvbmRpdGlvblwiLFxuICAgIFwicm93c1Zpc2libGVJZjpjb25kaXRpb25cIixcbiAgICB7IG5hbWU6IFwic2hvd0hlYWRlcjpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfVxuICBdLFxuICB1bmRlZmluZWQsXG4gIFwicXVlc3Rpb25cIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9tYXJ0aXhCYXNlLnRzIiwiaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgYm9vbGVhbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQm9vbGVhbk1vZGVsIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImxhYmVsXCIsIHRoaXMsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICB9XG4gIGlzTGF5b3V0VHlwZVN1cHBvcnRlZChsYXlvdXRUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBxdWVzdGlvbiBjaGVjayB3aWxsIGJlIHJlbmRlcmVkIGluIGluZGV0ZXJtaW5hdGUgbW9kZS4gdmFsdWUgaXMgZW1wdHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzSW5kZXRlcm1pbmF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0VtcHR5KCk7XG4gIH1cbiAgcHVibGljIGdldCBoYXNUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93VGl0bGU7XG4gIH1cbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIEdldC9zZXQgcXVlc3Rpb24gdmFsdWUgaW4gMyBtb2RlczogaW5kZXRlcm1pbmF0ZSAodmFsdWUgaXMgZW1wdHkpLCB0cnVlIChjaGVjayBpcyBzZXQpIGFuZCBmYWxzZSAoY2hlY2sgaXMgdW5zZXQpLlxuICAgKiBAc2VlIHZhbHVlVHJ1ZVxuICAgKiBAc2VlIHZhbHVlRmFsc2VcbiAgICovXG4gIHB1YmxpYyBnZXQgY2hlY2tlZFZhbHVlKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy52YWx1ZSA9PSB0aGlzLmdldFZhbHVlVHJ1ZSgpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hlY2tlZFZhbHVlKHZhbDogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsID09IHRydWUgPyB0aGlzLmdldFZhbHVlVHJ1ZSgpIDogdGhpcy5nZXRWYWx1ZUZhbHNlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgc3RhdGUgb2YgdGhlIGNoZWNrOiBcImluZGV0ZXJtaW5hdGVcIiAtIGRlZmF1bHQgKHZhbHVlIGlzIGVtcHR5L251bGwpLCBcInRydWVcIiAtIHZhbHVlIGVxdWFscyB2YWx1ZVRydWUgb3IgdHJ1ZSwgXCJmYWxzZVwiIC0gdmFsdWUgZXF1YWxzIHZhbHVlRmFsc2Ugb3IgZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlZmF1bHRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVcIiwgXCJpbmRldGVybWluYXRlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVmYXVsdFZhbHVlKHZhbDogYW55KSB7XG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSkgdmFsID0gXCJ0cnVlXCI7XG4gICAgaWYgKHZhbCA9PT0gZmFsc2UpIHZhbCA9IFwiZmFsc2VcIjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVcIiwgdmFsKTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlV2l0aERlZmF1bHRzKCk7XG4gIH1cbiAgcHVibGljIGdldERlZmF1bHRWYWx1ZSgpOiBhbnkge1xuICAgIGlmICh0aGlzLmRlZmF1bHRWYWx1ZSA9PSBcImluZGV0ZXJtaW5hdGVcIikgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlID09IFwidHJ1ZVwiXG4gICAgICA/IHRoaXMuZ2V0VmFsdWVUcnVlKClcbiAgICAgIDogdGhpcy5nZXRWYWx1ZUZhbHNlKCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjaGVja2JveCBsYWJlbC4gSWYgaXQgaXMgZW1wdHkgYW5kIHNob3dUaXRsZSBpcyBmYWxzZSB0aGVuIHRpdGxlIGlzIHJlbmRlcmVkXG4gICAqIEBzZWUgc2hvd1RpdGxlXG4gICAqIEBzZWUgdGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJsYWJlbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGxhYmVsKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJsYWJlbFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NMYWJlbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJsYWJlbFwiKTtcbiAgfVxuICBnZXQgbG9jRGlzcGxheUxhYmVsKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICBpZiAodGhpcy5sb2NMYWJlbC50ZXh0KSByZXR1cm4gdGhpcy5sb2NMYWJlbDtcbiAgICByZXR1cm4gdGhpcy5zaG93VGl0bGUgPyB0aGlzLmxvY0xhYmVsIDogdGhpcy5sb2NUaXRsZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSB0byBzaG93IHRoZSBxdWVzdGlvbiB0aXRsZS4gSXQgaXMgaGlkZGVuIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpdGxlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1RpdGxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dUaXRsZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSwgaWYgeW91IHdhbnQgdG8gaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBmcm9tIHRydWUgd2hlbiBjaGVjayBpcyBzZXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbHVlVHJ1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZVRydWVcIik7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZVRydWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZVRydWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHksIGlmIHlvdSB3YW50IHRvIGhhdmUgYSBkaWZmZXJlbnQgdmFsdWUgZnJvbSBmYWxzZSB3aGVuIGNoZWNrIGlzIHVuc2V0LlxuICAgKi9cbiAgcHVibGljIGdldCB2YWx1ZUZhbHNlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbHVlRmFsc2VcIik7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZUZhbHNlKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVGYWxzZVwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWVUcnVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVUcnVlID8gdGhpcy52YWx1ZVRydWUgOiB0cnVlO1xuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWVGYWxzZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlRmFsc2UgPyB0aGlzLnZhbHVlRmFsc2UgOiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0RGVmYXVsdFZhbHVlKCkge1xuICAgIGlmICh0aGlzLmRlZmF1bHRWYWx1ZSA9PSBcInRydWVcIikgdGhpcy5jaGVja2VkVmFsdWUgPSB0cnVlO1xuICAgIGlmICh0aGlzLmRlZmF1bHRWYWx1ZSA9PSBcImZhbHNlXCIpIHRoaXMuY2hlY2tlZFZhbHVlID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlID09IFwiaW5kZXRlcm1pbmF0ZVwiKSB0aGlzLnZhbHVlID0gbnVsbDtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImJvb2xlYW5cIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiZGVmYXVsdFZhbHVlOmRyb3Bkb3duXCIsXG4gICAgICBhbHRlcm5hdGl2ZU5hbWU6IFwiYm9vbGVhbkRlZmF1bHRWYWx1ZVwiLFxuICAgICAgZGVmYXVsdDogXCJpbmRldGVybWluYXRlXCIsXG4gICAgICBjaG9pY2VzOiBbXCJpbmRldGVybWluYXRlXCIsIFwiZmFsc2VcIiwgXCJ0cnVlXCJdXG4gICAgfSxcbiAgICB7IG5hbWU6IFwibGFiZWw6dGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jTGFiZWxcIiB9LFxuICAgIFwic2hvd1RpdGxlOmJvb2xlYW5cIixcbiAgICBcInZhbHVlVHJ1ZVwiLFxuICAgIFwidmFsdWVGYWxzZVwiXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Cb29sZWFuTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJib29sZWFuXCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uQm9vbGVhbk1vZGVsKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fYm9vbGVhbi50cyIsImltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hCYXNlIH0gZnJvbSBcIi4vcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgY2hlY2tib3ggcXVlc3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCBleHRlbmRzIFF1ZXN0aW9uQ2hlY2tib3hCYXNlIHtcbiAgcHJpdmF0ZSBub25lSXRlbVZhbHVlOiBJdGVtVmFsdWUgPSBuZXcgSXRlbVZhbHVlKFwibm9uZVwiKTtcbiAgcHJpdmF0ZSBzZWxlY3RBbGxJdGVtVmFsdWU6IEl0ZW1WYWx1ZSA9IG5ldyBJdGVtVmFsdWUoXCJzZWxlY3RhbGxcIik7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB2YXIgbm9uZUl0ZW1UZXh0ID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm5vbmVUZXh0XCIsIHRoaXMsIHRydWUpO1xuICAgIG5vbmVJdGVtVGV4dC5vbkdldFRleHRDYWxsYmFjayA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgIHJldHVybiAhIXRleHQgPyB0ZXh0IDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm5vbmVJdGVtVGV4dFwiKTtcbiAgICB9O1xuICAgIHRoaXMubm9uZUl0ZW1WYWx1ZS5sb2NPd25lciA9IHRoaXM7XG4gICAgdGhpcy5ub25lSXRlbVZhbHVlLnNldExvY1RleHQobm9uZUl0ZW1UZXh0KTtcblxuICAgIHZhciBzZWxlY3RBbGxJdGVtVGV4dCA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXG4gICAgICBcInNlbGVjdEFsbFRleHRcIixcbiAgICAgIHRoaXMsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICBzZWxlY3RBbGxJdGVtVGV4dC5vbkdldFRleHRDYWxsYmFjayA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgIHJldHVybiAhIXRleHQgPyB0ZXh0IDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNlbGVjdEFsbEl0ZW1UZXh0XCIpO1xuICAgIH07XG4gICAgdGhpcy5zZWxlY3RBbGxJdGVtLmxvY093bmVyID0gdGhpcztcbiAgICB0aGlzLnNlbGVjdEFsbEl0ZW0uc2V0TG9jVGV4dChzZWxlY3RBbGxJdGVtVGV4dCk7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wiaGFzTm9uZVwiLCBcIm5vbmVUZXh0XCIsIFwiaGFzU2VsZWN0QWxsXCIsIFwic2VsZWN0QWxsVGV4dFwiXSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DcmVhdGluZygpIHtcbiAgICBzdXBlci5vbkNyZWF0aW5nKCk7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcInJlbmRlcmVkVmFsdWVcIik7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcInZhbHVlXCIpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdElucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRJZCArIFwiXzBcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2VsZWN0IGFsbCBpdGVtLiBCeSB1c2luZyB0aGlzIHByb3BlcnR5LCB5b3UgbWF5IGNoYW5nZSBwcm9ncmFtbWF0aWNhbGx5IGl0J3MgdmFsdWUgYW5kIHRleHQuXG4gICAqIEBzZWUgaGFzU2VsZWN0QWxsXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNlbGVjdEFsbEl0ZW0oKTogSXRlbVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RBbGxJdGVtVmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5vbmUgaXRlbS4gQnkgdXNpbmcgdGhpcyBwcm9wZXJ0eSwgeW91IG1heSBjaGFuZ2UgcHJvZ3JhbW1hdGljYWxseSBpdCdzIHZhbHVlIGFuZCB0ZXh0LlxuICAgKiBAc2VlIGhhc05vbmVcbiAgICovXG4gIHB1YmxpYyBnZXQgbm9uZUl0ZW0oKTogSXRlbVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5ub25lSXRlbVZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXQgdGhlIGRpZmZlcmVudCB0ZXh0IGZvciBub25lIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5vbmVUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJub25lVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm5vbmVJdGVtVGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBub25lVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibm9uZVRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jTm9uZVRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibm9uZVRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgZGlmZmVyZW50IHRleHQgZm9yIFNlbGVjdCBBbGwgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0QWxsVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwic2VsZWN0QWxsVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNlbGVjdEFsbEl0ZW1UZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNlbGVjdEFsbFRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInNlbGVjdEFsbFRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jU2VsZWN0QWxsVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJzZWxlY3RBbGxUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCB0byBzaG93IHRoZSBcIlNlbGVjdCBBbGxcIiBpdGVtIG9uIHRoZSB0b3AuIElmIGVuZC11c2VyIGNoZWNrcyB0aGlzIGl0ZW0sIHRoZW4gYWxsIGl0ZW1zIGFyZSBjaGVja2VkLlxuICAgKi9cbiAgcHVibGljIGdldCBoYXNTZWxlY3RBbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhhc1NlbGVjdEFsbFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBoYXNTZWxlY3RBbGwodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGFzU2VsZWN0QWxsXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgaXRlbXMgYXJlIHNlbGVjdGVkXG4gICAqIEBzZWUgdG9nZ2xlU2VsZWN0QWxsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwgfHwgIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmlzSXRlbVNlbGVjdGVkKHRoaXMubm9uZUl0ZW0pKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGFsbEl0ZW1Db3VudCA9IHRoaXMudmlzaWJsZUNob2ljZXMubGVuZ3RoO1xuICAgIGlmICh0aGlzLmhhc090aGVyKSBhbGxJdGVtQ291bnQtLTtcbiAgICBpZiAodGhpcy5oYXNOb25lKSBhbGxJdGVtQ291bnQtLTtcbiAgICBpZiAodGhpcy5oYXNTZWxlY3RBbGwpIGFsbEl0ZW1Db3VudC0tO1xuICAgIHZhciBzZWxlY3RlZENvdW50ID0gdmFsLmxlbmd0aDtcbiAgICBpZiAodGhpcy5pc0l0ZW1TZWxlY3RlZCh0aGlzLm90aGVySXRlbSkpIHNlbGVjdGVkQ291bnQtLTtcbiAgICByZXR1cm4gc2VsZWN0ZWRDb3VudCA9PT0gYWxsSXRlbUNvdW50O1xuICB9XG4gIHB1YmxpYyBzZXQgaXNBbGxTZWxlY3RlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsKSB7XG4gICAgICB0aGlzLnNlbGVjdEFsbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsZWFyVmFsdWUoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEl0IHdpbGwgc2VsZWN0IGFsbCBpdGVtcywgZXhjZXB0IG90aGVyIGFuZCBub25lLiBJZiBhbGwgaXRlbXMgaGF2ZSBiZWVuIGFscmVhZHkgc2VsZWN0ZWQgdGhlbiBpdCB3aWxsIGNsZWFyIHRoZSB2YWx1ZVxuICAgKiBAc2VlIGlzQWxsU2VsZWN0ZWRcbiAgICogQHNlZSBzZWxlY3RBbGxcbiAgICovXG4gIHB1YmxpYyB0b2dnbGVTZWxlY3RBbGwoKSB7XG4gICAgdGhpcy5pc0FsbFNlbGVjdGVkID0gIXRoaXMuaXNBbGxTZWxlY3RlZDtcbiAgfVxuICAvKipcbiAgICogU2VsZWN0IGFsbCBpdGVtcywgZXhjZXB0IG90aGVyIGFuZCBub25lLlxuICAgKi9cbiAgcHVibGljIHNlbGVjdEFsbCgpIHtcbiAgICB2YXIgdmFsID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZpc2libGVDaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMudmlzaWJsZUNob2ljZXNbaV07XG4gICAgICBpZiAoXG4gICAgICAgIGl0ZW0gPT09IHRoaXMubm9uZUl0ZW0gfHxcbiAgICAgICAgaXRlbSA9PT0gdGhpcy5vdGhlckl0ZW0gfHxcbiAgICAgICAgaXRlbSA9PT0gdGhpcy5zZWxlY3RBbGxJdGVtXG4gICAgICApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgdmFsLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHRvIHNob3cgdGhlIFwiTm9uZVwiIGl0ZW0gb24gdGhlIGJvdHRvbS4gSWYgZW5kLXVzZXIgY2hlY2tzIHRoaXMgaXRlbSwgYWxsIG90aGVyIGl0ZW1zIHdvdWxkIGJlIHVuY2hlY2tlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzTm9uZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGFzTm9uZVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBoYXNOb25lKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhhc05vbmVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGl0ZW0gaXMgY2hlY2tlZFxuICAgKiBAcGFyYW0gaXRlbSBjaGVja2JveCBpdGVtIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgaXNJdGVtU2VsZWN0ZWQoaXRlbTogSXRlbVZhbHVlKTogYm9vbGVhbiB7XG4gICAgaWYgKGl0ZW0gPT09IHRoaXMuc2VsZWN0QWxsSXRlbSkgcmV0dXJuIHRoaXMuaXNBbGxTZWxlY3RlZDtcbiAgICB2YXIgdmFsID0gdGhpcy5yZW5kZXJlZFZhbHVlO1xuICAgIGlmICghdmFsIHx8ICFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh2YWxbaV0sIGl0ZW0udmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBzZXROZXdWYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgbmV3VmFsdWUgPSB0aGlzLnZhbHVlRnJvbURhdGEobmV3VmFsdWUpO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCFuZXdWYWx1ZSkgbmV3VmFsdWUgPSBbXTtcbiAgICBpZiAoIXZhbHVlKSB2YWx1ZSA9IFtdO1xuICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHModmFsdWUsIG5ld1ZhbHVlKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmhhc05vbmUpIHtcbiAgICAgIHZhciBwcmV2Tm9uZUluZGV4ID0gdGhpcy5ub25lSW5kZXhJbkFycmF5KHZhbHVlKTtcbiAgICAgIHZhciBuZXdOb25lSW5kZXggPSB0aGlzLm5vbmVJbmRleEluQXJyYXkobmV3VmFsdWUpO1xuICAgICAgaWYgKHByZXZOb25lSW5kZXggPiAtMSkge1xuICAgICAgICBpZiAobmV3Tm9uZUluZGV4ID4gLTEgJiYgbmV3VmFsdWUubGVuZ3RoID4gMSkge1xuICAgICAgICAgIG5ld1ZhbHVlLnNwbGljZShuZXdOb25lSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobmV3Tm9uZUluZGV4ID4gLTEpIHtcbiAgICAgICAgICBuZXdWYWx1ZS5zcGxpY2UoMCwgbmV3VmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICBuZXdWYWx1ZS5wdXNoKHRoaXMubm9uZUl0ZW0udmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgfVxuICBwcml2YXRlIG5vbmVJbmRleEluQXJyYXkodmFsOiBhbnkpIHtcbiAgICBpZiAoIXZhbCB8fCAhQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gLTE7XG4gICAgdmFyIG5vbmVWYWx1ZSA9IHRoaXMubm9uZUl0ZW0udmFsdWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh2YWxbaV0gPT0gbm9uZVZhbHVlKSByZXR1cm4gaTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHByb3RlY3RlZCBjYW5Vc2VGaWx0ZXJlZENob2ljZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmhhc05vbmUgJiYgIXRoaXMuaGFzU2VsZWN0QWxsICYmIHN1cGVyLmNhblVzZUZpbHRlcmVkQ2hvaWNlcygpO1xuICB9XG4gIHByb3RlY3RlZCBhZGRUb1Zpc2libGVDaG9pY2VzKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+KSB7XG4gICAgaWYgKHRoaXMuaGFzU2VsZWN0QWxsKSB7XG4gICAgICBpdGVtcy51bnNoaWZ0KHRoaXMuc2VsZWN0QWxsSXRlbSk7XG4gICAgfVxuICAgIHN1cGVyLmFkZFRvVmlzaWJsZUNob2ljZXMoaXRlbXMpO1xuICAgIGlmICh0aGlzLmhhc05vbmUpIHtcbiAgICAgIGl0ZW1zLnB1c2godGhpcy5ub25lSXRlbSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4pOiBhbnkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIFwiXCI7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy52aXNpYmxlQ2hvaWNlcztcbiAgICB2YXIgdmFsdWVzID0gdGhpcy5jcmVhdGVWYWx1ZUNvcHkoKTtcbiAgICB2YXIgc3RyID0gXCJcIjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbFN0ciA9IHRoaXMuZ2V0Q2hvaWNlc0Rpc3BsYXlWYWx1ZShpdGVtcywgdmFsdWVzW2ldKTtcbiAgICAgIGlmICh2YWxTdHIpIHtcbiAgICAgICAgaWYgKHN0cikgc3RyICs9IFwiLCBcIjtcbiAgICAgICAgc3RyICs9IHZhbFN0cjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJJbmNvcnJlY3RWYWx1ZXNDb3JlKCkge1xuICAgIHRoaXMuY2xlYXJJbmNvcnJlY3RBbmREaXNhYmxlZFZhbHVlcyhmYWxzZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNsZWFyRGlzYWJsZWRWYWx1ZXNDb3JlKCkge1xuICAgIHRoaXMuY2xlYXJJbmNvcnJlY3RBbmREaXNhYmxlZFZhbHVlcyh0cnVlKTtcbiAgfVxuICBwcml2YXRlIGNsZWFySW5jb3JyZWN0QW5kRGlzYWJsZWRWYWx1ZXMoY2xlYXJEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsKSByZXR1cm47XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkgfHwgdmFsLmxlbmd0aCA9PSAwKSB7XG4gICAgICBpZiAoIWNsZWFyRGlzYWJsZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29tbWVudCkge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBuZXdWYWx1ZSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgICghY2xlYXJEaXNhYmxlZCAmJiAhdGhpcy5jYW5DbGVhclZhbHVlQW5Vbmtub3codmFsW2ldKSkgfHxcbiAgICAgICAgKGNsZWFyRGlzYWJsZWQgJiYgIXRoaXMuaXNWYWx1ZURpc2FibGVkKHZhbFtpXSkpXG4gICAgICApIHtcbiAgICAgICAgbmV3VmFsdWUucHVzaCh2YWxbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobmV3VmFsdWUubGVuZ3RoID09IHZhbC5sZW5ndGgpIHJldHVybjtcbiAgICBpZiAobmV3VmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yOiBzdHJpbmcgPSBudWxsLCBwYXRoOiBzdHJpbmcgPSBudWxsKTogYW55IHtcbiAgICB2YXIganNvbiA9IHN1cGVyLmdldENvbmRpdGlvbkpzb24oKTtcbiAgICBpZiAob3BlcmF0b3IgPT0gXCJjb250YWluc1wiIHx8IG9wZXJhdG9yID09IFwibm90Y29udGFpbnNcIikge1xuICAgICAganNvbltcInR5cGVcIl0gPSBcInJhZGlvZ3JvdXBcIjtcbiAgICB9XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgcHVibGljIGlzQW5zd2VyQ29ycmVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gSGVscGVycy5pc0FycmF5Q29udGFpbnNFcXVhbCh0aGlzLnZhbHVlLCB0aGlzLmNvcnJlY3RBbnN3ZXIpO1xuICB9XG4gIHByb3RlY3RlZCBzZXREZWZhdWx0VmFsdWVXaXRoT3RoZXJzKCkge1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLnJlbmRlcmVkVmFsdWVGcm9tRGF0YUNvcmUodGhpcy5kZWZhdWx0VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRIYXNPdGhlcih2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsIHx8ICFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdmFsLmluZGV4T2YodGhpcy5vdGhlckl0ZW0udmFsdWUpID49IDA7XG4gIH1cbiAgcHJvdGVjdGVkIHZhbHVlRnJvbURhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICghdmFsKSByZXR1cm4gdmFsO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gW3N1cGVyLnZhbHVlRnJvbURhdGEodmFsKV07XG4gICAgbGV0IHZhbHVlID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjaG9pY2VpdGVtID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHRoaXMuY2hvaWNlcywgdmFsW2ldKTtcbiAgICAgIGlmICghIWNob2ljZWl0ZW0pIHtcbiAgICAgICAgdmFsdWUucHVzaChjaG9pY2VpdGVtLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlLnB1c2godmFsW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJlZFZhbHVlRnJvbURhdGFDb3JlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAoIXZhbCB8fCAhQXJyYXkuaXNBcnJheSh2YWwpKSB2YWwgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbFtpXSA9PSB0aGlzLm90aGVySXRlbS52YWx1ZSkgcmV0dXJuIHZhbDtcbiAgICAgIGlmICh0aGlzLmhhc1Vua25vd25WYWx1ZSh2YWxbaV0pKSB7XG4gICAgICAgIHRoaXMuY29tbWVudCA9IHZhbFtpXTtcbiAgICAgICAgdmFyIG5ld1ZhbCA9IHZhbC5zbGljZSgpO1xuICAgICAgICBuZXdWYWxbaV0gPSB0aGlzLm90aGVySXRlbS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIG5ld1ZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZHJlZFZhbHVlVG9EYXRhQ29yZSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKCF2YWwgfHwgIXZhbC5sZW5ndGgpIHJldHVybiB2YWw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh2YWxbaV0gPT0gdGhpcy5vdGhlckl0ZW0udmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0Q29tbWVudCgpKSB7XG4gICAgICAgICAgdmFyIG5ld1ZhbCA9IHZhbC5zbGljZSgpO1xuICAgICAgICAgIG5ld1ZhbFtpXSA9IHRoaXMuZ2V0Q29tbWVudCgpO1xuICAgICAgICAgIHJldHVybiBuZXdWYWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgaGFzVW5rbm93blZhbHVlKHZhbDogYW55LCBpbmNsdWRlT3RoZXI6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhc05vbmUgJiYgdmFsID09IHRoaXMubm9uZUl0ZW1WYWx1ZS52YWx1ZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBzdXBlci5oYXNVbmtub3duVmFsdWUodmFsLCBpbmNsdWRlT3RoZXIpO1xuICB9XG5cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjaGVja2JveFwiO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImNoZWNrYm94XCIsXG4gIFtcbiAgICBcImhhc1NlbGVjdEFsbDpib29sZWFuXCIsXG4gICAgXCJoYXNOb25lOmJvb2xlYW5cIixcbiAgICB7IG5hbWU6IFwibm9uZVRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY05vbmVUZXh0XCIgfSxcbiAgICB7IG5hbWU6IFwic2VsZWN0QWxsVGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jU2VsZWN0QWxsVGV4dFwiIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkNoZWNrYm94TW9kZWwoXCJcIik7XG4gIH0sXG4gIFwiY2hlY2tib3hiYXNlXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImNoZWNrYm94XCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbkNoZWNrYm94TW9kZWwobmFtZSk7XG4gIHEuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlcztcbiAgcmV0dXJuIHE7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9jaGVja2JveC50cyIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBjb21tZW50IHF1ZXN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkNvbW1lbnRNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwbGFjZUhvbGRlclwiLCB0aGlzKTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heGltaW0gdGV4dCBsZW5ndGguIElmIGl0IGlzIC0xLCBkZWZhdWwgdmFsdWUsIHRoZW4gdGhlIHN1cnZleSBtYXhUZXh0TGVuZ3RoIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAgICogSWYgaXQgaXMgMCwgdGhlbiB0aGUgdmFsdWUgaXMgdW5saW1pdGVkXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubWF4VGV4dExlbmd0aFxuICAgKi9cbiAgcHVibGljIGdldCBtYXhMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4TGVuZ3RoXCIsIC0xKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heExlbmd0aCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heExlbmd0aFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRNYXhMZW5ndGgoKTogYW55IHtcbiAgICByZXR1cm4gSGVscGVycy5nZXRNYXhMZW5ndGgoXG4gICAgICB0aGlzLm1heExlbmd0aCxcbiAgICAgIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkubWF4VGV4dExlbmd0aCA6IC0xXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gc2V0IHRoZSBpbnB1dCBwbGFjZSBob2xkZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYWNlSG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGxhY2VIb2xkZXJcIik7XG4gIH1cbiAgcHVibGljIHNldCBwbGFjZUhvbGRlcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGxhY2VIb2xkZXJcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUGxhY2VIb2xkZXIoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGxhY2VIb2xkZXJcIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBodG1sIHJvd3MgYXR0cmlidXRlLlxuICAgKi9cbiAgcHVibGljIGdldCByb3dzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIiwgNCk7XG4gIH1cbiAgcHVibGljIHNldCByb3dzKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaHRtbCBjb2xzIGF0dHJpYnV0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29scygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2xzXCIsIDUwKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbHModmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2xzXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjb21tZW50XCI7XG4gIH1cbiAgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VwZXIuaXNFbXB0eSgpIHx8IHRoaXMudmFsdWUgPT09IFwiXCI7XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiY29tbWVudFwiLFxuICBbXG4gICAgeyBuYW1lOiBcIm1heExlbmd0aDpudW1iZXJcIiwgZGVmYXVsdDogLTEgfSxcbiAgICB7IG5hbWU6IFwiY29sczpudW1iZXJcIiwgZGVmYXVsdDogNTAgfSxcbiAgICB7IG5hbWU6IFwicm93czpudW1iZXJcIiwgZGVmYXVsdDogNCB9LFxuICAgIHsgbmFtZTogXCJwbGFjZUhvbGRlclwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGxhY2VIb2xkZXJcIiB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Db21tZW50TW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiY29tbWVudFwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkNvbW1lbnRNb2RlbChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2NvbW1lbnQudHMiLCJpbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGFuIHF1ZXN0aW9uIHRoYXQgcmVuZGVycyBlbXB0eSBcImRpdlwiIHRhZy4gSXQgdXNlZCBhcyBhIGJhc2UgY2xhc3MgZm9yIHNvbWUgY3VzdG9tIHdpZGdldHNcbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRW1wdHlNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZW1wdHlcIjtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImVtcHR5XCIsXG4gIFtdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uRW1wdHlNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2VtcHR5LnRzIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IsIEV2ZW50IH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgVXBsb2FkaW5nRmlsZUVycm9yLCBFeGNlZWRTaXplRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgZmlsZSBxdWVzdGlvblxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25GaWxlTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIHByaXZhdGUgaXNVcGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBhZnRlciBxdWVzdGlvbiBzdGF0ZSBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHF1ZXN0aW9uIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnN0YXRlIG5ldyBxdWVzdGlvbiBzdGF0ZSB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBvblN0YXRlQ2hhbmdlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogUXVlc3Rpb25GaWxlTW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFF1ZXN0aW9uRmlsZU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICBwdWJsaWMgcHJldmlld1ZhbHVlOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgY3VycmVudFN0YXRlID0gXCJlbXB0eVwiO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmaWxlXCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlLCB0byBzaG93IHRoZSBwcmV2aWV3IGZvciB0aGUgaW1hZ2UgZmlsZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dQcmV2aWV3KCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UHJldmlld1wiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dQcmV2aWV3KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dQcmV2aWV3XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlLCB0byBhbGxvdyBzZWxlY3QgbXVsdGlwbGUgZmlsZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93TXVsdGlwbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFsbG93TXVsdGlwbGVcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsb3dNdWx0aXBsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd011bHRpcGxlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBoZWlnaHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlSGVpZ2h0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlSGVpZ2h0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW1hZ2VIZWlnaHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbWFnZUhlaWdodFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2Ugd2lkdGguXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VXaWR0aFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGltYWdlV2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbWFnZVdpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEFjY2VwdGVkIGZpbGUgdHlwZXMuIFBhc3NlZCB0byB0aGUgJ2FjY2VwdCcgYXR0cmlidXRlIG9mIHRoZSBmaWxlIGlucHV0IHRhZy4gU2VlIGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vdGFncy9hdHRfaW5wdXRfYWNjZXB0LmFzcCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgcHVibGljIGdldCBhY2NlcHRlZFR5cGVzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFjY2VwdGVkVHlwZXNcIik7XG4gIH1cbiAgcHVibGljIHNldCBhY2NlcHRlZFR5cGVzKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWNjZXB0ZWRUeXBlc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvIG5vdCB3YW50IHRvIHNlcmlhbGl6ZSBmaWxlIGNvbnRlbnQgYXMgdGV4dCBpbiB0aGUgc3VydmV5LmRhdGEuXG4gICAqIEluIHRoaXMgY2FzZSwgeW91IGhhdmUgdG8gd3JpdGUgdGhlIGNvZGUgb25VcGxvYWRGaWxlcyBldmVudCB0byBzdG9yZSB0aGUgZmlsZSBjb250ZW50LlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLm9uVXBsb2FkRmlsZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RvcmVEYXRhQXNUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdG9yZURhdGFBc1RleHRcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzdG9yZURhdGFBc1RleHQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3RvcmVEYXRhQXNUZXh0XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlIGlmIHlvdSB3YW50IHRvIHdhaXQgdW50aWwgZmlsZXMgd2lsbCBiZSB1cGxvYWRlZCB0byB5b3VyIHNlcnZlci5cbiAgICovXG4gIHB1YmxpYyBnZXQgd2FpdEZvclVwbG9hZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwid2FpdEZvclVwbG9hZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCB3YWl0Rm9yVXBsb2FkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIndhaXRGb3JVcGxvYWRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIGZhbHNlIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgaW1hZ2VzIHByZXZpZXcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93SW1hZ2VzUHJldmlldygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dJbWFnZXNQcmV2aWV3XCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsb3dJbWFnZXNQcmV2aWV3KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFsbG93SW1hZ2VzUHJldmlld1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXR1cCB0aGUgbWF4aW11bSBhbGxvd2VkIGZpbGUgc2l6ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4U2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhTaXplXCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4U2l6ZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFNpemVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGNsZWFuIGZpbGVzIHZhbHVlIGJ1dHRvbiBjYXB0aW9uLlxuICAgKi9cbiAgZ2V0IGNsZWFuQnV0dG9uQ2FwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2xlYW5DYXB0aW9uXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcmVtb3ZlIGZpbGUgYnV0dG9uIGNhcHRpb24uXG4gICAqL1xuICBnZXQgcmVtb3ZlRmlsZUNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInJlbW92ZUZpbGVDYXB0aW9uXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgdGl0bGUgdmFsdWUuXG4gICAqL1xuICBnZXQgaW5wdXRUaXRsZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzVXBsb2FkaW5nKSByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImxvYWRpbmdGaWxlXCIpO1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9vc2VGaWxlXCIpO1xuICAgIHJldHVybiBcIiBcIjtcbiAgfVxuICAvKipcbiAgICogQ2xlYXIgdmFsdWUgcHJvZ3JhbW1hdGljYWxseS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcihkb25lQ2FsbGJhY2s/OiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5zdXJ2ZXkuY2xlYXJGaWxlcyh0aGlzLm5hbWUsIHRoaXMudmFsdWUsIG51bGwsIChzdGF0dXMsIGRhdGEpID0+IHtcbiAgICAgIGlmIChzdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgICAgICEhZG9uZUNhbGxiYWNrICYmIGRvbmVDYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgZmlsZSBpdGVtIHByb2dyYW1tYXRpY2FsbHkuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRmlsZShjb250ZW50OiB7IG5hbWU6IHN0cmluZyB9KSB7XG4gICAgdGhpcy5zdXJ2ZXkuY2xlYXJGaWxlcyhcbiAgICAgIHRoaXMubmFtZSxcbiAgICAgIHRoaXMudmFsdWUsXG4gICAgICBjb250ZW50Lm5hbWUsXG4gICAgICAoc3RhdHVzLCBkYXRhKSA9PiB7XG4gICAgICAgIGlmIChzdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBvbGRWYWx1ZS5maWx0ZXIoZiA9PiBmLm5hbWUgIT09IGNvbnRlbnQubmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogTG9hZCBtdWx0aXBsZSBmaWxlcyBwcm9ncmFtbWF0aWNhbGx5LlxuICAgKiBAcGFyYW0gZmlsZXNcbiAgICovXG4gIHB1YmxpYyBsb2FkRmlsZXMoZmlsZXM6IEZpbGVbXSkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICBpZiAoIXRoaXMuYWxsRmlsZXNPayhmaWxlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImxvYWRpbmdcIik7XG5cbiAgICB2YXIgbG9hZEZpbGVzUHJvYyA9ICgpID0+IHtcbiAgICAgIHZhciBjb250ZW50ID0gPEFycmF5PGFueT4+W107XG4gICAgICBpZiAodGhpcy5zdG9yZURhdGFBc1RleHQpIHtcbiAgICAgICAgZmlsZXMuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgICAgICBsZXQgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSBlID0+IHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LmNvbmNhdChbXG4gICAgICAgICAgICAgIHsgbmFtZTogZmlsZS5uYW1lLCB0eXBlOiBmaWxlLnR5cGUsIGNvbnRlbnQ6IGZpbGVSZWFkZXIucmVzdWx0IH1cbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID09PSBmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9ICh0aGlzLnZhbHVlIHx8IFtdKS5jb25jYXQoY29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdXJ2ZXkudXBsb2FkRmlsZXModGhpcy5uYW1lLCBmaWxlcywgKHN0YXR1cywgZGF0YSkgPT4ge1xuICAgICAgICAgIGlmIChzdGF0dXMgPT09IFwiZXJyb3JcIikge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJlcnJvclwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSAodGhpcy52YWx1ZSB8fCBbXSkuY29uY2F0KFxuICAgICAgICAgICAgICBkYXRhLm1hcCgocjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHIuZmlsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgdHlwZTogci5maWxlLnR5cGUsXG4gICAgICAgICAgICAgICAgICBjb250ZW50OiByLmNvbnRlbnRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHRoaXMuYWxsb3dNdWx0aXBsZSkge1xuICAgICAgbG9hZEZpbGVzUHJvYygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsZWFyKGxvYWRGaWxlc1Byb2MpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY2FuUHJldmlld0ltYWdlKGZpbGVJdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hbGxvd0ltYWdlc1ByZXZpZXcgJiYgISFmaWxlSXRlbSAmJiB0aGlzLmlzRmlsZUltYWdlKGZpbGVJdGVtKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZSk7XG4gICAgdGhpcy5wcmV2aWV3VmFsdWUgPSBbXTtcbiAgICB2YXIgc3RhdGUgPVxuICAgICAgKCFBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSAmJiAhIW5ld1ZhbHVlKSB8fFxuICAgICAgKEFycmF5LmlzQXJyYXkobmV3VmFsdWUpICYmIG5ld1ZhbHVlLmxlbmd0aCA+IDApXG4gICAgICAgID8gdGhpcy5zaG93UHJldmlld1xuICAgICAgICAgID8gXCJsb2FkaW5nXCJcbiAgICAgICAgICA6IFwibG9hZGVkXCJcbiAgICAgICAgOiBcImVtcHR5XCI7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQoc3RhdGUpO1xuICAgIGlmICghdGhpcy5zaG93UHJldmlldyB8fCAhbmV3VmFsdWUpIHJldHVybjtcbiAgICB2YXIgbmV3VmFsdWVzID0gQXJyYXkuaXNBcnJheShuZXdWYWx1ZSlcbiAgICAgID8gbmV3VmFsdWVcbiAgICAgIDogISFuZXdWYWx1ZVxuICAgICAgICA/IFtuZXdWYWx1ZV1cbiAgICAgICAgOiBbXTtcblxuICAgIGlmICh0aGlzLnN0b3JlRGF0YUFzVGV4dCkge1xuICAgICAgbmV3VmFsdWVzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICB2YXIgY29udGVudCA9IHZhbHVlLmNvbnRlbnQgfHwgdmFsdWU7XG4gICAgICAgIHRoaXMucHJldmlld1ZhbHVlID0gdGhpcy5wcmV2aWV3VmFsdWUuY29uY2F0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgdHlwZTogdmFsdWUudHlwZSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnRcbiAgICAgICAgICB9XG4gICAgICAgIF0pO1xuICAgICAgfSk7XG4gICAgICBpZiAoc3RhdGUgPT09IFwibG9hZGluZ1wiKSB0aGlzLnN0YXRlQ2hhbmdlZChcImxvYWRlZFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3VmFsdWVzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICB2YXIgY29udGVudCA9IHZhbHVlLmNvbnRlbnQgfHwgdmFsdWU7XG4gICAgICAgIHRoaXMuc3VydmV5LmRvd25sb2FkRmlsZSh0aGlzLm5hbWUsIHZhbHVlLCAoc3RhdHVzLCBkYXRhKSA9PiB7XG4gICAgICAgICAgaWYgKHN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlld1ZhbHVlID0gdGhpcy5wcmV2aWV3VmFsdWUuY29uY2F0KFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGRhdGEsXG4gICAgICAgICAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiB2YWx1ZS50eXBlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldmlld1ZhbHVlLmxlbmd0aCA9PT0gbmV3VmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImxvYWRlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJlcnJvclwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvbkNoZWNrRm9yRXJyb3JzKGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+KSB7XG4gICAgc3VwZXIub25DaGVja0ZvckVycm9ycyhlcnJvcnMpO1xuICAgIGlmICh0aGlzLmlzVXBsb2FkaW5nICYmIHRoaXMud2FpdEZvclVwbG9hZCkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIG5ldyBVcGxvYWRpbmdGaWxlRXJyb3IoXG4gICAgICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInVwbG9hZGluZ0ZpbGVcIiksXG4gICAgICAgICAgdGhpc1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgc3RhdGVDaGFuZ2VkKHN0YXRlOiBzdHJpbmcpIHtcbiAgICBpZiAoc3RhdGUgPT09IFwibG9hZGluZ1wiKSB7XG4gICAgICB0aGlzLmlzVXBsb2FkaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHN0YXRlID09PSBcImxvYWRlZFwiKSB7XG4gICAgICB0aGlzLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5vblN0YXRlQ2hhbmdlZC5maXJlKHRoaXMsIHsgc3RhdGU6IHN0YXRlIH0pO1xuICB9XG4gIHByaXZhdGUgYWxsRmlsZXNPayhmaWxlczogRmlsZVtdKTogYm9vbGVhbiB7XG4gICAgdmFyIGVycm9yTGVuZ3RoID0gdGhpcy5lcnJvcnMgPyB0aGlzLmVycm9ycy5sZW5ndGggOiAwO1xuICAgIChmaWxlcyB8fCBbXSkuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgIGlmICh0aGlzLm1heFNpemUgPiAwICYmIGZpbGUuc2l6ZSA+IHRoaXMubWF4U2l6ZSkge1xuICAgICAgICB0aGlzLmVycm9ycy5wdXNoKG5ldyBFeGNlZWRTaXplRXJyb3IodGhpcy5tYXhTaXplLCB0aGlzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGVycm9yTGVuZ3RoID09PSB0aGlzLmVycm9ycy5sZW5ndGg7XG4gIH1cbiAgcHJpdmF0ZSBpc0ZpbGVJbWFnZShmaWxlOiB7XG4gICAgY29udGVudDogc3RyaW5nO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgdHlwZT86IHN0cmluZztcbiAgfSk6IGJvb2xlYW4ge1xuICAgIGlmICghZmlsZSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGltYWdlUHJlZml4ID0gXCJkYXRhOmltYWdlXCI7XG4gICAgdmFyIHN1YlN0ciA9IGZpbGUuY29udGVudCAmJiBmaWxlLmNvbnRlbnQuc3Vic3RyKDAsIGltYWdlUHJlZml4Lmxlbmd0aCk7XG4gICAgc3ViU3RyID0gc3ViU3RyICYmIHN1YlN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciByZXN1bHQgPVxuICAgICAgc3ViU3RyID09PSBpbWFnZVByZWZpeCB8fFxuICAgICAgKCEhZmlsZS50eXBlICYmIGZpbGUudHlwZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJpbWFnZS9cIikgPT09IDApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIGdldFBsYWluRGF0YShcbiAgICBvcHRpb25zOiB7XG4gICAgICBpbmNsdWRlRW1wdHk/OiBib29sZWFuO1xuICAgICAgY2FsY3VsYXRpb25zPzogQXJyYXk8e1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgIH0gPSB7XG4gICAgICBpbmNsdWRlRW1wdHk6IHRydWVcbiAgICB9XG4gICkge1xuICAgIHZhciBxdWVzdGlvblBsYWluRGF0YSA9IHN1cGVyLmdldFBsYWluRGF0YShvcHRpb25zKTtcbiAgICBpZiAoISFxdWVzdGlvblBsYWluRGF0YSAmJiAhdGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmlzTm9kZSA9IGZhbHNlO1xuICAgICAgdmFyIHZhbHVlcyA9IEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgPyB0aGlzLnZhbHVlIDogW3RoaXMudmFsdWVdO1xuICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuZGF0YSA9IHZhbHVlcy5tYXAoKGRhdGFWYWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBpbmRleCxcbiAgICAgICAgICB0aXRsZTogXCJGaWxlXCIsXG4gICAgICAgICAgdmFsdWU6IChkYXRhVmFsdWUuY29udGVudCAmJiBkYXRhVmFsdWUuY29udGVudCkgfHwgZGF0YVZhbHVlLFxuICAgICAgICAgIGRpc3BsYXlWYWx1ZTogKGRhdGFWYWx1ZS5uYW1lICYmIGRhdGFWYWx1ZS5uYW1lKSB8fCBkYXRhVmFsdWUsXG4gICAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgICB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiID8gSlNPTi5zdHJpbmdpZnkodmFsKSA6IHZhbCxcbiAgICAgICAgICBpc05vZGU6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXN0aW9uUGxhaW5EYXRhO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImZpbGVcIixcbiAgW1xuICAgIHsgbmFtZTogXCJzaG93UHJldmlldzpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBcImFsbG93TXVsdGlwbGU6Ym9vbGVhblwiLFxuICAgIHsgbmFtZTogXCJhbGxvd0ltYWdlc1ByZXZpZXc6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgXCJpbWFnZUhlaWdodFwiLFxuICAgIFwiaW1hZ2VXaWR0aFwiLFxuICAgIFwiYWNjZXB0ZWRUeXBlc1wiLFxuICAgIHsgbmFtZTogXCJzdG9yZURhdGFBc1RleHQ6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcIndhaXRGb3JVcGxvYWQ6Ym9vbGVhblwiLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIFwibWF4U2l6ZTpudW1iZXJcIlxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uRmlsZU1vZGVsKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImZpbGVcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25GaWxlTW9kZWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9maWxlLnRzIiwiaW1wb3J0IHsgUXVlc3Rpb25Ob25WYWx1ZSB9IGZyb20gXCIuL3F1ZXN0aW9ubm9udmFsdWVcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBodG1sIHF1ZXN0aW9uLiBVbmxpa2Ugb3RoZXIgcXVlc3Rpb25zIGl0IGRvZXNuJ3QgaGF2ZSB2YWx1ZSBhbmQgdGl0bGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkh0bWxNb2RlbCBleHRlbmRzIFF1ZXN0aW9uTm9uVmFsdWUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdmFyIGxvY0h0bWwgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiaHRtbFwiLCB0aGlzKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgbG9jSHRtbC5vbkdldFRleHRDYWxsYmFjayA9IGZ1bmN0aW9uKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAhIXNlbGYuc3VydmV5ID8gc2VsZi5zdXJ2ZXkucHJvY2Vzc0h0bWwoc3RyKSA6IHN0cjtcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiaHRtbFwiO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaHRtbCB0byBkaXNwbGF5IGl0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGh0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJodG1sXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaHRtbCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiaHRtbFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NIdG1sKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImh0bWxcIik7XG4gIH1cbiAgcHVibGljIGdldCBwcm9jZXNzZWRIdG1sKCkge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnByb2Nlc3NIdG1sKHRoaXMuaHRtbCkgOiB0aGlzLmh0bWw7XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiaHRtbFwiLFxuICBbeyBuYW1lOiBcImh0bWw6aHRtbFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jSHRtbFwiIH1dLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uSHRtbE1vZGVsKFwiXCIpO1xuICB9LFxuICBcIm5vbnZhbHVlXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImh0bWxcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25IdG1sTW9kZWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9odG1sLnRzIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveEJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBzZWxlY3QgaW1hZ2UgcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbkNoZWNrYm94QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNvbENvdW50ID0gMDtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImltYWdlcGlja2VyXCI7XG4gIH1cbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTXVsdGkgc2VsZWN0IG9wdGlvbi4gSWYgc2V0IHRvIHRydWUsIHRoZW4gYWxsb3dzIHRvIHNlbGVjdCBtdWx0aXBsZSBpbWFnZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG11bHRpU2VsZWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtdWx0aVNlbGVjdFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBtdWx0aVNlbGVjdChuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm11bHRpU2VsZWN0XCIsIG5ld1ZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpIHtcbiAgICBpZiAodGhpcy5tdWx0aVNlbGVjdCkge1xuICAgICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgICBpZiAoIXZhbCkgcmV0dXJuO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkgfHwgdmFsLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgbmV3VmFsdWUgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNVbmtub3duVmFsdWUodmFsW2ldLCB0cnVlKSkge1xuICAgICAgICAgIG5ld1ZhbHVlLnB1c2godmFsW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA9PSB2YWwubGVuZ3RoKSByZXR1cm47XG4gICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgICAgdGhpcy5jbGVhclZhbHVlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgbGFiZWwgdW5kZXIgdGhlIGltYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93TGFiZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dMYWJlbFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93TGFiZWwobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93TGFiZWxcIiwgbmV3VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZUNvcmUoKSB7XG4gICAgcmV0dXJuIHN1cGVyLmdldFZhbHVlQ29yZSgpIHx8ICh0aGlzLm11bHRpU2VsZWN0ICYmIFtdKSB8fCB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBoZWlnaHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlSGVpZ2h0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlSGVpZ2h0XCIsIDE1MCk7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZUhlaWdodCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImltYWdlSGVpZ2h0XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSB3aWR0aC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW1hZ2VXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbWFnZVdpZHRoXCIsIDIwMCk7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZVdpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VXaWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgZml0IG1vZGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlRml0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlRml0XCIsIFwiY29udGFpblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGltYWdlRml0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VGaXRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgbW9kZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29udGVudE1vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29udGVudE1vZGVcIiwgXCJpbWFnZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbnRlbnRNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29udGVudE1vZGVcIiwgdmFsKTtcbiAgICBpZiAodmFsID09PSBcInZpZGVvXCIpIHtcbiAgICAgIHRoaXMuc2hvd0xhYmVsID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcImltYWdlaXRlbXZhbHVlXCIsIFtcImltYWdlTGlua1wiXSwgbnVsbCwgXCJpdGVtdmFsdWVcIik7XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiaW1hZ2VwaWNrZXJcIixcbiAgW1xuICAgIHsgbmFtZTogXCJoYXNPdGhlclwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJvdGhlclRleHRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwib3B0aW9uc0NhcHRpb25cIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwib3RoZXJFcnJvclRleHRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwic3RvcmVPdGhlcnNBc0NvbW1lbnRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbnRlbnRNb2RlXCIsXG4gICAgICBkZWZhdWx0OiBcImltYWdlXCIsXG4gICAgICBjaG9pY2VzOiBbXCJpbWFnZVwiLCBcInZpZGVvXCJdXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImltYWdlRml0XCIsXG4gICAgICBkZWZhdWx0OiBcImNvbnRhaW5cIixcbiAgICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJjb250YWluXCIsIFwiY292ZXJcIiwgXCJmaWxsXCJdXG4gICAgfSxcbiAgICB7IG5hbWU6IFwiaW1hZ2VIZWlnaHQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDE1MCB9LFxuICAgIHsgbmFtZTogXCJpbWFnZVdpZHRoOm51bWJlclwiLCBkZWZhdWx0OiAyMDAgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJjaGVja2JveGJhc2VcIlxuKTtcblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoXCJpbWFnZXBpY2tlclwiLCB7XG4gIG5hbWU6IFwic2hvd0xhYmVsOmJvb2xlYW5cIixcbiAgZGVmYXVsdDogZmFsc2Vcbn0pO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eShcImltYWdlcGlja2VyXCIsIHtcbiAgbmFtZTogXCJjb2xDb3VudDpudW1iZXJcIixcbiAgZGVmYXVsdDogMCxcbiAgY2hvaWNlczogWzAsIDEsIDIsIDMsIDQsIDVdXG59KTtcblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoXCJpbWFnZXBpY2tlclwiLCB7XG4gIG5hbWU6IFwibXVsdGlTZWxlY3Q6Ym9vbGVhblwiLFxuICBkZWZhdWx0OiBmYWxzZVxufSk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KFwiaW1hZ2VwaWNrZXJcIiwge1xuICBuYW1lOiBcImNob2ljZXM6aW1hZ2VpdGVtdmFsdWVbXVwiXG59KTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJpbWFnZXBpY2tlclwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsKG5hbWUpO1xuICAvL3EuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlcztcbiAgcmV0dXJuIHE7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9pbWFnZXBpY2tlci50cyIsImltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uTWF0cml4QmFzZU1vZGVsIH0gZnJvbSBcIi4vbWFydGl4QmFzZVwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCwgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgUmVxdWlyZWRJbkFsbFJvd3NFcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nLCBJTG9jYWxpemFibGVPd25lciB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkRyb3Bkb3duTW9kZWwgfSBmcm9tIFwiLi9xdWVzdGlvbl9kcm9wZG93blwiO1xuaW1wb3J0IHsgSUNvbmRpdGlvbk9iamVjdCB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1hdHJpeERhdGEge1xuICBvbk1hdHJpeFJvd0NoYW5nZWQocm93OiBNYXRyaXhSb3dNb2RlbCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhSb3dNb2RlbCB7XG4gIHByaXZhdGUgZGF0YTogSU1hdHJpeERhdGE7XG4gIHByaXZhdGUgaXRlbTogSXRlbVZhbHVlO1xuICBwcm90ZWN0ZWQgcm93VmFsdWU6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgcHVibGljIGZ1bGxOYW1lOiBzdHJpbmcsXG4gICAgZGF0YTogSU1hdHJpeERhdGEsXG4gICAgdmFsdWU6IGFueVxuICApIHtcbiAgICB0aGlzLml0ZW0gPSBpdGVtO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5yb3dWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0udmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS50ZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS5sb2NUZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucm93VmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5yb3dWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIGlmICh0aGlzLmRhdGEpIHRoaXMuZGF0YS5vbk1hdHJpeFJvd0NoYW5nZWQodGhpcyk7XG4gICAgdGhpcy5vblZhbHVlQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdlZCgpIHt9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1hdHJpeENlbGxzT3duZXIgZXh0ZW5kcyBJTG9jYWxpemFibGVPd25lciB7XG4gIGdldFJvd3MoKTogQXJyYXk8YW55PjtcbiAgZ2V0Q29sdW1ucygpOiBBcnJheTxhbnk+O1xufVxuXG5leHBvcnQgY2xhc3MgTWFydHJpeENlbGxzIHtcbiAgcHJpdmF0ZSB2YWx1ZXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGNlbGxzT3duZXI6IElNYXRyaXhDZWxsc093bmVyKSB7fVxuICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKS5sZW5ndGggPT0gMDtcbiAgfVxuICBwdWJsaWMgc2V0Q2VsbFRleHQocm93OiBhbnksIGNvbHVtbjogYW55LCB2YWw6IHN0cmluZykge1xuICAgIHJvdyA9IHRoaXMuZ2V0Q2VsbFJvd0NvbHVtblZhbHVlKHJvdywgdGhpcy5yb3dzKTtcbiAgICBjb2x1bW4gPSB0aGlzLmdldENlbGxSb3dDb2x1bW5WYWx1ZShjb2x1bW4sIHRoaXMuY29sdW1ucyk7XG4gICAgaWYgKCFyb3cgfHwgIWNvbHVtbikgcmV0dXJuO1xuICAgIGlmICh2YWwpIHtcbiAgICAgIGlmICghdGhpcy52YWx1ZXNbcm93XSkgdGhpcy52YWx1ZXNbcm93XSA9IHt9O1xuICAgICAgaWYgKCF0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl0pXG4gICAgICAgIHRoaXMudmFsdWVzW3Jvd11bY29sdW1uXSA9IHRoaXMuY3JlYXRlU3RyaW5nKCk7XG4gICAgICB0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl0udGV4dCA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMudmFsdWVzW3Jvd10gJiYgdGhpcy52YWx1ZXNbcm93XVtjb2x1bW5dKSB7XG4gICAgICAgIHZhciBsb2MgPSB0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl07XG4gICAgICAgIGxvYy50ZXh0ID0gXCJcIjtcbiAgICAgICAgaWYgKGxvYy5pc0VtcHR5KSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMudmFsdWVzW3Jvd11bY29sdW1uXTtcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy52YWx1ZXNbcm93XSkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlc1tyb3ddO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgc2V0RGVmYXVsdENlbGxUZXh0KGNvbHVtbjogYW55LCB2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0Q2VsbFRleHQoc2V0dGluZ3MubWF0cml4RGVmYXVsdFJvd05hbWUsIGNvbHVtbiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q2VsbExvY1RleHQocm93OiBhbnksIGNvbHVtbjogYW55KTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJvdyA9IHRoaXMuZ2V0Q2VsbFJvd0NvbHVtblZhbHVlKHJvdywgdGhpcy5yb3dzKTtcbiAgICBjb2x1bW4gPSB0aGlzLmdldENlbGxSb3dDb2x1bW5WYWx1ZShjb2x1bW4sIHRoaXMuY29sdW1ucyk7XG4gICAgaWYgKCFyb3cgfHwgIWNvbHVtbikgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLnZhbHVlc1tyb3ddKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMudmFsdWVzW3Jvd11bY29sdW1uXSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzW3Jvd11bY29sdW1uXTtcbiAgfVxuICBwdWJsaWMgZ2V0RGVmYXVsdENlbGxMb2NUZXh0KGNvbHVtbjogYW55LCB2YWw6IHN0cmluZyk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDZWxsTG9jVGV4dChzZXR0aW5ncy5tYXRyaXhEZWZhdWx0Um93TmFtZSwgY29sdW1uKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q2VsbERpc3BsYXlMb2NUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICB2YXIgY2VsbFRleHQgPSB0aGlzLmdldENlbGxMb2NUZXh0KHJvdywgY29sdW1uKTtcbiAgICBpZiAoY2VsbFRleHQgJiYgIWNlbGxUZXh0LmlzRW1wdHkpIHJldHVybiBjZWxsVGV4dDtcbiAgICBjZWxsVGV4dCA9IHRoaXMuZ2V0Q2VsbExvY1RleHQoc2V0dGluZ3MubWF0cml4RGVmYXVsdFJvd05hbWUsIGNvbHVtbik7XG4gICAgaWYgKGNlbGxUZXh0ICYmICFjZWxsVGV4dC5pc0VtcHR5KSByZXR1cm4gY2VsbFRleHQ7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW4gPT0gXCJudW1iZXJcIikge1xuICAgICAgY29sdW1uID1cbiAgICAgICAgY29sdW1uID49IDAgJiYgY29sdW1uIDwgdGhpcy5jb2x1bW5zLmxlbmd0aFxuICAgICAgICAgID8gdGhpcy5jb2x1bW5zW2NvbHVtbl1cbiAgICAgICAgICA6IG51bGw7XG4gICAgfVxuICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmxvY1RleHQpIHJldHVybiBjb2x1bW4ubG9jVGV4dDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0Q2VsbFRleHQocm93OiBhbnksIGNvbHVtbjogYW55KTogc3RyaW5nIHtcbiAgICB2YXIgbG9jID0gdGhpcy5nZXRDZWxsTG9jVGV4dChyb3csIGNvbHVtbik7XG4gICAgcmV0dXJuIGxvYyA/IGxvYy50ZXh0IDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0RGVmYXVsdENlbGxUZXh0KGNvbHVtbjogYW55KTogc3RyaW5nIHtcbiAgICB2YXIgbG9jID0gdGhpcy5nZXRDZWxsTG9jVGV4dChzZXR0aW5ncy5tYXRyaXhEZWZhdWx0Um93TmFtZSwgY29sdW1uKTtcbiAgICByZXR1cm4gbG9jID8gbG9jLnRleHQgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRDZWxsRGlzcGxheVRleHQocm93OiBhbnksIGNvbHVtbjogYW55KTogc3RyaW5nIHtcbiAgICB2YXIgbG9jID0gdGhpcy5nZXRDZWxsRGlzcGxheUxvY1RleHQocm93LCBjb2x1bW4pO1xuICAgIHJldHVybiBsb2MgPyBsb2MudGV4dCA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldCByb3dzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNlbGxzT3duZXIgPyB0aGlzLmNlbGxzT3duZXIuZ2V0Um93cygpIDogW107XG4gIH1cbiAgcHVibGljIGdldCBjb2x1bW5zKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNlbGxzT3duZXIgPyB0aGlzLmNlbGxzT3duZXIuZ2V0Q29sdW1ucygpIDogW107XG4gIH1cbiAgcHJpdmF0ZSBnZXRDZWxsUm93Q29sdW1uVmFsdWUodmFsOiBhbnksIHZhbHVlczogQXJyYXk8YW55Pik6IGFueSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHZhbCA8IDAgfHwgdmFsID49IHZhbHVlcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgdmFsID0gdmFsdWVzW3ZhbF0udmFsdWU7XG4gICAgfVxuICAgIGlmICh2YWwudmFsdWUpIHJldHVybiB2YWwudmFsdWU7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0SnNvbigpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkpIHJldHVybiBudWxsO1xuICAgIHZhciByZXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIHJvdyBpbiB0aGlzLnZhbHVlcykge1xuICAgICAgdmFyIHJlc1JvdzogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICB2YXIgcm93VmFsdWVzID0gdGhpcy52YWx1ZXNbcm93XTtcbiAgICAgIGZvciAodmFyIGNvbCBpbiByb3dWYWx1ZXMpIHtcbiAgICAgICAgcmVzUm93W2NvbF0gPSByb3dWYWx1ZXNbY29sXS5nZXRKc29uKCk7XG4gICAgICB9XG4gICAgICByZXNbcm93XSA9IHJlc1JvdztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgc2V0SnNvbih2YWx1ZTogYW55KSB7XG4gICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgZm9yICh2YXIgcm93IGluIHZhbHVlKSB7XG4gICAgICBpZiAocm93ID09IFwicG9zXCIpIGNvbnRpbnVlO1xuICAgICAgdmFyIHJvd1ZhbHVlcyA9IHZhbHVlW3Jvd107XG4gICAgICB0aGlzLnZhbHVlc1tyb3ddID0ge307XG4gICAgICBmb3IgKHZhciBjb2wgaW4gcm93VmFsdWVzKSB7XG4gICAgICAgIGlmIChjb2wgPT0gXCJwb3NcIikgY29udGludWU7XG4gICAgICAgIHZhciBsb2MgPSB0aGlzLmNyZWF0ZVN0cmluZygpO1xuICAgICAgICBsb2Muc2V0SnNvbihyb3dWYWx1ZXNbY29sXSk7XG4gICAgICAgIHRoaXMudmFsdWVzW3Jvd11bY29sXSA9IGxvYztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVN0cmluZygpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBMb2NhbGl6YWJsZVN0cmluZyh0aGlzLmNlbGxzT3duZXIsIHRydWUpO1xuICB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBzaW1wbGUgbWF0cml4IHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhNb2RlbFxuICBleHRlbmRzIFF1ZXN0aW9uTWF0cml4QmFzZU1vZGVsPE1hdHJpeFJvd01vZGVsLCBJdGVtVmFsdWU+XG4gIGltcGxlbWVudHMgSU1hdHJpeERhdGEsIElNYXRyaXhDZWxsc093bmVyIHtcbiAgcHJpdmF0ZSBpc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gIHByaXZhdGUgY2VsbHNWYWx1ZTogTWFydHJpeENlbGxzO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNlbGxzVmFsdWUgPSBuZXcgTWFydHJpeENlbGxzKHRoaXMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiY29sdW1uc1wiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25Db2x1bW5zQ2hhbmdlZCgpO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJyb3dzXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFzZWxmLmZpbHRlckl0ZW1zKCkpIHtcbiAgICAgICAgc2VsZi5vblJvd3NDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtYXRyaXhcIjtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgaWYgeW91IHdhbnQgYSB1c2VyIHRvIGFuc3dlciBhbGwgcm93cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNBbGxSb3dSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNBbGxSb3dSZXF1aXJlZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBpc0FsbFJvd1JlcXVpcmVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzQWxsUm93UmVxdWlyZWRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcm93LlxuICAgKi9cbiAgcHVibGljIGdldCBoYXNSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJvd3MubGVuZ3RoID4gMDtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gcmVuZGVyIGl0ZW1zIGluIGEgc3BlY2lmaWMgb3JkZXI6IFwicmFuZG9tXCIgb3IgXCJpbml0aWFsXCIuIERlZmF1bHQgaXMgXCJpbml0aWFsXCIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvd3NPcmRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyb3dzT3JkZXJcIiwgXCJpbml0aWFsXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcm93c09yZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdmFsID0gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHZhbCA9PSB0aGlzLnJvd3NPcmRlcikgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd3NPcmRlclwiLCB2YWwpO1xuICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICB9XG4gIGdldFJvd3MoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucm93cztcbiAgfVxuICBnZXRDb2x1bW5zKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVDb2x1bW5zO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWaXNpYmxlUm93cygpOiBBcnJheTxNYXRyaXhSb3dNb2RlbD4ge1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8TWF0cml4Um93TW9kZWw+KCk7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwpIHZhbCA9IHt9O1xuICAgIHZhciByb3dzID0gISF0aGlzLmZpbHRlcmVkUm93cyA/IHRoaXMuZmlsdGVyZWRSb3dzIDogdGhpcy5yb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJvdyA9IHJvd3NbaV07XG4gICAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkocm93LnZhbHVlKSkgY29udGludWU7XG4gICAgICByZXN1bHQucHVzaChcbiAgICAgICAgdGhpcy5jcmVhdGVNYXRyaXhSb3coXG4gICAgICAgICAgcm93LFxuICAgICAgICAgIHRoaXMuaWQgKyBcIl9cIiArIHJvdy52YWx1ZS50b1N0cmluZygpLnJlcGxhY2UoL1xccy9nLCBcIl9cIiksXG4gICAgICAgICAgdmFsW3Jvdy52YWx1ZV1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMCAmJiAhdGhpcy5maWx0ZXJlZFJvd3MpIHtcbiAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICB0aGlzLmNyZWF0ZU1hdHJpeFJvdyhcbiAgICAgICAgICBuZXcgSXRlbVZhbHVlKG51bGwpLFxuICAgICAgICAgIHRoaXMubmFtZS5yZXBsYWNlKC9cXHMvZywgXCJfXCIpLFxuICAgICAgICAgIHZhbFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXN1bHQgPSB0aGlzLnNvcnRWaXNpYmxlUm93cyhyZXN1bHQpO1xuICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcm90ZWN0ZWQgc29ydFZpc2libGVSb3dzKFxuICAgIGFycmF5OiBBcnJheTxNYXRyaXhSb3dNb2RlbD5cbiAgKTogQXJyYXk8TWF0cml4Um93TW9kZWw+IHtcbiAgICB2YXIgb3JkZXIgPSB0aGlzLnJvd3NPcmRlci50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChvcmRlciA9PSBcInJhbmRvbVwiKSByZXR1cm4gSGVscGVycy5yYW5kb21pemVBcnJheTxNYXRyaXhSb3dNb2RlbD4oYXJyYXkpO1xuICAgIHJldHVybiBhcnJheTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB2aXNpYmxlIHJvd3MgYXMgbW9kZWwgb2JqZWN0cy5cbiAgICogQHNlZSByb3dzVmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVSb3dzKCk6IEFycmF5PE1hdHJpeFJvd01vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmlzaWJsZVJvd3MoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNlbGxzKCk6IE1hcnRyaXhDZWxscyB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbHNWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGNlbGxzKHZhbHVlOiBNYXJ0cml4Q2VsbHMpIHtcbiAgICB0aGlzLmNlbGxzLnNldEpzb24odmFsdWUgJiYgdmFsdWUuZ2V0SnNvbiA/IHZhbHVlLmdldEpzb24oKSA6IG51bGwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzQ2VsbFRleHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmNlbGxzLmlzRW1wdHk7XG4gIH1cbiAgcHVibGljIHNldENlbGxUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSwgdmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNlbGxzLnNldENlbGxUZXh0KHJvdywgY29sdW1uLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRDZWxsVGV4dChyb3c6IGFueSwgY29sdW1uOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNlbGxzLmdldENlbGxUZXh0KHJvdywgY29sdW1uKTtcbiAgfVxuICBwdWJsaWMgc2V0RGVmYXVsdENlbGxUZXh0KGNvbHVtbjogYW55LCB2YWw6IHN0cmluZykge1xuICAgIHRoaXMuY2VsbHMuc2V0RGVmYXVsdENlbGxUZXh0KGNvbHVtbiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0RGVmYXVsdENlbGxUZXh0KGNvbHVtbjogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jZWxscy5nZXREZWZhdWx0Q2VsbFRleHQoY29sdW1uKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q2VsbERpc3BsYXlUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbHMuZ2V0Q2VsbERpc3BsYXlUZXh0KHJvdywgY29sdW1uKTtcbiAgfVxuICBwcml2YXRlIGVtcHR5TG9jYWxpemFibGVTdHJpbmcgPSBuZXcgTG9jYWxpemFibGVTdHJpbmcodGhpcyk7XG4gIHB1YmxpYyBnZXRDZWxsRGlzcGxheUxvY1RleHQocm93OiBhbnksIGNvbHVtbjogYW55KTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHZhciBsb2MgPSB0aGlzLmNlbGxzLmdldENlbGxEaXNwbGF5TG9jVGV4dChyb3csIGNvbHVtbik7XG4gICAgcmV0dXJuIGxvYyA/IGxvYyA6IHRoaXMuZW1wdHlMb2NhbGl6YWJsZVN0cmluZztcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNWYWx1ZXNJbkFsbFJvd3MoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xuICAgIHN1cGVyLm9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzKTtcbiAgICBpZiAodGhpcy5oYXNFcnJvckluUm93cygpKSB7XG4gICAgICBlcnJvcnMucHVzaChuZXcgUmVxdWlyZWRJbkFsbFJvd3NFcnJvcihudWxsLCB0aGlzKSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JJblJvd3MoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzQWxsUm93UmVxdWlyZWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIXRoaXMuaGFzVmFsdWVzSW5BbGxSb3dzKCk7XG4gIH1cbiAgcHJpdmF0ZSBoYXNWYWx1ZXNJbkFsbFJvd3MoKTogYm9vbGVhbiB7XG4gICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgaWYgKCFyb3dzKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWwgPSByb3dzW2ldLnZhbHVlO1xuICAgICAgaWYgKCF2YWwpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU1hdHJpeFJvdyhcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgZnVsbE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55XG4gICk6IE1hdHJpeFJvd01vZGVsIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeFJvd01vZGVsKGl0ZW0sIGZ1bGxOYW1lLCB0aGlzLCB2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLnNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWUpO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyB8fFxuICAgICAgIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgfHxcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoID09IDBcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gdHJ1ZTtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCkgdmFsID0ge307XG4gICAgaWYgKHRoaXMucm93cy5sZW5ndGggPT0gMCkge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1swXS52YWx1ZSA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByb3cgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldO1xuICAgICAgICB2YXIgcm93VmFsID0gdmFsW3Jvdy5uYW1lXSA/IHZhbFtyb3cubmFtZV0gOiBudWxsO1xuICAgICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLnZhbHVlID0gcm93VmFsO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuKTogYW55IHtcbiAgICB2YXIgdmFsdWVzID0gdGhpcy5jcmVhdGVWYWx1ZUNvcHkoKTtcbiAgICBpZiAoIXZhbHVlcykgcmV0dXJuIHZhbHVlcztcbiAgICB2YXIgcmVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWVzKSB7XG4gICAgICB2YXIgbmV3S2V5ID0ga2V5c0FzVGV4dFxuICAgICAgICA/IEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZSh0aGlzLnJvd3MsIGtleSlcbiAgICAgICAgOiBrZXk7XG4gICAgICBpZiAoIW5ld0tleSkgbmV3S2V5ID0ga2V5O1xuICAgICAgdmFyIG5ld1ZhbHVlID0gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHRoaXMuY29sdW1ucywgdmFsdWVzW2tleV0pO1xuICAgICAgaWYgKCFuZXdWYWx1ZSkgbmV3VmFsdWUgPSB2YWx1ZXNba2V5XTtcbiAgICAgIHJlc1tuZXdLZXldID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldFBsYWluRGF0YShcbiAgICBvcHRpb25zOiB7XG4gICAgICBpbmNsdWRlRW1wdHk/OiBib29sZWFuO1xuICAgICAgY2FsY3VsYXRpb25zPzogQXJyYXk8e1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgIH0gPSB7XG4gICAgICBpbmNsdWRlRW1wdHk6IHRydWVcbiAgICB9XG4gICkge1xuICAgIHZhciBxdWVzdGlvblBsYWluRGF0YSA9IHN1cGVyLmdldFBsYWluRGF0YShvcHRpb25zKTtcbiAgICBpZiAoISFxdWVzdGlvblBsYWluRGF0YSkge1xuICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuY3JlYXRlVmFsdWVDb3B5KCk7XG4gICAgICBxdWVzdGlvblBsYWluRGF0YS5pc05vZGUgPSB0cnVlO1xuICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuZGF0YSA9IE9iamVjdC5rZXlzKHZhbHVlcyB8fCB7fSkubWFwKHJvd05hbWUgPT4ge1xuICAgICAgICB2YXIgcm93ID0gdGhpcy5yb3dzLmZpbHRlcihcbiAgICAgICAgICAocjogTWF0cml4Um93TW9kZWwpID0+IHIudmFsdWUgPT09IHJvd05hbWVcbiAgICAgICAgKVswXTtcbiAgICAgICAgdmFyIHJvd0RhdGFJdGVtID0gPGFueT57XG4gICAgICAgICAgbmFtZTogcm93TmFtZSxcbiAgICAgICAgICB0aXRsZTogISFyb3cgPyByb3cudGV4dCA6IFwicm93XCIsXG4gICAgICAgICAgdmFsdWU6IHZhbHVlc1tyb3dOYW1lXSxcbiAgICAgICAgICBkaXNwbGF5VmFsdWU6IEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZShcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMsXG4gICAgICAgICAgICB2YWx1ZXNbcm93TmFtZV1cbiAgICAgICAgICApLFxuICAgICAgICAgIGdldFN0cmluZzogKHZhbDogYW55KSA9PlxuICAgICAgICAgICAgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiA/IEpTT04uc3RyaW5naWZ5KHZhbCkgOiB2YWwsXG4gICAgICAgICAgaXNOb2RlOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB2YXIgaXRlbSA9IEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShcbiAgICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zLFxuICAgICAgICAgIHZhbHVlc1tyb3dOYW1lXVxuICAgICAgICApO1xuICAgICAgICBpZiAoISFpdGVtKSB7XG4gICAgICAgICAgKG9wdGlvbnMuY2FsY3VsYXRpb25zIHx8IFtdKS5mb3JFYWNoKGNhbGN1bGF0aW9uID0+IHtcbiAgICAgICAgICAgIHJvd0RhdGFJdGVtW2NhbGN1bGF0aW9uLnByb3BlcnR5TmFtZV0gPVxuICAgICAgICAgICAgICBpdGVtW2NhbGN1bGF0aW9uLnByb3BlcnR5TmFtZV07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd0RhdGFJdGVtO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBxdWVzdGlvblBsYWluRGF0YTtcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uTmFtZXMobmFtZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMucm93c1tpXS52YWx1ZSkge1xuICAgICAgICBuYW1lcy5wdXNoKHRoaXMubmFtZSArIFwiLlwiICsgdGhpcy5yb3dzW2ldLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQoXG4gICAgb2JqZWN0czogQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4sXG4gICAgY29udGV4dDogYW55XG4gICkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5yb3dzW2ldO1xuICAgICAgaWYgKCEhcm93LnZhbHVlKSB7XG4gICAgICAgIG9iamVjdHMucHVzaCh7XG4gICAgICAgICAgbmFtZTogdGhpcy5uYW1lICsgXCIuXCIgKyByb3cudmFsdWUsXG4gICAgICAgICAgdGV4dDogdGhpcy5wcm9jZXNzZWRUaXRsZSArIFwiLlwiICsgcm93LnRleHQsXG4gICAgICAgICAgcXVlc3Rpb246IHRoaXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yOiBzdHJpbmcgPSBudWxsLCBwYXRoOiBzdHJpbmcgPSBudWxsKTogYW55IHtcbiAgICBpZiAoIXBhdGgpIHJldHVybiBzdXBlci5nZXRDb25kaXRpb25Kc29uKCk7XG4gICAgdmFyIHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbChwYXRoKTtcbiAgICBxdWVzdGlvbi5jaG9pY2VzID0gdGhpcy5jb2x1bW5zO1xuICAgIHZhciBqc29uID0gbmV3IEpzb25PYmplY3QoKS50b0pzb25PYmplY3QocXVlc3Rpb24pO1xuICAgIGpzb25bXCJ0eXBlXCJdID0gcXVlc3Rpb24uZ2V0VHlwZSgpO1xuICAgIHJldHVybiBqc29uO1xuICB9XG4gIHB1YmxpYyBjbGVhclZhbHVlSWZJbnZpc2libGUoKSB7XG4gICAgc3VwZXIuY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gICAgaWYgKHRoaXMuaGFzUm93cykge1xuICAgICAgdGhpcy5jbGVhckludmlzaWJsZVZhbHVlc0luUm93cygpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpOiBzdHJpbmcge1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmIChyb3dzLmxlbmd0aCA+IDAgJiYgdGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dElkICsgXCJfXCIgKyByb3dzWzBdLm5hbWUgKyBcIl9cIiArIDA7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5nZXRGaXJzdElucHV0RWxlbWVudElkKCk7XG4gIH1cbiAgLy9JTWF0cml4RGF0YVxuICBvbk1hdHJpeFJvd0NoYW5nZWQocm93OiBNYXRyaXhSb3dNb2RlbCkge1xuICAgIGlmICh0aGlzLmlzUm93Q2hhbmdpbmcpIHJldHVybjtcbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSB0cnVlO1xuICAgIGlmICghdGhpcy5oYXNSb3dzKSB7XG4gICAgICB0aGlzLnNldE5ld1ZhbHVlKHJvdy52YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICBpZiAoIW5ld1ZhbHVlKSB7XG4gICAgICAgIG5ld1ZhbHVlID0ge307XG4gICAgICB9XG4gICAgICBuZXdWYWx1ZVtyb3cubmFtZV0gPSByb3cudmFsdWU7XG4gICAgICB0aGlzLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJtYXRyaXhcIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiY29sdW1uczppdGVtdmFsdWVbXVwiLFxuICAgICAgYmFzZVZhbHVlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtYXRyaXhfY29sdW1uXCIpO1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJyb3dzOml0ZW12YWx1ZVtdXCIsXG4gICAgICBiYXNlVmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1hdHJpeF9yb3dcIik7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IG5hbWU6IFwiY2VsbHM6Y2VsbHNcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImNlbGxzXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInJvd3NPcmRlclwiLFxuICAgICAgZGVmYXVsdDogXCJpbml0aWFsXCIsXG4gICAgICBjaG9pY2VzOiBbXCJpbml0aWFsXCIsIFwicmFuZG9tXCJdXG4gICAgfSxcbiAgICBcImlzQWxsUm93UmVxdWlyZWQ6Ym9vbGVhblwiXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJtYXRyaXhiYXNlXCJcbik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4XCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeE1vZGVsKG5hbWUpO1xuICBxLnJvd3MgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdFJvd3M7XG4gIHEuY29sdW1ucyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q29sdW1zO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX21hdHJpeC50cyIsImltcG9ydCB7XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UsXG4gIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICBJTWF0cml4RHJvcGRvd25EYXRhXG59IGZyb20gXCIuL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBJQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duUm93TW9kZWwgZXh0ZW5kcyBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB7XG4gIHByaXZhdGUgaXRlbTogSXRlbVZhbHVlO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhLFxuICAgIHZhbHVlOiBhbnlcbiAgKSB7XG4gICAgc3VwZXIoZGF0YSwgdmFsdWUpO1xuICAgIHRoaXMuaXRlbSA9IGl0ZW07XG4gICAgdGhpcy5idWlsZENlbGxzKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJvd05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0udGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0ubG9jVGV4dDtcbiAgfVxufVxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIG1hdHJpeCBkcm9wZG93biBxdWVzdGlvbi4gWW91IG1heSB1c2UgYSBkcm9wZG93biwgY2hlY2tib3gsIHJhZGlvZ3JvdXAsIHRleHQgYW5kIGNvbW1lbnQgcXVlc3Rpb25zIGFzIGEgY2VsbCBlZGl0b3JzLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsIGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZVxuICBpbXBsZW1lbnRzIElNYXRyaXhEcm9wZG93bkRhdGEge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInRvdGFsVGV4dFwiLCB0aGlzLCB0cnVlKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInJvd3NcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmdlbmVyYXRlZFZpc2libGVSb3dzID0gbnVsbDtcbiAgICAgIHNlbGYuZmlsdGVySXRlbXMoKTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm1hdHJpeGRyb3Bkb3duXCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHNob3cgaXQgb24gdGhlIGZpcnN0IGNvbHVtbiBmb3IgdGhlIHRvdGFsIHJvdy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdG90YWxUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRvdGFsVGV4dFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRvdGFsVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidG90YWxUZXh0XCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBsb2NUb3RhbFRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ0b3RhbFRleHRcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuKTogYW55IHtcbiAgICB2YXIgdmFsdWVzID0gdGhpcy5jcmVhdGVWYWx1ZUNvcHkoKTtcbiAgICBpZiAoIXZhbHVlcykgcmV0dXJuIHZhbHVlcztcbiAgICB2YXIgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgdmFyIHJlcyA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJvd1ZhbHVlID0gdGhpcy5yb3dzW2ldLnZhbHVlO1xuICAgICAgdmFyIHZhbCA9IHZhbHVlc1tyb3dWYWx1ZV07XG4gICAgICBpZiAoIXZhbCkgY29udGludWU7XG4gICAgICBpZiAoa2V5c0FzVGV4dCkge1xuICAgICAgICB2YXIgZGlzcGxheVJvd1ZhbHVlID0gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKFxuICAgICAgICAgIHRoaXMucm93cyxcbiAgICAgICAgICByb3dWYWx1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAoISFkaXNwbGF5Um93VmFsdWUpIHtcbiAgICAgICAgICByb3dWYWx1ZSA9IGRpc3BsYXlSb3dWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKDxhbnk+cmVzKVtyb3dWYWx1ZV0gPSB0aGlzLmdldFJvd0Rpc3BsYXlWYWx1ZShyb3dzW2ldLCB2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG4gIHB1YmxpYyBhZGRDb25kaXRpb25OYW1lcyhuYW1lczogQXJyYXk8c3RyaW5nPikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMucm93c1tpXS52YWx1ZSkgY29udGludWU7XG4gICAgICB2YXIgcHJlZml4ID0gdGhpcy5uYW1lICsgXCIuXCIgKyB0aGlzLnJvd3NbaV0udmFsdWUgKyBcIi5cIjtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIG5hbWVzLnB1c2gocHJlZml4ICsgdGhpcy5jb2x1bW5zW2pdLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgdmFyIGhhc0NvbnRleHQgPSAhIWNvbnRleHQgPyB0aGlzLmNvbHVtbnMuaW5kZXhPZihjb250ZXh0KSA+IC0xIDogZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSB0aGlzLnJvd3NbaV07XG4gICAgICBpZiAoIXJvdy52YWx1ZSkgY29udGludWU7XG4gICAgICB2YXIgcHJlZml4TmFtZSA9IHRoaXMubmFtZSArIFwiLlwiICsgcm93LnZhbHVlICsgXCIuXCI7XG4gICAgICB2YXIgcHJlZml4VGl0bGUgPSB0aGlzLnByb2Nlc3NlZFRpdGxlICsgXCIuXCIgKyByb3cudGV4dCArIFwiLlwiO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1uc1tqXTtcbiAgICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBwcmVmaXhOYW1lICsgY29sdW1uLm5hbWUsXG4gICAgICAgICAgdGV4dDogcHJlZml4VGl0bGUgKyBjb2x1bW4uZnVsbFRpdGxlLFxuICAgICAgICAgIHF1ZXN0aW9uOiB0aGlzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzQ29udGV4dCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICAgICAgaWYgKGNvbHVtbiA9PSBjb250ZXh0KSBjb250aW51ZTtcbiAgICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBcInJvdy5cIiArIGNvbHVtbi5uYW1lLFxuICAgICAgICAgIHRleHQ6IFwicm93LlwiICsgY29sdW1uLmZ1bGxUaXRsZSxcbiAgICAgICAgICBxdWVzdGlvbjogdGhpc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFySW5jb3JyZWN0VmFsdWVzKCkge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsKSByZXR1cm47XG4gICAgdmFyIG5ld1ZhbCA9IG51bGw7XG4gICAgdmFyIGlzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIHZhciByb3dzID0gISF0aGlzLmZpbHRlcmVkUm93cyA/IHRoaXMuZmlsdGVyZWRSb3dzIDogdGhpcy5yb3dzO1xuICAgIGZvciAodmFyIGtleSBpbiB2YWwpIHtcbiAgICAgIGlmIChJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUocm93cywga2V5KSkge1xuICAgICAgICBpZiAobmV3VmFsID09IG51bGwpIG5ld1ZhbCA9IHt9O1xuICAgICAgICAoPGFueT5uZXdWYWwpW2tleV0gPSB2YWxba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYW5nZWQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWw7XG4gICAgfVxuICAgIHN1cGVyLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gIH1cbiAgcHVibGljIGNsZWFyVmFsdWVJZkludmlzaWJsZSgpIHtcbiAgICBzdXBlci5jbGVhclZhbHVlSWZJbnZpc2libGUoKTtcbiAgICB0aGlzLmNsZWFySW52aXNpYmxlVmFsdWVzSW5Sb3dzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFJvd05hbWUocm93OiBhbnkpIHtcbiAgICByZXR1cm4gcm93LnJvd05hbWU7XG4gIH1cbiAgcHJvdGVjdGVkIGdlbmVyYXRlUm93cygpOiBBcnJheTxNYXRyaXhEcm9wZG93blJvd01vZGVsPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxNYXRyaXhEcm9wZG93blJvd01vZGVsPigpO1xuICAgIHZhciByb3dzID0gISF0aGlzLmZpbHRlcmVkUm93cyA/IHRoaXMuZmlsdGVyZWRSb3dzIDogdGhpcy5yb3dzO1xuICAgIGlmICghcm93cyB8fCByb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHJlc3VsdDtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCkgdmFsID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXJvd3NbaV0udmFsdWUpIGNvbnRpbnVlO1xuICAgICAgcmVzdWx0LnB1c2godGhpcy5jcmVhdGVNYXRyaXhSb3cocm93c1tpXSwgdmFsW3Jvd3NbaV0udmFsdWVdKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU1hdHJpeFJvdyhcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgdmFsdWU6IGFueVxuICApOiBNYXRyaXhEcm9wZG93blJvd01vZGVsIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeERyb3Bkb3duUm93TW9kZWwoaXRlbS52YWx1ZSwgaXRlbSwgdGhpcywgdmFsdWUpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwibWF0cml4ZHJvcGRvd25cIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwicm93czppdGVtdmFsdWVbXVwiXG4gICAgfSxcbiAgICBcInJvd3NWaXNpYmxlSWY6Y29uZGl0aW9uXCIsXG4gICAgeyBuYW1lOiBcInRvdGFsVGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVG90YWxUZXh0XCIgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJtYXRyaXhkcm9wZG93bmJhc2VcIlxuKTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtYXRyaXhkcm9wZG93blwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsKG5hbWUpO1xuICBxLmNob2ljZXMgPSBbMSwgMiwgMywgNCwgNV07XG4gIHEucm93cyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q29sdW1zO1xuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLmFkZERlZmF1bHRDb2x1bW5zKHEpO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duLnRzIiwiaW1wb3J0IHtcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSxcbiAgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gIElNYXRyaXhEcm9wZG93bkRhdGEsXG4gIE1hdHJpeERyb3Bkb3duQ29sdW1uXG59IGZyb20gXCIuL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgQmFzZSwgU3VydmV5RXJyb3IgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBNaW5Sb3dDb3VudEVycm9yLCBLZXlEdXBsaWNhdGlvbkVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IElDb25kaXRpb25PYmplY3QgfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeER5bmFtaWNSb3dNb2RlbCBleHRlbmRzIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIGluZGV4OiBudW1iZXIsIGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGEsIHZhbHVlOiBhbnkpIHtcbiAgICBzdXBlcihkYXRhLCB2YWx1ZSk7XG4gICAgdGhpcy5idWlsZENlbGxzKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJvd05hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIG1hdHJpeCBkeW1hbmljIHF1ZXN0aW9uLiBZb3UgbWF5IHVzZSBhIGRyb3Bkb3duLCBjaGVja2JveCwgcmFkaW9ncm91cCwgdGV4dCBhbmQgY29tbWVudCBxdWVzdGlvbnMgYXMgYSBjZWxsIGVkaXRvcnMuXG4gKiBBbiBlbmQtdXNlciBtYXkgZHluYW1pY2FsbHkgYWRkL3JlbW92ZSByb3dzLCB1bmxpa2UgaW4gbWF0cml4IGRyb3Bkb3duIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlXG4gIGltcGxlbWVudHMgSU1hdHJpeERyb3Bkb3duRGF0YSB7XG4gIHByaXZhdGUgcm93Q291bnRlciA9IDA7XG4gIHByaXZhdGUgcm93Q291bnRWYWx1ZTogbnVtYmVyID0gMjtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImNvbmZpcm1EZWxldGVUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJhZGRSb3dUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJyZW1vdmVSb3dUZXh0XCIsIHRoaXMpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibWF0cml4ZHluYW1pY1wiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSb3dzRHluYW1pYygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUsIHRvIHNob3cgYSBjb25maXJtYXRpb24gZGlhbG9nIG9uIHJlbW92aW5nIGEgcm93XG4gICAqIEBzZWUgQ29uZmlybURlbGV0ZVRleHRcbiAgICovXG4gIHB1YmxpYyBnZXQgY29uZmlybURlbGV0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29uZmlybURlbGV0ZVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBjb25maXJtRGVsZXRlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbmZpcm1EZWxldGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIGEgY29sdW1uIG5hbWUgYW5kIHRoZSBsaWJyYXJ5IHNob3dzIGR1cGxpY2F0aW9uIGVycm9yLCBpZiB0aGVyZSBhcmUgc2FtZSB2YWx1ZXMgaW4gZGlmZmVyZW50IHJvd3MgaW4gdGhlIGNvbHVtbi5cbiAgICogQHNlZSBrZXlEdXBsaWNhdGlvbkVycm9yXG4gICAqL1xuICBwdWJsaWMgZ2V0IGtleU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwia2V5TmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGtleU5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJrZXlOYW1lXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIElmIGl0IGlzIG5vdCBlbXB0eSwgdGhlbiB0aGlzIHZhbHVlIGlzIHNldCB0byBldmVyeSBuZXcgcm93LCBpbmNsdWRpbmcgcm93cyBjcmVhdGVkIGluaXRpYWxseSwgdW5sZXNzIHRoZSBkZWZhdWx0VmFsdWUgaXMgbm90IGVtcHR5XG4gICAqIEBzZWUgZGVmYXVsdFZhbHVlXG4gICAqIEBzZWUgZGVmYXVsdFZhbHVlRnJvbUxhc3RSb3dcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVmYXVsdFJvd1ZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRSb3dWYWx1ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlZmF1bHRSb3dWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRSb3dWYWx1ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gdHJ1ZSB0byBjb3B5IHRoZSB2YWx1ZSBpbnRvIG5ldyBhZGRlZCByb3cgZnJvbSB0aGUgbGFzdCByb3cuIElmIGRlZmF1bHRSb3dWYWx1ZSBpcyBzZXQgYW5kIHRoaXMgcHJvcGVydHkgZXF1YWxzIHRvIHRydWUsXG4gICAqIHRoZW4gdGhlIHZhbHVlIGZvciBuZXcgYWRkZWQgcm93IGlzIG1lcmdpbmcuXG4gICAqIEBzZWUgZGVmYXVsdFZhbHVlXG4gICAqIEBzZWUgZGVmYXVsdFJvd1ZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlZmF1bHRWYWx1ZUZyb21MYXN0Um93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVGcm9tTGFzdFJvd1wiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0VmFsdWVGcm9tTGFzdFJvdyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVGcm9tTGFzdFJvd1wiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBpc0RlZmF1bHRWYWx1ZUVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBzdXBlci5pc0RlZmF1bHRWYWx1ZUVtcHR5KCkgJiYgdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0Um93VmFsdWUpXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0RGVmYXVsdFZhbHVlKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFJvd1ZhbHVlKSB8fFxuICAgICAgIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFZhbHVlKVxuICAgICkge1xuICAgICAgc3VwZXIuc2V0RGVmYXVsdFZhbHVlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0VtcHR5KCkgfHwgdGhpcy5yb3dDb3VudCA9PSAwKSByZXR1cm47XG4gICAgdmFyIG5ld1ZhbHVlID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd0NvdW50OyBpKyspIHtcbiAgICAgIG5ld1ZhbHVlLnB1c2godGhpcy5kZWZhdWx0Um93VmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgbWF0cml4LlxuICAgKiBAc2VlIG1pblJvd0NvdW50XG4gICAqIEBzZWUgbWF4Um93Q291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgcm93Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yb3dDb3VudFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgcm93Q291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgMCB8fCB2YWwgPiBzZXR0aW5ncy5tYXRyaXhNYXhpbXVtUm93Q291bnQpIHJldHVybjtcbiAgICB2YXIgcHJldlZhbHVlID0gdGhpcy5yb3dDb3VudFZhbHVlO1xuICAgIHRoaXMucm93Q291bnRWYWx1ZSA9IHZhbDtcbiAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+IHZhbCkge1xuICAgICAgdmFyIHFWYWwgPSB0aGlzLnZhbHVlO1xuICAgICAgcVZhbC5zcGxpY2UodmFsKTtcbiAgICAgIHRoaXMudmFsdWUgPSBxVmFsO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIGlmICh0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLnNwbGljZSh2YWwpO1xuICAgICAgZm9yICh2YXIgaSA9IHByZXZWYWx1ZTsgaSA8IHZhbDsgaSsrKSB7XG4gICAgICAgIHZhciBuZXdSb3cgPSB0aGlzLmNyZWF0ZU1hdHJpeFJvdyhudWxsKTtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5wdXNoKG5ld1Jvdyk7XG4gICAgICAgIHRoaXMub25NYXRyaXhSb3dDcmVhdGVkKG5ld1Jvdyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMudmlzaWJsZVJvd3NDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSByb3cgY291bnQuIEEgdXNlciBjb3VsZCBub3QgZGVsZXRlIGEgcm93IGlmIHRoZSByb3dDb3VudCBlcXVhbHMgdG8gbWluUm93Q291bnRcbiAgICogQHNlZSByb3dDb3VudFxuICAgKiBAc2VlIG1heFJvd0NvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pblJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1pblJvd0NvdW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluUm93Q291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgMCkgdmFsID0gMDtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtaW5Sb3dDb3VudFwiLCB2YWwpO1xuICAgIGlmICh2YWwgPiB0aGlzLm1heFJvd0NvdW50KSB0aGlzLm1heFJvd0NvdW50ID0gdmFsO1xuICAgIGlmICh0aGlzLnJvd0NvdW50IDwgdmFsKSB0aGlzLnJvd0NvdW50ID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSByb3cgY291bnQuIEEgdXNlciBjb3VsZCBub3QgYWRkIGEgcm93IGlmIHRoZSByb3dDb3VudCBlcXVhbHMgdG8gbWF4Um93Q291bnRcbiAgICogQHNlZSByb3dDb3VudFxuICAgKiBAc2VlIG1pblJvd0NvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heFJvd0NvdW50XCIsIHNldHRpbmdzLm1hdHJpeE1heGltdW1Sb3dDb3VudCk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhSb3dDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPD0gMCkgcmV0dXJuO1xuICAgIGlmICh2YWwgPiBzZXR0aW5ncy5tYXRyaXhNYXhpbXVtUm93Q291bnQpXG4gICAgICB2YWwgPSBzZXR0aW5ncy5tYXRyaXhNYXhpbXVtUm93Q291bnQ7XG4gICAgaWYgKHZhbCA9PSB0aGlzLm1heFJvd0NvdW50KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4Um93Q291bnRcIiwgdmFsKTtcbiAgICBpZiAodmFsIDwgdGhpcy5taW5Sb3dDb3VudCkgdGhpcy5taW5Sb3dDb3VudCA9IHZhbDtcbiAgICBpZiAodGhpcy5yb3dDb3VudCA+IHZhbCkgdGhpcy5yb3dDb3VudCA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiBhIG5ldyByb3cgY2FuIGJlIGFkZGVkLlxuICAgKiBAc2VlIG1heFJvd0NvdW50XG4gICAqIEBzZWUgY2FuUmVtb3ZlUm93XG4gICAqIEBzZWUgcm93Q291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgY2FuQWRkUm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc1JlYWRPbmx5ICYmIHRoaXMucm93Q291bnQgPCB0aGlzLm1heFJvd0NvdW50O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUsIGlmIGEgcm93IGNhbiBiZSByZW1vdmVkLlxuICAgKiBAc2VlIG1pblJvd0NvdW50XG4gICAqIEBzZWUgY2FuQWRkUm93XG4gICAqIEBzZWUgcm93Q291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgY2FuUmVtb3ZlUm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc1JlYWRPbmx5ICYmIHRoaXMucm93Q291bnQgPiB0aGlzLm1pblJvd0NvdW50O1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBhZGQgYSBuZXcgcm93LlxuICAgKi9cbiAgcHVibGljIGFkZFJvdygpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHsgcXVlc3Rpb246IHRoaXMsIGNhbkFkZFJvdzogdGhpcy5jYW5BZGRSb3cgfTtcbiAgICBpZiAoISF0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkubWF0cml4QmVmb3JlUm93QWRkZWQob3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5jYW5BZGRSb3cpIHJldHVybjtcbiAgICB2YXIgcHJldlJvd0NvdW50ID0gdGhpcy5yb3dDb3VudDtcbiAgICB0aGlzLnJvd0NvdW50ID0gdGhpcy5yb3dDb3VudCArIDE7XG4gICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFJvd1ZhbHVlKHRydWUpO1xuICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkoZGVmYXVsdFZhbHVlKSkge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdWYWx1ZSgpO1xuICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA9PSB0aGlzLnJvd0NvdW50KSB7XG4gICAgICAgIG5ld1ZhbHVlW25ld1ZhbHVlLmxlbmd0aCAtIDFdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgIHRoaXMucnVuQ2VsbHNDb25kaXRpb24oXG4gICAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCksXG4gICAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIGlmIChwcmV2Um93Q291bnQgKyAxID09IHRoaXMucm93Q291bnQpIHtcbiAgICAgICAgdGhpcy5zdXJ2ZXkubWF0cml4Um93QWRkZWQodGhpcyk7XG4gICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMudmlzaWJsZVJvd3NDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldERlZmF1bHRSb3dWYWx1ZShpc1Jvd0FkZGVkOiBib29sZWFuKTogYW55IHtcbiAgICB2YXIgcmVzID0gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSB0aGlzLmNvbHVtbnNbaV0udGVtcGxhdGVRdWVzdGlvbjtcbiAgICAgIGlmICghIXEgJiYgIXRoaXMuaXNWYWx1ZUVtcHR5KHEuZ2V0RGVmYXVsdFZhbHVlKCkpKSB7XG4gICAgICAgIHJlcyA9IHJlcyB8fCB7fTtcbiAgICAgICAgKDxhbnk+cmVzKVt0aGlzLmNvbHVtbnNbaV0ubmFtZV0gPSBxLmdldERlZmF1bHRWYWx1ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFJvd1ZhbHVlKSkge1xuICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuZGVmYXVsdFJvd1ZhbHVlKSB7XG4gICAgICAgIHJlcyA9IHJlcyB8fCB7fTtcbiAgICAgICAgKDxhbnk+cmVzKVtrZXldID0gdGhpcy5kZWZhdWx0Um93VmFsdWVba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzUm93QWRkZWQgJiYgdGhpcy5kZWZhdWx0VmFsdWVGcm9tTGFzdFJvdykge1xuICAgICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgICBpZiAoISF2YWwgJiYgQXJyYXkuaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPj0gdGhpcy5yb3dDb3VudCAtIDEpIHtcbiAgICAgICAgdmFyIHJvd1ZhbHVlID0gdmFsW3RoaXMucm93Q291bnQgLSAyXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHJvd1ZhbHVlKSB7XG4gICAgICAgICAgcmVzID0gcmVzIHx8IHt9O1xuICAgICAgICAgICg8YW55PnJlcylba2V5XSA9IHJvd1ZhbHVlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogUmVtb3ZlcyBhIHJvdyBieSBpdCdzIGluZGV4LiBJZiBjb25maXJtRGVsZXRlIGlzIHRydWUsIHNob3cgYSBjb25maXJtYXRpb24gZGlhbG9nXG4gICAqIEBwYXJhbSBpbmRleCBhIHJvdyBpbmRleCwgZnJvbSAwIHRvIHJvd0NvdW50IC0gMVxuICAgKiBAc2VlIHJlbW92ZVJvd1xuICAgKiBAc2VlIGNvbmZpcm1EZWxldGVcbiAgICovXG4gIHB1YmxpYyByZW1vdmVSb3dVSSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNSZXF1aXJlQ29uZmlybU9uUm93RGVsZXRlKHZhbHVlKSB8fFxuICAgICAgY29uZmlybSh0aGlzLmNvbmZpcm1EZWxldGVUZXh0KVxuICAgICkge1xuICAgICAgdGhpcy5yZW1vdmVSb3codmFsdWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgaXNSZXF1aXJlQ29uZmlybU9uUm93RGVsZXRlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY29uZmlybURlbGV0ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5yb3dDb3VudCkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcbiAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWUpIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpbmRleCA+PSB2YWx1ZS5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlW2luZGV4XSk7XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSByb3cgYnkgaXQncyBpbmRleC5cbiAgICogQHBhcmFtIGluZGV4IGEgcm93IGluZGV4LCBmcm9tIDAgdG8gcm93Q291bnQgLSAxXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlUm93KGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMuY2FuUmVtb3ZlUm93KSByZXR1cm47XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnJvd0NvdW50KSByZXR1cm47XG4gICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1xuICAgICAgICA/IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaW5kZXhdXG4gICAgICAgIDogbnVsbDtcbiAgICAgIHRoaXMuc3VydmV5Lm1hdHJpeFJvd1JlbW92ZWQodGhpcywgaW5kZXgsIHJvdyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzICYmIGluZGV4IDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgdGhpcy5yb3dDb3VudFZhbHVlLS07XG4gICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgIHZhciB2YWwgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKCk7XG4gICAgICB2YWwuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHZhbCA9IHRoaXMuZGVsZXRlUm93VmFsdWUodmFsLCBudWxsKTtcbiAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsO1xuICAgICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMudmlzaWJsZVJvd3NDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dCBzaG93aW5nIGluIHRoZSBjb25maXJtYXRpb24gZGVsZXRlIGRpYWxvZyBvbiByZW1vdmluZyBhIHJvdy5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29uZmlybURlbGV0ZVRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJjb25maXJtRGVsZXRlVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNvbmZpcm1EZWxldGVcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgY29uZmlybURlbGV0ZVRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbmZpcm1EZWxldGVUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0NvbmZpcm1EZWxldGVUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiY29uZmlybURlbGV0ZVRleHRcIik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGR1cGxpY2F0aW9uIHZhbHVlIGVycm9yIHRleHQuIFNldCBpdCB0byBzaG93IHRoZSB0ZXh0IGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0LlxuICAgKiBAc2VlIGtleU5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXQga2V5RHVwbGljYXRpb25FcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcImtleUR1cGxpY2F0aW9uRXJyb3JcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGtleUR1cGxpY2F0aW9uRXJyb3IodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImtleUR1cGxpY2F0aW9uRXJyb3JcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jS2V5RHVwbGljYXRpb25FcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIik7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhZGQgcm93IGJ1dHRvbiB0ZXh0LlxuICAgKi9cbiAgcHVibGljIGdldCBhZGRSb3dUZXh0KCkge1xuICAgIHZhciBkZWZhdWx0TG9jTmFtZSA9IHRoaXMuaXNDb2x1bW5MYXlvdXRIb3Jpem9udGFsID8gXCJhZGRSb3dcIiA6IFwiYWRkQ29sdW1uXCI7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJhZGRSb3dUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKGRlZmF1bHRMb2NOYW1lKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBhZGRSb3dUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJhZGRSb3dUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0FkZFJvd1RleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJhZGRSb3dUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHRoZSAnQWRkIFJvdycgYnV0dG9uIGlzIHNob3duIG9uIGJvdHRvbSBpZiBjb2x1bW5MYXlvdXQgaXMgaG9yaXpvbnRhbCBhbmQgb24gdG9wIGlmIGNvbHVtbkxheW91dCBpcyB2ZXJ0aWNhbC4gPGJyLz5cbiAgICogWW91IG1heSBzZXQgaXQgdG8gXCJ0b3BcIiwgXCJib3R0b21cIiBvciBcInRvcEJvdHRvbVwiICh0byBzaG93IG9uIHRvcCBhbmQgYm90dG9tKS5cbiAgICogQHNlZSBjb2x1bW5MYXlvdXRcbiAgICovXG4gIHB1YmxpYyBnZXQgYWRkUm93TG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWRkUm93TG9jYXRpb25cIiwgXCJkZWZhdWx0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWRkUm93TG9jYXRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhZGRSb3dMb2NhdGlvblwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBZGRSb3dPblRvcCgpIHtcbiAgICBpZiAoIXRoaXMuY2FuQWRkUm93KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuYWRkUm93TG9jYXRpb24gPT09IFwiZGVmYXVsdFwiKVxuICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTGF5b3V0ID09PSBcInZlcnRpY2FsXCI7XG4gICAgcmV0dXJuIHRoaXMuYWRkUm93TG9jYXRpb24gIT09IFwiYm90dG9tXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0FkZFJvd09uQm90dG9tKCkge1xuICAgIGlmICghdGhpcy5jYW5BZGRSb3cpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5hZGRSb3dMb2NhdGlvbiA9PT0gXCJkZWZhdWx0XCIpXG4gICAgICByZXR1cm4gdGhpcy5jb2x1bW5MYXlvdXQgPT09IFwiaG9yaXpvbnRhbFwiO1xuICAgIHJldHVybiB0aGlzLmFkZFJvd0xvY2F0aW9uICE9PSBcInRvcFwiO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgcmVtb3ZlIHJvdyBidXR0b24gdGV4dC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVtb3ZlUm93VGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcInJlbW92ZVJvd1RleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZW1vdmVSb3dcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVtb3ZlUm93VGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicmVtb3ZlUm93VGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NSZW1vdmVSb3dUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicmVtb3ZlUm93VGV4dFwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuKTogYW55IHtcbiAgICB2YXIgdmFsdWVzID0gdGhpcy5jcmVhdGVWYWx1ZUNvcHkoKTtcbiAgICBpZiAoIXZhbHVlcyB8fCAhQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSByZXR1cm4gdmFsdWVzO1xuICAgIHZhciByb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoICYmIGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWwgPSB2YWx1ZXNbaV07XG4gICAgICBpZiAoIXZhbCkgY29udGludWU7XG4gICAgICB2YWx1ZXNbaV0gPSB0aGlzLmdldFJvd0Rpc3BsYXlWYWx1ZShyb3dzW2ldLCB2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG4gIHB1YmxpYyBhZGRDb25kaXRpb25OYW1lcyhuYW1lczogQXJyYXk8c3RyaW5nPikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuYW1lcy5wdXNoKHRoaXMubmFtZSArIFwiWzBdLlwiICsgdGhpcy5jb2x1bW5zW2ldLm5hbWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgdmFyIGhhc0NvbnRleHQgPSAhIWNvbnRleHQgPyB0aGlzLmNvbHVtbnMuaW5kZXhPZihjb250ZXh0KSA+IC0xIDogZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmNvbHVtbnNbaV07XG4gICAgICBvYmplY3RzLnB1c2goe1xuICAgICAgICBuYW1lOiB0aGlzLm5hbWUgKyBcIlswXS5cIiArIGNvbHVtbi5uYW1lLFxuICAgICAgICB0ZXh0OiB0aGlzLnByb2Nlc3NlZFRpdGxlICsgXCJbMF0uXCIgKyBjb2x1bW4uZnVsbFRpdGxlLFxuICAgICAgICBxdWVzdGlvbjogdGhpc1xuICAgICAgfSk7XG4gICAgICBpZiAoaGFzQ29udGV4dCAmJiBjb2x1bW4gIT0gY29udGV4dCkge1xuICAgICAgICBvYmplY3RzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IFwicm93LlwiICsgY29sdW1uLm5hbWUsXG4gICAgICAgICAgdGV4dDogXCJyb3cuXCIgKyBjb2x1bW4uZnVsbFRpdGxlLFxuICAgICAgICAgIHF1ZXN0aW9uOiB0aGlzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBvbkNoZWNrRm9yRXJyb3JzKGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+KSB7XG4gICAgc3VwZXIub25DaGVja0ZvckVycm9ycyhlcnJvcnMpO1xuICAgIGlmICh0aGlzLmhhc0Vycm9ySW5Sb3dzKCkpIHtcbiAgICAgIGVycm9ycy5wdXNoKG5ldyBNaW5Sb3dDb3VudEVycm9yKHRoaXMubWluUm93Q291bnQsIHRoaXMpKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgdmFyIHByZXZWYWx1ZSA9IHN1cGVyLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzLmlzVmFsdWVEdXBsaWNhdGVkKCkgfHwgcHJldlZhbHVlO1xuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JJblJvd3MoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubWluUm93Q291bnQgPD0gMCB8fCAhdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuIGZhbHNlO1xuICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICB2YXIgc2V0Um93Q291bnQgPSAwO1xuICAgIGZvciAoXG4gICAgICB2YXIgcm93SW5kZXggPSAwO1xuICAgICAgcm93SW5kZXggPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDtcbiAgICAgIHJvd0luZGV4KytcbiAgICApIHtcbiAgICAgIHZhciByb3cgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW3Jvd0luZGV4XTtcbiAgICAgIGlmICghcm93LmlzRW1wdHkpIHNldFJvd0NvdW50Kys7XG4gICAgfVxuICAgIHJldHVybiBzZXRSb3dDb3VudCA8IHRoaXMubWluUm93Q291bnQ7XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlRHVwbGljYXRlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMua2V5TmFtZSB8fCAhdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBjb2x1bW4gPSB0aGlzLmdldENvbHVtbkJ5TmFtZSh0aGlzLmtleU5hbWUpO1xuICAgIGlmICghY29sdW1uKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGtleVZhbHVlcyA9IDxBcnJheTxhbnk+PltdO1xuICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcyA9XG4gICAgICAgIHRoaXMuaXNWYWx1ZUR1cGxpY2F0ZWRJblJvdyhcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLFxuICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICBrZXlWYWx1ZXNcbiAgICAgICAgKSB8fCByZXM7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlRHVwbGljYXRlZEluUm93KFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICBrZXlWYWx1ZXM6IEFycmF5PGFueT5cbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIHF1ZXN0aW9uID0gcm93LmdldFF1ZXN0aW9uQnlDb2x1bW4oY29sdW1uKTtcbiAgICBpZiAoIXF1ZXN0aW9uIHx8IHF1ZXN0aW9uLmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB2YWx1ZSA9IHF1ZXN0aW9uLnZhbHVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodmFsdWUgPT0ga2V5VmFsdWVzW2ldKSB7XG4gICAgICAgIHF1ZXN0aW9uLmFkZEVycm9yKFxuICAgICAgICAgIG5ldyBLZXlEdXBsaWNhdGlvbkVycm9yKHRoaXMua2V5RHVwbGljYXRpb25FcnJvciwgdGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGtleVZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGdlbmVyYXRlUm93cygpOiBBcnJheTxNYXRyaXhEeW5hbWljUm93TW9kZWw+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PE1hdHJpeER5bmFtaWNSb3dNb2RlbD4oKTtcbiAgICBpZiAodGhpcy5yb3dDb3VudCA9PT0gMCkgcmV0dXJuIHJlc3VsdDtcbiAgICB2YXIgdmFsID0gdGhpcy5jcmVhdGVOZXdWYWx1ZSgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dDb3VudDsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaCh0aGlzLmNyZWF0ZU1hdHJpeFJvdyh0aGlzLmdldFJvd1ZhbHVlQnlJbmRleCh2YWwsIGkpKSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5nZXREZWZhdWx0Um93VmFsdWUoZmFsc2UpKSkge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTWF0cml4Um93KHZhbHVlOiBhbnkpOiBNYXRyaXhEeW5hbWljUm93TW9kZWwge1xuICAgIHJldHVybiBuZXcgTWF0cml4RHluYW1pY1Jvd01vZGVsKHRoaXMucm93Q291bnRlcisrLCB0aGlzLCB2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmVmb3JlVmFsdWVDaGFuZ2VkKHZhbDogYW55KSB7XG4gICAgdmFyIG5ld1Jvd0NvdW50ID0gdmFsICYmIEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbC5sZW5ndGggOiAwO1xuICAgIGlmIChuZXdSb3dDb3VudCA8PSB0aGlzLnJvd0NvdW50KSByZXR1cm47XG4gICAgdGhpcy5yb3dDb3VudFZhbHVlID0gbmV3Um93Q291bnQ7XG4gICAgaWYgKHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSBudWxsO1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnZpc2libGVSb3dzQ2hhbmdlZENhbGxiYWNrKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1ZhbHVlKCk6IGFueSB7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuY3JlYXRlVmFsdWVDb3B5KCk7XG4gICAgaWYgKCFyZXN1bHQgfHwgIUFycmF5LmlzQXJyYXkocmVzdWx0KSkgcmVzdWx0ID0gW107XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPiB0aGlzLnJvd0NvdW50KSByZXN1bHQuc3BsaWNlKHRoaXMucm93Q291bnQpO1xuICAgIHZhciByb3dWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFJvd1ZhbHVlKGZhbHNlKTtcbiAgICByb3dWYWx1ZSA9IHJvd1ZhbHVlIHx8IHt9O1xuICAgIGZvciAodmFyIGkgPSByZXN1bHQubGVuZ3RoOyBpIDwgdGhpcy5yb3dDb3VudDsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaChIZWxwZXJzLmdldFVuYmluZFZhbHVlKHJvd1ZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGRlbGV0ZVJvd1ZhbHVlKFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxuICApOiBhbnkge1xuICAgIHZhciBpc0VtcHR5ID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pc09iamVjdChuZXdWYWx1ZVtpXSkgJiYgT2JqZWN0LmtleXMobmV3VmFsdWVbaV0pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaXNFbXB0eSA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlzRW1wdHkgPyBudWxsIDogbmV3VmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGdldFJvd1ZhbHVlQnlJbmRleChxdWVzdGlvblZhbHVlOiBhbnksIGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIHJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgcXVlc3Rpb25WYWx1ZS5sZW5ndGhcbiAgICAgID8gcXVlc3Rpb25WYWx1ZVtpbmRleF1cbiAgICAgIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Um93VmFsdWVDb3JlKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgcXVlc3Rpb25WYWx1ZTogYW55LFxuICAgIGNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4ge307XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um93VmFsdWVCeUluZGV4KFxuICAgICAgcXVlc3Rpb25WYWx1ZSxcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MuaW5kZXhPZihyb3cpXG4gICAgKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIm1hdHJpeGR5bmFtaWNcIixcbiAgW1xuICAgIHsgbmFtZTogXCJyb3dzVmlzaWJsZUlmOmNvbmRpdGlvblwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJyb3dDb3VudDpudW1iZXJcIiwgZGVmYXVsdDogMiB9LFxuICAgIHsgbmFtZTogXCJtaW5Sb3dDb3VudDpudW1iZXJcIiwgZGVmYXVsdDogMCB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWF4Um93Q291bnQ6bnVtYmVyXCIsXG4gICAgICBkZWZhdWx0OiBzZXR0aW5ncy5tYXRyaXhNYXhpbXVtUm93Q291bnRcbiAgICB9LFxuICAgIHsgbmFtZTogXCJrZXlOYW1lXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImtleUR1cGxpY2F0aW9uRXJyb3JcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NLZXlEdXBsaWNhdGlvbkVycm9yXCJcbiAgICB9LFxuICAgIFwiZGVmYXVsdFJvd1ZhbHVlOnJvd3ZhbHVlXCIsXG4gICAgXCJkZWZhdWx0VmFsdWVGcm9tTGFzdFJvdzpib29sZWFuXCIsXG4gICAgeyBuYW1lOiBcImNvbmZpcm1EZWxldGU6Ym9vbGVhblwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjb25maXJtRGVsZXRlVGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbmZpcm1EZWxldGVUZXh0XCJcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiYWRkUm93TG9jYXRpb25cIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcInRvcEJvdHRvbVwiXVxuICAgIH0sXG4gICAgeyBuYW1lOiBcImFkZFJvd1RleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0FkZFJvd1RleHRcIiB9LFxuICAgIHsgbmFtZTogXCJyZW1vdmVSb3dUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NSZW1vdmVSb3dUZXh0XCIgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsKFwiXCIpO1xuICB9LFxuICBcIm1hdHJpeGRyb3Bkb3duYmFzZVwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeGR5bmFtaWNcIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsKG5hbWUpO1xuICBxLmNob2ljZXMgPSBbMSwgMiwgMywgNCwgNV07XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UuYWRkRGVmYXVsdENvbHVtbnMocSk7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHluYW1pYy50cyIsImltcG9ydCB7XG4gIEJhc2UsXG4gIElTdXJ2ZXlEYXRhLFxuICBJU3VydmV5SW1wbCxcbiAgSVN1cnZleSxcbiAgSVBhbmVsLFxuICBJRWxlbWVudCxcbiAgSVRleHRQcm9jZXNzb3Jcbn0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgU3VydmV5VmFsaWRhdG9yLCBJVmFsaWRhdG9yT3duZXIsIFZhbGlkYXRvclJ1bm5lciB9IGZyb20gXCIuL3ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgUXVlc3Rpb24sIElDb25kaXRpb25PYmplY3QgfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tIFwiLi9xdWVzdGlvbl90ZXh0XCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0LCBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IEFuc3dlclJlcXVpcmVkRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU11bHRpcGxlVGV4dERhdGEgZXh0ZW5kcyBJTG9jYWxpemFibGVPd25lciwgSVBhbmVsIHtcbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXk7XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3I7XG4gIGdldEFsbFZhbHVlcygpOiBhbnk7XG4gIGdldE11bHRpcGxlVGV4dFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueTtcbiAgc2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55O1xuICBnZXRJc1JlcXVpcmVkVGV4dCgpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNdWx0aXBsZVRleHRJdGVtTW9kZWwgZXh0ZW5kcyBCYXNlXG4gIGltcGxlbWVudHMgSVZhbGlkYXRvck93bmVyLCBJU3VydmV5RGF0YSwgSVN1cnZleUltcGwge1xuICBwcml2YXRlIGVkaXRvclZhbHVlOiBRdWVzdGlvblRleHRNb2RlbDtcbiAgcHJpdmF0ZSBkYXRhOiBJTXVsdGlwbGVUZXh0RGF0YTtcblxuICB2YWx1ZUNoYW5nZWRDYWxsYmFjazogKG5ld1ZhbHVlOiBhbnkpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IobmFtZTogYW55ID0gbnVsbCwgdGl0bGU6IHN0cmluZyA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZWRpdG9yVmFsdWUgPSB0aGlzLmNyZWF0ZUVkaXRvcihuYW1lKTtcbiAgICB0aGlzLmVkaXRvci5xdWVzdGlvblRpdGxlVGVtcGxhdGVDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfTtcbiAgICB0aGlzLmVkaXRvci50aXRsZUxvY2F0aW9uID0gXCJsZWZ0XCI7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibXVsdGlwbGV0ZXh0aXRlbVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuaWQ7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpdGVtIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IubmFtZTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVkaXRvci5uYW1lID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yKCk6IFF1ZXN0aW9uVGV4dE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlRWRpdG9yKG5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uVGV4dE1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dE1vZGVsKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIHRoaXMuZWRpdG9yLmxvY1N0cnNDaGFuZ2VkKCk7XG4gIH1cbiAgc2V0RGF0YShkYXRhOiBJTXVsdGlwbGVUZXh0RGF0YSkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnNldFN1cnZleUltcGwodGhpcyk7XG4gICAgICB0aGlzLmVkaXRvci5wYXJlbnQgPSBkYXRhO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgdG8gbWFrZSB0aGUgaXRlbSBhIHJlcXVpcmVkLiBJZiBhIHVzZXIgZG9lc24ndCBmaWxsIHRoZSBpdGVtIHRoZW4gYSB2YWxpZGF0aW9uIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5pc1JlcXVpcmVkO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNSZXF1aXJlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmVkaXRvci5pc1JlcXVpcmVkID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgaW5wdXQgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5wdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmlucHV0VHlwZTtcbiAgfVxuICBwdWJsaWMgc2V0IGlucHV0VHlwZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuZWRpdG9yLmlucHV0VHlwZSA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogSXRlbSB0aXRsZS4gSWYgaXQgaXMgZW1wdHksIHRoZSBpdGVtIG5hbWUgaXMgcmVuZGVyZWQgYXMgdGl0bGUuIFRoaXMgcHJvcGVydHkgc3VwcG9ydHMgbWFya2Rvd24uXG4gICAqIEBzZWUgbmFtZVxuICAgKi9cbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci50aXRsZTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5lZGl0b3IudGl0bGUgPSB2YWw7XG4gIH1cbiAgZ2V0IGxvY1RpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5sb2NUaXRsZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGV4dCBvciBodG1sIGZvciByZW5kZXJpbmcgdGhlIHRpdGxlLlxuICAgKi9cbiAgcHVibGljIGdldCBmdWxsVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuZnVsbFRpdGxlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW1pbSB0ZXh0IGxlbmd0aC4gSWYgaXQgaXMgLTEsIGRlZmF1bCB2YWx1ZSwgdGhlbiB0aGUgc3VydmV5IG1heFRleHRMZW5ndGggcHJvcGVydHkgd2lsbCBiZSB1c2VkLlxuICAgKiBJZiBpdCBpcyAwLCB0aGVuIHRoZSB2YWx1ZSBpcyB1bmxpbWl0ZWRcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5tYXhUZXh0TGVuZ3RoXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5tYXhMZW5ndGg7XG4gIH1cbiAgcHVibGljIHNldCBtYXhMZW5ndGgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLmVkaXRvci5tYXhMZW5ndGggPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldE1heExlbmd0aCgpOiBhbnkge1xuICAgIHZhciBzdXJ2ZXkgPSB0aGlzLmdldFN1cnZleSgpO1xuICAgIHJldHVybiBIZWxwZXJzLmdldE1heExlbmd0aChcbiAgICAgIHRoaXMubWF4TGVuZ3RoLFxuICAgICAgc3VydmV5ID8gc3VydmV5Lm1heFRleHRMZW5ndGggOiAtMVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBwbGFjZSBob2xkZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYWNlSG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLnBsYWNlSG9sZGVyO1xuICB9XG4gIHB1YmxpYyBzZXQgcGxhY2VIb2xkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVkaXRvci5wbGFjZUhvbGRlciA9IHZhbDtcbiAgfVxuICBnZXQgbG9jUGxhY2VIb2xkZXIoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5sb2NQbGFjZUhvbGRlcjtcbiAgfVxuICAvKipcbiAgICogVGhlIGN1c3RvbSB0ZXh0IHRoYXQgd2lsbCBiZSBzaG93biBvbiByZXF1aXJlZCBlcnJvci4gVXNlIHRoaXMgcHJvcGVydHksIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzaG93IHRoZSBkZWZhdWx0IHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkRXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLnJlcXVpcmVkRXJyb3JUZXh0O1xuICB9XG4gIHB1YmxpYyBzZXQgcmVxdWlyZWRFcnJvclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVkaXRvci5yZXF1aXJlZEVycm9yVGV4dCA9IHZhbDtcbiAgfVxuICBnZXQgbG9jUmVxdWlyZWRFcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5sb2NSZXF1aXJlZEVycm9yVGV4dDtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgcXVlc3Rpb24gdmFsaWRhdG9ycy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsaWRhdG9ycygpOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IudmFsaWRhdG9ycztcbiAgfVxuICBwdWJsaWMgc2V0IHZhbGlkYXRvcnModmFsOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+KSB7XG4gICAgdGhpcy5lZGl0b3IudmFsaWRhdG9ycyA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogVGhlIGl0ZW0gdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0TXVsdGlwbGVUZXh0VmFsdWUodGhpcy5uYW1lKSA6IG51bGw7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuZGF0YSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmRhdGEuc2V0TXVsdGlwbGVUZXh0VmFsdWUodGhpcy5uYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiBIZWxwZXJzLmlzVmFsdWVFbXB0eSh0aGlzLnZhbHVlKTtcbiAgfVxuICBwdWJsaWMgb25WYWx1ZUNoYW5nZWQobmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLnZhbHVlQ2hhbmdlZENhbGxiYWNrKSB0aGlzLnZhbHVlQ2hhbmdlZENhbGxiYWNrKG5ld1ZhbHVlKTtcbiAgfVxuICAvL0lTdXJ2ZXlJbXBsXG4gIGdlU3VydmV5RGF0YSgpOiBJU3VydmV5RGF0YSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0U3VydmV5KCkgOiBudWxsO1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0VGV4dFByb2Nlc3NvcigpIDogbnVsbDtcbiAgfVxuICAvL0lTdXJ2ZXlEYXRhXG4gIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZSk7XG4gIH1cbiAgc2V0VmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgdGhpcy5kYXRhLnNldE11bHRpcGxlVGV4dFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZ2V0Q29tbWVudChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKSB7fVxuICBnZXRBbGxWYWx1ZXMoKTogYW55IHtcbiAgICBpZiAodGhpcy5kYXRhKSByZXR1cm4gdGhpcy5kYXRhLmdldEFsbFZhbHVlcygpO1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG4gIGdldEZpbHRlcmVkVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsVmFsdWVzKCk7XG4gIH1cbiAgZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHsgc3VydmV5OiB0aGlzLmdldFN1cnZleSgpIH07XG4gIH1cbiAgLy9JVmFsaWRhdG9yT3duZXJcbiAgZ2V0VmFsaWRhdG9yVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50aXRsZTtcbiAgfVxuICBnZXQgdmFsaWRhdGVkVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuICBzZXQgdmFsaWRhdGVkVmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsO1xuICB9XG4gIGdldERhdGFGaWx0ZXJlZFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldEZpbHRlcmVkVmFsdWVzKCk7XG4gIH1cbiAgZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldEZpbHRlcmVkUHJvcGVydGllcygpO1xuICB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBtdWx0aXBsZSB0ZXh0IHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbCBleHRlbmRzIFF1ZXN0aW9uXG4gIGltcGxlbWVudHMgSU11bHRpcGxlVGV4dERhdGEsIElQYW5lbCB7XG4gIGNvbENvdW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuaXRlbXMgPSB0aGlzLmNyZWF0ZU5ld0FycmF5KFwiaXRlbXNcIiwgZnVuY3Rpb24oaXRlbTogYW55KSB7XG4gICAgICBpdGVtLnNldERhdGEoc2VsZik7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcIml0ZW1zXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5maXJlQ2FsbGJhY2soc2VsZi5jb2xDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImNvbENvdW50XCIsIGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5maXJlQ2FsbGJhY2soc2VsZi5jb2xDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtdWx0aXBsZXRleHRcIjtcbiAgfVxuICBwdWJsaWMgc2V0U3VydmV5SW1wbCh2YWx1ZTogSVN1cnZleUltcGwpIHtcbiAgICBzdXBlci5zZXRTdXJ2ZXlJbXBsKHZhbHVlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuaXRlbXNbaV0uc2V0RGF0YSh0aGlzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBpc0FsbG93VGl0bGVMZWZ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBvblN1cnZleUxvYWQoKSB7XG4gICAgdGhpcy5lZGl0b3JzT25TdXJ2ZXlMb2FkKCk7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jb2xDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbXNbaV07XG4gICAgICBpZiAoaXRlbS5lZGl0b3IpIGl0ZW0uZWRpdG9yLnVwZGF0ZVZhbHVlRnJvbVN1cnZleShpdGVtLnZhbHVlKTtcbiAgICB9XG4gIH1cbiAgb25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLm9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdGhpcy5pdGVtc1tpXTtcbiAgICAgIGlmIChpdGVtLmVkaXRvcikgaXRlbS5lZGl0b3Iub25TdXJ2ZXlWYWx1ZUNoYW5nZWQoaXRlbS52YWx1ZSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZWRpdG9yc09uU3VydmV5TG9hZCgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdGhpcy5pdGVtc1tpXTtcbiAgICAgIGlmIChpdGVtLmVkaXRvcikge1xuICAgICAgICAoPGFueT5pdGVtKS5lZGl0b3Iub25TdXJ2ZXlMb2FkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBpbnB1dCBpdGVtcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXRlbXMoKTogQXJyYXk8TXVsdGlwbGVUZXh0SXRlbU1vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIml0ZW1zXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXRlbXModmFsOiBBcnJheTxNdWx0aXBsZVRleHRJdGVtTW9kZWw+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXRlbXNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgbmV3IHRleHQgaXRlbS5cbiAgICogQHBhcmFtIG5hbWUgYSBpdGVtIG5hbWVcbiAgICogQHBhcmFtIHRpdGxlIGEgaXRlbSB0aXRsZSAob3B0aW9uYWwpXG4gICAqL1xuICBwdWJsaWMgYWRkSXRlbShuYW1lOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcgPSBudWxsKTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuY3JlYXRlVGV4dEl0ZW0obmFtZSwgdGl0bGUpO1xuICAgIHRoaXMuaXRlbXMucHVzaChpdGVtKTtcbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuICBwdWJsaWMgZ2V0SXRlbUJ5TmFtZShuYW1lOiBzdHJpbmcpOiBNdWx0aXBsZVRleHRJdGVtTW9kZWwge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuaXRlbXNbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gdGhpcy5pdGVtc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk5hbWVzKG5hbWVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuYW1lcy5wdXNoKHRoaXMubmFtZSArIFwiLlwiICsgdGhpcy5pdGVtc1tpXS5uYW1lKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQoXG4gICAgb2JqZWN0czogQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4sXG4gICAgY29udGV4dDogYW55XG4gICkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1zW2ldO1xuICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lICsgXCIuXCIgKyBpdGVtLm5hbWUsXG4gICAgICAgIHRleHQ6IHRoaXMucHJvY2Vzc2VkVGl0bGUgKyBcIi5cIiArIGl0ZW0uZnVsbFRpdGxlLFxuICAgICAgICBxdWVzdGlvbjogdGhpc1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yOiBzdHJpbmcgPSBudWxsLCBwYXRoOiBzdHJpbmcgPSBudWxsKTogYW55IHtcbiAgICBpZiAoIXBhdGgpIHJldHVybiBzdXBlci5nZXRDb25kaXRpb25Kc29uKCk7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLmdldEl0ZW1CeU5hbWUocGF0aCk7XG4gICAgaWYgKCFpdGVtKSByZXR1cm4gbnVsbDtcbiAgICB2YXIganNvbiA9IG5ldyBKc29uT2JqZWN0KCkudG9Kc29uT2JqZWN0KGl0ZW0pO1xuICAgIGpzb25bXCJ0eXBlXCJdID0gXCJ0ZXh0XCI7XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIHN1cGVyLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLml0ZW1zW2ldLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuaXRlbXNbaV0uaXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGNvbHVtbnMuIEl0ZW1zIGFyZSByZW5kcmVkIGluIG9uZSBsaW5lIGlmIHRoZSB2YWx1ZSBpcyAwLlxuICAgKi9cbiAgcHVibGljIGdldCBjb2xDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2xDb3VudFwiLCAxKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbENvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IDEgfHwgdmFsID4gNSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbENvdW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHRleHQgaW5wdXQgc2l6ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXRlbVNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXRlbVNpemVcIiwgMjUpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXRlbVNpemUodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpdGVtU2l6ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHJlbmRlcmVkIHJvd3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0Um93cygpOiBBcnJheTxhbnk+IHtcbiAgICB2YXIgY29sQ291bnQgPSB0aGlzLmNvbENvdW50O1xuICAgIHZhciBpdGVtcyA9IHRoaXMuaXRlbXM7XG4gICAgdmFyIHJvd3MgPSBbXTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpbmRleCA9PSAwKSB7XG4gICAgICAgIHJvd3MucHVzaChbXSk7XG4gICAgICB9XG4gICAgICByb3dzW3Jvd3MubGVuZ3RoIC0gMV0ucHVzaChpdGVtc1tpXSk7XG4gICAgICBpbmRleCsrO1xuICAgICAgaWYgKGluZGV4ID49IGNvbENvdW50KSB7XG4gICAgICAgIGluZGV4ID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cbiAgcHJpdmF0ZSBpc011bHRpcGxlSXRlbVZhbHVlQ2hhbmdpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uVmFsdWVDaGFuZ2VkKCk7XG4gICAgdGhpcy5vbkl0ZW1WYWx1ZUNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlVGV4dEl0ZW0obmFtZTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsIHtcbiAgICByZXR1cm4gbmV3IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbChuYW1lLCB0aXRsZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uSXRlbVZhbHVlQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5pc011bHRpcGxlSXRlbVZhbHVlQ2hhbmdpbmcpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtVmFsdWUgPSBudWxsO1xuICAgICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy5pdGVtc1tpXS5uYW1lIGluIHRoaXMudmFsdWUpIHtcbiAgICAgICAgaXRlbVZhbHVlID0gdGhpcy52YWx1ZVt0aGlzLml0ZW1zW2ldLm5hbWVdO1xuICAgICAgfVxuICAgICAgdGhpcy5pdGVtc1tpXS5vblZhbHVlQ2hhbmdlZChpdGVtVmFsdWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgaGFzRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHtcbiAgICB2YXIgcmVzID0gc3VwZXIuaGFzRXJyb3JzKGZpcmVDYWxsYmFjayk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMgPSB0aGlzLml0ZW1zW2ldLmVkaXRvci5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrKSB8fCByZXM7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldEFsbEVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHZhciByZXN1bHQgPSBzdXBlci5nZXRBbGxFcnJvcnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlcnJvcnMgPSB0aGlzLml0ZW1zW2ldLmVkaXRvci5nZXRBbGxFcnJvcnMoKTtcbiAgICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChlcnJvcnMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHB1YmxpYyBjbGVhckVycm9ycygpIHtcbiAgICBzdXBlci5jbGVhckVycm9ycygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5lZGl0b3IuY2xlYXJFcnJvcnMoKTtcbiAgICB9XG4gIH1cblxuICAvL0lNdWx0aXBsZVRleHREYXRhXG4gIGdldE11bHRpcGxlVGV4dFZhbHVlKG5hbWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy52YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVbbmFtZV07XG4gIH1cbiAgc2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5pc011bHRpcGxlSXRlbVZhbHVlQ2hhbmdpbmcgPSB0cnVlO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCFuZXdWYWx1ZSkge1xuICAgICAgbmV3VmFsdWUgPSB7fTtcbiAgICB9XG4gICAgbmV3VmFsdWVbbmFtZV0gPSB2YWx1ZTtcbiAgICB0aGlzLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICB0aGlzLmlzTXVsdGlwbGVJdGVtVmFsdWVDaGFuZ2luZyA9IGZhbHNlO1xuICB9XG4gIGdldFN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXk7XG4gIH1cbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvciB7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByb2Nlc3NvcjtcbiAgfVxuICBnZXRBbGxWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRBbGxWYWx1ZXMoKSA6IG51bGw7XG4gIH1cbiAgZ2V0SXNSZXF1aXJlZFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5yZXF1aXJlZFRleHQgOiBcIlwiO1xuICB9XG4gIC8vSVBhbmVsXG4gIGFkZEVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQsIGluZGV4OiBudW1iZXIpIHt9XG4gIHJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibGVmdFwiO1xuICB9XG4gIGdldENoaWxkcmVuTGF5b3V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJvd1wiO1xuICB9XG4gIGVsZW1lbnRXaWR0aENoYW5nZWQoZWw6IElFbGVtZW50KSB7fVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIm11bHRpcGxldGV4dGl0ZW1cIixcbiAgW1xuICAgIFwibmFtZVwiLFxuICAgIFwiaXNSZXF1aXJlZDpib29sZWFuXCIsXG4gICAgeyBuYW1lOiBcInBsYWNlSG9sZGVyXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQbGFjZUhvbGRlclwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJpbnB1dFR5cGVcIixcbiAgICAgIGRlZmF1bHQ6IFwidGV4dFwiLFxuICAgICAgY2hvaWNlczogW1xuICAgICAgICBcImNvbG9yXCIsXG4gICAgICAgIFwiZGF0ZVwiLFxuICAgICAgICBcImRhdGV0aW1lXCIsXG4gICAgICAgIFwiZGF0ZXRpbWUtbG9jYWxcIixcbiAgICAgICAgXCJlbWFpbFwiLFxuICAgICAgICBcIm1vbnRoXCIsXG4gICAgICAgIFwibnVtYmVyXCIsXG4gICAgICAgIFwicGFzc3dvcmRcIixcbiAgICAgICAgXCJyYW5nZVwiLFxuICAgICAgICBcInRlbFwiLFxuICAgICAgICBcInRleHRcIixcbiAgICAgICAgXCJ0aW1lXCIsXG4gICAgICAgIFwidXJsXCIsXG4gICAgICAgIFwid2Vla1wiXG4gICAgICBdXG4gICAgfSxcbiAgICB7IG5hbWU6IFwidGl0bGVcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RpdGxlXCIgfSxcbiAgICB7IG5hbWU6IFwibWF4TGVuZ3RoOm51bWJlclwiLCBkZWZhdWx0OiAtMSB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicmVxdWlyZWRFcnJvclRleHQ6dGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1JlcXVpcmVkRXJyb3JUZXh0XCJcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidmFsaWRhdG9yczp2YWxpZGF0b3JzXCIsXG4gICAgICBiYXNlQ2xhc3NOYW1lOiBcInN1cnZleXZhbGlkYXRvclwiLFxuICAgICAgY2xhc3NOYW1lUGFydDogXCJ2YWxpZGF0b3JcIlxuICAgIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBNdWx0aXBsZVRleHRJdGVtTW9kZWwoXCJcIik7XG4gIH1cbik7XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwibXVsdGlwbGV0ZXh0XCIsXG4gIFtcbiAgICB7IG5hbWU6IFwiIWl0ZW1zOnRleHRpdGVtc1wiLCBjbGFzc05hbWU6IFwibXVsdGlwbGV0ZXh0aXRlbVwiIH0sXG4gICAgeyBuYW1lOiBcIml0ZW1TaXplOm51bWJlclwiLCBkZWZhdWx0OiAyNSB9LFxuICAgIHsgbmFtZTogXCJjb2xDb3VudDpudW1iZXJcIiwgZGVmYXVsdDogMSwgY2hvaWNlczogWzEsIDIsIDMsIDQsIDVdIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibXVsdGlwbGV0ZXh0XCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsKG5hbWUpO1xuICBxLmFkZEl0ZW0oXCJ0ZXh0MVwiKTtcbiAgcS5hZGRJdGVtKFwidGV4dDJcIik7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fbXVsdGlwbGV0ZXh0LnRzIiwiaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgSUVsZW1lbnQsXG4gIElRdWVzdGlvbixcbiAgQmFzZSxcbiAgSVBhbmVsLFxuICBTdXJ2ZXlFcnJvcixcbiAgSVN1cnZleURhdGEsXG4gIElTdXJ2ZXksXG4gIElTdXJ2ZXlJbXBsLFxuICBJVGV4dFByb2Nlc3NvclxufSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgVGV4dFByZVByb2Nlc3NvciwgVGV4dFByZVByb2Nlc3NvclZhbHVlIH0gZnJvbSBcIi4vdGV4dFByZVByb2Nlc3NvclwiO1xuaW1wb3J0IHsgUHJvY2Vzc1ZhbHVlIH0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiwgSUNvbmRpdGlvbk9iamVjdCB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBQYW5lbE1vZGVsIH0gZnJvbSBcIi4vcGFuZWxcIjtcbmltcG9ydCB7IEpzb25PYmplY3QsIFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IEtleUR1cGxpY2F0aW9uRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElRdWVzdGlvblBhbmVsRHluYW1pY0RhdGEge1xuICBnZXRJdGVtSW5kZXgoaXRlbTogSVN1cnZleURhdGEpOiBudW1iZXI7XG4gIGdldFBhbmVsSXRlbURhdGEoaXRlbTogSVN1cnZleURhdGEpOiBhbnk7XG4gIHNldFBhbmVsSXRlbURhdGEoaXRlbTogSVN1cnZleURhdGEsIG5hbWU6IHN0cmluZywgdmFsOiBhbnkpOiBhbnk7XG4gIGdldFNoYXJlZFF1ZXN0aW9uRnJvbUFycmF5KG5hbWU6IHN0cmluZywgcGFuZWxJbmRleDogbnVtYmVyKTogUXVlc3Rpb247XG4gIGdldFN1cnZleSgpOiBJU3VydmV5O1xuICBnZXRSb290RGF0YSgpOiBJU3VydmV5RGF0YTtcbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbVxuICBpbXBsZW1lbnRzIElTdXJ2ZXlEYXRhLCBJU3VydmV5SW1wbCwgSVRleHRQcm9jZXNzb3Ige1xuICBwdWJsaWMgc3RhdGljIEl0ZW1WYXJpYWJsZU5hbWUgPSBcInBhbmVsXCI7XG4gIHB1YmxpYyBzdGF0aWMgSW5kZXhWYXJpYWJsZU5hbWUgPSBcInBhbmVsSW5kZXhcIjtcbiAgcHJpdmF0ZSBwYW5lbFZhbHVlOiBQYW5lbE1vZGVsO1xuICBwcml2YXRlIGRhdGE6IElRdWVzdGlvblBhbmVsRHluYW1pY0RhdGE7XG4gIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvcjogVGV4dFByZVByb2Nlc3NvcjtcbiAgY29uc3RydWN0b3IoZGF0YTogSVF1ZXN0aW9uUGFuZWxEeW5hbWljRGF0YSwgcGFuZWw6IFBhbmVsTW9kZWwpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMucGFuZWxWYWx1ZSA9IHBhbmVsO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3IgPSBuZXcgVGV4dFByZVByb2Nlc3NvcigpO1xuICAgIHRoaXMudGV4dFByZVByb2Nlc3Nvci5vblByb2Nlc3MgPSBmdW5jdGlvbihcbiAgICAgIHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlXG4gICAgKSB7XG4gICAgICBzZWxmLmdldFByb2Nlc3NlZFRleHRWYWx1ZSh0ZXh0VmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy5zZXRTdXJ2ZXlJbXBsKCk7XG4gIH1cbiAgcHVibGljIGdldCBwYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKCkge1xuICAgIHRoaXMucGFuZWwuc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICB2YXIgdmFsdWVzID0gdGhpcy5nZXRBbGxWYWx1ZXMoKTtcbiAgICByZXR1cm4gdmFsdWVzW25hbWVdO1xuICB9XG4gIHB1YmxpYyBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmRhdGEuc2V0UGFuZWxJdGVtRGF0YSh0aGlzLCBuYW1lLCBuZXdWYWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldENvbW1lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5nZXRWYWx1ZShuYW1lICsgc2V0dGluZ3MuY29tbWVudFByZWZpeCk7XG4gICAgcmV0dXJuIHJlc3VsdCA/IHJlc3VsdCA6IFwiXCI7XG4gIH1cbiAgcHVibGljIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRWYWx1ZShuYW1lICsgc2V0dGluZ3MuY29tbWVudFByZWZpeCwgbmV3VmFsdWUpO1xuICB9XG4gIGdldEFsbFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0UGFuZWxJdGVtRGF0YSh0aGlzKTtcbiAgfVxuICBnZXRGaWx0ZXJlZFZhbHVlcygpOiBhbnkge1xuICAgIHZhciB2YWx1ZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7IHBhbmVsOiB0aGlzLmdldEFsbFZhbHVlcygpIH07XG4gICAgdmFyIHN1cnZleVZhbHVlcyA9XG4gICAgICAhIXRoaXMuZGF0YSAmJiAhIXRoaXMuZGF0YS5nZXRSb290RGF0YSgpXG4gICAgICAgID8gdGhpcy5kYXRhLmdldFJvb3REYXRhKCkuZ2V0RmlsdGVyZWRWYWx1ZXMoKVxuICAgICAgICA6IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiBzdXJ2ZXlWYWx1ZXMpIHtcbiAgICAgIHZhbHVlc1trZXldID0gc3VydmV5VmFsdWVzW2tleV07XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cbiAgZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk6IGFueSB7XG4gICAgaWYgKCEhdGhpcy5kYXRhICYmICEhdGhpcy5kYXRhLmdldFJvb3REYXRhKCkpXG4gICAgICByZXR1cm4gdGhpcy5kYXRhLmdldFJvb3REYXRhKCkuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgcmV0dXJuIHsgc3VydmV5OiB0aGlzLmdldFN1cnZleSgpIH07XG4gIH1cbiAgZ2VTdXJ2ZXlEYXRhKCk6IElTdXJ2ZXlEYXRhIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZXRTdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRTdXJ2ZXkoKSA6IG51bGw7XG4gIH1cbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvciB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLy9JVGV4dFByb2Nlc3NvclxuICBwcml2YXRlIGdldFByb2Nlc3NlZFRleHRWYWx1ZSh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSkge1xuICAgIGlmICghdGV4dFZhbHVlKSByZXR1cm47XG4gICAgaWYgKHRleHRWYWx1ZS5uYW1lID09IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbS5JbmRleFZhcmlhYmxlTmFtZSkge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHRoaXMuZGF0YS5nZXRJdGVtSW5kZXgodGhpcykgKyAxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZmlyc3ROYW1lID0gbmV3IFByb2Nlc3NWYWx1ZSgpLmdldEZpcnN0TmFtZSh0ZXh0VmFsdWUubmFtZSk7XG4gICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gZmlyc3ROYW1lID09IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbS5JdGVtVmFyaWFibGVOYW1lO1xuICAgIHRleHRWYWx1ZS5jYW5Qcm9jZXNzID0gdGV4dFZhbHVlLmlzRXhpc3RzO1xuICAgIGlmICghdGV4dFZhbHVlLmNhblByb2Nlc3MpIHJldHVybjtcbiAgICAvL25hbWUgc2hvdWxkIHN0YXJ0IHdpdGggdGhlIHBhbmVsXG4gICAgdGV4dFZhbHVlLm5hbWUgPSB0ZXh0VmFsdWUubmFtZS5yZXBsYWNlKFxuICAgICAgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkl0ZW1WYXJpYWJsZU5hbWUgKyBcIi5cIixcbiAgICAgIFwiXCJcbiAgICApO1xuICAgIHZhciBmaXJzdE5hbWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCkuZ2V0Rmlyc3ROYW1lKHRleHRWYWx1ZS5uYW1lKTtcbiAgICB2YXIgcXVlc3Rpb24gPSA8UXVlc3Rpb24+dGhpcy5wYW5lbC5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKGZpcnN0TmFtZSk7XG4gICAgaWYgKCFxdWVzdGlvbiAmJiAhIXRoaXMuZGF0YSkge1xuICAgICAgcXVlc3Rpb24gPSB0aGlzLmRhdGEuZ2V0U2hhcmVkUXVlc3Rpb25Gcm9tQXJyYXkoXG4gICAgICAgIGZpcnN0TmFtZSxcbiAgICAgICAgdGhpcy5kYXRhLmdldEl0ZW1JbmRleCh0aGlzKVxuICAgICAgKTtcbiAgICB9XG4gICAgdmFyIHZhbHVlcyA9IHt9O1xuICAgIGlmIChxdWVzdGlvbikge1xuICAgICAgKDxhbnk+dmFsdWVzKVtmaXJzdE5hbWVdID0gdGV4dFZhbHVlLnJldHVybkRpc3BsYXlWYWx1ZVxuICAgICAgICA/IHF1ZXN0aW9uLmRpc3BsYXlWYWx1ZVxuICAgICAgICA6IHF1ZXN0aW9uLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYWxsVmFsdWVzID0gdGhpcy5nZXRBbGxWYWx1ZXMoKTtcbiAgICAgIGlmIChhbGxWYWx1ZXMpIHtcbiAgICAgICAgKDxhbnk+dmFsdWVzKVtmaXJzdE5hbWVdID0gYWxsVmFsdWVzW2ZpcnN0TmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIHRleHRWYWx1ZS52YWx1ZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRWYWx1ZSh0ZXh0VmFsdWUubmFtZSwgdmFsdWVzKTtcbiAgfVxuICBwcm9jZXNzVGV4dCh0ZXh0OiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgdGV4dCA9IHRoaXMudGV4dFByZVByb2Nlc3Nvci5wcm9jZXNzKHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSk7XG4gICAgdmFyIHN1cnZleSA9IHRoaXMuZ2V0U3VydmV5KCk7XG4gICAgcmV0dXJuIHN1cnZleSA/IHN1cnZleS5wcm9jZXNzVGV4dCh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUpIDogdGV4dDtcbiAgfVxuICBwcm9jZXNzVGV4dEV4KHRleHQ6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKTogYW55IHtcbiAgICB0ZXh0ID0gdGhpcy5wcm9jZXNzVGV4dCh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUpO1xuICAgIHZhciBoYXNBbGxWYWx1ZXNPbkxhc3RSdW4gPSB0aGlzLnRleHRQcmVQcm9jZXNzb3IuaGFzQWxsVmFsdWVzT25MYXN0UnVuO1xuICAgIHZhciByZXMgPSB7IGhhc0FsbFZhbHVlc09uTGFzdFJ1bjogdHJ1ZSwgdGV4dDogdGV4dCB9O1xuICAgIGlmICh0aGlzLmdldFN1cnZleSgpKSB7XG4gICAgICByZXMgPSB0aGlzLmdldFN1cnZleSgpLnByb2Nlc3NUZXh0RXgodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlLCBmYWxzZSk7XG4gICAgfVxuICAgIHJlcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4gPVxuICAgICAgcmVzLmhhc0FsbFZhbHVlc09uTGFzdFJ1biAmJiBoYXNBbGxWYWx1ZXNPbkxhc3RSdW47XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25QYW5lbER5bmFtaWNUZW1wbGF0ZVN1cnZleUltcGwgaW1wbGVtZW50cyBJU3VydmV5SW1wbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRhOiBJUXVlc3Rpb25QYW5lbER5bmFtaWNEYXRhKSB7fVxuICBnZVN1cnZleURhdGEoKTogSVN1cnZleURhdGEge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldFN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmdldFN1cnZleSgpO1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBwYW5lbCBkeW1hbmljIHF1ZXN0aW9uLiBZb3Ugc2V0dXAgdGhlIHRlbXBsYXRlIHBhbmVsLCBidXQgYWRkaW5nIGVsZW1lbnRzIChhbnkgcXVlc3Rpb24gb3IgYSBwYW5lbCkgYW5kIGFzc2lnbiBhIHRleHQgdG8gaXQncyB0aXRsZSwgYW5kIHRoaXMgcGFuZWwgd2lsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgb24gY3JlYXRpbmcgZHluYW1pYyBwYW5lbHMuIFRoZSBudW1iZXIgb2YgcGFuZWxzIGlzIGRlZmluZWQgYnkgcGFuZWxDb3VudCBwcm9wZXJ0eS5cbiAqIEFuIGVuZC11c2VyIG1heSBkeW5hbWljYWxseSBhZGQvcmVtb3ZlIHBhbmVscywgdW5sZXNzIHlvdSBmb3JiaWRkZW4gdGhpcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwgZXh0ZW5kcyBRdWVzdGlvblxuICBpbXBsZW1lbnRzIElRdWVzdGlvblBhbmVsRHluYW1pY0RhdGEge1xuICBwcml2YXRlIHRlbXBsYXRlVmFsdWU6IFBhbmVsTW9kZWw7XG4gIHByaXZhdGUgbG9hZGluZ1BhbmVsQ291bnQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBjaGFuZ2luZ1ZhbHVlUXVlc3Rpb246IFF1ZXN0aW9uO1xuICBwcml2YXRlIGN1cnJlbnRJbmRleFZhbHVlOiBudW1iZXIgPSAtMTtcblxuICByZW5kZXJNb2RlQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBwYW5lbENvdW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjdXJyZW50SW5kZXhDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJwYW5lbHNcIik7XG4gICAgdGhpcy50ZW1wbGF0ZVZhbHVlID0gdGhpcy5jcmVhdGVBbmRTZXR1cE5ld1BhbmVsT2JqZWN0KCk7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZW5kZXJXaWR0aCA9IFwiMTAwJVwiO1xuICAgIHRoaXMudGVtcGxhdGUuc2VsZWN0ZWRFbGVtZW50SW5EZXNpZ24gPSB0aGlzO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMudGVtcGxhdGUuYWRkRWxlbWVudENhbGxiYWNrID0gZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgc2VsZi5hZGRPblByb3BlcnR5Q2hhbmdlZENhbGxiYWNrKGVsZW1lbnQpO1xuICAgICAgc2VsZi5yZWJ1aWxkUGFuZWxzKCk7XG4gICAgfTtcbiAgICB0aGlzLnRlbXBsYXRlLnJlbW92ZUVsZW1lbnRDYWxsYmFjayA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgIHNlbGYucmVidWlsZFBhbmVscygpO1xuICAgIH07XG5cbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29uZmlybURlbGV0ZVRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsQWRkVGV4dFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxSZW1vdmVUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbFByZXZUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbE5leHRUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJwYW5lbHNTdGF0ZVwiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuc2V0UGFuZWxzU3RhdGUoKTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgc2V0U3VydmV5SW1wbCh2YWx1ZTogSVN1cnZleUltcGwpIHtcbiAgICBzdXBlci5zZXRTdXJ2ZXlJbXBsKHZhbHVlKTtcbiAgICB0aGlzLnNldFRlbXBsYXRlUGFuZWxTdXJ2ZXlJbXBsKCk7XG4gICAgdGhpcy5zZXRQYW5lbHNTdXJ2ZXlJbXBsKCk7XG4gIH1cbiAgcHJpdmF0ZSBhc3NpZ25PblByb3BlcnR5Q2hhbmdlZFRvVGVtcGxhdGUoKSB7XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy50ZW1wbGF0ZS5lbGVtZW50cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmFkZE9uUHJvcGVydHlDaGFuZ2VkQ2FsbGJhY2soZWxlbWVudHNbaV0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZE9uUHJvcGVydHlDaGFuZ2VkQ2FsbGJhY2soZWxlbWVudDogSUVsZW1lbnQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgKDxCYXNlPig8YW55PmVsZW1lbnQpKS5vblByb3BlcnR5Q2hhbmdlZC5hZGQoZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucykge1xuICAgICAgc2VsZi5vblRlbXBsYXRlRWxlbWVudFByb3BlcnR5Q2hhbmdlZChlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9KTtcbiAgICBpZiAoZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICAoPFBhbmVsTW9kZWw+KDxhbnk+ZWxlbWVudCkpLmFkZEVsZW1lbnRDYWxsYmFjayA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgc2VsZi5hZGRPblByb3BlcnR5Q2hhbmdlZENhbGxiYWNrKGVsZW1lbnQpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBvblRlbXBsYXRlRWxlbWVudFByb3BlcnR5Q2hhbmdlZChlbGVtZW50OiBhbnksIG9wdGlvbnM6IGFueSkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uIHx8IHRoaXMuaXNEZXNpZ25Nb2RlIHx8IHRoaXMucGFuZWxzLmxlbmd0aCA9PSAwKVxuICAgICAgcmV0dXJuO1xuICAgIHZhciBwcm9wZXJ0eSA9IFNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KGVsZW1lbnQuZ2V0VHlwZSgpLCBvcHRpb25zLm5hbWUpO1xuICAgIGlmICghcHJvcGVydHkpIHJldHVybjtcbiAgICB2YXIgcGFuZWxzID0gdGhpcy5wYW5lbHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHBhbmVsc1tpXS5nZXRRdWVzdGlvbkJ5TmFtZShlbGVtZW50Lm5hbWUpO1xuICAgICAgaWYgKCEhcXVlc3Rpb24gJiYgKDxhbnk+cXVlc3Rpb24pW29wdGlvbnMubmFtZV0gIT09IG9wdGlvbnMubmV3VmFsdWUpIHtcbiAgICAgICAgKDxhbnk+cXVlc3Rpb24pW29wdGlvbnMubmFtZV0gPSBvcHRpb25zLm5ld1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInBhbmVsZHluYW1pY1wiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBbGxvd1RpdGxlTGVmdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5yZW1vdmVFbGVtZW50KGVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0ZW1wbGF0ZSBQYW5lbC4gVGhpcyBwYW5lbCBpcyB1c2VkIGFzIGEgdGVtcGxhdGUgb24gY3JlYXRpZ24gZHluYW1pYyBwYW5lbHNcbiAgICogQHNlZSAgdGVtcGxhdGVFbGVtZW50c1xuICAgKiBAc2VlIHRlbXBsYXRlVGl0bGVcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IHRlbXBsYXRlKCk6IFBhbmVsTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldFBhbmVsKCk6IElQYW5lbCB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB0ZW1wbGF0ZSBQYW5lbCBlbGVtZW50cywgcXVlc3Rpb25zIGFuZCBwYW5lbHMuXG4gICAqIEBzZWUgIHRlbXBsYXRlRWxlbWVudHNcbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgdGVtcGxhdGVFbGVtZW50cygpOiBBcnJheTxJRWxlbWVudD4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLmVsZW1lbnRzO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdGVtcGxhdGUgUGFuZWwgdGl0bGUgcHJvcGVydHkuXG4gICAqIEBzZWUgIHRlbXBsYXRlRWxlbWVudHNcbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgdGVtcGxhdGVUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLnRpdGxlO1xuICB9XG4gIHB1YmxpYyBzZXQgdGVtcGxhdGVUaXRsZShuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS50aXRsZSA9IG5ld1ZhbHVlO1xuICB9XG4gIGdldCBsb2NUZW1wbGF0ZVRpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5sb2NUaXRsZTtcbiAgfVxuICAvKipcbiAgICogVGhlIHRlbXBsYXRlIFBhbmVsIGRlc2NyaXB0aW9uIHByb3BlcnR5LlxuICAgKiBAc2VlICB0ZW1wbGF0ZUVsZW1lbnRzXG4gICAqIEBzZWUgdGVtcGxhdGVcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgdGVtcGxhdGVUaXRsZVxuICAgKi9cbiAgcHVibGljIGdldCB0ZW1wbGF0ZURlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGUuZGVzY3JpcHRpb247XG4gIH1cbiAgcHVibGljIHNldCB0ZW1wbGF0ZURlc2NyaXB0aW9uKG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlLmRlc2NyaXB0aW9uID0gbmV3VmFsdWU7XG4gIH1cbiAgZ2V0IGxvY1RlbXBsYXRlRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLmxvY0Rlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBpdGVtcygpOiBBcnJheTxJU3VydmV5RGF0YT4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaCh0aGlzLnBhbmVsc1tpXS5kYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogVGhlIGFycmF5IG9mIGR5bmFtaWMgcGFuZWxzIGNyZWF0ZWQgYmFzZWQgb24gcGFuZWwgdGVtcGxhdGVcbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFuZWxzKCk6IEFycmF5PFBhbmVsTW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFuZWxzXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgY3VycmVudCBhY3RpdmUgZHluYW1pY2FsIHBhbmVsIHdoZW4gdGhlIHJlbmRlck1vZGUgaXMgbm90IFwibGlzdFwiLiBJZiB0aGVyZSBpcyBubyBkeW1hbWljIHBhbmVsIChwYW5lbENvdW50ID0gMCkgb3IgcmVuZGVyTW9kZSBlcXVhbHMgXCJsaXN0XCIgaXQgcmV0dXJucyAtMSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgYSB2YWx1ZSBmcm9tIDAgdG8gcGFuZWxDb3VudCAtIDEuXG4gICAqIEBzZWUgY3VycmVudFBhbmVsXG4gICAqIEBzZWUgcGFuZWxzXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudEluZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuaXNSZW5kZXJNb2RlTGlzdCkgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLmN1cnJlbnRJbmRleFZhbHVlIDwgMCAmJiB0aGlzLnBhbmVsQ291bnQgPiAwKSB7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleFZhbHVlID0gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3VycmVudEluZGV4VmFsdWUgPj0gdGhpcy5wYW5lbENvdW50KSB7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleFZhbHVlID0gdGhpcy5wYW5lbENvdW50IC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEluZGV4VmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBjdXJyZW50SW5kZXgodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsID49IHRoaXMucGFuZWxDb3VudCkgdmFsID0gdGhpcy5wYW5lbENvdW50IC0gMTtcbiAgICB0aGlzLmN1cnJlbnRJbmRleFZhbHVlID0gdmFsO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY3VycmVudEluZGV4Q2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgYWN0aXZlIGR5bmFtaWNhbCBwYW5lbCB3aGVuIHRoZSByZW5kZXJNb2RlIGlzIG5vdCBcImxpc3RcIi4gSWYgdGhlcmUgaXMgbm8gZHltYW1pYyBwYW5lbCAocGFuZWxDb3VudCA9IDApIG9yIHJlbmRlck1vZGUgZXF1YWxzIFwibGlzdFwiIGl0IHJldHVybnMgbnVsbC5cbiAgICogQHNlZSBjdXJyZW5JbmRleFxuICAgKiBAc2VlIHBhbmVsc1xuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSByZW5kZXJNb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRQYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmN1cnJlbnRJbmRleDtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucGFuZWxzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxzW2luZGV4XTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUsIHRvIHNob3cgYSBjb25maXJtYXRpb24gZGlhbG9nIG9uIHJlbW92aW5nIGEgcGFuZWxcbiAgICogQHNlZSBDb25maXJtRGVsZXRlVGV4dFxuICAgKi9cbiAgcHVibGljIGdldCBjb25maXJtRGVsZXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb25maXJtRGVsZXRlXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbmZpcm1EZWxldGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29uZmlybURlbGV0ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gYSBxdWVzdGlvbiBuYW1lIHVzZWQgaW4gdGhlIHRlbXBsYXRlIHBhbmVsIGFuZCB0aGUgbGlicmFyeSBzaG93cyBkdXBsaWNhdGlvbiBlcnJvciwgaWYgdGhlcmUgYXJlIHNhbWUgdmFsdWVzIGluIGRpZmZlcmVudCBwYW5lbHMgb2YgdGhpcyBxdWVzdGlvbi5cbiAgICogQHNlZSBrZXlEdXBsaWNhdGlvbkVycm9yXG4gICAqL1xuICBwdWJsaWMgZ2V0IGtleU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwia2V5TmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGtleU5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJrZXlOYW1lXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0IHNob3dpbmcgaW4gdGhlIGNvbmZpcm1hdGlvbiBkZWxldGUgZGlhbG9nIG9uIHJlbW92aW5nIGEgcGFuZWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbmZpcm1EZWxldGVUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwiY29uZmlybURlbGV0ZVRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjb25maXJtRGVsZXRlXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbmZpcm1EZWxldGVUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb25maXJtRGVsZXRlVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NDb25maXJtRGVsZXRlVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb25maXJtRGVsZXRlVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGR1cGxpY2F0aW9uIHZhbHVlIGVycm9yIHRleHQuIFNldCBpdCB0byBzaG93IHRoZSB0ZXh0IGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0LlxuICAgKiBAc2VlIGtleU5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXQga2V5RHVwbGljYXRpb25FcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcImtleUR1cGxpY2F0aW9uRXJyb3JcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGtleUR1cGxpY2F0aW9uRXJyb3IodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImtleUR1cGxpY2F0aW9uRXJyb3JcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jS2V5RHVwbGljYXRpb25FcnJvcigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgcHJldmlvdXMgYnV0dG9uIHRleHQuIFByZXZpb3VzIGJ1dHRvbiBzaG93cyB0aGUgcHJldmlvdXMgcGFuZWwsIGNoYW5nZSB0aGUgY3VycmVudFBhbmVsLCB3aGVuIHRoZSByZW5kZXJNb2RlIGRvZXNuJ3QgZXF1YWwgdG8gXCJsaXN0XCIuXG4gICAqIEBzZWUgY3VycmVudFBhbmVsXG4gICAqIEBzZWUgY3VycmVudEluZGV4XG4gICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbFByZXZUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJwYW5lbFByZXZUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicGFnZVByZXZUZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhbmVsUHJldlRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBhbmVsUHJldlRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUGFuZWxQcmV2VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbFByZXZUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgbmV4dCBidXR0b24gdGV4dC4gTmV4dCBidXR0b24gc2hvd3MgdGhlIG5leHQgcGFuZWwsIGNoYW5nZSB0aGUgY3VycmVudFBhbmVsLCB3aGVuIHRoZSByZW5kZXJNb2RlIGRvZXNuJ3QgZXF1YWwgdG8gXCJsaXN0XCIuXG4gICAqIEBzZWUgY3VycmVudFBhbmVsXG4gICAqIEBzZWUgY3VycmVudEluZGV4XG4gICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbE5leHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJwYW5lbE5leHRUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicGFnZU5leHRUZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhbmVsTmV4dFRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBhbmVsTmV4dFRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUGFuZWxOZXh0VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbE5leHRUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYWRkIHBhbmVsIGJ1dHRvbiB0ZXh0LlxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbEFkZFRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJwYW5lbEFkZFRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJhZGRQYW5lbFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbEFkZFRleHQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFuZWxBZGRUZXh0XCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jUGFuZWxBZGRUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsQWRkVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHJlbW92ZSBwYW5lbCBidXR0b24gdGV4dC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGFuZWxSZW1vdmVUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwicGFuZWxSZW1vdmVUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVtb3ZlUGFuZWxcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFuZWxSZW1vdmVUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwYW5lbFJlbW92ZVRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUGFuZWxSZW1vdmVUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsUmVtb3ZlVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHJlbmRlck1vZGUgZXF1YWxzIHRvIFwicHJvZ3Jlc3NUb3BcIiBvciBcInByb2dyZXNzVG9wQm90dG9tXCJcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNQcm9ncmVzc1RvcFNob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucmVuZGVyTW9kZSA9PSBcInByb2dyZXNzVG9wXCIgfHwgdGhpcy5yZW5kZXJNb2RlID09IFwicHJvZ3Jlc3NUb3BCb3R0b21cIlxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSByZW5kZXJNb2RlIGVxdWFscyB0byBcInByb2dyZXNzQm90dG9tXCIgb3IgXCJwcm9ncmVzc1RvcEJvdHRvbVwiXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUHJvZ3Jlc3NCb3R0b21TaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnJlbmRlck1vZGUgPT0gXCJwcm9ncmVzc0JvdHRvbVwiIHx8XG4gICAgICB0aGlzLnJlbmRlck1vZGUgPT0gXCJwcm9ncmVzc1RvcEJvdHRvbVwiXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gY3VycmVudEluZGV4IGlzIG1vcmUgdGhhbiAwLlxuICAgKiBAc2VlIGN1cnJlbkluZGV4XG4gICAqIEBzZWUgY3VycmVuUGFuZWxcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNQcmV2QnV0dG9uU2hvd2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50SW5kZXggPiAwO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiBjdXJyZW50SW5kZXggaXMgbW9yZSB0aGFuIG9yIGVxdWFsIDAgYW5kIGxlc3MgdGhlbiBwYW5lbENvdW50IC0gMS5cbiAgICogQHNlZSBjdXJyZW5JbmRleFxuICAgKiBAc2VlIGN1cnJlblBhbmVsXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBpc05leHRCdXR0b25TaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRJbmRleCA+PSAwICYmIHRoaXMuY3VycmVudEluZGV4IDwgdGhpcy5wYW5lbENvdW50IC0gMTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gc2hvd1JhbmdlSW5Qcm9ncmVzcyBlcXVhbHMgdG8gdHJ1ZSwgcmVuZGVyTW9kZSBkb2Vzbid0IGVxdWFsIHRvIFwibGlzdFwiIGFuZCBwYW5lbENvdW50IGlzID49IDIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUmFuZ2VTaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnNob3dSYW5nZUluUHJvZ3Jlc3MgJiZcbiAgICAgICh0aGlzLmN1cnJlbnRJbmRleCA+PSAwICYmIHRoaXMucGFuZWxDb3VudCA+IDEpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0RWxlbWVudHNJbkRlc2lnbihpbmNsdWRlSGlkZGVuOiBib29sZWFuID0gZmFsc2UpOiBBcnJheTxJRWxlbWVudD4ge1xuICAgIHJldHVybiBpbmNsdWRlSGlkZGVuID8gW3RoaXMudGVtcGxhdGVdIDogdGhpcy50ZW1wbGF0ZUVsZW1lbnRzO1xuICB9XG4gIHByaXZhdGUgaXNBZGRpbmdOZXdQYW5lbHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBhZGRpbmdOZXdQYW5lbHNWYWx1ZTogYW55O1xuICBwcml2YXRlIGlzTmV3UGFuZWxzVmFsdWVDaGFuZ2VkOiBib29sZWFuO1xuICBwcml2YXRlIHByZXBhcmVWYWx1ZUZvclBhbmVsQ3JlYXRpbmcoKSB7XG4gICAgdGhpcy5hZGRpbmdOZXdQYW5lbHNWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgdGhpcy5pc0FkZGluZ05ld1BhbmVscyA9IHRydWU7XG4gICAgdGhpcy5pc05ld1BhbmVsc1ZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xuICB9XG4gIHByaXZhdGUgc2V0VmFsdWVBZnRlclBhbmVsc0NyZWF0aW5nKCkge1xuICAgIHRoaXMuaXNBZGRpbmdOZXdQYW5lbHMgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5pc05ld1BhbmVsc1ZhbHVlQ2hhbmdlZCkge1xuICAgICAgdGhpcy5pc1ZhbHVlQ2hhbmdpbmdJbnRlcm5hbGx5ID0gdHJ1ZTtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmFkZGluZ05ld1BhbmVsc1ZhbHVlO1xuICAgICAgdGhpcy5pc1ZhbHVlQ2hhbmdpbmdJbnRlcm5hbGx5ID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZUNvcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNBZGRpbmdOZXdQYW5lbHNcbiAgICAgID8gdGhpcy5hZGRpbmdOZXdQYW5lbHNWYWx1ZVxuICAgICAgOiBzdXBlci5nZXRWYWx1ZUNvcmUoKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0VmFsdWVDb3JlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc0FkZGluZ05ld1BhbmVscykge1xuICAgICAgdGhpcy5pc05ld1BhbmVsc1ZhbHVlQ2hhbmdlZCA9IHRydWU7XG4gICAgICB0aGlzLmFkZGluZ05ld1BhbmVsc1ZhbHVlID0gbmV3VmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLnNldFZhbHVlQ29yZShuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBnZXQvc2V0IHRoZSBudW1iZXIgb2YgZHluYW1pYyBwYW5lbHMuXG4gICAqIEBzZWUgdGVtcGxhdGVcbiAgICogQHNlZSBtaW5QYW5lbENvdW50XG4gICAqIEBzZWUgbWF4UGFuZWxDb3VudFxuICAgKiBAc2VlIGFkZFBhbmVsXG4gICAqIEBzZWUgcmVtb3ZlUGFuZWxcbiAgICogQHNlZSByZW1vdmVQYW5lbFVJXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhbmVsQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fCB0aGlzLmlzRGVzaWduTW9kZVxuICAgICAgPyB0aGlzLmxvYWRpbmdQYW5lbENvdW50XG4gICAgICA6IHRoaXMucGFuZWxzLmxlbmd0aDtcbiAgfVxuICBwdWJsaWMgc2V0IHBhbmVsQ291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgMCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uIHx8IHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICB0aGlzLmxvYWRpbmdQYW5lbENvdW50ID0gdmFsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsID09IHRoaXMucGFuZWxzLmxlbmd0aCB8fCB0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuICAgIHRoaXMucHJlcGFyZVZhbHVlRm9yUGFuZWxDcmVhdGluZygpO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLnBhbmVsQ291bnQ7IGkgPCB2YWw7IGkrKykge1xuICAgICAgdmFyIHBhbmVsID0gdGhpcy5jcmVhdGVOZXdQYW5lbCgpO1xuICAgICAgdGhpcy5wYW5lbHMucHVzaChwYW5lbCk7XG4gICAgICBpZiAodGhpcy5yZW5kZXJNb2RlID09IFwibGlzdFwiICYmIHRoaXMucGFuZWxzU3RhdGUgIT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgICAgaWYgKHRoaXMucGFuZWxzU3RhdGUgPT09IFwiZXhwYW5kXCIpIHtcbiAgICAgICAgICBwYW5lbC5leHBhbmQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYW5lbC5jb2xsYXBzZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWwgPCB0aGlzLnBhbmVsQ291bnQpIHRoaXMucGFuZWxzLnNwbGljZSh2YWwsIHRoaXMucGFuZWxDb3VudCAtIHZhbCk7XG4gICAgdGhpcy5zZXRWYWx1ZUFmdGVyUGFuZWxzQ3JlYXRpbmcoKTtcbiAgICB0aGlzLnNldFZhbHVlQmFzZWRPblBhbmVsQ291bnQoKTtcbiAgICB0aGlzLnJlUnVuQ29uZGl0aW9uKCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5wYW5lbENvdW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gYWxsb3cgdGhlIGVuZC11c2VyIHRvIGNvbGxhcHNlL2V4cGFuZCB0aGUgcGFuZWxzLiBJdCB3b3JrcyBvbmx5IGlmIHRoZSByZW5kZXJNb2RlIHByb3BlcnR5IGVxdWFscyB0byBcImxpc3RcIiBhbmQgdGVtcGxhdGVUaXRsZSBwcm9wZXJ0eSBpcyBub3QgZW1wdHkuIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBhdmFpbGFibGU6XG4gICAqIDxici8+IGRlZmF1bHQgLSB0aGUgZGVmYXVsdCB2YWx1ZS4gVXNlciBjYW4ndCBjb2xscGFzZS9leHBhbmQgcGFuZWxzXG4gICAqIDxici8+IGV4cGFuZGVkIC0gVXNlciBjYW4gY29sbHBhc2UvZXhwYW5kIHBhbmVscyBhbmQgYWxsIHBhbmVscyBhcmUgZXhwYW5kZWQgYnkgZGVmYXVsdFxuICAgKiA8YnIvPiBjb2xsYXBzZWQgLSBVc2VyIGNhbiBjb2xscGFzZS9leHBhbmQgcGFuZWxzIGFuZCBhbGwgcGFuZWxzIGFyZSBjb2xsYXBzZWQgYnkgZGVmYXVsdFxuICAgKiA8YnIvPiBmaXJzdEV4cGFuZGVkIC0gVXNlciBjYW4gY29sbHBhc2UvZXhwYW5kIHBhbmVscy4gVGhlIGZpcnN0IHBhbmVsIGlzIGV4cGFuZGVkIGFuZCBvdGhlcnMgYXJlIGNvbGxhcHNlZFxuICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICogQHNlZSB0ZW1wbGF0ZVRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhbmVsc1N0YXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhbmVsc1N0YXRlXCIsIFwiZGVmYXVsdFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhbmVsc1N0YXRlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFuZWxzU3RhdGVcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIHNldFRlbXBsYXRlUGFuZWxTdXJ2ZXlJbXBsKCkge1xuICAgIHRoaXMudGVtcGxhdGUuc2V0U3VydmV5SW1wbChcbiAgICAgIHRoaXMuaXNEZXNpZ25Nb2RlXG4gICAgICAgID8gdGhpcy5zdXJ2ZXlJbXBsXG4gICAgICAgIDogbmV3IFF1ZXN0aW9uUGFuZWxEeW5hbWljVGVtcGxhdGVTdXJ2ZXlJbXBsKHRoaXMpXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHNldFBhbmVsc1N1cnZleUltcGwoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhbmVsID0gdGhpcy5wYW5lbHNbaV07XG4gICAgICBpZiAocGFuZWwgPT0gdGhpcy50ZW1wbGF0ZSkgY29udGludWU7XG4gICAgICBwYW5lbC5zZXRTdXJ2ZXlJbXBsKDxRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0+cGFuZWwuZGF0YSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc2V0UGFuZWxzU3RhdGUoKSB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlIHx8IHRoaXMucmVuZGVyTW9kZSAhPSBcImxpc3RcIikgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdGF0ZSA9IHRoaXMucGFuZWxzU3RhdGU7XG4gICAgICBpZiAoc3RhdGUgPT09IFwiZmlyc3RFeHBhbmRlZFwiKSB7XG4gICAgICAgIHN0YXRlID0gaSA9PT0gMCA/IFwiZXhwYW5kZWRcIiA6IFwiY29sbGFwc2VkXCI7XG4gICAgICB9XG4gICAgICB0aGlzLnBhbmVsc1tpXS5zdGF0ZSA9IHN0YXRlO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHNldFZhbHVlQmFzZWRPblBhbmVsQ291bnQoKSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlKSkgdmFsdWUgPSBbXTtcbiAgICBpZiAodmFsdWUubGVuZ3RoID09IHRoaXMucGFuZWxDb3VudCkgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSB2YWx1ZS5sZW5ndGg7IGkgPCB0aGlzLnBhbmVsQ291bnQ7IGkrKykgdmFsdWUucHVzaCh7fSk7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA+IHRoaXMucGFuZWxDb3VudCkge1xuICAgICAgdmFsdWUuc3BsaWNlKHRoaXMucGFuZWxDb3VudCwgdmFsdWUubGVuZ3RoIC0gdGhpcy5wYW5lbENvdW50KTtcbiAgICB9XG4gICAgdGhpcy5pc1ZhbHVlQ2hhbmdpbmdJbnRlcm5hbGx5ID0gdHJ1ZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5pc1ZhbHVlQ2hhbmdpbmdJbnRlcm5hbGx5ID0gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHBhbmVsIGNvdW50LiBBIHVzZXIgY291bGQgbm90IGRlbGV0ZSBhIHBhbmVsIGlmIHRoZSBwYW5lbENvdW50IGVxdWFscyB0byBtaW5QYW5lbENvdW50XG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIG1heFBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgbWluUGFuZWxDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtaW5QYW5lbENvdW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluUGFuZWxDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAwKSB2YWwgPSAwO1xuICAgIGlmICh2YWwgPT0gdGhpcy5taW5QYW5lbENvdW50KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWluUGFuZWxDb3VudFwiLCB2YWwpO1xuICAgIGlmICh2YWwgPiB0aGlzLm1heFBhbmVsQ291bnQpIHRoaXMubWF4UGFuZWxDb3VudCA9IHZhbDtcbiAgICBpZiAodGhpcy5wYW5lbENvdW50IDwgdmFsKSB0aGlzLnBhbmVsQ291bnQgPSB2YWw7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHBhbmVsIGNvdW50LiBBIHVzZXIgY291bGQgbm90IGFkZCBhIHBhbmVsIGlmIHRoZSBwYW5lbENvdW50IGVxdWFscyB0byBtYXhQYW5lbENvdW50XG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIG1pblBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4UGFuZWxDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXG4gICAgICBcIm1heFBhbmVsQ291bnRcIixcbiAgICAgIHNldHRpbmdzLnBhbmVsTWF4aW11bVBhbmVsQ291bnRcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4UGFuZWxDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPD0gMCkgcmV0dXJuO1xuICAgIGlmICh2YWwgPiBzZXR0aW5ncy5wYW5lbE1heGltdW1QYW5lbENvdW50KVxuICAgICAgdmFsID0gc2V0dGluZ3MucGFuZWxNYXhpbXVtUGFuZWxDb3VudDtcbiAgICBpZiAodmFsID09IHRoaXMubWF4UGFuZWxDb3VudCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFBhbmVsQ291bnRcIiwgdmFsKTtcbiAgICBpZiAodmFsIDwgdGhpcy5taW5QYW5lbENvdW50KSB0aGlzLm1pblBhbmVsQ291bnQgPSB2YWw7XG4gICAgaWYgKHRoaXMucGFuZWxDb3VudCA+IHZhbCkgdGhpcy5wYW5lbENvdW50ID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byBoaWRlIHRoZSAnQWRkIE5ldycgYnV0dG9uXG4gICAqIEBzZWUgYWxsb3dSZW1vdmVQYW5lbFxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd0FkZFBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhbGxvd0FkZFBhbmVsXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsb3dBZGRQYW5lbCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd0FkZFBhbmVsXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIHRvIGhpZGUgdGhlICdSZW1vdmUnIGJ1dHRvblxuICAgKiBAc2VlIGFsbG93QWRkUGFuZWxcbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dSZW1vdmVQYW5lbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dSZW1vdmVQYW5lbFwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFsbG93UmVtb3ZlUGFuZWwodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dSZW1vdmVQYW5lbFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSBkaWZmZXJlbnQgZnJvbSBcImRlZmF1bHRcIiB0byBzZXQgdGhlIHNwZWNpZmljIHF1ZXN0aW9uIHRpdGxlIGxvY2F0aW9uIGZvciB0aGUgdGVtcGxhdGUgcXVlc3Rpb25zLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnF1ZXN0aW9uVGl0bGVMb2NhdGlvblxuICAgKiBAc2VlIFBhbmVsTW9kZWxCYXNlLnF1ZXN0aW9uVGl0bGVMb2NhdGlvblxuICAgKi9cbiAgcHVibGljIGdldCB0ZW1wbGF0ZVRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidGVtcGxhdGVUaXRsZUxvY2F0aW9uXCIsIFwiZGVmYXVsdFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRlbXBsYXRlVGl0bGVMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGVtcGxhdGVUaXRsZUxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzaG93L2hpZGUgdGhlIG51bWJlcnMgaW4gdGl0bGVzIGluIHF1ZXN0aW9ucyBpbnNpZGUgYSBkeW5hbWljIHBhbmVsLlxuICAgKiBCeSBkZWZhdWx0IHRoZSB2YWx1ZSBpcyBcIm9mZlwiLiBZb3UgbWF5IHNldCBpdCB0byBcIm9uUGFuZWxcIiBhbmQgdGhlIGZpcnN0IHF1ZXN0aW9uIGluc2lkZSBhIGR5bmFtaWMgcGFuZWwgd2lsbCBzdGFydCB3aXRoIDEgb3IgXCJvblN1cnZleVwiIHRvIGluY2x1ZGUgbmVzdGVkIHF1ZXN0aW9ucyBpbiBkeW1hbWljIHBhbmVscyBpbnRvIGdsb2JhbCBzdXJ2ZXkgcXVlc3Rpb24gbnVtYmVyaW5nLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93UXVlc3Rpb25OdW1iZXJzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dRdWVzdGlvbk51bWJlcnNcIiwgXCJvZmZcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UXVlc3Rpb25OdW1iZXJzKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLCB2YWwpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiAmJiB0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkucXVlc3Rpb25WaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLCB0aGlzLnZpc2libGUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU2hvd3MgdGhlIHJhbmdlIGZyb20gMSB0byBwYW5lbENvdW50IHdoZW4gcmVuZGVyTW9kZSBkb2Vzbid0IGVxdWFsIHRvIFwibGlzdFwiLiBTZXQgdG8gZmFsc2UgdG8gaGlkZSB0aGlzIGVsZW1lbnQuXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1JhbmdlSW5Qcm9ncmVzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1JhbmdlSW5Qcm9ncmVzc1wiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dSYW5nZUluUHJvZ3Jlc3ModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1JhbmdlSW5Qcm9ncmVzc1wiLCB2YWwpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY3VycmVudEluZGV4Q2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogQnkgZGVmYXVsdCB0aGUgcHJvcGVydHkgZXF1YWxzIHRvIFwibGlzdFwiIGFuZCBhbGwgZHluYW1pYyBwYW5lbHMgYXJlIHJlbmRlcmVkIG9uZSBieSBvbmUgb24gdGhlIHBhZ2UuIFlvdSBtYXkgY2hhbmdlIGl0IHRvOiBcInByb2dyZXNzVG9wXCIsIFwicHJvZ3Jlc3NCb3R0b21cIiBvciBcInByb2dyZXNzVG9wQm90dG9tXCIgdG8gcmVuZGVyIG9ubHkgb25lIGR5bmFtaWMgcGFuZWwgYXQgb25jZS4gVGhlIHByb2dyZXNzIGFuZCBuYXZpZ2F0aW9uIGVsZW1lbnRzIGNhbiBiZSByZW5kcmVkIG9uIHRvcCwgYm90dG9tIG9yIGJvdGguXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlbmRlck1vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyTW9kZVwiLCBcImxpc3RcIik7XG4gIH1cbiAgcHVibGljIHNldCByZW5kZXJNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyTW9kZVwiLCB2YWwpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucmVuZGVyTW9kZUNoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHJlbmRlck1vZGUgZXF1YWxzIHRvIFwibGlzdFwiLlxuICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNSZW5kZXJNb2RlTGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJNb2RlID09IFwibGlzdFwiO1xuICB9XG4gIHB1YmxpYyBzZXRWaXNpYmxlSW5kZXgodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkgcmV0dXJuIDA7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSB0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgPT0gXCJvblN1cnZleVwiID8gdmFsdWUgOiAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjb3VudGVyID0gdGhpcy5zZXRQYW5lbFZpc2libGVJbmRleChcbiAgICAgICAgdGhpcy5wYW5lbHNbaV0sXG4gICAgICAgIHN0YXJ0SW5kZXgsXG4gICAgICAgIHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyAhPSBcIm9mZlwiXG4gICAgICApO1xuICAgICAgaWYgKHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyA9PSBcIm9uU3VydmV5XCIpIHtcbiAgICAgICAgc3RhcnRJbmRleCArPSBjb3VudGVyO1xuICAgICAgfVxuICAgIH1cbiAgICBzdXBlci5zZXRWaXNpYmxlSW5kZXgodGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzICE9IFwib25TdXJ2ZXlcIiA/IHZhbHVlIDogLTEpO1xuICAgIHJldHVybiB0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgIT0gXCJvblN1cnZleVwiID8gMSA6IHN0YXJ0SW5kZXggLSB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIHNldFBhbmVsVmlzaWJsZUluZGV4KFxuICAgIHBhbmVsOiBQYW5lbE1vZGVsLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgc2hvd0luZGV4OiBib29sZWFuXG4gICk6IG51bWJlciB7XG4gICAgaWYgKCFzaG93SW5kZXgpIHtcbiAgICAgIHBhbmVsLnNldFZpc2libGVJbmRleCgtMSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIHBhbmVsLnNldFZpc2libGVJbmRleChpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gYW4gZW5kIHVzZXIgbWF5IGFkZCBhIG5ldyBwYW5lbC4gVGhlIHF1ZXN0aW9uIGlzIG5vdCByZWFkIG9ubHkgYW5kIHBhbmVsQ291bnQgbGVzcyB0aGFuIG1heFBhbmVsQ291bnRcbiAgICogQHNlZSBpc1JlYWRPbmx5XG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIG1heFBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgY2FuQWRkUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzRGVzaWduTW9kZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmFsbG93QWRkUGFuZWwgJiZcbiAgICAgICF0aGlzLmlzUmVhZE9ubHkgJiZcbiAgICAgIHRoaXMucGFuZWxDb3VudCA8IHRoaXMubWF4UGFuZWxDb3VudFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIGFuIGVuZCB1c2VyIG1heSByZW1vdmUgYSBwYW5lbC4gVGhlIHF1ZXN0aW9uIGlzIG5vdCByZWFkIG9ubHkgYW5kIHBhbmVsQ291bnQgaXMgbW9yZSB0aGFuIG1pblBhbmVsQ291bnRcbiAgICogQHNlZSBpc1JlYWRPbmx5XG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIG1pblBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgY2FuUmVtb3ZlUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzRGVzaWduTW9kZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmFsbG93UmVtb3ZlUGFuZWwgJiZcbiAgICAgICF0aGlzLmlzUmVhZE9ubHkgJiZcbiAgICAgIHRoaXMucGFuZWxDb3VudCA+IHRoaXMubWluUGFuZWxDb3VudFxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlYnVpbGRQYW5lbHMoKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnByZXBhcmVWYWx1ZUZvclBhbmVsQ3JlYXRpbmcoKTtcbiAgICB2YXIgcGFuZWxzID0gW107XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICBuZXcgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtKHRoaXMsIHRoaXMudGVtcGxhdGUpO1xuICAgICAgcGFuZWxzLnB1c2godGhpcy50ZW1wbGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbENvdW50OyBpKyspIHtcbiAgICAgICAgcGFuZWxzLnB1c2godGhpcy5jcmVhdGVOZXdQYW5lbCgpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wYW5lbHMuc3BsaWNlKDAsIHRoaXMucGFuZWxzLmxlbmd0aCwgLi4ucGFuZWxzKTtcbiAgICB0aGlzLnNldFZhbHVlQWZ0ZXJQYW5lbHNDcmVhdGluZygpO1xuICAgIHRoaXMuc2V0UGFuZWxzU3RhdGUoKTtcbiAgICB0aGlzLnJlUnVuQ29uZGl0aW9uKCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5wYW5lbENvdW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogSWYgaXQgaXMgbm90IGVtcHR5LCB0aGVuIHRoaXMgdmFsdWUgaXMgc2V0IHRvIGV2ZXJ5IG5ldyBwYW5lbCwgaW5jbHVkaW5nIHBhbmVscyBjcmVhdGVkIGluaXRpYWxseSwgdW5sZXNzIHRoZSBkZWZhdWx0VmFsdWUgaXMgbm90IGVtcHR5XG4gICAqIEBzZWUgZGVmYXVsdFZhbHVlXG4gICAqIEBzZWUgZGVmYXVsdFZhbHVlRnJvbUxhc3RSb3dcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVmYXVsdFBhbmVsVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFBhbmVsVmFsdWVcIik7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0UGFuZWxWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRQYW5lbFZhbHVlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlIHRvIGNvcHkgdGhlIHZhbHVlIGludG8gbmV3IGFkZGVkIHBhbmVsIGZyb20gdGhlIGxhc3QgcGFuZWwuIElmIGRlZmF1bHRQYW5lbFZhbHVlIGlzIHNldCBhbmQgdGhpcyBwcm9wZXJ0eSBlcXVhbHMgdG8gdHJ1ZSxcbiAgICogdGhlbiB0aGUgdmFsdWUgZm9yIG5ldyBhZGRlZCBwYW5lbCBpcyBtZXJnaW5nLlxuICAgKiBAc2VlIGRlZmF1bHRWYWx1ZVxuICAgKiBAc2VlIGRlZmF1bHRQYW5lbFZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlZmF1bHRWYWx1ZUZyb21MYXN0UGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZUZyb21MYXN0UGFuZWxcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVmYXVsdFZhbHVlRnJvbUxhc3RQYW5lbCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVGcm9tTGFzdFBhbmVsXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzRGVmYXVsdFZhbHVlRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN1cGVyLmlzRGVmYXVsdFZhbHVlRW1wdHkoKSAmJiB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRQYW5lbFZhbHVlKVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldERlZmF1bHRWYWx1ZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRQYW5lbFZhbHVlKSB8fFxuICAgICAgIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFZhbHVlKVxuICAgICkge1xuICAgICAgc3VwZXIuc2V0RGVmYXVsdFZhbHVlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0VtcHR5KCkgfHwgdGhpcy5wYW5lbENvdW50ID09IDApIHJldHVybjtcbiAgICB2YXIgbmV3VmFsdWUgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxDb3VudDsgaSsrKSB7XG4gICAgICBuZXdWYWx1ZS5wdXNoKHRoaXMuZGVmYXVsdFBhbmVsVmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gIH1cbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwgfHwgIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy5pc1Jvd0VtcHR5KHZhbFtpXSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBpc1Jvd0VtcHR5KHZhbDogYW55KSB7XG4gICAgZm9yICh2YXIgcHJvcCBpbiB2YWwpIHtcbiAgICAgIGlmICh2YWwuaGFzT3duUHJvcGVydHkocHJvcCkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGR5bmFtaWMgcGFuZWwgYmFzZWQgb24gdGhlIHRlbXBsYXRlIFBhbmVsLiBJdCBjaGVja3MgaWYgY2FuQWRkUGFuZWwgcmV0dXJucyB0cnVlIGFuZCB0aGVuIGNhbGxzIGFkZFBhbmVsIG1ldGhvZC5cbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSBwYW5lbHNcbiAgICogQHNlZSBjYW5BZGRQYW5lbFxuICAgKi9cbiAgcHVibGljIGFkZFBhbmVsVUkoKTogUGFuZWxNb2RlbCB7XG4gICAgaWYgKCF0aGlzLmNhbkFkZFBhbmVsKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgbmV3UGFuZWwgPSB0aGlzLmFkZFBhbmVsKCk7XG4gICAgaWYgKHRoaXMucmVuZGVyTW9kZSA9PT0gXCJsaXN0XCIgJiYgdGhpcy5wYW5lbHNTdGF0ZSAhPT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgIG5ld1BhbmVsLmV4cGFuZCgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3UGFuZWw7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBkeW5hbWljIHBhbmVsIGJhc2VkIG9uIHRoZSB0ZW1wbGF0ZSBQYW5lbC5cbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSBwYW5lbHNcbiAgICovXG4gIHB1YmxpYyBhZGRQYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICB0aGlzLnBhbmVsQ291bnQrKztcbiAgICBpZiAoIXRoaXMuaXNSZW5kZXJNb2RlTGlzdCkge1xuICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSB0aGlzLnBhbmVsQ291bnQgLSAxO1xuICAgIH1cbiAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIHZhciBoYXNNb2RpZmllZCA9IGZhbHNlO1xuICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0UGFuZWxWYWx1ZSkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgISFuZXdWYWx1ZSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSAmJlxuICAgICAgICBuZXdWYWx1ZS5sZW5ndGggPT0gdGhpcy5wYW5lbENvdW50XG4gICAgICApIHtcbiAgICAgICAgaGFzTW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvcHlWYWx1ZShuZXdWYWx1ZVtuZXdWYWx1ZS5sZW5ndGggLSAxXSwgdGhpcy5kZWZhdWx0UGFuZWxWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuZGVmYXVsdFZhbHVlRnJvbUxhc3RQYW5lbCAmJlxuICAgICAgISFuZXdWYWx1ZSAmJlxuICAgICAgQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkgJiZcbiAgICAgIG5ld1ZhbHVlLmxlbmd0aCA+IDEgJiZcbiAgICAgIG5ld1ZhbHVlLmxlbmd0aCA9PSB0aGlzLnBhbmVsQ291bnRcbiAgICApIHtcbiAgICAgIGhhc01vZGlmaWVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuY29weVZhbHVlKFxuICAgICAgICBuZXdWYWx1ZVtuZXdWYWx1ZS5sZW5ndGggLSAxXSxcbiAgICAgICAgbmV3VmFsdWVbbmV3VmFsdWUubGVuZ3RoIC0gMl1cbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChoYXNNb2RpZmllZCkge1xuICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHRoaXMuc3VydmV5LmR5bmFtaWNQYW5lbEFkZGVkKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnBhbmVsc1t0aGlzLnBhbmVsQ291bnQgLSAxXTtcbiAgfVxuICBwcml2YXRlIGNvcHlWYWx1ZShzcmM6IGFueSwgZGVzdDogYW55KSB7XG4gICAgZm9yICh2YXIga2V5IGluIGRlc3QpIHtcbiAgICAgIHNyY1trZXldID0gZGVzdFtrZXldO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQ2FsbCByZW1vdmVQYW5lbCBmdW5jdGlvbi4gRG8gbm90aGluZyBpcyBjYW5SZW1vdmVQYW5lbCByZXR1cm5zIGZhbHNlLiBJZiBjb25maXJtRGVsZXRlIHNldCB0byB0cnVlLCBpdCBzaG93cyB0aGUgY29uZmlybWF0aW9uIGRpYWxvZyBmaXJzdC5cbiAgICogQHBhcmFtIHZhbHVlIGEgcGFuZWwgb3IgcGFuZWwgaW5kZXhcbiAgICogQHNlZSByZW1vdmVQYW5lbFxuICAgKiBAc2VlIGNvbmZpcm1EZWxldGVcbiAgICogQHNlZSBjb25maXJtRGVsZXRlVGV4dFxuICAgKiBAc2VlIGNhblJlbW92ZVBhbmVsXG4gICAqXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlUGFuZWxVSSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKCF0aGlzLmNhblJlbW92ZVBhbmVsKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmNvbmZpcm1EZWxldGUgfHwgY29uZmlybSh0aGlzLmNvbmZpcm1EZWxldGVUZXh0KSkge1xuICAgICAgdGhpcy5yZW1vdmVQYW5lbCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBHb2VzIHRvIHRoZSBuZXh0IHBhbmVsIGluIHRoZSBQYW5lbER5bmFtaWNcbiAgICpcbiAgICovXG4gIHB1YmxpYyBnb1RvTmV4dFBhbmVsKCkge1xuICAgIGlmICh0aGlzLnJlbmRlck1vZGUgIT09IFwibGlzdFwiICYmIHRoaXMuY3VycmVudFBhbmVsLmhhc0Vycm9ycygpKSByZXR1cm47XG4gICAgdGhpcy5jdXJyZW50SW5kZXgrKztcbiAgfVxuICAvKipcbiAgICogR29lcyB0byB0aGUgcHJldmlvdXMgcGFuZWwgaW4gdGhlIFBhbmVsRHluYW1pY1xuICAgKlxuICAgKi9cbiAgcHVibGljIGdvVG9QcmV2UGFuZWwoKSB7XG4gICAgdGhpcy5jdXJyZW50SW5kZXgtLTtcbiAgfVxuICAvKipcbiAgICogUmVtb3ZlcyBhIGR5bmFtaWMgcGFuZWwgZnJvbSB0aGUgcGFuZWxzIGFycmF5LlxuICAgKiBAcGFyYW0gdmFsdWUgYSBwYW5lbCBvciBwYW5lbCBpbmRleFxuICAgKiBAc2VlIHBhbmVsc1xuICAgKiBAc2VlIHRlbXBsYXRlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlUGFuZWwodmFsdWU6IGFueSkge1xuICAgIHZhciBpbmRleCA9IHRoaXMuZ2V0UGFuZWxJbmRleCh2YWx1ZSk7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnBhbmVsQ291bnQpIHJldHVybjtcbiAgICB0aGlzLnBhbmVscy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWx1ZSB8fCAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaW5kZXggPj0gdmFsdWUubGVuZ3RoKSByZXR1cm47XG4gICAgdmFsdWUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5wYW5lbENvdW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHRoaXMuc3VydmV5LmR5bmFtaWNQYW5lbFJlbW92ZWQodGhpcywgaW5kZXgpO1xuICB9XG4gIHByaXZhdGUgZ2V0UGFuZWxJbmRleCh2YWw6IGFueSk6IG51bWJlciB7XG4gICAgaWYgKCFpc05hTihwYXJzZUZsb2F0KHZhbCkpICYmIGlzRmluaXRlKHZhbCkpIHJldHVybiB2YWw7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5wYW5lbHNbaV0gPT09IHZhbCB8fCBpdGVtc1tpXSA9PT0gdmFsKSByZXR1cm4gaTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIHZhciBwYW5lbHMgPSB0aGlzLnBhbmVscztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgcGFuZWxzW2ldLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNsZWFySW5jb3JyZWN0VmFsdWVzSW5QYW5lbChpKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFyRXJyb3JzKCkge1xuICAgIHN1cGVyLmNsZWFyRXJyb3JzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYW5lbHNbaV0uY2xlYXJFcnJvcnMoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uRnJvbUFycmF5KG5hbWU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IElRdWVzdGlvbiB7XG4gICAgaWYgKGluZGV4ID49IHRoaXMucGFuZWxDb3VudCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxzW2luZGV4XS5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgfVxuICBwcml2YXRlIGNsZWFySW5jb3JyZWN0VmFsdWVzSW5QYW5lbChpbmRleDogbnVtYmVyKSB7XG4gICAgdmFyIHBhbmVsID0gdGhpcy5wYW5lbHNbaW5kZXhdO1xuICAgIHBhbmVsLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgdmFyIHZhbHVlcyA9ICEhdmFsICYmIGluZGV4IDwgdmFsLmxlbmd0aCA/IHZhbFtpbmRleF0gOiBudWxsO1xuICAgIGlmICghdmFsdWVzKSByZXR1cm47XG4gICAgdmFyIGlzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZXMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXBhbmVsLmdldFF1ZXN0aW9uQnlOYW1lKGtleSkgJiZcbiAgICAgICAgIXRoaXMuZ2V0U2hhcmVkUXVlc3Rpb25Gcm9tQXJyYXkoa2V5LCBpbmRleClcbiAgICAgICkge1xuICAgICAgICBkZWxldGUgdmFsdWVzW2tleV07XG4gICAgICAgIGlzQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYW5nZWQpIHtcbiAgICAgIHZhbFtpbmRleF0gPSB2YWx1ZXM7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0U2hhcmVkUXVlc3Rpb25Gcm9tQXJyYXkoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhbmVsSW5kZXg6IG51bWJlclxuICApOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgJiYgISF0aGlzLnZhbHVlTmFtZVxuICAgICAgPyA8UXVlc3Rpb24+dGhpcy5zdXJ2ZXkuZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZUZyb21BcnJheShcbiAgICAgICAgICB0aGlzLnZhbHVlTmFtZSxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHBhbmVsSW5kZXhcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBhZGRDb25kaXRpb25OYW1lcyhuYW1lczogQXJyYXk8c3RyaW5nPikge1xuICAgIHZhciBwcmVmaXggPSB0aGlzLm5hbWUgKyBcIlswXS5cIjtcbiAgICB2YXIgcGFuZWxOYW1lczogQXJyYXk8YW55PiA9IFtdO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnRlbXBsYXRlLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVlc3Rpb25zW2ldLmFkZENvbmRpdGlvbk5hbWVzKHBhbmVsTmFtZXMpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhbmVsTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5hbWVzLnB1c2gocHJlZml4ICsgcGFuZWxOYW1lc1tpXSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBhZGRDb25kaXRpb25PYmplY3RzQnlDb250ZXh0KFxuICAgIG9iamVjdHM6IEFycmF5PElDb25kaXRpb25PYmplY3Q+LFxuICAgIGNvbnRleHQ6IGFueVxuICApIHtcbiAgICB2YXIgaGFzQ29udGV4dCA9ICEhY29udGV4dFxuICAgICAgPyB0aGlzLnRlbXBsYXRlLnF1ZXN0aW9ucy5pbmRleE9mKGNvbnRleHQpID4gLTFcbiAgICAgIDogZmFsc2U7XG4gICAgdmFyIHByZWZpeE5hbWUgPSB0aGlzLm5hbWUgKyBcIlswXS5cIjtcbiAgICB2YXIgcHJlZml4VGV4dCA9IHRoaXMucHJvY2Vzc2VkVGl0bGUgKyBcIlswXS5cIjtcbiAgICB2YXIgcGFuZWxPYmpzID0gbmV3IEFycmF5PElDb25kaXRpb25PYmplY3Q+KCk7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMudGVtcGxhdGUucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0uYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChwYW5lbE9ianMsIGNvbnRleHQpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhbmVsT2Jqcy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgbmFtZTogcHJlZml4TmFtZSArIHBhbmVsT2Jqc1tpXS5uYW1lLFxuICAgICAgICB0ZXh0OiBwcmVmaXhUZXh0ICsgcGFuZWxPYmpzW2ldLnRleHQsXG4gICAgICAgIHF1ZXN0aW9uOiBwYW5lbE9ianNbaV0ucXVlc3Rpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoaGFzQ29udGV4dCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbE9ianMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBhbmVsT2Jqc1tpXS5xdWVzdGlvbiA9PSBjb250ZXh0KSBjb250aW51ZTtcbiAgICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBcInBhbmVsLlwiICsgcGFuZWxPYmpzW2ldLm5hbWUsXG4gICAgICAgICAgdGV4dDogXCJwYW5lbC5cIiArIHBhbmVsT2Jqc1tpXS50ZXh0LFxuICAgICAgICAgIHF1ZXN0aW9uOiBwYW5lbE9ianNbaV0ucXVlc3Rpb25cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yOiBzdHJpbmcgPSBudWxsLCBwYXRoOiBzdHJpbmcgPSBudWxsKTogYW55IHtcbiAgICBpZiAoIXBhdGgpIHJldHVybiBzdXBlci5nZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yLCBwYXRoKTtcbiAgICB2YXIgcXVlc3Rpb25OYW1lID0gcGF0aDtcbiAgICB2YXIgcG9zID0gcGF0aC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAocG9zID4gLTEpIHtcbiAgICAgIHF1ZXN0aW9uTmFtZSA9IHBhdGguc3Vic3RyKDAsIHBvcyk7XG4gICAgICBwYXRoID0gcGF0aC5zdWJzdHIocG9zICsgMSk7XG4gICAgfVxuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMudGVtcGxhdGUuZ2V0UXVlc3Rpb25CeU5hbWUocXVlc3Rpb25OYW1lKTtcbiAgICBpZiAoIXF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcXVlc3Rpb24uZ2V0Q29uZGl0aW9uSnNvbihvcGVyYXRvciwgcGF0aCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUmVhZE9ubHlDaGFuZ2VkKCkge1xuICAgIHZhciByZWFkT25seSA9IHRoaXMuaXNSZWFkT25seTtcbiAgICB0aGlzLnRlbXBsYXRlLnJlYWRPbmx5ID0gcmVhZE9ubHk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYW5lbHNbaV0ucmVhZE9ubHkgPSByZWFkT25seTtcbiAgICB9XG4gICAgc3VwZXIub25SZWFkT25seUNoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHRoaXMudGVtcGxhdGUucmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHk7XG4gICAgdGhpcy50ZW1wbGF0ZS5vblN1cnZleUxvYWQoKTtcbiAgICBpZiAodGhpcy5sb2FkaW5nUGFuZWxDb3VudCA+IDApIHtcbiAgICAgIHRoaXMucGFuZWxDb3VudCA9IHRoaXMubG9hZGluZ1BhbmVsQ291bnQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgdGhpcy5yZWJ1aWxkUGFuZWxzKCk7XG4gICAgfVxuICAgIHRoaXMuc2V0UGFuZWxzU3VydmV5SW1wbCgpO1xuICAgIHRoaXMuc2V0UGFuZWxzU3RhdGUoKTtcbiAgICB0aGlzLmFzc2lnbk9uUHJvcGVydHlDaGFuZ2VkVG9UZW1wbGF0ZSgpO1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICB9XG4gIHB1YmxpYyBvbkZpcnN0UmVuZGVyaW5nKCkge1xuICAgIHRoaXMudGVtcGxhdGUub25GaXJzdFJlbmRlcmluZygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFuZWxzW2ldLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgICB9XG4gICAgc3VwZXIub25GaXJzdFJlbmRlcmluZygpO1xuICB9XG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBzdXBlci5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB0aGlzLnJ1blBhbmVsc0NvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgcmVSdW5Db25kaXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHJldHVybjtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbihcbiAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCksXG4gICAgICB0aGlzLmdldERhdGFGaWx0ZXJlZFByb3BlcnRpZXMoKVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJ1blBhbmVsc0NvbmRpdGlvbihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICkge1xuICAgIHZhciBuZXdWYWx1ZXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICBuZXdWYWx1ZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlcykpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFuZWxWYWx1ZXMgPSB0aGlzLmdldFBhbmVsSXRlbURhdGEodGhpcy5wYW5lbHNbaV0uZGF0YSk7XG4gICAgICBuZXdWYWx1ZXNbUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkl0ZW1WYXJpYWJsZU5hbWVdID0gcGFuZWxWYWx1ZXM7XG4gICAgICBuZXdWYWx1ZXNbUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkluZGV4VmFyaWFibGVOYW1lXSA9IGk7XG4gICAgICB0aGlzLnBhbmVsc1tpXS5ydW5Db25kaXRpb24obmV3VmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cbiAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYW5lbHNbaV0ub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgICB0aGlzLnBhbmVsc1tpXS5vbkFueVZhbHVlQ2hhbmdlZChcbiAgICAgICAgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkl0ZW1WYXJpYWJsZU5hbWVcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzVmFsdWVDaGFuZ2luZ0ludGVybmFsbHkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoISF0aGlzLmNoYW5naW5nVmFsdWVRdWVzdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuY2hhbmdpbmdWYWx1ZVF1ZXN0aW9uLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZXJyb3NJblBhbmVscyA9IHRoaXMuaGFzRXJyb3JJblBhbmVscyhmaXJlQ2FsbGJhY2spO1xuICAgICAgcmV0dXJuIHN1cGVyLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2spIHx8IGVycm9zSW5QYW5lbHM7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjbGVhclZhbHVlSWZJbnZpc2libGUoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucGFuZWxzW2ldLnF1ZXN0aW9ucztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHF1ZXN0aW9uc1tqXS5jbGVhclZhbHVlSWZJbnZpc2libGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIuY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gIH1cbiAgcHVibGljIGdldEFsbEVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHZhciByZXN1bHQgPSBzdXBlci5nZXRBbGxFcnJvcnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5wYW5lbHNbaV0ucXVlc3Rpb25zO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBxdWVzdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVycm9ycyA9IHF1ZXN0aW9uc1tqXS5nZXRBbGxFcnJvcnMoKTtcbiAgICAgICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4pOiBhbnkge1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmNyZWF0ZVZhbHVlQ29weSgpO1xuICAgIGlmICghdmFsdWVzIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlcykpIHJldHVybiB2YWx1ZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGggJiYgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbCA9IHZhbHVlc1tpXTtcbiAgICAgIGlmICghdmFsKSBjb250aW51ZTtcbiAgICAgIHZhbHVlc1tpXSA9IHRoaXMuZ2V0UGFuZWxEaXNwbGF5VmFsdWUoaSwgdmFsLCBrZXlzQXNUZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFuZWxEaXNwbGF5VmFsdWUoXG4gICAgcGFuZWxJbmRleDogbnVtYmVyLFxuICAgIHZhbDogYW55LFxuICAgIGtleXNBc1RleHQ6IGJvb2xlYW5cbiAgKTogYW55IHtcbiAgICBpZiAoIXZhbCkgcmV0dXJuIHZhbDtcbiAgICB2YXIgcGFuZWwgPSB0aGlzLnBhbmVsc1twYW5lbEluZGV4XTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSBwYW5lbC5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKGtleSk7XG4gICAgICBpZiAoIXF1ZXN0aW9uKSB7XG4gICAgICAgIHF1ZXN0aW9uID0gdGhpcy5nZXRTaGFyZWRRdWVzdGlvbkZyb21BcnJheShrZXksIHBhbmVsSW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKCEhcXVlc3Rpb24pIHtcbiAgICAgICAgdmFsW2tleV0gPSBxdWVzdGlvbi5nZXREaXNwbGF5VmFsdWUoa2V5c0FzVGV4dCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBwcml2YXRlIGhhc0Vycm9ySW5QYW5lbHMoZmlyZUNhbGxiYWNrOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgIHZhciBwYW5lbHMgPSB0aGlzLnBhbmVscztcbiAgICB2YXIga2V5VmFsdWVzOiBBcnJheTxhbnk+ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwbmxFcnJvciA9IHBhbmVsc1tpXS5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrKTtcbiAgICAgIHBubEVycm9yID0gdGhpcy5pc1ZhbHVlRHVwbGljYXRlZChwYW5lbHNbaV0sIGtleVZhbHVlcykgfHwgcG5sRXJyb3I7XG4gICAgICBpZiAoIXRoaXMuaXNSZW5kZXJNb2RlTGlzdCAmJiBwbmxFcnJvciAmJiAhcmVzKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gaTtcbiAgICAgIH1cbiAgICAgIHJlcyA9IHBubEVycm9yIHx8IHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGlzVmFsdWVEdXBsaWNhdGVkKHBhbmVsOiBQYW5lbE1vZGVsLCBrZXlWYWx1ZXM6IEFycmF5PGFueT4pOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMua2V5TmFtZSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBxdWVzdGlvbiA9IDxRdWVzdGlvbj5wYW5lbC5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKHRoaXMua2V5TmFtZSk7XG4gICAgaWYgKCFxdWVzdGlvbiB8fCBxdWVzdGlvbi5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdmFsdWUgPSBxdWVzdGlvbi52YWx1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlID09IGtleVZhbHVlc1tpXSkge1xuICAgICAgICBxdWVzdGlvbi5hZGRFcnJvcihcbiAgICAgICAgICBuZXcgS2V5RHVwbGljYXRpb25FcnJvcih0aGlzLmtleUR1cGxpY2F0aW9uRXJyb3IsIHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBrZXlWYWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdQYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICB2YXIgcGFuZWwgPSB0aGlzLmNyZWF0ZUFuZFNldHVwTmV3UGFuZWxPYmplY3QoKTtcbiAgICB2YXIganNvbiA9IHRoaXMudGVtcGxhdGUudG9KU09OKCk7XG4gICAgbmV3IEpzb25PYmplY3QoKS50b09iamVjdChqc29uLCBwYW5lbCk7XG4gICAgcGFuZWwucmVuZGVyV2lkdGggPSBcIjEwMCVcIjtcbiAgICBwYW5lbC51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gICAgbmV3IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSh0aGlzLCBwYW5lbCk7XG4gICAgcmV0dXJuIHBhbmVsO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVBbmRTZXR1cE5ld1BhbmVsT2JqZWN0KCk6IFBhbmVsTW9kZWwge1xuICAgIHZhciBwYW5lbCA9IHRoaXMuY3JlYXRlTmV3UGFuZWxPYmplY3QoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcGFuZWwub25HZXRRdWVzdGlvblRpdGxlTG9jYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzZWxmLmdldFRlbXBsYXRlUXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk7XG4gICAgfTtcbiAgICByZXR1cm4gcGFuZWw7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUZW1wbGF0ZVF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVRpdGxlTG9jYXRpb24gIT0gXCJkZWZhdWx0XCJcbiAgICAgID8gdGhpcy50ZW1wbGF0ZVRpdGxlTG9jYXRpb25cbiAgICAgIDogdGhpcy5nZXRUaXRsZUxvY2F0aW9uQ29yZSgpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdQYW5lbE9iamVjdCgpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFBhbmVsTW9kZWwoKTtcbiAgfVxuICBwcml2YXRlIHNldFBhbmVsQ291bnRCYXNlZE9uVmFsdWUoKSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSkgcmV0dXJuO1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIHZhciBuZXdQYW5lbENvdW50ID0gdmFsICYmIEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbC5sZW5ndGggOiAwO1xuICAgIGlmIChuZXdQYW5lbENvdW50ID09IDAgJiYgdGhpcy5sb2FkaW5nUGFuZWxDb3VudCA+IDApIHtcbiAgICAgIG5ld1BhbmVsQ291bnQgPSB0aGlzLmxvYWRpbmdQYW5lbENvdW50O1xuICAgIH1cbiAgICB0aGlzLnBhbmVsQ291bnQgPSBuZXdQYW5lbENvdW50O1xuICB9XG4gIHB1YmxpYyBzZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5zZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlKTtcbiAgICB0aGlzLnNldFBhbmVsQ291bnRCYXNlZE9uVmFsdWUoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhbmVsVXBkYXRlVmFsdWVGcm9tU3VydmV5KHRoaXMucGFuZWxzW2ldKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIG9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5vblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYW5lbFN1cnZleVZhbHVlQ2hhbmdlZCh0aGlzLnBhbmVsc1tpXSk7XG4gICAgfVxuICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldFZhbHVlQmFzZWRPblBhbmVsQ291bnQoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBwYW5lbFVwZGF0ZVZhbHVlRnJvbVN1cnZleShwYW5lbDogUGFuZWxNb2RlbCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSBwYW5lbC5xdWVzdGlvbnM7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0UGFuZWxJdGVtRGF0YShwYW5lbC5kYXRhKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICBxLnVwZGF0ZVZhbHVlRnJvbVN1cnZleSh2YWx1ZXNbcS5nZXRWYWx1ZU5hbWUoKV0pO1xuICAgICAgcS51cGRhdGVDb21tZW50RnJvbVN1cnZleShcbiAgICAgICAgdmFsdWVzW3EuZ2V0VmFsdWVOYW1lKCkgKyBzZXR0aW5ncy5jb21tZW50UHJlZml4XVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBwYW5lbFN1cnZleVZhbHVlQ2hhbmdlZChwYW5lbDogUGFuZWxNb2RlbCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSBwYW5lbC5xdWVzdGlvbnM7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0UGFuZWxJdGVtRGF0YShwYW5lbC5kYXRhKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICBxLm9uU3VydmV5VmFsdWVDaGFuZ2VkKHZhbHVlc1txLmdldFZhbHVlTmFtZSgpXSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvblNldERhdGEoKSB7XG4gICAgc3VwZXIub25TZXREYXRhKCk7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICB0aGlzLnNldFRlbXBsYXRlUGFuZWxTdXJ2ZXlJbXBsKCk7XG4gICAgICB0aGlzLnJlYnVpbGRQYW5lbHMoKTtcbiAgICB9XG4gIH1cbiAgLy9JUXVlc3Rpb25QYW5lbER5bmFtaWNEYXRhXG4gIGdldEl0ZW1JbmRleChpdGVtOiBJU3VydmV5RGF0YSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgfVxuICBnZXRQYW5lbEl0ZW1EYXRhKGl0ZW06IElTdXJ2ZXlEYXRhKTogYW55IHtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLml0ZW1zO1xuICAgIHZhciBpbmRleCA9IGl0ZW1zLmluZGV4T2YoaXRlbSk7XG4gICAgdmFyIHFWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKGluZGV4IDwgMCAmJiBBcnJheS5pc0FycmF5KHFWYWx1ZSkgJiYgcVZhbHVlLmxlbmd0aCA+IGl0ZW1zLmxlbmd0aCkge1xuICAgICAgaW5kZXggPSBpdGVtcy5sZW5ndGg7XG4gICAgfVxuICAgIGlmIChpbmRleCA8IDApIHJldHVybiB7fTtcbiAgICBpZiAoIXFWYWx1ZSB8fCAhQXJyYXkuaXNBcnJheShxVmFsdWUpIHx8IHFWYWx1ZS5sZW5ndGggPD0gaW5kZXgpIHJldHVybiB7fTtcbiAgICByZXR1cm4gcVZhbHVlW2luZGV4XTtcbiAgfVxuICBzZXRQYW5lbEl0ZW1EYXRhKGl0ZW06IElTdXJ2ZXlEYXRhLCBuYW1lOiBzdHJpbmcsIHZhbDogYW55KSB7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICB2YXIgaW5kZXggPSBpdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChpbmRleCA8IDApIGluZGV4ID0gaXRlbXMubGVuZ3RoO1xuICAgIHZhciBxVmFsdWUgPSBIZWxwZXJzLmdldFVuYmluZFZhbHVlKHRoaXMudmFsdWUpO1xuICAgIGlmICghcVZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHFWYWx1ZSkpIHtcbiAgICAgIHFWYWx1ZSA9IFtdO1xuICAgIH1cbiAgICBpZiAocVZhbHVlLmxlbmd0aCA8PSBpbmRleCkge1xuICAgICAgZm9yICh2YXIgaSA9IHFWYWx1ZS5sZW5ndGg7IGkgPD0gaW5kZXg7IGkrKykge1xuICAgICAgICBxVmFsdWUucHVzaCh7fSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghcVZhbHVlW2luZGV4XSkgcVZhbHVlW2luZGV4XSA9IHt9O1xuICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkodmFsKSkge1xuICAgICAgcVZhbHVlW2luZGV4XVtuYW1lXSA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHFWYWx1ZVtpbmRleF1bbmFtZV07XG4gICAgfVxuICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5wYW5lbHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNoYW5naW5nVmFsdWVRdWVzdGlvbiA9IHRoaXMucGFuZWxzW2luZGV4XS5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKFxuICAgICAgICBuYW1lXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0gcVZhbHVlO1xuICAgIHRoaXMuY2hhbmdpbmdWYWx1ZVF1ZXN0aW9uID0gbnVsbDtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBxdWVzdGlvbjogdGhpcyxcbiAgICAgICAgcGFuZWw6ICg8UXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtPml0ZW0pLnBhbmVsLFxuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICBpdGVtSW5kZXg6IGluZGV4LFxuICAgICAgICBpdGVtVmFsdWU6IHFWYWx1ZVtpbmRleF0sXG4gICAgICAgIHZhbHVlOiB2YWxcbiAgICAgIH07XG4gICAgICB0aGlzLnN1cnZleS5keW5hbWljUGFuZWxJdGVtVmFsdWVDaGFuZ2VkKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBnZXRTdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5O1xuICB9XG4gIGdldFJvb3REYXRhKCk6IElTdXJ2ZXlEYXRhIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xuICB9XG4gIHB1YmxpYyBnZXRQbGFpbkRhdGEoXG4gICAgb3B0aW9uczoge1xuICAgICAgaW5jbHVkZUVtcHR5PzogYm9vbGVhbjtcbiAgICAgIGNhbGN1bGF0aW9ucz86IEFycmF5PHtcbiAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICB9ID0ge1xuICAgICAgaW5jbHVkZUVtcHR5OiB0cnVlXG4gICAgfVxuICApIHtcbiAgICB2YXIgcXVlc3Rpb25QbGFpbkRhdGEgPSBzdXBlci5nZXRQbGFpbkRhdGEob3B0aW9ucyk7XG4gICAgaWYgKCEhcXVlc3Rpb25QbGFpbkRhdGEpIHtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmlzTm9kZSA9IHRydWU7XG4gICAgICBxdWVzdGlvblBsYWluRGF0YS5kYXRhID0gdGhpcy5wYW5lbHMubWFwKFxuICAgICAgICAocGFuZWw6IFBhbmVsTW9kZWwsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICB2YXIgcGFuZWxEYXRhSXRlbSA9IDxhbnk+e1xuICAgICAgICAgICAgbmFtZTogcGFuZWwubmFtZSB8fCBpbmRleCxcbiAgICAgICAgICAgIHRpdGxlOiBwYW5lbC50aXRsZSB8fCBcIlBhbmVsXCIsXG4gICAgICAgICAgICB2YWx1ZTogcGFuZWwuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogcGFuZWwuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgIGdldFN0cmluZzogKHZhbDogYW55KSA9PlxuICAgICAgICAgICAgICB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiID8gSlNPTi5zdHJpbmdpZnkodmFsKSA6IHZhbCxcbiAgICAgICAgICAgIGlzTm9kZTogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IHBhbmVsLnF1ZXN0aW9uc1xuICAgICAgICAgICAgICAubWFwKChxdWVzdGlvbjogUXVlc3Rpb24pID0+IHF1ZXN0aW9uLmdldFBsYWluRGF0YShvcHRpb25zKSlcbiAgICAgICAgICAgICAgLmZpbHRlcigoZDogYW55KSA9PiAhIWQpXG4gICAgICAgICAgfTtcbiAgICAgICAgICAob3B0aW9ucy5jYWxjdWxhdGlvbnMgfHwgW10pLmZvckVhY2goY2FsY3VsYXRpb24gPT4ge1xuICAgICAgICAgICAgcGFuZWxEYXRhSXRlbVtjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVdID0gKDxhbnk+cGFuZWwpW1xuICAgICAgICAgICAgICBjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHBhbmVsRGF0YUl0ZW07XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBxdWVzdGlvblBsYWluRGF0YTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInBhbmVsZHluYW1pY1wiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJ0ZW1wbGF0ZUVsZW1lbnRzXCIsXG4gICAgICBhbHRlcm5hdGl2ZU5hbWU6IFwicXVlc3Rpb25zXCIsXG4gICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgIGlzTGlnaHRTZXJpYWxpemFibGU6IGZhbHNlXG4gICAgfSxcbiAgICB7IG5hbWU6IFwidGVtcGxhdGVUaXRsZTp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUZW1wbGF0ZVRpdGxlXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRlbXBsYXRlRGVzY3JpcHRpb246dGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RlbXBsYXRlRGVzY3JpcHRpb25cIlxuICAgIH0sXG4gICAgeyBuYW1lOiBcImFsbG93QWRkUGFuZWw6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcImFsbG93UmVtb3ZlUGFuZWw6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJwYW5lbENvdW50Om51bWJlclwiLFxuICAgICAgZGVmYXVsdDogMCxcbiAgICAgIGNob2ljZXM6IFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJtaW5QYW5lbENvdW50Om51bWJlclwiLCBkZWZhdWx0OiAwIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtYXhQYW5lbENvdW50Om51bWJlclwiLFxuICAgICAgZGVmYXVsdDogc2V0dGluZ3MucGFuZWxNYXhpbXVtUGFuZWxDb3VudFxuICAgIH0sXG4gICAgXCJkZWZhdWx0UGFuZWxWYWx1ZTpwYW5lbHZhbHVlXCIsXG4gICAgXCJkZWZhdWx0VmFsdWVGcm9tTGFzdFBhbmVsOmJvb2xlYW5cIixcbiAgICB7XG4gICAgICBuYW1lOiBcInBhbmVsc1N0YXRlXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJjb2xsYXBzZWRcIiwgXCJleHBhbmRlZFwiLCBcImZpcnN0RXhwYW5kZWRcIl1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJrZXlOYW1lXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImtleUR1cGxpY2F0aW9uRXJyb3JcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NLZXlEdXBsaWNhdGlvbkVycm9yXCJcbiAgICB9LFxuICAgIHsgbmFtZTogXCJjb25maXJtRGVsZXRlOmJvb2xlYW5cIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY29uZmlybURlbGV0ZVRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NDb25maXJtRGVsZXRlVGV4dFwiXG4gICAgfSxcbiAgICB7IG5hbWU6IFwicGFuZWxBZGRUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQYW5lbEFkZFRleHRcIiB9LFxuICAgIHsgbmFtZTogXCJwYW5lbFJlbW92ZVRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhbmVsUmVtb3ZlVGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcInBhbmVsUHJldlRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhbmVsUHJldlRleHRcIiB9LFxuICAgIHsgbmFtZTogXCJwYW5lbE5leHRUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQYW5lbE5leHRUZXh0XCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInNob3dRdWVzdGlvbk51bWJlcnNcIixcbiAgICAgIGRlZmF1bHQ6IFwib2ZmXCIsXG4gICAgICBjaG9pY2VzOiBbXCJvZmZcIiwgXCJvblBhbmVsXCIsIFwib25TdXJ2ZXlcIl1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJzaG93UmFuZ2VJblByb2dyZXNzXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInJlbmRlck1vZGVcIixcbiAgICAgIGRlZmF1bHQ6IFwibGlzdFwiLFxuICAgICAgY2hvaWNlczogW1wibGlzdFwiLCBcInByb2dyZXNzVG9wXCIsIFwicHJvZ3Jlc3NCb3R0b21cIiwgXCJwcm9ncmVzc1RvcEJvdHRvbVwiXVxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ0ZW1wbGF0ZVRpdGxlTG9jYXRpb25cIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIl1cbiAgICB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJwYW5lbGR5bmFtaWNcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX3BhbmVsZHluYW1pYy50cyIsImltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hCYXNlIH0gZnJvbSBcIi4vcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgcmFkaW9ncm91cCBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIGV4dGVuZHMgUXVlc3Rpb25DaGVja2JveEJhc2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyYWRpb2dyb3VwXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dElkICsgXCJfMFwiO1xuICB9XG4gIC8qKlxuICAgKiBTaG93IFwiY2xlYXIgYnV0dG9uXCIgZmxhZy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd0NsZWFyQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93Q2xlYXJCdXR0b25cIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd0NsZWFyQnV0dG9uKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dDbGVhckJ1dHRvblwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgY2FuU2hvd0NsZWFyQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNob3dDbGVhckJ1dHRvbiAmJiAhdGhpcy5pc1JlYWRPbmx5O1xuICB9XG4gIHB1YmxpYyBnZXQgY2xlYXJCdXR0b25DYXB0aW9uKCkge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2xlYXJDYXB0aW9uXCIpO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicmFkaW9ncm91cFwiLFxuICBbeyBuYW1lOiBcInNob3dDbGVhckJ1dHRvbjpib29sZWFuXCIsIGRlZmF1bHQ6IGZhbHNlIH1dLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsKFwiXCIpO1xuICB9LFxuICBcImNoZWNrYm94YmFzZVwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInJhZGlvZ3JvdXBcIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsKG5hbWUpO1xuICBxLmNob2ljZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENob2ljZXM7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fcmFkaW9ncm91cC50cyIsImltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgcmF0aW5nIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25SYXRpbmdNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgcHJpdmF0ZSByYXRlczogQXJyYXk8SXRlbVZhbHVlPjtcblxuICByYXRlVmFsdWVzQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLnJhdGVzID0gdGhpcy5jcmVhdGVJdGVtVmFsdWVzKFwicmF0ZXNcIik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJyYXRlc1wiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKHNlbGYucmF0ZVZhbHVlc0NoYW5nZWRDYWxsYmFjayk7XG4gICAgfSk7XG4gICAgdGhpcy5vblByb3BlcnR5Q2hhbmdlZC5hZGQoZnVuY3Rpb24oc2VuZGVyOiBhbnksIG9wdGlvbnM6IGFueSkge1xuICAgICAgaWYgKFxuICAgICAgICBvcHRpb25zLm5hbWUgPT0gXCJyYXRlTWluXCIgfHxcbiAgICAgICAgb3B0aW9ucy5uYW1lID09IFwicmF0ZU1heFwiIHx8XG4gICAgICAgIG9wdGlvbnMubmFtZSA9PSBcInJhdGVTdGVwXCJcbiAgICAgICkge1xuICAgICAgICBzZWxmLmZpcmVDYWxsYmFjayhzZWxmLnJhdGVWYWx1ZXNDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIGxvY01pblJhdGVEZXNjcmlwdGlvblZhbHVlID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcbiAgICAgIFwibWluUmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgICB0aGlzLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgdmFyIGxvY01heFJhdGVEZXNjcmlwdGlvblZhbHVlID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcbiAgICAgIFwibWF4UmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgICB0aGlzLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgbG9jTWluUmF0ZURlc2NyaXB0aW9uVmFsdWUub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICByZXR1cm4gdGV4dCA/IHRleHQgKyBcIiBcIiA6IHRleHQ7XG4gICAgfTtcbiAgICBsb2NNYXhSYXRlRGVzY3JpcHRpb25WYWx1ZS5vbkdldFRleHRDYWxsYmFjayA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgIHJldHVybiB0ZXh0ID8gXCIgXCIgKyB0ZXh0IDogdGV4dDtcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5yYXRlVmFsdWVzQ2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgcmF0ZSBpdGVtcy4gRXZlcnkgaXRlbSBoYXMgdmFsdWUgYW5kIHRleHQuIElmIHRleHQgaXMgZW1wdHksIHRoZSB2YWx1ZSBpcyByZW5kZXJlZC4gVGhlIGl0ZW0gdGV4dCBzdXBwb3J0cyBtYXJrZG93bi4gSWYgaXQgaXMgZW1wdHkgdGhlIGFycmF5IGlzIGdlbmVyYXRlZCBieSB1c2luZyByYXRlTWluLCByYXRlTWF4IGFuZCByYXRlU3RlcCBwcm9wZXJ0aWVzLlxuICAgKiBAc2VlIHJhdGVNaW5cbiAgICogQHNlZSByYXRlTWF4XG4gICAqIEBzZWUgcmF0ZVN0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgcmF0ZVZhbHVlcygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5yYXRlcztcbiAgfVxuICBwdWJsaWMgc2V0IHJhdGVWYWx1ZXModmFsOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZXNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGdlbmVyYXRlIHJhdGUgdmFsdWVzIGlmIHJhdGVWYWx1ZXMgYXJyYXkgaXMgZW1wdHkuIEl0IGlzIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgcmF0aW5nLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxLlxuICAgKiBAc2VlIHJhdGVWYWx1ZXNcbiAgICogQHNlZSByYXRlTWF4XG4gICAqIEBzZWUgcmF0ZVN0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgcmF0ZU1pbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyYXRlTWluXCIsIDEpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmF0ZU1pbih2YWw6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiAmJiB2YWwgPiB0aGlzLnJhdGVNYXggLSB0aGlzLnJhdGVTdGVwKVxuICAgICAgdmFsID0gdGhpcy5yYXRlTWF4IC0gdGhpcy5yYXRlU3RlcDtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyYXRlTWluXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBnZW5lcmF0ZSByYXRlIHZhbHVlcyBpZiByYXRlVmFsdWVzIGFycmF5IGlzIGVtcHR5LiBJdCBpcyB0aGUgbGFzdCB2YWx1ZSBpbiB0aGUgcmF0aW5nLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA1LlxuICAgKiBAc2VlIHJhdGVWYWx1ZXNcbiAgICogQHNlZSByYXRlTWluXG4gICAqIEBzZWUgcmF0ZVN0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgcmF0ZU1heCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyYXRlTWF4XCIsIDUpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmF0ZU1heCh2YWw6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiAmJiB2YWwgPCB0aGlzLnJhdGVNaW4gKyB0aGlzLnJhdGVTdGVwKVxuICAgICAgdmFsID0gdGhpcy5yYXRlTWluICsgdGhpcy5yYXRlU3RlcDtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyYXRlTWF4XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBnZW5lcmF0ZSByYXRlIHZhbHVlcyBpZiByYXRlVmFsdWVzIGFycmF5IGlzIGVtcHR5LiBJdCBpcyB0aGUgc3RlcCB2YWx1ZS4gVGhlIG51bWJlciBvZiByYXRlIHZhbHVlcyBhcmUgKHJhdGVNYXggLSByYXRlTWluKSAvIHJhdGVTdGVwLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxLlxuICAgKiBAc2VlIHJhdGVWYWx1ZXNcbiAgICogQHNlZSByYXRlTWluXG4gICAqIEBzZWUgcmF0ZU1heFxuICAgKi9cbiAgcHVibGljIGdldCByYXRlU3RlcCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyYXRlU3RlcFwiLCAxKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJhdGVTdGVwKHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8PSAwKSB2YWwgPSAxO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiAmJiB2YWwgPiB0aGlzLnJhdGVNYXggLSB0aGlzLnJhdGVNaW4pXG4gICAgICB2YWwgPSB0aGlzLnJhdGVNYXggLSB0aGlzLnJhdGVNaW47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZVN0ZXBcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuKTogYW55IHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHJldHVybiBcIlwiO1xuICAgIHZhciByZXMgPSBJdGVtVmFsdWUuZ2V0VGV4dE9ySHRtbEJ5VmFsdWUoXG4gICAgICB0aGlzLnZpc2libGVSYXRlVmFsdWVzLFxuICAgICAgdGhpcy52YWx1ZVxuICAgICk7XG4gICAgcmV0dXJuICEhcmVzID8gcmVzIDogdGhpcy5jcmVhdGVWYWx1ZUNvcHkoKTtcbiAgfVxuICBnZXQgdmlzaWJsZVJhdGVWYWx1ZXMoKTogSXRlbVZhbHVlW10ge1xuICAgIGlmICh0aGlzLnJhdGVWYWx1ZXMubGVuZ3RoID4gMCkgcmV0dXJuIHRoaXMucmF0ZVZhbHVlcztcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIHZhbHVlID0gdGhpcy5yYXRlTWluO1xuICAgIHdoaWxlIChcbiAgICAgIHZhbHVlIDw9IHRoaXMucmF0ZU1heCAmJlxuICAgICAgcmVzLmxlbmd0aCA8IHNldHRpbmdzLnJhdGluZ01heGltdW1SYXRlVmFsdWVDb3VudFxuICAgICkge1xuICAgICAgcmVzLnB1c2gobmV3IEl0ZW1WYWx1ZSh2YWx1ZSkpO1xuICAgICAgdmFsdWUgKz0gdGhpcy5yYXRlU3RlcDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJhdGluZ1wiO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0Q29tbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydE90aGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgbWluaW11bSAoZmlyc3QpIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pblJhdGVEZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm1pblJhdGVEZXNjcmlwdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pblJhdGVEZXNjcmlwdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibWluUmF0ZURlc2NyaXB0aW9uXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY01pblJhdGVEZXNjcmlwdGlvbigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJtaW5SYXRlRGVzY3JpcHRpb25cIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiBtYXhpbXVtIChsYXN0KSBpdGVtLlxuICAgKi9cbiAgcHVibGljIGdldCBtYXhSYXRlRGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJtYXhSYXRlRGVzY3JpcHRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBtYXhSYXRlRGVzY3JpcHRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm1heFJhdGVEZXNjcmlwdGlvblwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NNYXhSYXRlRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibWF4UmF0ZURlc2NyaXB0aW9uXCIpO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInJhdGluZ1wiLFxuICBbXG4gICAgeyBuYW1lOiBcImhhc0NvbW1lbnQ6Ym9vbGVhblwiLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbW1lbnRUZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29tbWVudFRleHRcIixcbiAgICAgIGxheW91dDogXCJyb3dcIlxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJyYXRlVmFsdWVzOml0ZW12YWx1ZVtdXCJcbiAgICB9LFxuICAgIHsgbmFtZTogXCJyYXRlTWluOm51bWJlclwiLCBkZWZhdWx0OiAxIH0sXG4gICAgeyBuYW1lOiBcInJhdGVNYXg6bnVtYmVyXCIsIGRlZmF1bHQ6IDUgfSxcbiAgICB7IG5hbWU6IFwicmF0ZVN0ZXA6bnVtYmVyXCIsIGRlZmF1bHQ6IDEgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm1pblJhdGVEZXNjcmlwdGlvblwiLFxuICAgICAgYWx0ZXJuYXRpdmVOYW1lOiBcIm1pbmludW1SYXRlRGVzY3JpcHRpb25cIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NNaW5SYXRlRGVzY3JpcHRpb25cIlxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtYXhSYXRlRGVzY3JpcHRpb25cIixcbiAgICAgIGFsdGVybmF0aXZlTmFtZTogXCJtYXhpbXVtUmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jTWF4UmF0ZURlc2NyaXB0aW9uXCJcbiAgICB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25SYXRpbmdNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJyYXRpbmdcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25SYXRpbmdNb2RlbChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX3JhdGluZy50cyIsImltcG9ydCB7IFF1ZXN0aW9uLCBJQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL2Jhc2VcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBub24gdmFsdWUgcXVlc3Rpb24uIFRoaXMgcXVlc3Rpb24gZG9lc24ndCBhZGQgYW55IG5ldyBmdW5jdGlvbmFsaXR5LiBJdCBoaWRlcyBzb21lIHByb3BlcnRpZXMsIGluY2x1ZGluZyB0aGUgdmFsdWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk5vblZhbHVlIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJub252YWx1ZVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzVGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXRUaXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcHVibGljIGdldCBoYXNDb21tZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0QWxsRXJyb3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk5hbWVzKG5hbWVzOiBBcnJheTxzdHJpbmc+KSB7fVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7fVxuICBwdWJsaWMgZ2V0Q29uZGl0aW9uSnNvbihvcGVyYXRvcjogc3RyaW5nID0gbnVsbCwgcGF0aDogc3RyaW5nID0gbnVsbCk6IGFueSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwibm9udmFsdWVcIixcbiAgW1xuICAgIHsgbmFtZTogXCJ0aXRsZVwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJkZXNjcmlwdGlvblwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJ2YWx1ZU5hbWVcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiZW5hYmxlSWZcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiZGVmYXVsdFZhbHVlXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImNvcnJlY3RBbnN3ZXJcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiaXNSZXF1aXJlZFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJyZXF1aXJlZEVycm9yVGV4dFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJyZWFkT25seVwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJ2YWxpZGF0b3JzXCIsIHZpc2libGU6IGZhbHNlIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbk5vblZhbHVlKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25ub252YWx1ZS50cyIsImltcG9ydCB7IHN1cnZleUNzcyB9IGZyb20gXCIuL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmRcIjtcbmV4cG9ydCBjbGFzcyBTdHlsZXNNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgU3VydmV5SlNTdHlsZXNTaGVldElkID0gXCJzdXJ2ZXlqc1wiO1xuXG4gIHB1YmxpYyBzdGF0aWMgU3R5bGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIC8vIFwiLnN2X2Jvb3RzdHJhcF9jc3NcIjpcbiAgICAvLyAgIFwicG9zaXRpb246IHJlbGF0aXZlOyB3aWR0aDogMTAwJTsgYmFja2dyb3VuZC1jb2xvcjogI2Y0ZjRmNFwiLFxuICAgIC8vIFwiLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X2N1c3RvbV9oZWFkZXJcIjpcbiAgICAvLyAgIFwicG9zaXRpb246IGFic29sdXRlOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAyNzVweDsgYmFja2dyb3VuZC1jb2xvcjogI2U3ZTdlNztcIixcbiAgICAvLyBcIi5zdl9ib290c3RyYXBfY3NzIC5zdl9jb250YWluZXJcIjpcbiAgICAvLyAgIFwibWF4LXdpZHRoOiA4MCU7IG1hcmdpbjogYXV0bzsgcG9zaXRpb246IHJlbGF0aXZlOyBjb2xvcjogIzZkNzA3MjsgcGFkZGluZzogMCAxZW07XCIsXG4gICAgLy8gXCIuc3ZfYm9vdHN0cmFwX2NzcyAucGFuZWwtYm9keVwiOlxuICAgIC8vICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgcGFkZGluZzogMWVtIDFlbSA1ZW0gMWVtOyBib3JkZXItdG9wOiAycHggc29saWQgbGlnaHRncmF5O1wiLFxuXG4gICAgXCIuc3ZfbWFpbiBzcGFuXCI6IFwid29yZC1icmVhazogYnJlYWstd29yZDtcIixcblxuICAgIFwiLnN2X21haW4gbGVnZW5kXCI6IFwiYm9yZGVyOiBub25lOyBtYXJnaW46IDA7XCIsXG5cbiAgICBcIi5zdl9ib290c3RyYXBfY3NzIC5zdl9xc3RuXCI6IFwicGFkZGluZzogMC41ZW0gMWVtIDEuNWVtIDFlbTtcIixcbiAgICBcIi5zdl9ib290c3RyYXBfY3NzIC5zdl9xY2JjIGlucHV0W3R5cGU9Y2hlY2tib3hdLCAuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfcWNiYyBpbnB1dFt0eXBlPXJhZGlvXVwiOlxuICAgICAgXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBtYXJnaW4tdG9wOiAtMXB4XCIsXG4gICAgXCIuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfcXN0biBmaWVsZHNldFwiOiBcImRpc3BsYXk6IGJsb2NrO1wiLFxuICAgIFwiLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X3FzdG4gIC5zdl9xX2NoZWNrYm94X2lubGluZSwgLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X3FzdG4gLnN2X3FfcmFkaW9ncm91cF9pbmxpbmVcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnN2X3FfcmFkaW9ncm91cF9jb250cm9sX2xhYmVsXCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZTsgcG9zaXRpb246IHN0YXRpYztcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuY2hlY2tib3hcIjpcbiAgICAgIFwibWFyZ2luLXRvcDoxMHB4O21hcmdpbi1ib3R0b206MTBweDtcIixcblxuICAgIFwiLnN2X3Jvd1wiOiBcImNsZWFyOiBib3RoO1wiLFxuICAgIFwiLnN2X3JvdyAuc3ZfcXN0blwiOiBcImZsb2F0OiBsZWZ0XCIsXG4gICAgXCIuc3Zfcm93IC5zdl9xc3RuOmxhc3QtY2hpbGRcIjogXCJmbG9hdDogbm9uZVwiLFxuICAgIFwiLnN2X3FzdG5cIjogXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHZlcnRpY2FsLWFsaWduOiB0b3A7IG92ZXJmbG93OiBhdXRvO1wiLFxuICAgIFwiLnByb2dyZXNzXCI6IFwid2lkdGg6IDYwJTtcIixcbiAgICBcIi5wcm9ncmVzcy1iYXJcIjogXCJ3aWR0aDogYXV0bzsgbWFyZ2luLWxlZnQ6IDJweDsgbWFyZ2luLXJpZ2h0OiAycHg7XCIsXG4gICAgXCIuc3ZfcF9jb250YWluZXJcIjogXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHZlcnRpY2FsLWFsaWduOiB0b3A7XCIsXG4gICAgXCIuc3ZfcWJsbiAuY2hlY2tib3gtbWF0ZXJpYWxcIjogXCJtYXJnaW4tcmlnaHQ6IDNweDtcIixcbiAgICBcIi5zdl9xY2J4IC5jaGVja2JveC1tYXRlcmlhbFwiOiBcIm1hcmdpbi1yaWdodDogNXB4O1wiLFxuICAgIFwiLnN2X3FjYnggLmNoZWNrYm94IGxhYmVsXCI6IFwianVzdGlmeS1jb250ZW50OiBsZWZ0OyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG4gICAgXCIuc3ZfcXN0biAucmFkaW8gbGFiZWxcIjogXCJqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7IGRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ltZ3NlbCA+IGxhYmVsIGltZ1wiOiBcInBvaW50ZXItZXZlbnRzOiBub25lO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2X3FfaW1nc2VsLnN2X3FfaW1hZ2VwaWNrZXJfaW5saW5lXCI6IFwiZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X3FzdG4gbGFiZWwuc3ZfcV9tX2xhYmVsXCI6XG4gICAgICBcInBvc2l0aW9uOiBhYnNvbHV0ZTsgbWFyZ2luOiAwOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDEwMCU7XCIsXG4gICAgXCIuc3ZfcXN0biB0ZFwiOiBcInBvc2l0aW9uOiByZWxhdGl2ZTtcIixcbiAgICBcIi5zdl9xX210X2l0ZW1fdmFsdWVcIjogXCJmbG9hdDogbGVmdDtcIixcbiAgICBcIi5zdl9xc3RuLnN2X3FzdG5fbGVmdFwiOiBcIm1hcmdpbi10b3A6IDAuNzVlbTtcIixcbiAgICBcIi5zdl9xc3RuIC50aXRsZS1sZWZ0XCI6IFwiZmxvYXQ6IGxlZnQ7IG1hcmdpbi1yaWdodDogMWVtO1wiLFxuICAgIFwiLnN2X3FzdG4gLmNvbnRlbnQtbGVmdFwiOiBcIm92ZXJmbG93OiBoaWRkZW5cIixcbiAgICBcIi5zdl9xX3JhZGlvZ3JvdXBfaW5saW5lIC5zdl9xX3JhZGlvZ3JvdXBfb3RoZXJcIjogXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG4gICAgXCIuc3ZfcV9jaGVja2JveF9pbmxpbmUgLnN2X3FfY2hlY2tib3hfb3RoZXJcIjogXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG4gICAgXCIuc3ZfcV9jaGVja2JveF9pbmxpbmUsIC5zdl9xX3JhZGlvZ3JvdXBfaW5saW5lLCAuc3ZfcV9pbWFnZXBpY2tlcl9pbmxpbmVcIjpcbiAgICAgIFwibGluZS1oZWlnaHQ6IDIuNWVtO1wiLFxuICAgIFwiLmZvcm0taW5saW5lIC5zdl9xX2NoZWNrYm94X2lubGluZTpub3QoOmxhc3QtY2hpbGQpXCI6IFwibWFyZ2luLXJpZ2h0OiAxZW07XCIsXG4gICAgXCIuZm9ybS1pbmxpbmUgLnN2X3FfcmFkaW9ncm91cF9pbmxpbmU6bm90KDpsYXN0LWNoaWxkKVwiOlxuICAgICAgXCJtYXJnaW4tcmlnaHQ6IDFlbTtcIixcbiAgICBcIi5zdl9pbWdzZWwgLnN2X3FfaW1hZ2VwaWNrZXJfaW5saW5lOm5vdCg6bGFzdC1jaGlsZClcIjpcbiAgICAgIFwibWFyZ2luLXJpZ2h0OiAxZW07XCIsXG4gICAgXCIuc3ZfcXN0biBmaWVsZHNldFwiOiBcImJvcmRlcjogbm9uZTsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2X3FfZmlsZV9wbGFjZWhvbGRlclwiOiBcImRpc3BsYXk6bm9uZVwiLFxuXG4gICAgXCIuc3ZfcF90aXRsZVwiOiBcInBhZGRpbmctbGVmdDogMWVtOyBwYWRkaW5nLWJvdHRvbTogMC4zZW07XCIsXG4gICAgXCIuc3ZfcF90aXRsZV9leHBhbmRhYmxlXCI6IFwiY3Vyc29yOiBwb2ludGVyO1wiLFxuICAgIFwiLnN2X3BfdGl0bGUgLnN2X3BhbmVsX2ljb25cIjogXCJmbG9hdDogcmlnaHQ7IG1hcmdpbi1yaWdodDogMWVtO1wiLFxuICAgIFwiLnN2X3BfdGl0bGUgLnN2X3BhbmVsX2ljb246OmJlZm9yZVwiOlxuICAgICAgXCJjb250ZW50OiAnJzsgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOyBwYWRkaW5nOiAwLjVlbTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejROQ2p3aExTMGdSMlZ1WlhKaGRHOXlPaUJCWkc5aVpTQkpiR3gxYzNSeVlYUnZjaUF5TWk0d0xqRXNJRk5XUnlCRmVIQnZjblFnVUd4MVp5MUpiaUF1SUZOV1J5QldaWEp6YVc5dU9pQTJMakF3SUVKMWFXeGtJREFwSUNBdExUNE5Danh6ZG1jZ2RtVnljMmx2YmowaU1TNHhJaUJwWkQwaVRHRjVaWEpmTVNJZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCNGJXeHVjenA0YkdsdWF6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNVGs1T1M5NGJHbHVheUlnZUQwaU1IQjRJaUI1UFNJd2NIZ2lEUW9KSUhacFpYZENiM2c5SWpBZ01DQXhNQ0F4TUNJZ2MzUjViR1U5SW1WdVlXSnNaUzFpWVdOclozSnZkVzVrT201bGR5QXdJREFnTVRBZ01UQTdJaUI0Yld3NmMzQmhZMlU5SW5CeVpYTmxjblpsSWo0TkNqeHpkSGxzWlNCMGVYQmxQU0owWlhoMEwyTnpjeUkrRFFvSkxuTjBNSHRtYVd4c09pTTJSRGN3TnpJN2ZRMEtQQzl6ZEhsc1pUNE5Danh3YjJ4NVoyOXVJR05zWVhOelBTSnpkREFpSUhCdmFXNTBjejBpTWl3eUlEQXNOQ0ExTERrZ01UQXNOQ0E0TERJZ05TdzFJQ0l2UGcwS1BDOXpkbWMrRFFvPSk7XCIsXG4gICAgXCIuc3ZfcF90aXRsZSAuc3ZfcGFuZWxfaWNvbi5zdl9leHBhbmRlZDo6YmVmb3JlXCI6XG4gICAgICBcInRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XCIsXG5cbiAgICBcIi5zdl9xX2ZpbGUgPiBpbnB1dFt0eXBlPWZpbGVdLCAuc3ZfcV9maWxlID4gYnV0dG9uXCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcbiAgICBcIi5zdl9xX2ZpbGVfcHJldmlld1wiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHZlcnRpY2FsLWFsaWduOiB0b3A7IGJvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JheTsgcGFkZGluZzogNXB4OyBtYXJnaW4tdG9wOiAxMHB4O1wiLFxuICAgIFwiLnN2X3FfZmlsZV9wcmV2aWV3ID4gYVwiOlxuICAgICAgXCJkaXNwbGF5OiBibG9jazsgb3ZlcmZsb3c6IGhpZGRlbjsgdmVydGljYWwtYWxpZ246IHRvcDsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XCIsXG4gICAgXCIuc3ZfcV9maWxlX3JlbW92ZV9idXR0b25cIjogXCJsaW5lLWhlaWdodDogbm9ybWFsO1wiLFxuICAgIFwiLnN2X3FfZmlsZV9yZW1vdmVcIjogXCJkaXNwbGF5OiBibG9jazsgY3Vyc29yOiBwb2ludGVyO1wiLFxuXG4gICAgXCIuc3ZfcV9tX2NlbGxfdGV4dFwiOiBcImN1cnNvcjogcG9pbnRlcjtcIixcblxuICAgIFwiLnN2X3FfZGRfb3RoZXJcIjogXCJtYXJnaW4tdG9wOiAxZW07XCIsXG4gICAgXCIuc3ZfcV9kZF9vdGhlciBpbnB1dFwiOiBcIndpZHRoOiAxMDAlO1wiLFxuXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2wtMVwiOlxuICAgICAgXCJ3aWR0aDogMTAwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2wtMlwiOlxuICAgICAgXCJ3aWR0aDogNTAlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmctcmlnaHQ6IDFlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd29yZC1icmVhazogYnJlYWstd29yZDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdi1xLWNvbC0zXCI6XG4gICAgICBcIndpZHRoOiAzMy4zMzMzMyU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZy1yaWdodDogMWVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2LXEtY29sLTRcIjpcbiAgICAgIFwid2lkdGg6IDI1JTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2wtNVwiOlxuICAgICAgXCJ3aWR0aDogMjAlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmctcmlnaHQ6IDFlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd29yZC1icmVhazogYnJlYWstd29yZDtcIixcblxuICAgIFwiLnN2X3FzdG4gLnN2LXEtY29sdW1uLTFcIjpcbiAgICAgIFwid2lkdGg6IDEwMCU7IG1heC13aWR0aDogMTAwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2x1bW4tMlwiOlxuICAgICAgXCJtYXgtd2lkdGg6IDUwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2x1bW4tM1wiOlxuICAgICAgXCJtYXgtd2lkdGg6IDMzLjMzMzMzJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2x1bW4tNFwiOlxuICAgICAgXCJtYXgtd2lkdGg6IDI1JTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2x1bW4tNVwiOlxuICAgICAgXCJtYXgtd2lkdGg6IDIwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG5cbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ZpbGVfaW5wdXRcIjogXCJjb2xvcjogdHJhbnNwYXJlbnQ7XCIsXG5cbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ltZ3NlbCBsYWJlbCA+IGRpdlwiOlxuICAgICAgXCJvdmVyZmxvdzogaGlkZGVuOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgcGFkZGluZzogNHB4OyBib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyYXk7IGJvcmRlci1yYWRpdXM6IDRweDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ltZ3NlbCBsYWJlbCA+IGRpdiA+IGltZywgLnN2X3FzdG4gLnN2X3FfaW1nc2VsIGxhYmVsID4gZGl2ID4gZW1iZWRcIjpcbiAgICAgIFwiZGlzcGxheTogYmxvY2s7XCIsXG5cbiAgICBcIi5zdl9xc3RuIHRhYmxlIHRyIHRkIC5zdl9xX21fY2VsbF9sYWJlbFwiOlxuICAgICAgXCJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDA7IHJpZ2h0OiAwOyB0b3A6IDA7IGJvdHRvbTogMDtcIixcblxuICAgIFwiZi1wYW5lbFwiOiBcInBhZGRpbmc6IDAuNWVtIDFlbTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBsaW5lLWhlaWdodDogMmVtO1wiLFxuXG4gICAgXCIuc3ZfcHJvZ3Jlc3NfYmFyID4gc3BhblwiOiBcIndoaXRlLXNwYWNlOiBub3dyYXA7XCIsXG5cbiAgICBcIi5zdl9xc3RuIC5zdl9xX3NlbGVjdF9jb2x1bW5cIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBtaW4td2lkdGg6IDEwJTtcIixcblxuICAgIFwiLnN2X3FzdG4gLnN2X3Ffc2VsZWN0X2NvbHVtbiA+ICo6bm90KC5zdl90ZWNobmljYWwpXCI6IFwiZGlzcGxheTogYmxvY2s7XCIsXG5cbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnN2X2JvZHkgLnN2X3Bfcm9vdCAuc3ZfcXN0biAuc3ZfcV9zZWxlY3RfY29sdW1uIHRleHRhcmVhXCI6XG4gICAgICBcIm1hcmdpbi1sZWZ0OiAwOyBwYWRkaW5nLWxlZnQ6IDA7IGxpbmUtaGVpZ2h0OiBpbml0aWFsO1wiXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBNZWRpYTogeyBba2V5OiBzdHJpbmddOiB7IG1lZGlhOiBzdHJpbmc7IHN0eWxlOiBzdHJpbmcgfSB9ID0ge1xuICAgIFwiLnN2X3FzdG4gZmllbGRzZXQgLnN2LXEtY29sLTFcIjoge1xuICAgICAgc3R5bGU6IFwid2lkdGg6IDEwMCU7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KVwiXG4gICAgfSxcbiAgICBcIi5zdl9xc3RuIGZpZWxkc2V0IC5zdi1xLWNvbC0yXCI6IHtcbiAgICAgIHN0eWxlOiBcIndpZHRoOiAxMDAlO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfcXN0biBmaWVsZHNldCAuc3YtcS1jb2wtM1wiOiB7XG4gICAgICBzdHlsZTogXCJ3aWR0aDogMTAwJTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpXCJcbiAgICB9LFxuICAgIFwiLnN2X3FzdG4gZmllbGRzZXQgLnN2LXEtY29sLTRcIjoge1xuICAgICAgc3R5bGU6IFwid2lkdGg6IDEwMCU7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KVwiXG4gICAgfSxcbiAgICBcIi5zdl9xc3RuIGZpZWxkc2V0IC5zdi1xLWNvbC01XCI6IHtcbiAgICAgIHN0eWxlOiBcIndpZHRoOiAxMDAlO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweClcIlxuICAgIH0sXG5cbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuXCI6IHtcbiAgICAgIHN0eWxlOiBcImRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIC50aXRsZS1sZWZ0XCI6IHtcbiAgICAgIHN0eWxlOiBcImZsb2F0OiBub25lO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIC5zdl9xX3JhZGlvZ3JvdXBfaW5saW5lLCAuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biAuc3ZfcV9jaGVja2JveF9pbmxpbmUsIC5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIC5zdl9xX2ltYWdlcGlja2VyX2lubGluZVwiOiB7XG4gICAgICBzdHlsZTogXCJkaXNwbGF5OiBibG9jaztcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biB0YWJsZS50YWJsZVwiOiB7XG4gICAgICBzdHlsZTogXCJkaXNwbGF5OiBibG9jaztcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biB0YWJsZS50YWJsZSB0aGVhZFwiOiB7XG4gICAgICBzdHlsZTogXCJkaXNwbGF5OiBub25lO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIHRhYmxlLnRhYmxlIHRib2R5LCAuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biB0YWJsZS50YWJsZSB0ciwgLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gdGFibGUudGFibGUgdGRcIjoge1xuICAgICAgc3R5bGU6IFwiZGlzcGxheTogYmxvY2s7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpXCJcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gdGFibGUudGFibGU6bm90KC5zdl9xX21hdHJpeCkgdGQ6YmVmb3JlXCI6IHtcbiAgICAgIHN0eWxlOiBcImNvbnRlbnQ6IGF0dHIoaGVhZGVycyk7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpXCJcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gdGFibGUuc3ZfcV9tYXRyaXggdGQ6YWZ0ZXJcIjoge1xuICAgICAgc3R5bGU6IFwiY29udGVudDogYXR0cihoZWFkZXJzKTsgcGFkZGluZy1sZWZ0OiAxZW1cIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biAucmFkaW8gbGFiZWwsIC5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIC5jaGVja2JveCBsYWJlbFwiOiB7XG4gICAgICBzdHlsZTogXCJsaW5lLWhlaWdodDogMTJweDsgdmVydGljYWwtYWxpZ246IHRvcDtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfcXN0biBsYWJlbC5zdl9xX21fbGFiZWxcIjoge1xuICAgICAgc3R5bGU6IFwiZGlzcGxheTogaW5saW5lO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jdXN0b21faGVhZGVyXCI6IHtcbiAgICAgIHN0eWxlOiBcImRpc3BsYXk6IG5vbmU7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogMTMwMHB4KVwiXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnN2X2hlYWRlciBoM1wiOiB7XG4gICAgICBzdHlsZTogXCJmb250LXNpemU6IDEuNWVtO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDEzMDBweClcIlxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5zdl9oZWFkZXIgaDMgc3BhblwiOiB7XG4gICAgICBzdHlsZTogXCJmb250LXNpemU6IDAuNzVlbTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA3MDBweClcIlxuICAgIH1cbiAgfTtcblxuICBwdWJsaWMgc3RhdGljIFRoZW1lQ29sb3JzOiB7IFtrZXk6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfSA9IHtcbiAgICBkZWZhdWx0OiB7XG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNlN2U3ZTdcIixcbiAgICAgIFwiJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZjRmNGY0XCIsXG5cbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjMWFiMzk0XCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiIzBhYTM4NFwiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjNmQ3MDcyXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjNmQ3MDcyXCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIlxuICAgIH0sXG4gICAgb3JhbmdlOiB7XG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiM0YTRhNGFcIixcbiAgICAgIFwiJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZjhmOGY4XCIsXG5cbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjZjc4MTE5XCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiI2U3NzEwOVwiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjNGE0YTRhXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjZjc4MTE5XCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIlxuICAgIH0sXG4gICAgZGFya2JsdWU6IHtcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2Q5ZDhkZFwiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmNmY3ZjJcIixcblxuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiMzYzRmNmRcIixcbiAgICAgIFwiJG1haW4taG92ZXItY29sb3JcIjogXCIjMmMzZjVkXCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiM0YTRhNGFcIixcbiAgICAgIFwiJGhlYWRlci1jb2xvclwiOiBcIiM2ZDcwNzJcIixcbiAgICAgIFwiJGJvcmRlci1jb2xvclwiOiBcIiNlN2U3ZTdcIixcblxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCIsXG4gICAgICBcIiRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZkNjU3NVwiXG4gICAgfSxcbiAgICBkYXJrcm9zZToge1xuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZGRkMmNlXCIsXG4gICAgICBcIiRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2Y3ZWZlZFwiLFxuXG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzY4NjU2ZVwiLFxuICAgICAgXCIkbWFpbi1ob3Zlci1jb2xvclwiOiBcIiM1ODU1NWVcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRpbnB1dHMtYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzRhNGE0YVwiLFxuICAgICAgXCIkaGVhZGVyLWNvbG9yXCI6IFwiIzZkNzA3MlwiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNlZDU1NjVcIixcbiAgICAgIFwiJGVycm9yLWJhY2tncm91bmQtY29sb3JcIjogXCIjZmQ2NTc1XCJcbiAgICB9LFxuICAgIHN0b25lOiB7XG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNjZGNjZDJcIixcbiAgICAgIFwiJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZWZlZGY0XCIsXG5cbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjMGYwZjMzXCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiIzE5MTk1NVwiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjMGYwZjMzXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjMGYwZjMzXCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIlxuICAgIH0sXG4gICAgd2ludGVyOiB7XG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiM4MmI4ZGFcIixcbiAgICAgIFwiJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZGFlMWU3XCIsXG5cbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjM2MzYjQwXCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiIzFlMWQyMFwiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjMDAwXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjMDAwXCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIlxuICAgIH0sXG4gICAgd2ludGVyc3RvbmU6IHtcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiIzMyMzIzMlwiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmOGY4ZjhcIixcblxuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiM1YWM4ZmFcIixcbiAgICAgIFwiJG1haW4taG92ZXItY29sb3JcIjogXCIjMDZhMWU3XCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiMwMDBcIixcbiAgICAgIFwiJGhlYWRlci1jb2xvclwiOiBcIiNmZmZcIixcbiAgICAgIFwiJGJvcmRlci1jb2xvclwiOiBcIiNlN2U3ZTdcIixcblxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCIsXG4gICAgICBcIiRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZkNjU3NVwiXG4gICAgfVxuICB9O1xuICBwdWJsaWMgc3RhdGljIFRoZW1lQ3NzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIFwiLnN2X2RlZmF1bHRfY3NzXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3I7XCIsXG5cbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBoclwiOiBcImJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIGlucHV0W3R5cGU9J2J1dHRvbiddLCAuc3ZfZGVmYXVsdF9jc3MgYnV0dG9uXCI6XG4gICAgICBcImNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dFt0eXBlPSdidXR0b24nXTpob3ZlciwgLnN2X2RlZmF1bHRfY3NzIGJ1dHRvbjpob3ZlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9oZWFkZXJcIjogXCJjb2xvcjogJGhlYWRlci1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfY3VzdG9tX2hlYWRlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkaGVhZGVyLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X2NvbnRhaW5lclwiOiBcImNvbG9yOiAkdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfYm9keVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yOyBib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9wcm9ncmVzc1wiOiBcImJhY2tncm91bmQtY29sb3I6ICRib3JkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Byb2dyZXNzX2JhclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Bfcm9vdCA+IC5zdl9yb3dcIjogXCJib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Bfcm9vdCA+IC5zdl9yb3c6bnRoLWNoaWxkKG9kZClcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcF9yb290ID4gLnN2X3JvdzpudGgtY2hpbGQoZXZlbilcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3I7XCIsXG5cbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV9vdGhlciBpbnB1dFwiOlxuICAgICAgXCJjb2xvcjogJHRleHQtY29sb3I7IGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX3RleHRfcm9vdFwiOlxuICAgICAgXCJjb2xvcjogJHRleHQtY29sb3I7IGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX2Ryb3Bkb3duX2NvbnRyb2xcIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dFt0eXBlPSd0ZXh0J11cIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBzZWxlY3RcIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyB0ZXh0YXJlYVwiOlxuICAgICAgXCJjb2xvcjogJHRleHQtY29sb3I7IGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIGlucHV0Om5vdChbdHlwZT0nYnV0dG9uJ10pOm5vdChbdHlwZT0ncmVzZXQnXSk6bm90KFt0eXBlPSdzdWJtaXQnXSk6bm90KFt0eXBlPSdpbWFnZSddKTpub3QoW3R5cGU9J2NoZWNrYm94J10pOm5vdChbdHlwZT0ncmFkaW8nXSlcIjpcbiAgICAgIFwiYm9yZGVyOiAxcHggc29saWQgJGJvcmRlci1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO2NvbG9yOiAkdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dDpub3QoW3R5cGU9J2J1dHRvbiddKTpub3QoW3R5cGU9J3Jlc2V0J10pOm5vdChbdHlwZT0nc3VibWl0J10pOm5vdChbdHlwZT0naW1hZ2UnXSk6bm90KFt0eXBlPSdjaGVja2JveCddKTpub3QoW3R5cGU9J3JhZGlvJ10pOmZvY3VzXCI6XG4gICAgICBcImJvcmRlcjogMXB4IHNvbGlkICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9jb250YWluZXIgLnN2X2JvZHkgLnN2X3Bfcm9vdCAuc3ZfcSAuc3Zfc2VsZWN0X3dyYXBwZXIgLnN2X3FfZHJvcGRvd25fY29udHJvbCBcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX290aGVyIGlucHV0OmZvY3VzXCI6IFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV90ZXh0X3Jvb3Q6Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX2Ryb3Bkb3duX2NvbnRyb2w6Zm9jdXNcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dFt0eXBlPSd0ZXh0J106Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgICcuc3ZfZGVmYXVsdF9jc3MgLnN2X2NvbnRhaW5lciAuc3ZfYm9keSAuc3ZfcF9yb290IC5zdl9xIGlucHV0W3R5cGU9XCJyYWRpb1wiXTpmb2N1cywgLnN2X2RlZmF1bHRfY3NzIC5zdl9jb250YWluZXIgLnN2X2JvZHkgLnN2X3Bfcm9vdCAuc3ZfcSBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Zm9jdXMnOlxuICAgICAgXCJvdXRsaW5lOiAxcHggZG90dGVkICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHNlbGVjdDpmb2N1c1wiOiBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgdGV4dGFyZWE6Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3NlbGVjdF93cmFwcGVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3NlbGVjdF93cmFwcGVyOjpiZWZvcmVcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV9yYXRpbmdfaXRlbS5hY3RpdmUgLnN2X3FfcmF0aW5nX2l0ZW1fdGV4dFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfcmF0aW5nX2l0ZW0gLnN2X3FfcmF0aW5nX2l0ZW1fdGV4dFwiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfcmF0aW5nX2l0ZW0gLnN2X3FfcmF0aW5nX2l0ZW1fdGV4dDpob3ZlclwiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRtYWluLWhvdmVyLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgdGFibGUuc3ZfcV9tYXRyaXggdHJcIjogXCJib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgdGFibGUuc3ZfcV9tYXRyaXhfZHJvcGRvd24gdHJcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHRhYmxlLnN2X3FfbWF0cml4X2R5bmFtaWMgdHJcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfbV9jZWxsX3NlbGVjdGVkXCI6XG4gICAgICBcImNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjtcIixcblxuICAgIFwiLnN2X21haW4gLnN2X3FfZmlsZV9yZW1vdmU6aG92ZXJcIjogXCJjb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICBcIi5zdl9tYWluIC5zdl9xX2ltZ3NlbC5jaGVja2VkIGxhYmVsPmRpdlwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yXCIsXG5cbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcF9kZXNjcmlwdGlvblwiOiBcInBhZGRpbmctbGVmdDogMS4yOWVtO1wiXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBib290c3RyYXBUaGVtZUNzczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICBcIi5zdl9tYWluIC5zdl9xX2ltZ3NlbC5jaGVja2VkIGxhYmVsPmRpdlwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yXCIsXG4gICAgXCIuc3ZfbWFpbiAuc3ZfcF9kZXNjcmlwdGlvblwiOiBcInBhZGRpbmctbGVmdDogMS42NmVtO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X3FzdG5fZXJyb3JfYm90dG9tXCI6IFwibWFyZ2luLXRvcDogMjBweDsgbWFyZ2luLWJvdHRvbTogMDtcIixcbiAgICBcIi5zdl9tYWluIC5wcm9ncmVzc1wiOiBcIndpZHRoOiA2MCU7XCIsXG4gICAgXCIuc3ZfbWFpbiAucHJvZ3Jlc3MtYmFyXCI6XG4gICAgICBcIndpZHRoOiBhdXRvOyBtYXJnaW4tbGVmdDogMnB4OyBtYXJnaW4tcmlnaHQ6IDJweDtcIixcbiAgICBcIi5zdl9tYWluIC50YWJsZT50Ym9keT50cj50ZFwiOiBcIm1pbi13aWR0aDogOTBweDtcIixcbiAgICBcIi5zdl9tYWluIGYtcGFuZWwgLnN2X3FzdG5cIjogXCJwYWRkaW5nOiAwOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1wiXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBib290c3RyYXBtYXRlcmlhbFRoZW1lQ3NzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5mb3JtLWdyb3VwLmlzLWZvY3VzZWQgLmZvcm0tY29udHJvbFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoJG1haW4tY29sb3IsICRtYWluLWNvbG9yKSwgbGluZWFyLWdyYWRpZW50KCNEMkQyRDIsICNEMkQyRDIpO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5mb3JtLWdyb3VwLmlzLWZvY3VzZWQgbGFiZWxcIjpcbiAgICAgIFwiY29sb3I6JG1haW4tY29sb3I7XCIsXG5cbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuc3ZfcXN0biBsYWJlbC5zdl9xX21fbGFiZWxcIjpcbiAgICAgIFwiaGVpZ2h0OiAxMDAlO1wiLFxuXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmNoZWNrYm94IGlucHV0W3R5cGU9Y2hlY2tib3hdOmNoZWNrZWQgKyAuY2hlY2tib3gtbWF0ZXJpYWwgLmNoZWNrXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgbGFiZWwuY2hlY2tib3gtaW5saW5lIGlucHV0W3R5cGU9Y2hlY2tib3hdOmNoZWNrZWQgKyAuY2hlY2tib3gtbWF0ZXJpYWwgLmNoZWNrXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmNoZWNrYm94IGlucHV0W3R5cGU9Y2hlY2tib3hdOmNoZWNrZWQgKyAuY2hlY2tib3gtbWF0ZXJpYWwgLmNoZWNrOmJlZm9yZVwiOlxuICAgICAgXCJjb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgbGFiZWwuY2hlY2tib3gtaW5saW5lIGlucHV0W3R5cGU9Y2hlY2tib3hdOmNoZWNrZWQgKyAuY2hlY2tib3gtbWF0ZXJpYWwgLmNoZWNrOmJlZm9yZVwiOlxuICAgICAgXCJjb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAucmFkaW8gaW5wdXRbdHlwZT1yYWRpb106Y2hlY2tlZCB+IC5jaXJjbGVcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyBsYWJlbC5yYWRpby1pbmxpbmUgaW5wdXRbdHlwZT1yYWRpb106Y2hlY2tlZCB+IC5jaXJjbGVcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAucmFkaW8gaW5wdXRbdHlwZT1yYWRpb106Y2hlY2tlZCB+IC5jaGVja1wiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyBsYWJlbC5yYWRpby1pbmxpbmUgaW5wdXRbdHlwZT1yYWRpb106Y2hlY2tlZCB+IC5jaGVja1wiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuYnRuLWRlZmF1bHQuYWN0aXZlXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yOyBjb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuYnRuLWRlZmF1bHQ6YWN0aXZlXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yOyBjb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuYnRuLXNlY29uZGFyeS5hY3RpdmVcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7IGNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5idG4tc2Vjb25kYXJ5OmFjdGl2ZVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLm9wZW4+LmRyb3Bkb3duLXRvZ2dsZS5idG4tZGVmYXVsdFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgaW5wdXRbdHlwZT0nYnV0dG9uJ10uYnRuLXByaW1hcnksIC5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyBidXR0b24uYnRuLXByaW1hcnlcIjpcbiAgICAgIFwiY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIGlucHV0W3R5cGU9J2J1dHRvbiddLmJ0bi1wcmltYXJ5OmhvdmVyLCAuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgYnV0dG9uLmJ0bi1wcmltYXJ5OmhvdmVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWhvdmVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X3FfaW1nc2VsLmNoZWNrZWQgbGFiZWw+ZGl2XCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuc3ZfcV9maWxlX3JlbW92ZTpob3ZlclwiOlxuICAgICAgXCJjb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuZm9ybS1ncm91cCBpbnB1dFt0eXBlPWZpbGVdXCI6XG4gICAgICBcInBvc2l0aW9uOiByZWxhdGl2ZTsgb3BhY2l0eTogMTtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAucHJvZ3Jlc3NcIjogXCJ3aWR0aDogNjAlO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5wcm9ncmVzcy1iYXJcIjpcbiAgICAgIFwid2lkdGg6IGF1dG87IG1hcmdpbi1sZWZ0OiAycHg7IG1hcmdpbi1yaWdodDogMnB4O1wiXG4gIH07XG5cbiAgcHJpdmF0ZSBzaGVldDogQ1NTU3R5bGVTaGVldCA9IG51bGw7XG5cbiAgc3RhdGljIGZpbmRTaGVldChzdHlsZVNoZWV0SWQ6IHN0cmluZykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgISFkb2N1bWVudC5zdHlsZVNoZWV0c1tpXS5vd25lck5vZGUgJiZcbiAgICAgICAgKDxhbnk+ZG9jdW1lbnQpLnN0eWxlU2hlZXRzW2ldLm93bmVyTm9kZVtcImlkXCJdID09PSBzdHlsZVNoZWV0SWRcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gPENTU1N0eWxlU2hlZXQ+ZG9jdW1lbnQuc3R5bGVTaGVldHNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVNoZWV0KHN0eWxlU2hlZXRJZDogc3RyaW5nKSB7XG4gICAgbGV0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICAgIHN0eWxlLmlkID0gc3R5bGVTaGVldElkO1xuICAgIC8vIEFkZCBhIG1lZGlhIChhbmQvb3IgbWVkaWEgcXVlcnkpIGhlcmUgaWYgeW91J2QgbGlrZSFcbiAgICAvLyBzdHlsZS5zZXRBdHRyaWJ1dGUoXCJtZWRpYVwiLCBcInNjcmVlblwiKVxuICAgIC8vIHN0eWxlLnNldEF0dHJpYnV0ZShcIm1lZGlhXCIsIFwib25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGggOiAxMDI0cHgpXCIpXG4gICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIikpO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIHJldHVybiA8Q1NTU3R5bGVTaGVldD5zdHlsZS5zaGVldDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYXBwbHlUaGVtZShcbiAgICB0aGVtZU5hbWU6IHN0cmluZyA9IFwiZGVmYXVsdFwiLFxuICAgIHRoZW1lU2VsZWN0b3I6IHN0cmluZyA9IFwiLnN2X21haW5cIlxuICApIHtcbiAgICBsZXQgVGhlbWVDc3M6IGFueTtcbiAgICBpZiAoW1wiYm9vdHN0cmFwXCIsIFwiYm9vdHN0cmFwbWF0ZXJpYWxcIl0uaW5kZXhPZih0aGVtZU5hbWUpICE9PSAtMSkge1xuICAgICAgVGhlbWVDc3MgPSAoPGFueT5TdHlsZXNNYW5hZ2VyKVt0aGVtZU5hbWUgKyBcIlRoZW1lQ3NzXCJdO1xuICAgICAgc3VydmV5Q3NzLmN1cnJlbnRUeXBlID0gdGhlbWVOYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICBUaGVtZUNzcyA9IFN0eWxlc01hbmFnZXIuVGhlbWVDc3M7XG4gICAgICBzdXJ2ZXlDc3MuY3VycmVudFR5cGUgPSBcInN0YW5kYXJkXCI7XG4gICAgfVxuXG4gICAgaWYgKFN0eWxlc01hbmFnZXIuRW5hYmxlZCkge1xuICAgICAgbGV0IHNoZWV0ID0gU3R5bGVzTWFuYWdlci5maW5kU2hlZXQodGhlbWVOYW1lICsgdGhlbWVTZWxlY3Rvcik7XG4gICAgICBpZiAoIXNoZWV0KSB7XG4gICAgICAgIHNoZWV0ID0gU3R5bGVzTWFuYWdlci5jcmVhdGVTaGVldCh0aGVtZU5hbWUgKyB0aGVtZVNlbGVjdG9yKTtcbiAgICAgICAgbGV0IHRoZW1lID1cbiAgICAgICAgICBTdHlsZXNNYW5hZ2VyLlRoZW1lQ29sb3JzW3RoZW1lTmFtZV0gfHxcbiAgICAgICAgICBTdHlsZXNNYW5hZ2VyLlRoZW1lQ29sb3JzW1wiZGVmYXVsdFwiXTtcblxuICAgICAgICBPYmplY3Qua2V5cyhUaGVtZUNzcykuZm9yRWFjaChzZWxlY3RvciA9PiB7XG4gICAgICAgICAgbGV0IGNzc1J1bGVUZXh0ID0gVGhlbWVDc3Nbc2VsZWN0b3JdO1xuICAgICAgICAgIE9iamVjdC5rZXlzKHRoZW1lKS5mb3JFYWNoKFxuICAgICAgICAgICAgY29sb3JWYXJpYWJsZU5hbWUgPT5cbiAgICAgICAgICAgICAgKGNzc1J1bGVUZXh0ID0gY3NzUnVsZVRleHQucmVwbGFjZShcbiAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKFwiXFxcXFwiICsgY29sb3JWYXJpYWJsZU5hbWUsIFwiZ1wiKSxcbiAgICAgICAgICAgICAgICB0aGVtZVtjb2xvclZhcmlhYmxlTmFtZV1cbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIHNoZWV0Lmluc2VydFJ1bGUoXG4gICAgICAgICAgICB0aGVtZVNlbGVjdG9yICsgc2VsZWN0b3IgKyBcIiB7IFwiICsgY3NzUnVsZVRleHQgKyBcIiB9XCIsXG4gICAgICAgICAgICAwXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBFbmFibGVkID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoU3R5bGVzTWFuYWdlci5FbmFibGVkKSB7XG4gICAgICB0aGlzLnNoZWV0ID0gU3R5bGVzTWFuYWdlci5maW5kU2hlZXQoU3R5bGVzTWFuYWdlci5TdXJ2ZXlKU1N0eWxlc1NoZWV0SWQpO1xuICAgICAgaWYgKCF0aGlzLnNoZWV0KSB7XG4gICAgICAgIHRoaXMuc2hlZXQgPSBTdHlsZXNNYW5hZ2VyLmNyZWF0ZVNoZWV0KFxuICAgICAgICAgIFN0eWxlc01hbmFnZXIuU3VydmV5SlNTdHlsZXNTaGVldElkXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVN0eWxlcyh0aGlzLnNoZWV0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZVN0eWxlcyhzaGVldDogQ1NTU3R5bGVTaGVldCkge1xuICAgIGlmIChTdHlsZXNNYW5hZ2VyLkVuYWJsZWQpIHtcbiAgICAgIE9iamVjdC5rZXlzKFN0eWxlc01hbmFnZXIuU3R5bGVzKS5mb3JFYWNoKHNlbGVjdG9yID0+XG4gICAgICAgIHNoZWV0Lmluc2VydFJ1bGUoXG4gICAgICAgICAgc2VsZWN0b3IgKyBcIiB7IFwiICsgU3R5bGVzTWFuYWdlci5TdHlsZXNbc2VsZWN0b3JdICsgXCIgfVwiLFxuICAgICAgICAgIDBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIE9iamVjdC5rZXlzKFN0eWxlc01hbmFnZXIuTWVkaWEpLmZvckVhY2goc2VsZWN0b3IgPT4ge1xuICAgICAgICBzaGVldC5pbnNlcnRSdWxlKFxuICAgICAgICAgIFN0eWxlc01hbmFnZXIuTWVkaWFbc2VsZWN0b3JdLm1lZGlhICtcbiAgICAgICAgICAgIFwiIHsgXCIgK1xuICAgICAgICAgICAgc2VsZWN0b3IgK1xuICAgICAgICAgICAgXCIgeyBcIiArXG4gICAgICAgICAgICBTdHlsZXNNYW5hZ2VyLk1lZGlhW3NlbGVjdG9yXS5zdHlsZSArXG4gICAgICAgICAgICBcIiB9IH1cIixcbiAgICAgICAgICAwXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zdHlsZXNtYW5hZ2VyLnRzIiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcIi4vc3VydmV5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBzdXJ2ZXkgcnVubmluZyBpbiB0aGUgV2luZG93LlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5V2luZG93TW9kZWwgZXh0ZW5kcyBCYXNlIHtcbiAgcHVibGljIHN0YXRpYyBzdXJ2ZXlFbGVtZW50TmFtZSA9IFwid2luZG93U3VydmV5SlNcIjtcbiAgc3VydmV5VmFsdWU6IFN1cnZleU1vZGVsO1xuICB3aW5kb3dFbGVtZW50OiBIVE1MRGl2RWxlbWVudDtcblxuICB0ZW1wbGF0ZVZhbHVlOiBzdHJpbmc7XG4gIGV4cGFuZGVkQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBzaG93aW5nQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjbG9zZVdpbmRvd09uQ29tcGxldGVDYWxsYmFjazogKCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3Rvcihqc29uT2JqOiBhbnksIGluaXRpYWxNb2RlbDogU3VydmV5TW9kZWwgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAoaW5pdGlhbE1vZGVsKSB7XG4gICAgICB0aGlzLnN1cnZleVZhbHVlID0gaW5pdGlhbE1vZGVsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1cnZleVZhbHVlID0gdGhpcy5jcmVhdGVTdXJ2ZXkoanNvbk9iaik7XG4gICAgfVxuICAgIHRoaXMuc3VydmV5VmFsdWUuc2hvd1RpdGxlID0gZmFsc2U7XG4gICAgaWYgKFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBkb2N1bWVudCkge1xuICAgICAgdGhpcy53aW5kb3dFbGVtZW50ID0gPEhUTUxEaXZFbGVtZW50PmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgfVxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnN1cnZleS5vbkNvbXBsZXRlLmFkZChmdW5jdGlvbihzdXJ2ZXksIG9wdGlvbnMpIHtcbiAgICAgIHNlbGYub25TdXJ2ZXlDb21wbGV0ZSgpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwid2luZG93XCI7XG4gIH1cbiAgLyoqXG4gICAqIEEgc3VydmV5IG9iamVjdC5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbFxuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXkoKTogU3VydmV5TW9kZWwge1xuICAgIHJldHVybiB0aGlzLnN1cnZleVZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyB2YWx1ZSB0byBuZWdhdGl2ZSB2YWx1ZSwgZm9yIGV4YW1wbGUgLTEsIHRvIGF2b2lkIGNsb3NpbmcgdGhlIHdpbmRvdyBvbiBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkuIExlYXZlIGl0IGVxdWFscyB0byAwIChkZWZhdWx0IHZhbHVlKSB0byBjbG9zZSB0aGUgd2luZG93IGltbWVkaWF0ZWx5LCBvciBzZXQgaXQgdG8gMywgNSwgMTAsIC4uLiB0byBjbG9zZSB0aGUgd2luZG93IGluIDMsIDUsIDEwIHNlY29uZHMuXG4gICAqL1xuICBwdWJsaWMgY2xvc2VPbkNvbXBsZXRlVGltZW91dDogbnVtYmVyID0gMDtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBzaG93aW5nLiBTZXQgaXQgdG8gdHJ1ZSB0byBzaG93IHRoZSB3aW5kb3cgYW5kIGZhbHNlIHRvIGhpZGUgaXQuXG4gICAqIEBzZWUgc2hvd1xuICAgKiBAc2VlIGhpZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNTaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1Nob3dpbmdcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNTaG93aW5nKHZhbDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmlzU2hvd2luZyA9PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Nob3dpbmdcIiwgdmFsKTtcbiAgICBpZiAodGhpcy5zaG93aW5nQ2hhbmdlZENhbGxiYWNrKSB0aGlzLnNob3dpbmdDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgfVxuICAvKipcbiAgICogU2hvdyB0aGUgd2luZG93XG4gICAqIEBzZWUgaGlkZVxuICAgKiBAc2VlIGlzU2hvd2luZ1xuICAgKi9cbiAgcHVibGljIHNob3coKSB7XG4gICAgdGhpcy5pc1Nob3dpbmcgPSB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBIaWRlIHRoZSB3aW5kb3dcbiAgICogQHNlZSBzaG93XG4gICAqIEBzZWUgaXNTaG93aW5nXG4gICAqL1xuICBwdWJsaWMgaGlkZSgpIHtcbiAgICB0aGlzLmlzU2hvd2luZyA9IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyBleHBhbmRlZC4gU2V0IGl0IHRvIHRydWUgdG8gZXhwYW5kIHRoZSB3aW5kb3cgb3IgZmFsc2UgdG8gY29sbGFwc2UgaXQuXG4gICAqIEBzZWUgZXhwYW5kXG4gICAqIEBzZWUgY29sbGFwc2VcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNFeHBhbmRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNFeHBhbmRlZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBpc0V4cGFuZGVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzRXhwYW5kZWRcIiwgdmFsKTtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24gJiYgdGhpcy5leHBhbmRlZENoYW5nZWRDYWxsYmFjaylcbiAgICAgIHRoaXMuZXhwYW5kZWRDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHdpbmRvdyBhbmQgc3VydmV5IHRpdGxlLlxuICAgKi9cbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleS50aXRsZTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnN1cnZleS50aXRsZSA9IHZhbHVlO1xuICB9XG4gIGdldCBsb2NUaXRsZSgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5LmxvY1RpdGxlO1xuICB9XG4gIC8qKlxuICAgKiBFeHBhbmQgdGhlIHdpbmRvdyB0byBzaG93IHRoZSBzdXJ2ZXkuXG4gICAqL1xuICBwdWJsaWMgZXhwYW5kKCkge1xuICAgIHRoaXMuZXhwYW5kY29sbGFwc2UodHJ1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIENvbGxhcHNlIHRoZSB3aW5kb3cgYW5kIHNob3cgc3VydmV5IHRpdGxlIG9ubHkuXG4gICAqL1xuICBwdWJsaWMgY29sbGFwc2UoKSB7XG4gICAgdGhpcy5leHBhbmRjb2xsYXBzZShmYWxzZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVN1cnZleShqc29uT2JqOiBhbnkpOiBTdXJ2ZXlNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlNb2RlbChqc29uT2JqKTtcbiAgfVxuICBwcm90ZWN0ZWQgZXhwYW5kY29sbGFwc2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzRXhwYW5kZWQgPSB2YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdXJ2ZXlDb21wbGV0ZSgpIHtcbiAgICBpZiAodGhpcy5jbG9zZU9uQ29tcGxldGVUaW1lb3V0IDwgMCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmNsb3NlT25Db21wbGV0ZVRpbWVvdXQgPT0gMCkge1xuICAgICAgdGhpcy5jbG9zZVdpbmRvd09uQ29tcGxldGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHRpbWVySWQ6IGFueSA9IG51bGw7XG4gICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLmNsb3NlV2luZG93T25Db21wbGV0ZSgpO1xuICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aW1lcklkKTtcbiAgICAgIH07XG4gICAgICB0aW1lcklkID0gd2luZG93LnNldEludGVydmFsKGZ1bmMsIHRoaXMuY2xvc2VPbkNvbXBsZXRlVGltZW91dCAqIDEwMDApO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY2xvc2VXaW5kb3dPbkNvbXBsZXRlKCkge1xuICAgIGlmICghIXRoaXMuY2xvc2VXaW5kb3dPbkNvbXBsZXRlQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMuY2xvc2VXaW5kb3dPbkNvbXBsZXRlQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zdXJ2ZXlXaW5kb3cudHMiLCJpbXBvcnQgeyBFdmVudCB9IGZyb20gXCIuL2Jhc2VcIjtcblxuZXhwb3J0IHZhciBzdXJ2ZXlUaW1lckZ1bmN0aW9ucyA9IHtcbiAgc2V0VGltZW91dDogZnVuY3Rpb24oZnVuYzogKCkgPT4gYW55KTogbnVtYmVyIHtcbiAgICByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuYywgMTAwMCk7XG4gIH0sXG4gIGNsZWFyVGltZW91dDogZnVuY3Rpb24odGltZXJJZDogbnVtYmVyKSB7XG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgfVxufTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVRpbWVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2VWYWx1ZTogU3VydmV5VGltZXIgPSBudWxsO1xuICBwdWJsaWMgc3RhdGljIGdldCBpbnN0YW5jZSgpIHtcbiAgICBpZiAoIVN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWUpIHtcbiAgICAgIFN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWUgPSBuZXcgU3VydmV5VGltZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIFN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBsaXN0ZW5lckNvdW50ZXIgPSAwO1xuICBwcml2YXRlIHRpbWVySWQgPSAtMTtcbiAgcHVibGljIG9uVGltZXI6IEV2ZW50PCgpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoKSA9PiBhbnksIGFueT4oKTtcbiAgcHVibGljIHN0YXJ0KGZ1bmM6ICgpID0+IGFueSA9IG51bGwpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgdGhpcy5vblRpbWVyLmFkZChmdW5jKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGltZXJJZCA8IDApIHtcbiAgICAgIHRoaXMudGltZXJJZCA9IHN1cnZleVRpbWVyRnVuY3Rpb25zLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRvVGltZXIoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmxpc3RlbmVyQ291bnRlcisrO1xuICB9XG4gIHB1YmxpYyBzdG9wKGZ1bmM6ICgpID0+IGFueSA9IG51bGwpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgdGhpcy5vblRpbWVyLnJlbW92ZShmdW5jKTtcbiAgICB9XG4gICAgdGhpcy5saXN0ZW5lckNvdW50ZXItLTtcbiAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50ZXIgPT0gMCAmJiB0aGlzLnRpbWVySWQgPiAtMSkge1xuICAgICAgc3VydmV5VGltZXJGdW5jdGlvbnMuY2xlYXJUaW1lb3V0KHRoaXMudGltZXJJZCk7XG4gICAgICB0aGlzLnRpbWVySWQgPSAtMTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGRvVGltZXIoKSB7XG4gICAgaWYgKHRoaXMudGltZXJJZCA8IDApIHJldHVybjtcbiAgICB0aGlzLm9uVGltZXIuZmlyZSh0aGlzLCB7fSk7XG4gICAgdGhpcy50aW1lcklkID0gc3VydmV5VGltZXJGdW5jdGlvbnMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRvVGltZXIoKTtcbiAgICB9KTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N1cnZleXRpbWVyLnRzIiwiaW1wb3J0IHsgc3VydmV5Q3NzIH0gZnJvbSBcIi4vY3Nzc3RhbmRhcmRcIjtcblxuZXhwb3J0IHZhciBkZWZhdWx0Qm9vdHN0cmFwQ3NzID0ge1xuICByb290OiBcInN2X21haW4gc3ZfYm9vdHN0cmFwX2Nzc1wiLFxuICBoZWFkZXI6IFwicGFuZWwtaGVhZGluZyBjYXJkLWhlYWRlclwiLFxuICBib2R5OiBcInBhbmVsLWJvZHkgY2FyZC1ibG9jayBtdC00XCIsXG4gIGJvZHlFbXB0eTogXCJwYW5lbC1ib2R5IGNhcmQtYmxvY2sgbXQtNCBzdl9ib2R5X2VtcHR5XCIsXG4gIGZvb3RlcjogXCJwYW5lbC1mb290ZXIgY2FyZC1mb290ZXJcIixcbiAgbmF2aWdhdGlvbkJ1dHRvbjogXCJcIixcbiAgY29tcGxldGVkUGFnZTogXCJcIixcbiAgbmF2aWdhdGlvbjoge1xuICAgIGNvbXBsZXRlOiBcImJ0biBzdl9jb21wbGV0ZV9idG5cIixcbiAgICBwcmV2OiBcImJ0biBzdl9wcmV2X2J0blwiLFxuICAgIG5leHQ6IFwiYnRuIHN2X25leHRfYnRuXCIsXG4gICAgc3RhcnQ6IFwiYnRuIHN2X3N0YXJ0X2J0blwiXG4gIH0sXG4gIHByb2dyZXNzOiBcInByb2dyZXNzIGNlbnRlci1ibG9jayBteC1hdXRvIG1iLTRcIixcbiAgcHJvZ3Jlc3NCYXI6IFwicHJvZ3Jlc3MtYmFyXCIsXG4gIHBhZ2U6IHtcbiAgICByb290OiBcIlwiLFxuICAgIHRpdGxlOiBcIlwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlwiXG4gIH0sXG4gIHBhZ2VUaXRsZTogXCJcIixcbiAgcGFnZURlc2NyaXB0aW9uOiBcInNtYWxsXCIsXG4gIHJvdzogXCJzdl9yb3dcIixcbiAgcXVlc3Rpb246IHtcbiAgICBtYWluUm9vdDogXCJzdl9xc3RuXCIsXG4gICAgZmxvd1Jvb3Q6IFwic3ZfcV9mbG93IHN2X3FzdG5cIixcbiAgICB0aXRsZUxlZnRSb290OiBcInN2X3FzdG5fbGVmdFwiLFxuICAgIHRpdGxlOiBcIlwiLFxuICAgIG51bWJlcjogXCJzdl9xX251bVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInNtYWxsXCIsXG4gICAgY29tbWVudDogXCJmb3JtLWNvbnRyb2xcIixcbiAgICByZXF1aXJlZDogXCJcIixcbiAgICB0aXRsZVJlcXVpcmVkOiBcIlwiLFxuICAgIGhhc0Vycm9yOiBcImhhcy1lcnJvclwiLFxuICAgIGluZGVudDogMjBcbiAgfSxcbiAgcGFuZWw6IHtcbiAgICB0aXRsZTogXCJzdl9wX3RpdGxlXCIsXG4gICAgZGVzY3JpcHRpb246IFwic21hbGwgc3ZfcF9kZXNjcmlwdGlvblwiLFxuICAgIGNvbnRhaW5lcjogXCJzdl9wX2NvbnRhaW5lclwiXG4gIH0sXG4gIGVycm9yOiB7XG4gICAgcm9vdDogXCJhbGVydCBhbGVydC1kYW5nZXJcIixcbiAgICBpY29uOiBcImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblwiLFxuICAgIGl0ZW06IFwiXCIsXG4gICAgbG9jYXRpb25Ub3A6IFwic3ZfcXN0bl9lcnJvcl90b3BcIixcbiAgICBsb2NhdGlvbkJvdHRvbTogXCJzdl9xc3RuX2Vycm9yX2JvdHRvbVwiXG4gIH0sXG4gIGJvb2xlYW46IHtcbiAgICByb290OiBcInN2X3FibG4gZm9ybS1pbmxpbmUgY2hlY2tib3hcIixcbiAgICBpdGVtOiBcIlwiLFxuICAgIGxhYmVsOiBcIlwiLFxuICAgIG1hdGVyaWFsRGVjb3JhdG9yOiBcImNoZWNrYm94LW1hdGVyaWFsXCJcbiAgfSxcbiAgY2hlY2tib3g6IHtcbiAgICByb290OiBcInN2X3FjYmMgc3ZfcWNieCBmb3JtLWlubGluZVwiLFxuICAgIGl0ZW06IFwiY2hlY2tib3hcIixcbiAgICBpdGVtQ29udHJvbDogXCJcIixcbiAgICBjb250cm9sTGFiZWw6IFwiXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwiY2hlY2tib3gtbWF0ZXJpYWxcIixcbiAgICBvdGhlcjogXCJzdl9xX2NoZWNrYm94X290aGVyIGZvcm0tY29udHJvbFwiLFxuICAgIGNvbHVtbjogXCJzdl9xX3NlbGVjdF9jb2x1bW5cIlxuICB9LFxuICBjb21tZW50OiBcImZvcm0tY29udHJvbFwiLFxuICBkcm9wZG93bjoge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgY29udHJvbDogXCJmb3JtLWNvbnRyb2xcIixcbiAgICBvdGhlcjogXCJzdl9xX2RkX290aGVyIGZvcm0tY29udHJvbFwiXG4gIH0sXG4gIGh0bWw6IHsgcm9vdDogXCJcIiB9LFxuICBtYXRyaXg6IHtcbiAgICByb290OiBcInRhYmxlIHN2X3FfbWF0cml4XCIsXG4gICAgbGFiZWw6IFwic3ZfcV9tX2xhYmVsXCIsXG4gICAgY2VsbFRleHQ6IFwic3ZfcV9tX2NlbGxfdGV4dFwiLFxuICAgIGNlbGxUZXh0U2VsZWN0ZWQ6IFwic3ZfcV9tX2NlbGxfc2VsZWN0ZWQgYmctcHJpbWFyeVwiLFxuICAgIGNlbGxMYWJlbDogXCJzdl9xX21fY2VsbF9sYWJlbFwiXG4gIH0sXG4gIG1hdHJpeGRyb3Bkb3duOiB7IHJvb3Q6IFwidGFibGVcIiB9LFxuICBtYXRyaXhkeW5hbWljOiB7XG4gICAgcm9vdDogXCJ0YWJsZVwiLFxuICAgIGJ1dHRvbjogXCJidXR0b25cIixcbiAgICBidXR0b25BZGQ6IFwiXCIsXG4gICAgYnV0dG9uUmVtb3ZlOiBcIlwiLFxuICAgIGljb25BZGQ6IFwiXCIsXG4gICAgaWNvblJlbW92ZTogXCJcIlxuICB9LFxuICBwYW5lbGR5bmFtaWM6IHtcbiAgICByb290OiBcIlwiLFxuICAgIGJ1dHRvbjogXCJidXR0b25cIixcbiAgICBidXR0b25QcmV2OiBcIlwiLFxuICAgIGJ1dHRvbk5leHQ6IFwiXCIsXG4gICAgYnV0dG9uQWRkOiBcIlwiLFxuICAgIGJ1dHRvblJlbW92ZTogXCJcIlxuICB9LFxuICBtdWx0aXBsZXRleHQ6IHtcbiAgICByb290OiBcInRhYmxlXCIsXG4gICAgaXRlbVRpdGxlOiBcIlwiLFxuICAgIGl0ZW1WYWx1ZTogXCJzdl9xX210X2l0ZW1fdmFsdWUgZm9ybS1jb250cm9sXCJcbiAgfSxcbiAgcmFkaW9ncm91cDoge1xuICAgIHJvb3Q6IFwic3ZfcWNiYyBmb3JtLWlubGluZVwiLFxuICAgIGl0ZW06IFwicmFkaW9cIixcbiAgICBsYWJlbDogXCJcIixcbiAgICBpdGVtQ29udHJvbDogXCJcIixcbiAgICBjb250cm9sTGFiZWw6IFwiXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwiY2lyY2xlXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9yYWRpb2dyb3VwX290aGVyIGZvcm0tY29udHJvbFwiLFxuICAgIGNsZWFyQnV0dG9uOiBcInN2X3FfcmFkaW9ncm91cF9jbGVhciBidXR0b25cIixcbiAgICBjb2x1bW46IFwic3ZfcV9zZWxlY3RfY29sdW1uXCJcbiAgfSxcbiAgaW1hZ2VwaWNrZXI6IHtcbiAgICByb290OiBcInN2X2ltZ3NlbFwiLFxuICAgIGl0ZW06IFwic3ZfcV9pbWdzZWxcIixcbiAgICBsYWJlbDogXCJzdl9xX2ltZ3NlbF9sYWJlbFwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2X3FfaW1nc2VsX2NvbnRyb2xfaXRlbVwiLFxuICAgIGltYWdlOiBcInN2X3FfaW1nc2VsX2ltYWdlXCIsXG4gICAgaXRlbVRleHQ6IFwic3ZfcV9pbWdzZWxfdGV4dFwiLFxuICAgIGNsZWFyQnV0dG9uOiBcInN2X3FfcmFkaW9ncm91cF9jbGVhclwiXG4gIH0sXG4gIHJhdGluZzoge1xuICAgIHJvb3Q6IFwiYnRuLWdyb3VwXCIsXG4gICAgaXRlbTogXCJidG4gYnRuLWRlZmF1bHQgYnRuLXNlY29uZGFyeVwiLFxuICAgIHNlbGVjdGVkOiBcImFjdGl2ZVwiLFxuICAgIG1pblRleHQ6IFwic3ZfcV9yYXRpbmdfbWluX3RleHRcIixcbiAgICBpdGVtVGV4dDogXCJzdl9xX3JhdGluZ19pdGVtX3RleHRcIixcbiAgICBtYXhUZXh0OiBcInN2X3FfcmF0aW5nX21heF90ZXh0XCJcbiAgfSxcbiAgdGV4dDogXCJmb3JtLWNvbnRyb2xcIixcbiAgZXhwcmVzc2lvbjogXCJmb3JtLWNvbnRyb2xcIixcbiAgZmlsZToge1xuICAgIHJvb3Q6IFwic3ZfcV9maWxlXCIsXG4gICAgcGxhY2Vob2xkZXJJbnB1dDogXCJzdl9xX2ZpbGVfcGxhY2Vob2xkZXJcIixcbiAgICBwcmV2aWV3OiBcInN2X3FfZmlsZV9wcmV2aWV3XCIsXG4gICAgcmVtb3ZlQnV0dG9uOiBcInN2X3FfZmlsZV9yZW1vdmVfYnV0dG9uXCIsXG4gICAgZmlsZUlucHV0OiBcInN2X3FfZmlsZV9pbnB1dFwiLFxuICAgIHJlbW92ZUZpbGU6IFwic3ZfcV9maWxlX3JlbW92ZVwiXG4gIH0sXG4gIHNhdmVEYXRhOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBzYXZpbmc6IFwiYWxlcnQgYWxlcnQtaW5mb1wiLFxuICAgIGVycm9yOiBcImFsZXJ0IGFsZXJ0LWRhbmdlclwiLFxuICAgIHN1Y2Nlc3M6IFwiYWxlcnQgYWxlcnQtc3VjY2Vzc1wiLFxuICAgIHNhdmVBZ2FpbkJ1dHRvbjogXCJcIlxuICB9LFxuICB3aW5kb3c6IHtcbiAgICByb290OiBcIm1vZGFsLWNvbnRlbnRcIixcbiAgICBib2R5OiBcIm1vZGFsLWJvZHlcIixcbiAgICBoZWFkZXI6IHtcbiAgICAgIHJvb3Q6IFwibW9kYWwtaGVhZGVyIHBhbmVsLXRpdGxlXCIsXG4gICAgICB0aXRsZTogXCJwdWxsLWxlZnRcIixcbiAgICAgIGJ1dHRvbjogXCJnbHlwaGljb24gcHVsbC1yaWdodFwiLFxuICAgICAgYnV0dG9uRXhwYW5kZWQ6IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHQgZ2x5cGhpY29uLWNoZXZyb24tdXBcIixcbiAgICAgIGJ1dHRvbkNvbGxhcHNlZDogXCJnbHlwaGljb24gcHVsbC1yaWdodCBnbHlwaGljb24tY2hldnJvbi1kb3duXCJcbiAgICB9XG4gIH1cbn07XG4oPGFueT5zdXJ2ZXlDc3MpW1wiYm9vdHN0cmFwXCJdID0gZGVmYXVsdEJvb3RzdHJhcENzcztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9kZWZhdWx0Q3NzL2Nzc2Jvb3RzdHJhcC50cyIsImltcG9ydCB7IHN1cnZleUNzcyB9IGZyb20gXCIuL2Nzc3N0YW5kYXJkXCI7XG5cbmV4cG9ydCB2YXIgZGVmYXVsdEJvb3RzdHJhcE1hdGVyaWFsQ3NzID0ge1xuICByb290OiBcInN2X21haW4gc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzXCIsXG4gIGhlYWRlcjogXCJwYW5lbC1oZWFkaW5nXCIsXG4gIGJvZHk6IFwicGFuZWwtYm9keVwiLFxuICBib2R5RW1wdHk6IFwicGFuZWwtYm9keSBzdl9ib2R5X2VtcHR5XCIsXG4gIGZvb3RlcjogXCJwYW5lbC1mb290ZXJcIixcbiAgbmF2aWdhdGlvbkJ1dHRvbjogXCJcIixcbiAgY29tcGxldGVkUGFnZTogXCJcIixcbiAgbmF2aWdhdGlvbjoge1xuICAgIGNvbXBsZXRlOiBcImJ0biBzdl9jb21wbGV0ZV9idG4gYnRuLXByaW1hcnlcIixcbiAgICBwcmV2OiBcImJ0biBzdl9wcmV2X2J0biBidG4tcHJpbWFyeVwiLFxuICAgIG5leHQ6IFwiYnRuIHN2X25leHRfYnRuIGJ0bi1wcmltYXJ5XCIsXG4gICAgc3RhcnQ6IFwiYnRuIHN2X3N0YXJ0X2J0biBidG4tcHJpbWFyeVwiXG4gIH0sXG4gIHByb2dyZXNzOiBcInByb2dyZXNzIGNlbnRlci1ibG9jayBteC1hdXRvIG1iLTRcIixcbiAgcHJvZ3Jlc3NCYXI6IFwicHJvZ3Jlc3MtYmFyXCIsXG4gIHBhZ2U6IHtcbiAgICByb290OiBcIlwiLFxuICAgIHRpdGxlOiBcIlwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlwiXG4gIH0sXG4gIHBhZ2VUaXRsZTogXCJcIixcbiAgcGFnZURlc2NyaXB0aW9uOiBcInNtYWxsXCIsXG4gIHJvdzogXCJzdl9yb3dcIixcbiAgcXVlc3Rpb246IHtcbiAgICBtYWluUm9vdDogXCJzdl9xc3RuIGZvcm0tZ3JvdXBcIixcbiAgICBmbG93Um9vdDogXCJzdl9xX2Zsb3cgZm9ybS1ncm91cFwiLFxuICAgIHRpdGxlTGVmdFJvb3Q6IFwic3ZfcXN0bl9sZWZ0XCIsXG4gICAgdGl0bGU6IFwiXCIsXG4gICAgbnVtYmVyOiBcInN2X3FfbnVtXCIsXG4gICAgZGVzY3JpcHRpb246IFwic21hbGxcIixcbiAgICBjb21tZW50OiBcImZvcm0tY29udHJvbFwiLFxuICAgIHJlcXVpcmVkOiBcIlwiLFxuICAgIHRpdGxlUmVxdWlyZWQ6IFwiXCIsXG4gICAgaGFzRXJyb3I6IFwiaGFzLWVycm9yXCIsXG4gICAgaW5kZW50OiAyMFxuICB9LFxuICBwYW5lbDoge1xuICAgIHRpdGxlOiBcInN2X3BfdGl0bGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJzbWFsbCBzdl9wX2Rlc2NyaXB0aW9uXCIsXG4gICAgY29udGFpbmVyOiBcInN2X3BfY29udGFpbmVyXCJcbiAgfSxcbiAgZXJyb3I6IHtcbiAgICByb290OiBcImFsZXJ0IGFsZXJ0LWRhbmdlclwiLFxuICAgIGljb246IFwiZ2x5cGhpY29uIGdseXBoaWNvbi1leGNsYW1hdGlvbi1zaWduXCIsXG4gICAgaXRlbTogXCJcIixcbiAgICBsb2NhdGlvblRvcDogXCJzdl9xc3RuX2Vycm9yX3RvcFwiLFxuICAgIGxvY2F0aW9uQm90dG9tOiBcInN2X3FzdG5fZXJyb3JfYm90dG9tXCJcbiAgfSxcblxuICBib29sZWFuOiB7XG4gICAgcm9vdDogXCJzdl9xYmxuIGZvcm0taW5saW5lIGNoZWNrYm94XCIsXG4gICAgaXRlbTogXCJcIixcbiAgICBsYWJlbDogXCJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaGVja2JveC1tYXRlcmlhbFwiXG4gIH0sXG4gIGNoZWNrYm94OiB7XG4gICAgcm9vdDogXCJzdl9xY2J4IGZvcm0taW5saW5lXCIsXG4gICAgaXRlbTogXCJjaGVja2JveFwiLFxuICAgIGl0ZW1Db250cm9sOiBcIlwiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaGVja2JveC1tYXRlcmlhbFwiLFxuICAgIG90aGVyOiBcInN2X3FfY2hlY2tib3hfb3RoZXIgZm9ybS1jb250cm9sXCIsXG4gICAgY29sdW1uOiBcInN2X3Ffc2VsZWN0X2NvbHVtblwiXG4gIH0sXG4gIGNvbW1lbnQ6IFwiZm9ybS1jb250cm9sXCIsXG4gIGRyb3Bkb3duOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBjb250cm9sOiBcImZvcm0tY29udHJvbFwiLFxuICAgIG90aGVyOiBcInN2X3FfZGRfb3RoZXIgZm9ybS1jb250cm9sXCJcbiAgfSxcbiAgaHRtbDogeyByb290OiBcIlwiIH0sXG4gIG1hdHJpeDoge1xuICAgIHJvb3Q6IFwidGFibGUgc3ZfcV9tYXRyaXhcIixcbiAgICByb3c6IFwiZm9ybS1ncm91cFwiLFxuICAgIGxhYmVsOiBcInN2X3FfbV9sYWJlbCByYWRpby1pbmxpbmVcIixcbiAgICBjZWxsVGV4dDogXCJzdl9xX21fY2VsbF90ZXh0XCIsXG4gICAgY2VsbFRleHRTZWxlY3RlZDogXCJzdl9xX21fY2VsbF9zZWxlY3RlZCBiZy1wcmltYXJ5XCIsXG4gICAgY2VsbExhYmVsOiBcInN2X3FfbV9jZWxsX2xhYmVsXCIsXG4gICAgaXRlbVZhbHVlOiBcImZvcm0tY29udHJvbFwiXG4gIH0sXG4gIG1hdHJpeGRyb3Bkb3duOiB7IHJvb3Q6IFwidGFibGVcIiwgaXRlbVZhbHVlOiBcImZvcm0tZ3JvdXBcIiB9LFxuICBtYXRyaXhkeW5hbWljOiB7XG4gICAgcm9vdDogXCJ0YWJsZVwiLFxuICAgIGJ1dHRvbjogXCJidG4gYnRuLXByaW1hcnlcIixcbiAgICBpdGVtVmFsdWU6IFwiZm9ybS1ncm91cFwiLFxuICAgIGJ1dHRvbkFkZDogXCJcIixcbiAgICBidXR0b25SZW1vdmU6IFwiXCIsXG4gICAgaWNvbkFkZDogXCJcIixcbiAgICBpY29uUmVtb3ZlOiBcIlwiXG4gIH0sXG4gIHBhbmVsZHluYW1pYzoge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgYnV0dG9uOiBcImJ0biBidG4tcHJpbWFyeVwiLFxuICAgIGJ1dHRvblByZXY6IFwiXCIsXG4gICAgYnV0dG9uTmV4dDogXCJcIixcbiAgICBidXR0b25BZGQ6IFwiXCIsXG4gICAgYnV0dG9uUmVtb3ZlOiBcIlwiXG4gIH0sXG4gIG11bHRpcGxldGV4dDoge1xuICAgIHJvb3Q6IFwidGFibGVcIixcbiAgICBpdGVtVGl0bGU6IFwiXCIsXG4gICAgcm93OiBcImZvcm0tZ3JvdXBcIixcbiAgICBpdGVtVmFsdWU6IFwic3ZfcV9tdF9pdGVtX3ZhbHVlIGZvcm0tY29udHJvbFwiXG4gIH0sXG4gIHJhZGlvZ3JvdXA6IHtcbiAgICByb290OiBcIlwiLFxuICAgIGl0ZW06IFwicmFkaW9cIixcbiAgICBsYWJlbDogXCJcIixcbiAgICBpdGVtQ29udHJvbDogXCJcIixcbiAgICBjb250cm9sTGFiZWw6IFwic3ZfcV9yYWRpb2dyb3VwX2NvbnRyb2xfbGFiZWxcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaXJjbGVcIixcbiAgICBvdGhlcjogXCJzdl9xX3JhZGlvZ3JvdXBfb3RoZXIgZm9ybS1jb250cm9sXCIsXG4gICAgY2xlYXJCdXR0b246IFwic3ZfcV9yYWRpb2dyb3VwX2NsZWFyIGJ1dHRvbiBidG4gYnRuLXByaW1hcnlcIixcbiAgICBjb2x1bW46IFwic3ZfcV9zZWxlY3RfY29sdW1uXCJcbiAgfSxcbiAgaW1hZ2VwaWNrZXI6IHtcbiAgICByb290OiBcInN2X2ltZ3NlbFwiLFxuICAgIGl0ZW06IFwic3ZfcV9pbWdzZWxcIixcbiAgICBsYWJlbDogXCJzdl9xX2ltZ3NlbF9sYWJlbFwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2X3FfaW1nc2VsX2NvbnRyb2xfaXRlbVwiLFxuICAgIGltYWdlOiBcInN2X3FfaW1nc2VsX2ltYWdlXCIsXG4gICAgaXRlbVRleHQ6IFwic3ZfcV9pbWdzZWxfdGV4dFwiLFxuICAgIGNsZWFyQnV0dG9uOiBcInN2X3FfcmFkaW9ncm91cF9jbGVhclwiXG4gIH0sXG4gIHJhdGluZzoge1xuICAgIHJvb3Q6IFwiYnRuLWdyb3VwXCIsXG4gICAgaXRlbTogXCJidG4gYnRuLWRlZmF1bHQgYnRuLXNlY29uZGFyeVwiLFxuICAgIHNlbGVjdGVkOiBcImFjdGl2ZVwiLFxuICAgIG1pblRleHQ6IFwic3ZfcV9yYXRpbmdfbWluX3RleHRcIixcbiAgICBpdGVtVGV4dDogXCJzdl9xX3JhdGluZ19pdGVtX3RleHRcIixcbiAgICBtYXhUZXh0OiBcInN2X3FfcmF0aW5nX21heF90ZXh0XCJcbiAgfSxcbiAgdGV4dDogXCJmb3JtLWNvbnRyb2xcIixcbiAgZXhwcmVzc2lvbjogXCJmb3JtLWNvbnRyb2xcIixcbiAgZmlsZToge1xuICAgIHJvb3Q6IFwiZm9ybS1ncm91cCBpcy1maWxlaW5wdXQgc3ZfcV9maWxlXCIsXG4gICAgcGxhY2Vob2xkZXJJbnB1dDogXCJcIixcbiAgICBwcmV2aWV3OiBcInN2X3FfZmlsZV9wcmV2aWV3XCIsXG4gICAgcmVtb3ZlQnV0dG9uOiBcInN2X3FfZmlsZV9yZW1vdmVfYnV0dG9uXCIsXG4gICAgZmlsZUlucHV0OiBcInN2X3FfZmlsZV9pbnB1dFwiLFxuICAgIHJlbW92ZUZpbGU6IFwic3ZfcV9maWxlX3JlbW92ZVwiXG4gIH0sXG4gIHNhdmVEYXRhOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBzYXZpbmc6IFwiYWxlcnQgYWxlcnQtaW5mb1wiLFxuICAgIGVycm9yOiBcImFsZXJ0IGFsZXJ0LWRhbmdlclwiLFxuICAgIHN1Y2Nlc3M6IFwiYWxlcnQgYWxlcnQtc3VjY2Vzc1wiLFxuICAgIHNhdmVBZ2FpbkJ1dHRvbjogXCJcIlxuICB9LFxuICB3aW5kb3c6IHtcbiAgICByb290OiBcIm1vZGFsLWNvbnRlbnRcIixcbiAgICBib2R5OiBcIm1vZGFsLWJvZHlcIixcbiAgICBoZWFkZXI6IHtcbiAgICAgIHJvb3Q6IFwibW9kYWwtaGVhZGVyIHBhbmVsLXRpdGxlXCIsXG4gICAgICB0aXRsZTogXCJwdWxsLWxlZnRcIixcbiAgICAgIGJ1dHRvbjogXCJnbHlwaGljb24gcHVsbC1yaWdodFwiLFxuICAgICAgYnV0dG9uRXhwYW5kZWQ6IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHQgZ2x5cGhpY29uLWNoZXZyb24tdXBcIixcbiAgICAgIGJ1dHRvbkNvbGxhcHNlZDogXCJnbHlwaGljb24gcHVsbC1yaWdodCBnbHlwaGljb24tY2hldnJvbi1kb3duXCJcbiAgICB9XG4gIH1cbn07XG4oPGFueT5zdXJ2ZXlDc3MpW1wiYm9vdHN0cmFwbWF0ZXJpYWxcIl0gPSBkZWZhdWx0Qm9vdHN0cmFwTWF0ZXJpYWxDc3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZGVmYXVsdENzcy9jc3Nib290c3RyYXBtYXRlcmlhbC50cyIsImltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9hcmFiaWNcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9idWxnYXJpYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9jYXRhbGFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vY3plY2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9kYW5pc2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9kdXRjaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2Zpbm5pc2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9mcmVuY2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9nZW9yZ2lhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2dlcm1hblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2dyZWVrXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vaGVicmV3XCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vaHVuZ2FyaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vaWNlbGFuZGljXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vaW5kb25lc2lhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2l0YWxpYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9qYXBhbmVzZVwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2tvcmVhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2xhdHZpYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9saXRodWFuaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vbm9yd2VnaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vcGVyc2lhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3BvbGlzaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2VcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9yb21hbmlhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3J1c3NpYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9zaW1wbGlmaWVkLWNoaW5lc2VcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9zcGFuaXNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vc3dlZGlzaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3R1cmtpc2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi90cmFkaXRpb25hbC1jaGluZXNlXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vdWtyYWluaWFuXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZW50cmllcy9jaHVua3MvbG9jYWxpemF0aW9uLnRzIiwiLy8gc3R5bGVzXG5pbXBvcnQgXCIuLi8uLi9tYWluLnNjc3NcIjtcblxuZXhwb3J0IGxldCBWZXJzaW9uOiBzdHJpbmc7XG5WZXJzaW9uID0gYCR7cHJvY2Vzcy5lbnYuVkVSU0lPTn1gO1xuXG5leHBvcnQge3NldHRpbmdzfSBmcm9tIFwiLi4vLi4vc2V0dGluZ3NcIjtcbmV4cG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi4vLi4vaGVscGVyc1wiO1xuZXhwb3J0IHtcbiAgQW5zd2VyQ291bnRWYWxpZGF0b3IsXG4gIEVtYWlsVmFsaWRhdG9yLFxuICBOdW1lcmljVmFsaWRhdG9yLFxuICBSZWdleFZhbGlkYXRvcixcbiAgU3VydmV5VmFsaWRhdG9yLFxuICBUZXh0VmFsaWRhdG9yLFxuICBWYWxpZGF0b3JSZXN1bHQsXG4gIFZhbGlkYXRvclJ1bm5lclxufSBmcm9tIFwiLi4vLi4vdmFsaWRhdG9yXCI7XG5leHBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi4vLi4vaXRlbXZhbHVlXCI7XG5leHBvcnQgeyBCYXNlLCBFdmVudCwgU3VydmV5RXJyb3IsIElTdXJ2ZXksIFN1cnZleUVsZW1lbnQgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuZXhwb3J0IHtcbiAgQ3VzdG9tRXJyb3IsXG4gIEFuc3dlclJlcXVpcmVkRXJyb3IsXG4gIE9uZUFuc3dlclJlcXVpcmVkRXJyb3IsXG4gIFJlcXVyZU51bWVyaWNFcnJvcixcbiAgRXhjZWVkU2l6ZUVycm9yXG59IGZyb20gXCIuLi8uLi9lcnJvclwiO1xuZXhwb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4uLy4uL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5leHBvcnQgeyBIdG1sQ29uZGl0aW9uSXRlbSB9IGZyb20gXCIuLi8uLi9odG1sQ29uZGl0aW9uSXRlbVwiO1xuZXhwb3J0IHsgQ2hvaWNlc1Jlc3RmdWxsIH0gZnJvbSBcIi4uLy4uL2Nob2ljZXNSZXN0ZnVsbFwiO1xuZXhwb3J0IHsgRnVuY3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uLy4uL2Z1bmN0aW9uc2ZhY3RvcnlcIjtcbmV4cG9ydCB7XG4gIENvbmRpdGlvblJ1bm5lcixcbiAgRXhwcmVzc2lvblJ1bm5lclxufSBmcm9tIFwiLi4vLi4vY29uZGl0aW9uc1wiO1xuZXhwb3J0IHsgT3BlcmFuZCB9IGZyb20gXCIuLi8uLi9leHByZXNzaW9ucy9leHByZXNzaW9uc1wiO1xuZXhwb3J0IHsgQ29uZGl0aW9uc1BhcnNlciB9IGZyb20gXCIuLi8uLi9jb25kaXRpb25zUGFyc2VyXCI7XG5leHBvcnQgeyBQcm9jZXNzVmFsdWUgfSBmcm9tIFwiLi4vLi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5leHBvcnQge1xuICBKc29uRXJyb3IsXG4gIEpzb25JbmNvcnJlY3RUeXBlRXJyb3IsXG4gIEpzb25NZXRhZGF0YSxcbiAgSnNvbk1ldGFkYXRhQ2xhc3MsXG4gIEpzb25NaXNzaW5nVHlwZUVycm9yLFxuICBKc29uTWlzc2luZ1R5cGVFcnJvckJhc2UsXG4gIEpzb25PYmplY3QsXG4gIEpzb25PYmplY3RQcm9wZXJ0eSxcbiAgSnNvblJlcXVpcmVkUHJvcGVydHlFcnJvcixcbiAgSnNvblVua25vd25Qcm9wZXJ0eUVycm9yLFxuICBTZXJpYWxpemVyXG59IGZyb20gXCIuLi8uLi9qc29ub2JqZWN0XCI7XG5leHBvcnQge1xuICBNYXRyaXhEcm9wZG93bkNlbGwsXG4gIE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICBtYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzLFxuICBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZVxufSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlXCI7XG5leHBvcnQge1xuICBNYXRyaXhEcm9wZG93blJvd01vZGVsLFxuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duXCI7XG5leHBvcnQge1xuICBNYXRyaXhEeW5hbWljUm93TW9kZWwsXG4gIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9tYXRyaXhkeW5hbWljXCI7XG5leHBvcnQge1xuICBNYXRyaXhSb3dNb2RlbCxcbiAgTWFydHJpeENlbGxzLFxuICBRdWVzdGlvbk1hdHJpeE1vZGVsXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9tYXRyaXhcIjtcbmV4cG9ydCB7XG4gIE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCxcbiAgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbFxufSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fbXVsdGlwbGV0ZXh0XCI7XG5leHBvcnQgeyBQYW5lbE1vZGVsLCBQYW5lbE1vZGVsQmFzZSwgUXVlc3Rpb25Sb3dNb2RlbCB9IGZyb20gXCIuLi8uLi9wYW5lbFwiO1xuZXhwb3J0IHsgRmxvd1BhbmVsTW9kZWwgfSBmcm9tIFwiLi4vLi4vZmxvd3BhbmVsXCI7XG5leHBvcnQgeyBQYWdlTW9kZWwgfSBmcm9tIFwiLi4vLi4vcGFnZVwiO1xuZXhwb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25cIjtcbmV4cG9ydCB7IFF1ZXN0aW9uTm9uVmFsdWUgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25ub252YWx1ZVwiO1xuZXhwb3J0IHsgUXVlc3Rpb25FbXB0eU1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2VtcHR5XCI7XG5leHBvcnQge1xuICBRdWVzdGlvbkNoZWNrYm94QmFzZSxcbiAgUXVlc3Rpb25TZWxlY3RCYXNlXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5leHBvcnQgeyBRdWVzdGlvbkNoZWNrYm94TW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fY2hlY2tib3hcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQ29tbWVudE1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2NvbW1lbnRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9kcm9wZG93blwiO1xuZXhwb3J0IHsgUXVlc3Rpb25GYWN0b3J5LCBFbGVtZW50RmFjdG9yeSB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRmlsZU1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2ZpbGVcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uSHRtbE1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2h0bWxcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX3JhZGlvZ3JvdXBcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUmF0aW5nTW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fcmF0aW5nXCI7XG5leHBvcnQgeyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9leHByZXNzaW9uXCI7XG5leHBvcnQgeyBRdWVzdGlvblRleHRNb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl90ZXh0XCI7XG5leHBvcnQgeyBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9ib29sZWFuXCI7XG5leHBvcnQgeyBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25faW1hZ2VwaWNrZXJcIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwsXG4gIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbVxufSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fcGFuZWxkeW5hbWljXCI7XG5leHBvcnQgeyBTdXJ2ZXlUaW1lciB9IGZyb20gXCIuLi8uLi9zdXJ2ZXl0aW1lclwiO1xuZXhwb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi4vLi4vc3VydmV5XCI7XG5leHBvcnQge1xuICBTdXJ2ZXlUcmlnZ2VyLFxuICBTdXJ2ZXlUcmlnZ2VyQ29tcGxldGUsXG4gIFN1cnZleVRyaWdnZXJTZXRWYWx1ZSxcbiAgU3VydmV5VHJpZ2dlclZpc2libGUsXG4gIFN1cnZleVRyaWdnZXJDb3B5VmFsdWUsXG4gIFN1cnZleVRyaWdnZXJSdW5FeHByZXNzaW9uLFxuICBUcmlnZ2VyXG59IGZyb20gXCIuLi8uLi90cmlnZ2VyXCI7XG5leHBvcnQgeyBTdXJ2ZXlXaW5kb3dNb2RlbCB9IGZyb20gXCIuLi8uLi9zdXJ2ZXlXaW5kb3dcIjtcbmV4cG9ydCB7IFRleHRQcmVQcm9jZXNzb3IgfSBmcm9tIFwiLi4vLi4vdGV4dFByZVByb2Nlc3NvclwiO1xuXG5leHBvcnQgeyBkeFN1cnZleVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vZHhTdXJ2ZXlTZXJ2aWNlXCI7XG5leHBvcnQgeyBlbmdsaXNoU3RyaW5ncyB9IGZyb20gXCIuLi8uLi9sb2NhbGl6YXRpb24vZW5nbGlzaFwiO1xuZXhwb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uLCBzdXJ2ZXlTdHJpbmdzIH0gZnJvbSBcIi4uLy4uL3N1cnZleVN0cmluZ3NcIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0LFxuICBDdXN0b21XaWRnZXRDb2xsZWN0aW9uXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbkN1c3RvbVdpZGdldHNcIjtcblxuZXhwb3J0IHsgU3R5bGVzTWFuYWdlciB9IGZyb20gXCIuLi8uLi9zdHlsZXNtYW5hZ2VyXCI7XG5cbi8vVW5jb21tZW50IHRvIGluY2x1ZGUgdGhlIFwiZGF0ZVwiIHF1ZXN0aW9uIHR5cGUuXG4vL2V4cG9ydCB7ZGVmYXVsdCBhcyBRdWVzdGlvbkRhdGVNb2RlbH0gZnJvbSBcIi4uLy4uL3BsdWdpbnMvcXVlc3Rpb25fZGF0ZVwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2VudHJpZXMvY2h1bmtzL21vZGVsLnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlXaW5kb3dNb2RlbCB9IGZyb20gXCIuLi9zdXJ2ZXlXaW5kb3dcIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcIi4uL3N1cnZleVwiO1xuaW1wb3J0IHsgU3VydmV5IH0gZnJvbSBcIi4va29zdXJ2ZXlcIjtcbnZhciBrb1RlbXBsYXRlID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi90ZW1wbGF0ZXMvd2luZG93L3dpbmRvdy5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5V2luZG93IGV4dGVuZHMgU3VydmV5V2luZG93TW9kZWwge1xuICBrb0V4cGFuZGVkOiBhbnk7XG4gIGtvRXhwYW5kZWRDc3M6IGFueTtcbiAgZG9FeHBhbmQ6IGFueTtcbiAgY29uc3RydWN0b3IoanNvbk9iajogYW55ID0gbnVsbCwgaW5pdGlhbE1vZGVsOiBTdXJ2ZXlNb2RlbCA9IG51bGwpIHtcbiAgICBzdXBlcihqc29uT2JqLCBpbml0aWFsTW9kZWwpO1xuICAgIHRoaXMua29FeHBhbmRlZCA9IGtvLm9ic2VydmFibGUoZmFsc2UpO1xuICAgIHRoaXMua29FeHBhbmRlZENzcyA9IGtvLm9ic2VydmFibGUodGhpcy5nZXRCdXR0b25Dc3MoKSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuZXhwYW5kZWRDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYua29FeHBhbmRlZChzZWxmLmlzRXhwYW5kZWQpO1xuICAgICAgc2VsZi5rb0V4cGFuZGVkQ3NzKHNlbGYuZ2V0QnV0dG9uQ3NzKCkpO1xuICAgIH07XG4gICAgdGhpcy5zaG93aW5nQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmRvU2hvd2luZ0NoYW5nZWQoKTtcbiAgICB9O1xuICAgIHRoaXMuZG9FeHBhbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuY2hhbmdlRXhwYW5kZWQoKTtcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVTdXJ2ZXkoanNvbk9iajogYW55KTogU3VydmV5TW9kZWwge1xuICAgIHJldHVybiBuZXcgU3VydmV5KGpzb25PYmopO1xuICB9XG4gIHByb3RlY3RlZCBjbG9zZVdpbmRvd09uQ29tcGxldGUoKSB7XG4gICAgdGhpcy5oaWRlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB0ZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFsdWUgPyB0aGlzLnRlbXBsYXRlVmFsdWUgOiB0aGlzLmdldERlZmF1bHRUZW1wbGF0ZSgpO1xuICB9XG4gIHByb3RlY3RlZCBzZXQgdGVtcGxhdGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudGVtcGxhdGVWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBkb1Nob3dpbmdDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLmlzU2hvd2luZykge1xuICAgICAgdGhpcy53aW5kb3dFbGVtZW50LmlubmVySFRNTCA9IHRoaXMudGVtcGxhdGU7XG4gICAgICBrby5jbGVhbk5vZGUodGhpcy53aW5kb3dFbGVtZW50KTtcbiAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcywgdGhpcy53aW5kb3dFbGVtZW50KTtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy53aW5kb3dFbGVtZW50KTtcbiAgICAgICg8U3VydmV5PnRoaXMuc3VydmV5KS5yZW5kZXIoU3VydmV5V2luZG93LnN1cnZleUVsZW1lbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLndpbmRvd0VsZW1lbnQpO1xuICAgICAgdGhpcy53aW5kb3dFbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4ga29UZW1wbGF0ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzcygpOiBhbnkge1xuICAgIHJldHVybiAoPGFueT50aGlzKS5zdXJ2ZXlbXCJjc3NcIl07XG4gIH1cbiAgcHJpdmF0ZSBjaGFuZ2VFeHBhbmRlZCgpIHtcbiAgICB0aGlzLmV4cGFuZGNvbGxhcHNlKCF0aGlzLmlzRXhwYW5kZWQpO1xuICB9XG4gIHByaXZhdGUgZ2V0QnV0dG9uQ3NzKCkge1xuICAgIHJldHVybiB0aGlzLmtvRXhwYW5kZWQoKVxuICAgICAgPyB0aGlzLmNzcy53aW5kb3cuaGVhZGVyLmJ1dHRvbkNvbGxhcHNlZFxuICAgICAgOiB0aGlzLmNzcy53aW5kb3cuaGVhZGVyLmJ1dHRvbkV4cGFuZGVkO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQva29TdXJ2ZXlXaW5kb3cudHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IEZsb3dQYW5lbE1vZGVsIH0gZnJvbSBcIi4uL2Zsb3dwYW5lbFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnkgfSBmcm9tIFwiLi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBJbXBsZW1lbnRvckJhc2UgfSBmcm9tIFwiLi9rb2Jhc2VcIjtcbmltcG9ydCB7IFN1cnZleUVsZW1lbnQsIElFbGVtZW50IH0gZnJvbSBcIi4uL2Jhc2VcIjtcblxuZXhwb3J0IGNsYXNzIEZsb3dQYW5lbCBleHRlbmRzIEZsb3dQYW5lbE1vZGVsIHtcbiAga29FbGVtZW50VHlwZTogYW55O1xuICBrb0VsZW1lbnRBZnRlclJlbmRlcjogYW55O1xuICBwbGFjZUhvbGRlcjogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5rb0VsZW1lbnRUeXBlID0ga28ub2JzZXJ2YWJsZShcInN1cnZleS1mbG93cGFuZWxcIik7XG4gICAgbmV3IEltcGxlbWVudG9yQmFzZSh0aGlzKTtcbiAgICB0aGlzLm9uQ3JlYXRpbmcoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5rb0VsZW1lbnRBZnRlclJlbmRlciA9IGZ1bmN0aW9uKGVsOiBhbnksIGNvbjogYW55KSB7XG4gICAgICByZXR1cm4gc2VsZi5lbGVtZW50QWZ0ZXJSZW5kZXIoZWwsIGNvbik7XG4gICAgfTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DcmVhdGluZygpIHt9XG4gIHByb3RlY3RlZCBnZXRIdG1sRm9yUXVlc3Rpb24ocXVlc3Rpb246IFF1ZXN0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgJzxzcGFuIHF1ZXN0aW9uPVwidHJ1ZVwiIGNvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCIgaWQ9XCJmbG93cGFuZWxfJyArXG4gICAgICBxdWVzdGlvbi5uYW1lICtcbiAgICAgICdcIj48IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6IFwic3VydmV5LWZsb3dwYW5lbC1xdWVzdGlvblwiLCBkYXRhOiBcIicgK1xuICAgICAgcXVlc3Rpb24ubmFtZSArXG4gICAgICAnXCJ9IC0tPjwhLS0gL2tvIC0tPjwvc3Bhbj4nXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGVsZW1lbnRBZnRlclJlbmRlcihlbGVtZW50czogYW55LCBjb246IGFueSkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB2YXIgZWwgPSBTdXJ2ZXlFbGVtZW50LkdldEZpcnN0Tm9uVGV4dEVsZW1lbnQoZWxlbWVudHMpO1xuICAgIGlmICghIWVsKSB7XG4gICAgICB0aGlzLnN1cnZleS5hZnRlclJlbmRlclF1ZXN0aW9uKGNvbiwgZWwpO1xuICAgIH1cbiAgfVxufVxuXG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwiZmxvd3BhbmVsXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IEZsb3dQYW5lbCgpO1xufSk7XG4vKlxuRWxlbWVudEZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJFbGVtZW50KFwiZmxvd3BhbmVsXCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IEZsb3dQYW5lbChuYW1lKTtcbn0pO1xuKi9cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJmLXBhbmVsXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiBmdW5jdGlvbihwYXJhbXM6IGFueSwgY29tcG9uZW50SW5mbzogYW55KSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcXVlc3Rpb24gPSBrby51bndyYXAocGFyYW1zLnF1ZXN0aW9uKTtcbiAgICAgIHNlbGYuZWxlbWVudCA9IGNvbXBvbmVudEluZm8uZWxlbWVudDtcbiAgICAgIHNlbGYuZWxlbWVudC5pbm5lckhUTUwgPSBxdWVzdGlvbi5odG1sO1xuICAgICAgc2VsZi5pc09uRm9jdXMgPSBmYWxzZTtcbiAgICAgIHNlbGYud2FzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgc2VsZi5pc0NvbnRlbnRVcGRhdGluZyA9IGZhbHNlO1xuICAgICAgcXVlc3Rpb24uY29udGVudENoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoc2VsZi5pc0NvbnRlbnRVcGRhdGluZykgcmV0dXJuO1xuICAgICAgICBrby5jbGVhbk5vZGUoc2VsZi5lbGVtZW50KTtcbiAgICAgICAgc2VsZi5lbGVtZW50LmlubmVySFRNTCA9IHF1ZXN0aW9uLmh0bWw7XG4gICAgICAgIGtvLmFwcGx5QmluZGluZ3MoeyBxdWVzdGlvbiB9LCBzZWxmLmVsZW1lbnQpO1xuICAgICAgICBrby50YXNrcy5ydW5FYXJseSgpO1xuICAgICAgfTtcbiAgICAgIHNlbGYuZWxlbWVudC5vbmZvY3VzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuaXNPbkZvY3VzID0gdHJ1ZTtcbiAgICAgIH07XG4gICAgICBzZWxmLmVsZW1lbnQub25ibHVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChzZWxmLndhc0NoYW5nZWQpIHNlbGYudXBkYXRlQ29udGVudCgpO1xuICAgICAgICBzZWxmLmlzT25Gb2N1cyA9IGZhbHNlO1xuICAgICAgICBzZWxmLndhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgIH07XG4gICAgICBzZWxmLmVsZW1lbnQub25kcmFnZW5kID0gZnVuY3Rpb24oZXZlbnQ6IGFueSkge1xuICAgICAgICB2YXIgcmVnRXggPSAveyguKj8oZWxlbWVudDopW14kXS4qPyl9L2c7XG4gICAgICAgIHZhciBzdHIgPSBzZWxmLmVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICB2YXIgcmVzID0gcmVnRXguZXhlYyhzdHIpO1xuICAgICAgICBpZiAocmVzICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIHEgPSBxdWVzdGlvbi5nZXRRdWVzdGlvbkZyb21UZXh0KHJlc1swXSk7XG4gICAgICAgICAgaWYgKCEhcSkge1xuICAgICAgICAgICAgcXVlc3Rpb24uY29udGVudCA9IHNlbGYuZ2V0Q29udGVudChxLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHNlbGYudXBkYXRlQ29udGVudCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLmlzQ29udGVudFVwZGF0aW5nID0gdHJ1ZTtcbiAgICAgICAgcXVlc3Rpb24uY29udGVudCA9IHNlbGYuZ2V0Q29udGVudCgpO1xuICAgICAgICBzZWxmLmlzQ29udGVudFVwZGF0aW5nID0gZmFsc2U7XG4gICAgICB9O1xuICAgICAgcXVlc3Rpb24uZ2V0Q29udGVudCA9IHNlbGYuZ2V0Q29udGVudCA9IGZ1bmN0aW9uKGRlbGV0ZWROYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiRElWXCIpO1xuICAgICAgICBjb250ZW50LmlubmVySFRNTCA9IHNlbGYuZWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgIHZhciBjcHMgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NwYW5bcXVlc3Rpb249XCJ0cnVlXCJdJyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIG5hbWUgPSBjcHNbaV0uaWQucmVwbGFjZShcImZsb3dwYW5lbF9cIiwgXCJcIik7XG4gICAgICAgICAgdmFyIGh0bWwgPSBcIlwiO1xuICAgICAgICAgIGlmIChuYW1lICE9PSBkZWxldGVkTmFtZSkge1xuICAgICAgICAgICAgdmFyIGVsID0gcXVlc3Rpb24uZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSk7XG4gICAgICAgICAgICBodG1sID0gISFlbCA/IHF1ZXN0aW9uLmdldEVsZW1lbnRDb250ZW50VGV4dChlbCkgOiBcIlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjcHNbaV0ub3V0ZXJIVE1MID0gaHRtbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGVudC5pbm5lckhUTUw7XG4gICAgICB9O1xuICAgICAgdmFyIGNvbmZpZyA9IHtcbiAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcbiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICBzdWJ0cmVlOiB0cnVlXG4gICAgICB9O1xuICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24obXV0YXRpb25zTGlzdDogYW55LCBvYnNlcnZlcjogYW55KSB7XG4gICAgICAgIGlmICghc2VsZi5pc09uRm9jdXMpIHJldHVybjtcbiAgICAgICAgc2VsZi53YXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH07XG4gICAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjayk7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKHNlbGYuZWxlbWVudCwgY29uZmlnKTtcbiAgICAgIHJldHVybiB7IHF1ZXN0aW9uIH07XG4gICAgfVxuICB9LFxuICB0ZW1wbGF0ZTogXCI8ZGl2PjwvZGl2PlwiXG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb2Zsb3dwYW5lbC50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25Cb29sZWFuTW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fYm9vbGVhblwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQm9vbGVhbkltcGxlbWVudG9yIGV4dGVuZHMgUXVlc3Rpb25JbXBsZW1lbnRvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBzdXBlcihxdWVzdGlvbik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQm9vbGVhbiBleHRlbmRzIFF1ZXN0aW9uQm9vbGVhbk1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBRdWVzdGlvbkJvb2xlYW5JbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwdWJsaWMgZ2V0SXRlbUNzcyhyb3c6IGFueSwgY29sdW1uOiBhbnkpIHtcbiAgICBsZXQgaXNDaGVja2VkID0gdGhpcy5jaGVja2VkVmFsdWU7XG4gICAgbGV0IGl0ZW1DbGFzcyA9ICg8YW55PnRoaXMpW1wia29Dc3NcIl0oKS5pdGVtICsgKGlzQ2hlY2tlZCA/IFwiIGNoZWNrZWRcIiA6IFwiXCIpO1xuICAgIHJldHVybiBpdGVtQ2xhc3M7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcImJvb2xlYW5cIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25Cb29sZWFuKFwiXCIpO1xufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiYm9vbGVhblwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkJvb2xlYW4obmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2Jvb2xlYW4udHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hCYXNlSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveE1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2NoZWNrYm94XCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi9xdWVzdGlvblwiO1xuXG5jbGFzcyBRdWVzdGlvbkNoZWNrYm94SW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkNoZWNrYm94QmFzZUltcGxlbWVudG9yIHtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICB9XG4gIHByb3RlY3RlZCBnZXRLb1ZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ2hlY2tib3ggZXh0ZW5kcyBRdWVzdGlvbkNoZWNrYm94TW9kZWwge1xuICBrb0FsbFNlbGVjdGVkOiBhbnk7XG4gIHByaXZhdGUgaXNBbGxTZWxlY3RlZFVwZGF0aW5nID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUXVlc3Rpb25DaGVja2JveEltcGxlbWVudG9yKHRoaXMpO1xuICAgIHRoaXMua29BbGxTZWxlY3RlZCA9IGtvLm9ic2VydmFibGUodGhpcy5pc0FsbFNlbGVjdGVkKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5rb0FsbFNlbGVjdGVkLnN1YnNjcmliZShmdW5jdGlvbihuZXdWYWx1ZTogYW55KSB7XG4gICAgICBpZiAoc2VsZi5pc0FsbFNlbGVjdGVkVXBkYXRpbmcpIHJldHVybjtcbiAgICAgIGlmIChuZXdWYWx1ZSkgc2VsZi5zZWxlY3RBbGwoKTtcbiAgICAgIGVsc2Ugc2VsZi5jbGVhclZhbHVlKCk7XG4gICAgfSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uVmFsdWVDaGFuZ2VkKCk7XG4gICAgdGhpcy51cGRhdGVBbGxTZWxlY3RlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBvblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgIHRoaXMudXBkYXRlQWxsU2VsZWN0ZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlQWxsU2VsZWN0ZWQoKSB7XG4gICAgdGhpcy5pc0FsbFNlbGVjdGVkVXBkYXRpbmcgPSB0cnVlO1xuICAgIHRoaXMua29BbGxTZWxlY3RlZCh0aGlzLmlzQWxsU2VsZWN0ZWQpO1xuICAgIHRoaXMuaXNBbGxTZWxlY3RlZFVwZGF0aW5nID0gZmFsc2U7XG4gIH1cbiAgZ2V0SXRlbUNsYXNzKGl0ZW06IGFueSkge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlOyAvL3RyaWdnZXIgZGVwZW5kZW5jaWVzIGZyb20ga29WYWx1ZSBmb3Iga25vY2tvdXRcbiAgICB2YXIgaXNDaGVja2VkID0gdGhpcy5pc0l0ZW1TZWxlY3RlZChpdGVtKTtcbiAgICB2YXIgaXRlbUNsYXNzID0gdGhpcy5jc3NDbGFzc2VzLml0ZW07XG5cbiAgICBpZiAoIXRoaXMuaGFzQ29sdW1ucykge1xuICAgICAgaXRlbUNsYXNzICs9XG4gICAgICAgIHRoaXMuY29sQ291bnQgPT09IDBcbiAgICAgICAgICA/IFwiIHN2X3FfY2hlY2tib3hfaW5saW5lXCJcbiAgICAgICAgICA6IFwiIHN2LXEtY29sLVwiICsgdGhpcy5jb2xDb3VudDtcbiAgICB9XG5cbiAgICBpZiAoaXNDaGVja2VkKSBpdGVtQ2xhc3MgKz0gXCIgY2hlY2tlZFwiO1xuXG4gICAgcmV0dXJuIGl0ZW1DbGFzcztcbiAgfVxufVxuXG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwiY2hlY2tib3hcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25DaGVja2JveChcIlwiKTtcbn0pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJjaGVja2JveFwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25DaGVja2JveChuYW1lKTtcbiAgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fY2hlY2tib3gudHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25Db21tZW50TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fY29tbWVudFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ29tbWVudCBleHRlbmRzIFF1ZXN0aW9uQ29tbWVudE1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBRdWVzdGlvbkltcGxlbWVudG9yKHRoaXMpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJjb21tZW50XCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uQ29tbWVudChcIlwiKTtcbn0pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJjb21tZW50XCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uQ29tbWVudChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fY29tbWVudC50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2Ryb3Bkb3duXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uU2VsZWN0QmFzZUltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkRyb3Bkb3duIGV4dGVuZHMgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBRdWVzdGlvblNlbGVjdEJhc2VJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwiZHJvcGRvd25cIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25Ecm9wZG93bihcIlwiKTtcbn0pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJkcm9wZG93blwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25Ecm9wZG93bihuYW1lKTtcbiAgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fZHJvcGRvd24udHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRW1wdHlNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9lbXB0eVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRW1wdHkgZXh0ZW5kcyBRdWVzdGlvbkVtcHR5TW9kZWwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgbmV3IFF1ZXN0aW9uSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcImVtcHR5XCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRW1wdHkoXCJcIik7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2VtcHR5LnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9leHByZXNzaW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi9xdWVzdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25FeHByZXNzaW9uSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkltcGxlbWVudG9yIHtcbiAga29EaXNwbGF5VmFsdWU6IGFueTtcbiAgY29uc3RydWN0b3IocHVibGljIHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICB0aGlzLmtvRGlzcGxheVZhbHVlID0ga28ub2JzZXJ2YWJsZSh0aGlzLnF1ZXN0aW9uLmRpc3BsYXlWYWx1ZSk7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb0Rpc3BsYXlWYWx1ZVwiXSA9IHRoaXMua29EaXNwbGF5VmFsdWU7XG4gICAga28uY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgdGhpcy5rb0Rpc3BsYXlWYWx1ZSh0aGlzLnF1ZXN0aW9uLmRpc3BsYXlWYWx1ZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRXhwcmVzc2lvbiBleHRlbmRzIFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBRdWVzdGlvbkV4cHJlc3Npb25JbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwiZXhwcmVzc2lvblwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkV4cHJlc3Npb24oXCJcIik7XG59KTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiZXhwcmVzc2lvblwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkV4cHJlc3Npb24obmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2V4cHJlc3Npb24udHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GaWxlTW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fZmlsZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3F1ZXN0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkZpbGVJbXBsZW1lbnRvciBleHRlbmRzIFF1ZXN0aW9uSW1wbGVtZW50b3Ige1xuICBrb1N0YXRlID0ga28ub2JzZXJ2YWJsZTxzdHJpbmc+KFwiZW1wdHlcIik7XG4gIGtvSGFzVmFsdWUgPSBrby5jb21wdXRlZCgoKSA9PiB0aGlzLmtvU3RhdGUoKSA9PT0gXCJsb2FkZWRcIik7XG4gIGtvRGF0YSA9IGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAodGhpcy5rb0hhc1ZhbHVlKCkpIHtcbiAgICAgIHJldHVybiAoPFF1ZXN0aW9uRmlsZU1vZGVsPnRoaXMucXVlc3Rpb24pLnByZXZpZXdWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9KTtcbiAga29JbnB1dFRpdGxlID0ga28ub2JzZXJ2YWJsZTxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvRGF0YVwiXSA9IHRoaXMua29EYXRhO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29IYXNWYWx1ZVwiXSA9IHRoaXMua29IYXNWYWx1ZTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvSW5wdXRUaXRsZVwiXSA9IHRoaXMua29JbnB1dFRpdGxlO1xuICAgIHZhciB1cGRhdGVTdGF0ZSA9IChzdGF0ZTogYW55KSA9PiB7XG4gICAgICB0aGlzLmtvU3RhdGUoc3RhdGUpO1xuICAgICAgdGhpcy5rb0lucHV0VGl0bGUoKDxRdWVzdGlvbkZpbGVNb2RlbD50aGlzLnF1ZXN0aW9uKS5pbnB1dFRpdGxlKTtcbiAgICB9O1xuICAgICg8UXVlc3Rpb25GaWxlTW9kZWw+dGhpcy5xdWVzdGlvbikub25TdGF0ZUNoYW5nZWQuYWRkKChzZW5kZXIsIG9wdGlvbnMpID0+IHtcbiAgICAgIHVwZGF0ZVN0YXRlKG9wdGlvbnMuc3RhdGUpO1xuICAgIH0pO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wiZG9jaGFuZ2VcIl0gPSAoZGF0YTogYW55LCBldmVudDogYW55KSA9PiB7XG4gICAgICB2YXIgc3JjID0gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQ7XG4gICAgICBzZWxmLm9uQ2hhbmdlKHNyYyk7XG4gICAgfTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImRvY2xlYW5cIl0gPSAoZGF0YTogYW55LCBldmVudDogYW55KSA9PiB7XG4gICAgICB2YXIgc3JjID0gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQ7XG4gICAgICB2YXIgaW5wdXQgPSBzcmMucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRcIilbMF07XG4gICAgICAoPFF1ZXN0aW9uRmlsZU1vZGVsPnRoaXMucXVlc3Rpb24pLmNsZWFyKCk7XG4gICAgICBpbnB1dC52YWx1ZSA9IFwiXCI7XG4gICAgfTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImRvcmVtb3ZlZmlsZVwiXSA9IChkYXRhOiBhbnksIGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICg8UXVlc3Rpb25GaWxlTW9kZWw+dGhpcy5xdWVzdGlvbikucmVtb3ZlRmlsZShkYXRhKTtcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgb25DaGFuZ2Uoc3JjOiBhbnkpIHtcbiAgICBpZiAoISg8YW55PndpbmRvdylbXCJGaWxlUmVhZGVyXCJdKSByZXR1cm47XG4gICAgaWYgKCFzcmMgfHwgIXNyYy5maWxlcyB8fCBzcmMuZmlsZXMubGVuZ3RoIDwgMSkgcmV0dXJuO1xuICAgIGxldCBmaWxlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3JjLmZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmaWxlcy5wdXNoKHNyYy5maWxlc1tpXSk7XG4gICAgfVxuICAgIHNyYy52YWx1ZSA9IFwiXCI7XG4gICAgKDxRdWVzdGlvbkZpbGVNb2RlbD50aGlzLnF1ZXN0aW9uKS5sb2FkRmlsZXMoZmlsZXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkZpbGUgZXh0ZW5kcyBRdWVzdGlvbkZpbGVNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUXVlc3Rpb25GaWxlSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcImZpbGVcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25GaWxlKFwiXCIpO1xufSk7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImZpbGVcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25GaWxlKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9maWxlLnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkh0bWxNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9odG1sXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkh0bWwgZXh0ZW5kcyBRdWVzdGlvbkh0bWxNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUXVlc3Rpb25JbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwiaHRtbFwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkh0bWwoXCJcIik7XG59KTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiaHRtbFwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkh0bWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2h0bWwudHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9pbWFnZXBpY2tlclwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkNoZWNrYm94QmFzZUltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkltYWdlUGlja2VyIGV4dGVuZHMgUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICBuZXcgUXVlc3Rpb25DaGVja2JveEJhc2VJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBnZXRJdGVtQ2xhc3MoaXRlbTogYW55KSB7XG4gICAgdmFyIGl0ZW1DbGFzcyA9XG4gICAgICB0aGlzLmNzc0NsYXNzZXMuaXRlbSArXG4gICAgICAodGhpcy5jb2xDb3VudCA9PT0gMFxuICAgICAgICA/IFwiIHN2X3FfaW1hZ2VwaWNrZXJfaW5saW5lXCJcbiAgICAgICAgOiBcIiBzdi1xLWNvbC1cIiArIHRoaXMuY29sQ291bnQpO1xuICAgIGlmICh0aGlzLm11bHRpU2VsZWN0KSB7XG4gICAgICBpZiAoISF0aGlzLnZhbHVlICYmIHRoaXNbXCJrb1ZhbHVlXCJdKCkuaW5kZXhPZihpdGVtLnZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgaXRlbUNsYXNzICs9IFwiIGNoZWNrZWRcIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEhaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlID09IHRoaXNbXCJrb1ZhbHVlXCJdKCkpIHtcbiAgICAgICAgaXRlbUNsYXNzICs9IFwiIGNoZWNrZWRcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1DbGFzcztcbiAgfVxufVxuXG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwiaW1hZ2VwaWNrZXJcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25JbWFnZVBpY2tlcihcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImltYWdlcGlja2VyXCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbkltYWdlUGlja2VyKG5hbWUpO1xuICAvL3EuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlcztcbiAgcmV0dXJuIHE7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2ltYWdlcGlja2VyLnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQge1xuICBRdWVzdGlvbk1hdHJpeE1vZGVsLFxuICBNYXRyaXhSb3dNb2RlbCxcbiAgSU1hdHJpeERhdGFcbn0gZnJvbSBcIi4uL3F1ZXN0aW9uX21hdHJpeFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4uL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhSb3cgZXh0ZW5kcyBNYXRyaXhSb3dNb2RlbCB7XG4gIHByaXZhdGUgaXNWYWx1ZVVwZGF0aW5nID0gZmFsc2U7XG4gIGtvVmFsdWU6IGFueTtcbiAga29DZWxsQ2xpY2s6IGFueTtcbiAgY29uc3RydWN0b3IoXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIHB1YmxpYyBmdWxsTmFtZTogc3RyaW5nLFxuICAgIGRhdGE6IElNYXRyaXhEYXRhLFxuICAgIHZhbHVlOiBhbnlcbiAgKSB7XG4gICAgc3VwZXIoaXRlbSwgZnVsbE5hbWUsIGRhdGEsIHZhbHVlKTtcbiAgICB0aGlzLmtvVmFsdWUgPSBrby5vYnNlcnZhYmxlKHRoaXMudmFsdWUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvVmFsdWUuc3Vic2NyaWJlKGZ1bmN0aW9uKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICAgIGlmIChzZWxmLmlzVmFsdWVVcGRhdGluZykgdHJ1ZTtcbiAgICAgIHNlbGYudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLmtvQ2VsbENsaWNrID0gZnVuY3Rpb24oY29sdW1uOiBhbnkpIHtcbiAgICAgIHNlbGYua29WYWx1ZShjb2x1bW4udmFsdWUpO1xuICAgIH07XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKCkge1xuICAgIHRoaXMuaXNWYWx1ZVVwZGF0aW5nID0gdHJ1ZTtcbiAgICBpZiAoIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh0aGlzLmtvVmFsdWUoKSwgdGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMua29WYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5pc1ZhbHVlVXBkYXRpbmcgPSBmYWxzZTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4IGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhNb2RlbCB7XG4gIGtvVmlzaWJsZVJvd3M6IGFueTtcbiAga29WaXNpYmxlQ29sdW1uczogYW55O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgbmV3IFF1ZXN0aW9uSW1wbGVtZW50b3IodGhpcyk7XG4gICAgdGhpcy5rb1Zpc2libGVSb3dzID0ga28ub2JzZXJ2YWJsZSh0aGlzLnZpc2libGVSb3dzKTtcbiAgICB0aGlzLmtvVmlzaWJsZUNvbHVtbnMgPSBrby5vYnNlcnZhYmxlKHRoaXMudmlzaWJsZUNvbHVtbnMpO1xuICB9XG4gIHByb3RlY3RlZCBvbkNvbHVtbnNDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uQ29sdW1uc0NoYW5nZWQoKTtcbiAgICB0aGlzLmtvVmlzaWJsZVJvd3ModGhpcy52aXNpYmxlUm93cyk7XG4gICAgdGhpcy5rb1Zpc2libGVDb2x1bW5zKHRoaXMudmlzaWJsZUNvbHVtbnMpO1xuICB9XG4gIHByb3RlY3RlZCBvblJvd3NDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uUm93c0NoYW5nZWQoKTtcbiAgICB0aGlzLmtvVmlzaWJsZVJvd3ModGhpcy52aXNpYmxlUm93cyk7XG4gICAgdGhpcy5rb1Zpc2libGVDb2x1bW5zKHRoaXMudmlzaWJsZUNvbHVtbnMpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU1hdHJpeFJvdyhcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgZnVsbE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55XG4gICk6IE1hdHJpeFJvd01vZGVsIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeFJvdyhpdGVtLCBmdWxsTmFtZSwgdGhpcywgdmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXRJdGVtQ3NzKHJvdzogYW55LCBjb2x1bW46IGFueSkge1xuICAgIHZhciBpc0NoZWNrZWQgPSByb3cua29WYWx1ZSgpID09IGNvbHVtbi52YWx1ZTtcbiAgICB2YXIgY2VsbFNlbGVjdGVkQ2xhc3MgPSB0aGlzLmhhc0NlbGxUZXh0XG4gICAgICA/IHRoaXMuY3NzQ2xhc3Nlcy5jZWxsVGV4dFNlbGVjdGVkXG4gICAgICA6IFwiY2hlY2tlZFwiO1xuICAgIHZhciBjZWxsQ2xhc3MgPSB0aGlzLmhhc0NlbGxUZXh0XG4gICAgICA/ICg8YW55PnRoaXMpW1wia29Dc3NcIl0oKS5jZWxsVGV4dFxuICAgICAgOiAoPGFueT50aGlzKVtcImtvQ3NzXCJdKCkubGFiZWw7XG4gICAgbGV0IGl0ZW1DbGFzcyA9IGNlbGxDbGFzcyArIChpc0NoZWNrZWQgPyBcIiBcIiArIGNlbGxTZWxlY3RlZENsYXNzIDogXCJcIik7XG4gICAgcmV0dXJuIGl0ZW1DbGFzcztcbiAgfVxufVxuXG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwibWF0cml4XCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4KFwiXCIpO1xufSk7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeFwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25NYXRyaXgobmFtZSk7XG4gIHEucm93cyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Um93cztcbiAgcS5jb2x1bW5zID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDb2x1bXM7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXgudHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uTWF0cml4QmFzZUltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvbl9tYXRyaXhkcm9wZG93blwiO1xuaW1wb3J0IHsgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fbWF0cml4ZHluYW1pY1wiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UgfSBmcm9tIFwiLi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlXCI7XG5pbXBvcnQgeyBNYXRyaXhEeW5hbWljUm93TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fbWF0cml4ZHluYW1pY1wiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEeW5hbWljSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbk1hdHJpeEJhc2VJbXBsZW1lbnRvciB7XG4gIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgfVxuICBwcm90ZWN0ZWQgaGFzUm93VGV4dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGlzQWRkUm93VG9wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoPFF1ZXN0aW9uTWF0cml4RHluYW1pYz50aGlzLnF1ZXN0aW9uKS5pc0FkZFJvd09uVG9wO1xuICB9XG4gIHByb3RlY3RlZCBpc0FkZFJvd0JvdHRvbSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKDxRdWVzdGlvbk1hdHJpeER5bmFtaWM+dGhpcy5xdWVzdGlvbikuaXNBZGRSb3dPbkJvdHRvbTtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuUmVtb3ZlUm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhdGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5ICYmXG4gICAgICAoPFF1ZXN0aW9uTWF0cml4RHluYW1pYz50aGlzLnF1ZXN0aW9uKS5jYW5SZW1vdmVSb3dcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBvblVwZGF0ZUNlbGxzKCkge1xuICAgIC8vR2VuZXJlYXRlIHJvd3MgYWdhaW4uXG4gICAgdmFyIHJvd3MgPSAoPFF1ZXN0aW9uTWF0cml4RHluYW1pYz50aGlzLnF1ZXN0aW9uKVtcImdlbmVyYXRlZFZpc2libGVSb3dzXCJdO1xuICAgIHZhciBjb2x1bW5zID0gKDxRdWVzdGlvbk1hdHJpeER5bmFtaWM+dGhpcy5xdWVzdGlvbikuY29sdW1ucztcbiAgICBpZiAocm93cyAmJiByb3dzLmxlbmd0aCA+IDAgJiYgY29sdW1ucyAmJiBjb2x1bW5zLmxlbmd0aCA+IDApXG4gICAgICB0aGlzLm9uQ29sdW1uQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBhZGRSb3coKSB7XG4gICAgKDxRdWVzdGlvbk1hdHJpeER5bmFtaWM+dGhpcy5xdWVzdGlvbikuYWRkUm93KCk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbW92ZVJvdyhyb3c6IE1hdHJpeER5bmFtaWNSb3dNb2RlbCkge1xuICAgIHZhciByb3dzID0gKDxRdWVzdGlvbk1hdHJpeER5bmFtaWM+dGhpcy5xdWVzdGlvbikudmlzaWJsZVJvd3M7XG4gICAgdmFyIGluZGV4ID0gcm93cy5pbmRleE9mKHJvdyk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICg8UXVlc3Rpb25NYXRyaXhEeW5hbWljPnRoaXMucXVlc3Rpb24pLnJlbW92ZVJvd1VJKGluZGV4KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4RHluYW1pYyBleHRlbmRzIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsIHtcbiAga29DZWxsQWZ0ZXJSZW5kZXI6IGFueTtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBRdWVzdGlvbk1hdHJpeER5bmFtaWNJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwibWF0cml4ZHluYW1pY1wiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbk1hdHJpeER5bmFtaWMoXCJcIik7XG59KTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtYXRyaXhkeW5hbWljXCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeER5bmFtaWMobmFtZSk7XG4gIHEuY2hvaWNlcyA9IFsxLCAyLCAzLCA0LCA1XTtcbiAgcS5yb3dDb3VudCA9IDI7XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UuYWRkRGVmYXVsdENvbHVtbnMocSk7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhkeW5hbWljLnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQge1xuICBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsLFxuICBNdWx0aXBsZVRleHRJdGVtTW9kZWxcbn0gZnJvbSBcIi4uL3F1ZXN0aW9uX211bHRpcGxldGV4dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fdGV4dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uVGV4dCB9IGZyb20gXCIuL2tvcXVlc3Rpb25fdGV4dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuXG5leHBvcnQgY2xhc3MgTXVsdGlwbGVUZXh0SXRlbSBleHRlbmRzIE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBhbnkgPSBudWxsLCB0aXRsZTogc3RyaW5nID0gbnVsbCkge1xuICAgIHN1cGVyKG5hbWUsIHRpdGxlKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlRWRpdG9yKG5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uVGV4dE1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dChuYW1lKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NdWx0aXBsZVRleHRJbXBsZW1lbnRvciBleHRlbmRzIFF1ZXN0aW9uSW1wbGVtZW50b3Ige1xuICBrb1Jvd3M6IGFueTtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICAgIHRoaXMua29Sb3dzID0ga28ub2JzZXJ2YWJsZUFycmF5KFxuICAgICAgKDxRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsPnRoaXMucXVlc3Rpb24pLmdldFJvd3MoKVxuICAgICk7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb1Jvd3NcIl0gPSB0aGlzLmtvUm93cztcbiAgICB0aGlzLm9uQ29sQ291bnRDaGFuZ2VkKCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICg8UXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbD50aGlzXG4gICAgICAucXVlc3Rpb24pLmNvbENvdW50Q2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uQ29sQ291bnRDaGFuZ2VkKCk7XG4gICAgfTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Db2xDb3VudENoYW5nZWQoKSB7XG4gICAgdGhpcy5rb1Jvd3MoKDxRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsPnRoaXMucXVlc3Rpb24pLmdldFJvd3MoKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTXVsdGlwbGVUZXh0IGV4dGVuZHMgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUXVlc3Rpb25NdWx0aXBsZVRleHRJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlVGV4dEl0ZW0obmFtZTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsIHtcbiAgICByZXR1cm4gbmV3IE11bHRpcGxlVGV4dEl0ZW0obmFtZSwgdGl0bGUpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJtdWx0aXBsZXRleHRpdGVtXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IE11bHRpcGxlVGV4dEl0ZW0oXCJcIik7XG59KTtcblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcIm11bHRpcGxldGV4dFwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbk11bHRpcGxlVGV4dChcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm11bHRpcGxldGV4dFwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25NdWx0aXBsZVRleHQobmFtZSk7XG4gIHEuYWRkSXRlbShcInRleHQxXCIpO1xuICBxLmFkZEl0ZW0oXCJ0ZXh0MlwiKTtcbiAgcmV0dXJuIHE7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX211bHRpcGxldGV4dC50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudCB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5pbXBvcnQge1xuICBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsLFxuICBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW1cbn0gZnJvbSBcIi4uL3F1ZXN0aW9uX3BhbmVsZHluYW1pY1wiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFBhbmVsTW9kZWwgfSBmcm9tIFwiLi4vcGFuZWxcIjtcbmltcG9ydCB7IFBhbmVsIH0gZnJvbSBcIi4va29wYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblBhbmVsRHluYW1pY0ltcGxlbWVudG9yIGV4dGVuZHMgUXVlc3Rpb25JbXBsZW1lbnRvciB7XG4gIGtvUmVjYWxjOiBhbnk7XG4gIGtvQWRkUGFuZWxDbGljazogYW55O1xuICBrb1JlbW92ZVBhbmVsQ2xpY2s6IGFueTtcbiAga29QcmV2UGFuZWxDbGljazogYW55O1xuICBrb05leHRQYW5lbENsaWNrOiBhbnk7XG4gIGtvQ2FuQWRkUGFuZWw6IGFueTtcbiAga29DYW5SZW1vdmVQYW5lbDogYW55O1xuICBrb1BhbmVsOiBhbnk7XG4gIGtvSXNMaXN0OiBhbnk7XG4gIGtvSXNQcm9ncmVzc1RvcDogYW55O1xuICBrb0lzUHJvZ3Jlc3NCb3R0b206IGFueTtcbiAga29Jc05leHRCdXR0b246IGFueTtcbiAga29Jc1ByZXZCdXR0b246IGFueTtcbiAga29Jc1JhbmdlOiBhbnk7XG4gIGtvUmFuZ2VWYWx1ZTogYW55O1xuICBrb1JhbmdlTWF4OiBhbnk7XG4gIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICB0aGlzLmtvUmVjYWxjID0ga28ub2JzZXJ2YWJsZSgwKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5rb0FkZFBhbmVsQ2xpY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuYWRkUGFuZWwoKTtcbiAgICB9O1xuICAgIHRoaXMua29SZW1vdmVQYW5lbENsaWNrID0gZnVuY3Rpb24oZGF0YTogYW55KSB7XG4gICAgICBzZWxmLnJlbW92ZVBhbmVsKGRhdGEpO1xuICAgIH07XG4gICAgdGhpcy5rb1ByZXZQYW5lbENsaWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnNlbGYucXVlc3Rpb24pLmdvVG9QcmV2UGFuZWwoKTtcbiAgICB9O1xuICAgIHRoaXMua29OZXh0UGFuZWxDbGljayA9IGZ1bmN0aW9uKCkge1xuICAgICAgKDxRdWVzdGlvblBhbmVsRHluYW1pYz5zZWxmLnF1ZXN0aW9uKS5nb1RvTmV4dFBhbmVsKCk7XG4gICAgfTtcblxuICAgIHRoaXMua29DYW5BZGRQYW5lbCA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYua29SZWNhbGMoKTtcbiAgICAgIHJldHVybiAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnNlbGYucXVlc3Rpb24pLmNhbkFkZFBhbmVsO1xuICAgIH0pO1xuICAgIHRoaXMua29DYW5SZW1vdmVQYW5lbCA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYua29SZWNhbGMoKTtcbiAgICAgIHJldHVybiAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnNlbGYucXVlc3Rpb24pLmNhblJlbW92ZVBhbmVsO1xuICAgIH0pO1xuICAgIHRoaXMua29Jc1ByZXZCdXR0b24gPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmtvUmVjYWxjKCk7XG4gICAgICByZXR1cm4gKDxRdWVzdGlvblBhbmVsRHluYW1pYz5zZWxmLnF1ZXN0aW9uKS5pc1ByZXZCdXR0b25TaG93aW5nO1xuICAgIH0pO1xuICAgIHRoaXMua29Jc05leHRCdXR0b24gPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmtvUmVjYWxjKCk7XG4gICAgICByZXR1cm4gKDxRdWVzdGlvblBhbmVsRHluYW1pYz5zZWxmLnF1ZXN0aW9uKS5pc05leHRCdXR0b25TaG93aW5nO1xuICAgIH0pO1xuICAgIHRoaXMua29Jc1JhbmdlID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5rb1JlY2FsYygpO1xuICAgICAgcmV0dXJuICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+c2VsZi5xdWVzdGlvbikuaXNSYW5nZVNob3dpbmc7XG4gICAgfSk7XG4gICAgdGhpcy5rb1BhbmVsID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5rb1JlY2FsYygpO1xuICAgICAgcmV0dXJuICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+c2VsZi5xdWVzdGlvbikuY3VycmVudFBhbmVsO1xuICAgIH0pO1xuICAgIHRoaXMua29Jc0xpc3QgPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmtvUmVjYWxjKCk7XG4gICAgICByZXR1cm4gKDxRdWVzdGlvblBhbmVsRHluYW1pYz5zZWxmLnF1ZXN0aW9uKS5pc1JlbmRlck1vZGVMaXN0O1xuICAgIH0pO1xuICAgIHRoaXMua29Jc1Byb2dyZXNzVG9wID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5rb1JlY2FsYygpO1xuICAgICAgcmV0dXJuICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+c2VsZi5xdWVzdGlvbikuaXNQcm9ncmVzc1RvcFNob3dpbmc7XG4gICAgfSk7XG4gICAgdGhpcy5rb0lzUHJvZ3Jlc3NCb3R0b20gPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmtvUmVjYWxjKCk7XG4gICAgICByZXR1cm4gKDxRdWVzdGlvblBhbmVsRHluYW1pYz5zZWxmLnF1ZXN0aW9uKS5pc1Byb2dyZXNzQm90dG9tU2hvd2luZztcbiAgICB9KTtcblxuICAgIHRoaXMua29SYW5nZVZhbHVlID0ga28ub2JzZXJ2YWJsZShcbiAgICAgICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+c2VsZi5xdWVzdGlvbikuY3VycmVudEluZGV4XG4gICAgKTtcbiAgICB0aGlzLmtvUmFuZ2VWYWx1ZS5zdWJzY3JpYmUoZnVuY3Rpb24obmV3VmFsdWU6IGFueSkge1xuICAgICAgKDxRdWVzdGlvblBhbmVsRHluYW1pYz5zZWxmLnF1ZXN0aW9uKS5jdXJyZW50SW5kZXggPSBuZXdWYWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLmtvUmFuZ2VNYXggPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmtvUmVjYWxjKCk7XG4gICAgICByZXR1cm4gKDxRdWVzdGlvblBhbmVsRHluYW1pYz5zZWxmLnF1ZXN0aW9uKS5wYW5lbENvdW50IC0gMTtcbiAgICB9KTtcblxuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29BZGRQYW5lbENsaWNrXCJdID0gdGhpcy5rb0FkZFBhbmVsQ2xpY2s7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb1JlbW92ZVBhbmVsQ2xpY2tcIl0gPSB0aGlzLmtvUmVtb3ZlUGFuZWxDbGljaztcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvUHJldlBhbmVsQ2xpY2tcIl0gPSB0aGlzLmtvUHJldlBhbmVsQ2xpY2s7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb05leHRQYW5lbENsaWNrXCJdID0gdGhpcy5rb05leHRQYW5lbENsaWNrO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29DYW5BZGRQYW5lbFwiXSA9IHRoaXMua29DYW5BZGRQYW5lbDtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvQ2FuUmVtb3ZlUGFuZWxcIl0gPSB0aGlzLmtvQ2FuUmVtb3ZlUGFuZWw7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb1BhbmVsXCJdID0gdGhpcy5rb1BhbmVsO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29Jc0xpc3RcIl0gPSB0aGlzLmtvSXNMaXN0O1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29Jc1Byb2dyZXNzVG9wXCJdID0gdGhpcy5rb0lzUHJvZ3Jlc3NUb3A7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb0lzUHJvZ3Jlc3NCb3R0b21cIl0gPSB0aGlzLmtvSXNQcm9ncmVzc0JvdHRvbTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvSXNQcmV2QnV0dG9uXCJdID0gdGhpcy5rb0lzUHJldkJ1dHRvbjtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvSXNOZXh0QnV0dG9uXCJdID0gdGhpcy5rb0lzTmV4dEJ1dHRvbjtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImtvSXNSYW5nZVwiXSA9IHRoaXMua29Jc1JhbmdlO1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29SYW5nZVZhbHVlXCJdID0gdGhpcy5rb1JhbmdlVmFsdWU7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb1JhbmdlTWF4XCJdID0gdGhpcy5rb1JhbmdlTWF4O1xuXG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb1BhbmVsQWZ0ZXJSZW5kZXJcIl0gPSBmdW5jdGlvbihlbDogYW55LCBjb246IGFueSkge1xuICAgICAgc2VsZi5wYW5lbEFmdGVyUmVuZGVyKGVsLCBjb24pO1xuICAgIH07XG4gICAgKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzXG4gICAgICAucXVlc3Rpb24pLnBhbmVsQ291bnRDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25QYW5lbENvdW50Q2hhbmdlZCgpO1xuICAgIH07XG4gICAgKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzXG4gICAgICAucXVlc3Rpb24pLnJlbmRlck1vZGVDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25SZW5kZXJNb2RlQ2hhbmdlZCgpO1xuICAgIH07XG4gICAgKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzXG4gICAgICAucXVlc3Rpb24pLmN1cnJlbnRJbmRleENoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vbkN1cnJlbnRJbmRleENoYW5nZWQoKTtcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCBvblBhbmVsQ291bnRDaGFuZ2VkKCkge1xuICAgIHRoaXMub25DdXJyZW50SW5kZXhDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUmVuZGVyTW9kZUNoYW5nZWQoKSB7XG4gICAgdGhpcy5vbkN1cnJlbnRJbmRleENoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DdXJyZW50SW5kZXhDaGFuZ2VkKCkge1xuICAgIHRoaXMua29SZWNhbGModGhpcy5rb1JlY2FsYygpICsgMSk7XG4gICAgdGhpcy5rb1JhbmdlVmFsdWUoKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzLnF1ZXN0aW9uKS5jdXJyZW50SW5kZXgpO1xuICB9XG4gIHByb3RlY3RlZCBhZGRQYW5lbCgpIHtcbiAgICAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnRoaXMucXVlc3Rpb24pLmFkZFBhbmVsVUkoKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVtb3ZlUGFuZWwodmFsOiBhbnkpIHtcbiAgICB2YXIgcSA9IDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzLnF1ZXN0aW9uO1xuICAgIGlmICghcS5pc1JlbmRlck1vZGVMaXN0KSB7XG4gICAgICB2YWwgPSBxLmN1cnJlbnRQYW5lbDtcbiAgICB9XG4gICAgcS5yZW1vdmVQYW5lbFVJKHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBwYW5lbEFmdGVyUmVuZGVyKGVsZW1lbnRzOiBhbnksIGNvbjogYW55KSB7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uIHx8ICF0aGlzLnF1ZXN0aW9uLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBlbCA9IFN1cnZleUVsZW1lbnQuR2V0Rmlyc3ROb25UZXh0RWxlbWVudChlbGVtZW50cyk7XG4gICAgdGhpcy5xdWVzdGlvbi5zdXJ2ZXkuYWZ0ZXJSZW5kZXJQYW5lbChjb24sIGVsKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25QYW5lbER5bmFtaWMgZXh0ZW5kcyBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY0ltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdQYW5lbE9iamVjdCgpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFBhbmVsKCk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcInBhbmVsZHluYW1pY1wiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pYyhcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInBhbmVsZHluYW1pY1wiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pYyhuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fcGFuZWxkeW5hbWljLnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9yYWRpb2dyb3VwXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hCYXNlSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUmFkaW9ncm91cCBleHRlbmRzIFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBRdWVzdGlvbkNoZWNrYm94QmFzZUltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIGdldEl0ZW1DbGFzcyhpdGVtOiBhbnkpIHtcbiAgICB2YXIgaXRlbUNsYXNzID0gdGhpcy5jc3NDbGFzc2VzLml0ZW07XG5cbiAgICBpZiAoIXRoaXMuaGFzQ29sdW1ucykge1xuICAgICAgaXRlbUNsYXNzICs9XG4gICAgICAgIHRoaXMuY29sQ291bnQgPT09IDBcbiAgICAgICAgICA/IFwiIHN2X3FfcmFkaW9ncm91cF9pbmxpbmVcIlxuICAgICAgICAgIDogXCIgc3YtcS1jb2wtXCIgKyB0aGlzLmNvbENvdW50O1xuICAgIH1cblxuICAgIGlmIChpdGVtLnZhbHVlID09PSB0aGlzLnZhbHVlKSBpdGVtQ2xhc3MgKz0gXCIgY2hlY2tlZFwiO1xuICAgIHJldHVybiBpdGVtQ2xhc3M7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcInJhZGlvZ3JvdXBcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25SYWRpb2dyb3VwKFwiXCIpO1xufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicmFkaW9ncm91cFwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25SYWRpb2dyb3VwKG5hbWUpO1xuICBxLmNob2ljZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENob2ljZXM7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9yYWRpb2dyb3VwLnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb25SYXRpbmdNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9yYXRpbmdcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcblxuY2xhc3MgUXVlc3Rpb25SYXRpbmdJbXBsZW1lbnRvciBleHRlbmRzIFF1ZXN0aW9uSW1wbGVtZW50b3Ige1xuICBrb1Zpc2libGVSYXRlVmFsdWVzOiBhbnk7XG4gIGtvQ2hhbmdlOiBhbnk7XG4gIGtvQ3NzOiBhbnk7XG4gIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICB0aGlzLmtvVmlzaWJsZVJhdGVWYWx1ZXMgPSBrby5vYnNlcnZhYmxlQXJyYXkodGhpcy5nZXRWYWx1ZXMoKSk7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb1Zpc2libGVSYXRlVmFsdWVzXCJdID0gdGhpcy5rb1Zpc2libGVSYXRlVmFsdWVzO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvQ2hhbmdlID0gZnVuY3Rpb24odmFsOiBhbnkpIHtcbiAgICAgIHNlbGYucXVlc3Rpb24udmFsdWUgPSB2YWwuaXRlbVZhbHVlO1xuICAgIH07XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJrb0NoYW5nZVwiXSA9IHRoaXMua29DaGFuZ2U7XG4gICAgKDxRdWVzdGlvblJhdGluZz50aGlzLnF1ZXN0aW9uKS5yYXRlVmFsdWVzQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uUmF0ZVZhbHVlc0NoYW5nZWQoKTtcbiAgICB9O1xuICAgICg8YW55PnRoaXMucXVlc3Rpb24pW1wia29HZXRDc3NcIl0gPSAodmFsOiBhbnkpID0+IHtcbiAgICAgIHZhciBjc3MgPSBzZWxmLnF1ZXN0aW9uLmNzc0NsYXNzZXMuaXRlbTtcbiAgICAgIHZhciBzZWxlY3RlZCA9IHNlbGYucXVlc3Rpb24uY3NzQ2xhc3Nlcy5zZWxlY3RlZDtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnZhbHVlID09PSB2YWwudmFsdWUgPyBjc3MgKyBcIiBcIiArIHNlbGVjdGVkIDogY3NzO1xuICAgIH07XG4gIH1cbiAgcHJvdGVjdGVkIG9uUmF0ZVZhbHVlc0NoYW5nZWQoKSB7XG4gICAgdGhpcy5rb1Zpc2libGVSYXRlVmFsdWVzKHRoaXMuZ2V0VmFsdWVzKCkpO1xuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWVzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiAoPFF1ZXN0aW9uUmF0aW5nPnRoaXMucXVlc3Rpb24pLnZpc2libGVSYXRlVmFsdWVzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblJhdGluZyBleHRlbmRzIFF1ZXN0aW9uUmF0aW5nTW9kZWwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgbmV3IFF1ZXN0aW9uUmF0aW5nSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcInJhdGluZ1wiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblJhdGluZyhcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInJhdGluZ1wiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblJhdGluZyhuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fcmF0aW5nLnRzIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LWNvbW1lbnRcXFwiPlxcbiAgPCEtLSBrbyBpZm5vdDogcXVlc3Rpb24uaXNSZWFkT25seSAtLT5cXG4gIDx0ZXh0YXJlYSB0eXBlPVxcXCJ0ZXh0XFxcIiBkYXRhLWJpbmQ9XFxcInZhbHVlOiAkZGF0YS5xdWVzdGlvbi5jb21tZW50LCB2aXNpYmxlOiAkZGF0YS52aXNpYmxlLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkub3RoZXIsIGF0dHI6IHttYXhMZW5ndGg6IHF1ZXN0aW9uLmdldE90aGVyc01heExlbmd0aCgpLCAnYXJpYS1sYWJlbCc6ICEhcXVlc3Rpb24ubG9jVGl0bGUgJiYgcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sLCBwbGFjZWhvbGRlcjogcXVlc3Rpb24ub3RoZXJQbGFjZUhvbGRlcn1cXFwiPjwvdGV4dGFyZWE+XFxuICA8IS0tIC9rbyAtLT5cXG4gIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmlzUmVhZE9ubHkgLS0+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwidGV4dDogJGRhdGEucXVlc3Rpb24uY29tbWVudCwgdmlzaWJsZTogJGRhdGEudmlzaWJsZSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLm90aGVyXFxcIj48L2Rpdj5cXG4gIDwhLS0gL2tvIC0tPlxcbjwvc2NyaXB0PlxcblwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9jb21tZW50Lmh0bWxcbi8vIG1vZHVsZSBpZCA9IDgyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1mbG93cGFuZWxcXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcInN0eWxlOnsgd2lkdGg6IHJlbmRlcldpZHRoIH0sIGF0dHI6IHtpZDogaWR9LCBjc3M6IGNzc0NsYXNzZXMucGFuZWwuY29udGFpbmVyXFxcIj5cXG4gICAgICA8aDQgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiAocHJvY2Vzc2VkVGl0bGUubGVuZ3RoID4gMCksIGNzczogY3NzQ2xhc3Nlcy5wYW5lbC50aXRsZVxcXCI+XFxuICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBsb2NUaXRsZSB9IC0tPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8L2g0PlxcbiAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzc0NsYXNzZXMucGFuZWwuZGVzY3JpcHRpb25cXFwiPlxcbiAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jRGVzY3JpcHRpb24gfSAtLT5cXG4gICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPC9kaXY+XFxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInN0eWxlOiB7IHBhZGRpbmdMZWZ0OiBpbm5lclBhZGRpbmdMZWZ0fVxcXCI+PC9kaXY+XFxuICAgICAgPGYtcGFuZWwgcGFyYW1zPVxcXCJxdWVzdGlvbjogcXVlc3Rpb25cXFwiIGRhdGEtYmluZD1cXFwiYXR0cjoge2NvbnRlbnRlZGl0YWJsZSA6IHF1ZXN0aW9uLmlzRGVzaWduTW9kZSwgcGxhY2VIb2xkZXI6IHF1ZXN0aW9uLnBsYWNlSG9sZGVyfVxcXCI+PC9mLXBhbmVsPlxcbiAgPC9kaXY+XFxuPC9zY3JpcHQ+XFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktZmxvd3BhbmVsLXF1ZXN0aW9uXFxcIj5cXG4gIDwhLS0ga28gd2l0aDogJHBhcmVudC5xdWVzdGlvbi5nZXRRdWVzdGlvbkJ5TmFtZSgkZGF0YSkgLS0+XFxuICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZToga29FbGVtZW50VHlwZSgpLCBkYXRhOiAkZGF0YSwgYXM6ICdxdWVzdGlvbicsIGFmdGVyUmVuZGVyOiBwYXJlbnQua29FbGVtZW50QWZ0ZXJSZW5kZXIgfSAtLT48IS0tIC9rbyAtLT5cXG4gIDwhLS0gL2tvIC0tPlxcbjwvc2NyaXB0PlxcblwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9mbG93cGFuZWwuaHRtbFxuLy8gbW9kdWxlIGlkID0gODNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LWNvbnRlbnRcXFwiPlxcblxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLnJvb3QsIGFmdGVyUmVuZGVyOiBrb0V2ZW50QWZ0ZXJSZW5kZXJcXFwiPlxcbiAgICAgIDxmb3JtIG9uc3VibWl0PVxcXCJyZXR1cm4gZmFsc2U7XFxcIj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwic3ZfY3VzdG9tX2hlYWRlclxcXCI+PC9kaXY+XFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInN2X2NvbnRhaW5lclxcXCI+XFxuICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAodGl0bGUubGVuZ3RoID4gMCkgJiYgc2hvd1RpdGxlICYmIGtvU3RhdGUoKSA9PSAncnVubmluZycgLS0+XFxuICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBjc3MuaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICA8aDM+PCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY1RpdGxlIH0gLS0+PCEtLSAva28gLS0+PC9oMz5cXG4gICAgICAgICAgICAgICAgICA8aDU+PCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY0Rlc2NyaXB0aW9uIH0gLS0+PCEtLSAva28gLS0+PC9oNT5cXG4gICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBrb1N0YXRlKCkgPT0gXFxcInN0YXJ0aW5nXFxcIiAtLT5cXG4gICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy5ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBpc05hdmlnYXRpb25CdXR0b25zU2hvd2luZyA9PT0gJ3RvcCcgfHwgaXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmcgPT09ICdib3RoJyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktbmF2aWdhdGlvbi1zdGFydCd9IC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJhdHRyOiB7IGlkOiBzdGFydGVkUGFnZS5pZCB9LCB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXBhZ2UnLCBkYXRhOiBzdGFydGVkUGFnZSwgYWZ0ZXJSZW5kZXI6IGtvQWZ0ZXJSZW5kZXJQYWdlIH1cXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IGlzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nID09PSAnYm90dG9tJyB8fCBpc05hdmlnYXRpb25CdXR0b25zU2hvd2luZyA9PT0gJ2JvdGgnIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1uYXZpZ2F0aW9uLXN0YXJ0J30gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBpZjoga29TdGF0ZSgpID09IFxcXCJydW5uaW5nXFxcIiAtLT5cXG4gICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy5ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBpc1RpbWVyUGFuZWxTaG93aW5nT25Ub3AgLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXRpbWVycGFuZWwnfSAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTogaXNTaG93UHJvZ3Jlc3NCYXJPblRvcCwgdGVtcGxhdGU6ICdzdXJ2ZXktcHJvZ3Jlc3MnXFxcIj48L2Rpdj5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBpc05hdmlnYXRpb25CdXR0b25zU2hvd2luZyA9PT0gJ3RvcCcgfHwgaXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmcgPT09ICdib3RoJyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktbmF2aWdhdGlvbid9IC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IGtvQ3VycmVudFBhZ2UgLS0+XFxuICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgaWQ6IGtvQ3VycmVudFBhZ2UoKS5pZCB9LCB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXBhZ2UnLCBkYXRhOiBrb0N1cnJlbnRQYWdlLCBhZnRlclJlbmRlcjoga29BZnRlclJlbmRlclBhZ2UgfVxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cXFwibWFyZ2luLXRvcDoxZW1cXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZTogaXNTaG93UHJvZ3Jlc3NCYXJPbkJvdHRvbSwgdGVtcGxhdGU6ICdzdXJ2ZXktcHJvZ3Jlc3MnXFxcIj48L2Rpdj5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBpc1RpbWVyUGFuZWxTaG93aW5nT25Cb3R0b20gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXRpbWVycGFuZWwnfSAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBpc05hdmlnYXRpb25CdXR0b25zU2hvd2luZyA9PT0gJ2JvdHRvbScgfHwgaXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmcgPT09ICdib3RoJyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktbmF2aWdhdGlvbid9IC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWY6IGtvU3RhdGUoKSA9PSBcXFwiY29tcGxldGVkXFxcIiAmJiBzaG93Q29tcGxldGVkUGFnZSAtLT5cXG4gICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJodG1sOiBwcm9jZXNzZWRDb21wbGV0ZWRIdG1sLCBjc3M6IGNvbXBsZXRlZENzc1xcXCI+PC9kaXY+XFxuICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZToga29Db21wbGV0ZWRTdGF0ZSgpICE9ICcnLCBjc3M6IGNzcy5zYXZlRGF0YS5yb290XFxcIj5cXG4gICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBrb0NvbXBsZXRlZFN0YXRlQ3NzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OmtvQ29tcGxldGVkU3RhdGVUZXh0XFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZToga29Db21wbGV0ZWRTdGF0ZSgpID09ICdlcnJvcicsIHZhbHVlOiBnZXRMb2NTdHJpbmcoJ3NhdmVBZ2FpbkJ1dHRvbicpLCBjbGljazogZG9Db21wbGV0ZSwgY3NzOiBjc3Muc2F2ZURhdGEuc2F2ZUFnYWluQnV0dG9uXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAvPlxcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWY6IGtvU3RhdGUoKSA9PSBcXFwiY29tcGxldGVkYmVmb3JlXFxcIiAtLT5cXG4gICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJodG1sOiBwcm9jZXNzZWRDb21wbGV0ZWRCZWZvcmVIdG1sLCBjc3M6IGNzcy5ib2R5XFxcIj48L2Rpdj5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBpZjoga29TdGF0ZSgpID09IFxcXCJsb2FkaW5nXFxcIiAtLT5cXG4gICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJodG1sOiBwcm9jZXNzZWRMb2FkaW5nSHRtbCwgY3NzOiBjc3MuYm9keVxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWY6IGtvU3RhdGUoKSA9PSBcXFwiZW1wdHlcXFwiIC0tPlxcbiAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInRleHQ6ZW1wdHlTdXJ2ZXlUZXh0LCBjc3M6IGNzcy5ib2R5RW1wdHlcXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZm9ybT5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcbjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LW5hdmlnYXRpb25cXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLmZvb3RlclxcXCI+XFxuICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJ2YWx1ZTogcGFnZVByZXZUZXh0LCBjbGljazogcHJldlBhZ2UsIHZpc2libGU6ICFrb0lzRmlyc3RQYWdlKCkgJiYgaXNTaG93UHJldkJ1dHRvbiwgY3NzOiBjc3NOYXZpZ2F0aW9uUHJldlxcXCJcXG4gICAgICAvPlxcbiAgICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIGRhdGEtYmluZD1cXFwidmFsdWU6IHBhZ2VOZXh0VGV4dCwgY2xpY2s6IG5leHRQYWdlVUlDbGljaywgZXZlbnQ6IHsgbW91c2Vkb3duOiBuZXh0UGFnZU1vdXNlRG93biB9LCB2aXNpYmxlOiAha29Jc0xhc3RQYWdlKCksIGNzczogY3NzTmF2aWdhdGlvbk5leHRcXFwiIC8+XFxuICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJ2YWx1ZTogY29tcGxldGVUZXh0LCBjbGljazogY29tcGxldGVMYXN0UGFnZSwgdmlzaWJsZToga29Jc0xhc3RQYWdlKCkgJiYgaXNFZGl0TW9kZSwgY3NzOiBjc3NOYXZpZ2F0aW9uQ29tcGxldGVcXFwiXFxuICAgICAgLz5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcbjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LW5hdmlnYXRpb24tc3RhcnRcXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLmZvb3RlclxcXCI+XFxuICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJ2YWx1ZTogc3RhcnRTdXJ2ZXlUZXh0LCBjbGljazogc3RhcnQsIGNzczogY3NzTmF2aWdhdGlvblN0YXJ0XFxcIiAvPlxcbiAgPC9kaXY+XFxuPC9zY3JpcHQ+XFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL2luZGV4Lmh0bWxcbi8vIG1vZHVsZSBpZCA9IDg0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1tYXRyaXhjZWxsXFxcIj5cXG4gIDx0ZCBkYXRhLWJpbmQ9XFxcImNzczogJGNvbnRleHQucXVlc3Rpb24ua29Dc3MoKS5pdGVtVmFsdWUgKyAoY2VsbC5xdWVzdGlvbi5lcnJvcnMubGVuZ3RoID4gMCA/ICcgJyArIGNlbGwucXVlc3Rpb24ua29Dc3MoKS5oYXNFcnJvciA6ICcnKSwgYXR0cjogeyBoZWFkZXJzOiBjZWxsLnF1ZXN0aW9uLmlzVmlzaWJsZSA/IGNlbGwuY29sdW1uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbCA6ICcnIH1cXFwiPlxcbiAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBjZWxsLnF1ZXN0aW9uLmlzVmlzaWJsZVxcXCI+XFxuICAgICAgICAgIDwhLS0ga28gaWY6IGNlbGwucXVlc3Rpb24uc3VydmV5LnF1ZXN0aW9uRXJyb3JMb2NhdGlvbiA9PSAndG9wJyAtLT5cXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBjZWxsLnF1ZXN0aW9uLmtvQ3NzKCkuZXJyb3IubG9jYXRpb25Ub3BcXFwiPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXF1ZXN0aW9uLWVycm9ycycsIGRhdGE6IGNlbGwucXVlc3Rpb24gfSAtLT5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG5cXG4gICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiBxdWVzdGlvbi5rb1RlbXBsYXRlTmFtZSgpLCBkYXRhOiBjZWxsLnF1ZXN0aW9uLCBhczogJ3F1ZXN0aW9uJyB9IC0tPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG5cXG4gICAgICAgICAgPCEtLSBrbyBpZjogY2VsbC5xdWVzdGlvbi5zdXJ2ZXkucXVlc3Rpb25FcnJvckxvY2F0aW9uID09ICdib3R0b20nIC0tPlxcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNlbGwucXVlc3Rpb24ua29Dc3MoKS5lcnJvci5sb2NhdGlvbkJvdHRvbVxcXCI+XFxuICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tZXJyb3JzJywgZGF0YTogY2VsbC5xdWVzdGlvbiB9IC0tPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwvZGl2PlxcbiAgPC90ZD5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvbWF0cml4Y2VsbC5odG1sXG4vLyBtb2R1bGUgaWQgPSA4NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcGFnZVxcXCI+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBkYXRhLmNzcy5wYWdlLnJvb3RcXFwiPlxcbiAgICAgIDxoNCBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGRhdGEuc2hvd1BhZ2VUaXRsZXMsIGNzczogZGF0YS5jc3MucGFnZVRpdGxlXFxcIj5cXG4gICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY1RpdGxlIH0gLS0+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwvaDQ+XFxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogZGF0YS5jc3MucGFnZURlc2NyaXB0aW9uXFxcIj5cXG4gICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY0Rlc2NyaXB0aW9uIH0gLS0+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwvZGl2PlxcbiAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1yb3dzJywgZGF0YTogJGRhdGF9IC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgPC9kaXY+XFxuPC9zY3JpcHQ+XFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3BhZ2UuaHRtbFxuLy8gbW9kdWxlIGlkID0gODZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXBhbmVsXFxcIj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInN0eWxlOnsgd2lkdGg6IHJlbmRlcldpZHRoIH0sIGF0dHI6IHtpZDogaWR9LCBjc3M6IGNzc0NsYXNzZXMucGFuZWwuY29udGFpbmVyXFxcIj5cXG4gICAgICAgIDxoNCBkYXRhLWJpbmQ9XFxcInZpc2libGU6IChwcm9jZXNzZWRUaXRsZS5sZW5ndGggPiAwKSwgY3NzOiAkZGF0YS5nZXRUaXRsZVN0eWxlKCksIGNsaWNrOiBkb0V4cGFuZFxcXCI+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY1RpdGxlIH0gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInN2X3BhbmVsX2ljb25cXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZToga29Jc0NvbGxhcHNlZCgpIHx8IGtvSXNFeHBhbmRlZCgpLCBjc3M6IHtzdl9leHBhbmRlZDogIWtvSXNDb2xsYXBzZWQoKX1cXFwiPjwvc3Bhbj5cXG4gICAgICAgIDwvaDQ+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBjc3NDbGFzc2VzLnBhbmVsLmRlc2NyaXB0aW9uXFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jRGVzY3JpcHRpb24gfSAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXF1ZXN0aW9uLWVycm9ycycsIGRhdGE6ICRkYXRhIH0gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiAha29Jc0NvbGxhcHNlZCgpLCBzdHlsZTogeyBwYWRkaW5nTGVmdDogaW5uZXJQYWRkaW5nTGVmdH1cXFwiPlxcbiAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1yb3dzJywgZGF0YTogJGRhdGF9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2Plxcbjwvc2NyaXB0PlwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9wYW5lbC5odG1sXG4vLyBtb2R1bGUgaWQgPSA4N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcHJvZ3Jlc3NcXFwiPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBjc3MucHJvZ3Jlc3NcXFwiPlxcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLnByb2dyZXNzQmFyLCBzdHlsZTp7d2lkdGg6IGtvUHJvZ3Jlc3MoKSArICclJ31cXFwiXFxuICAgICAgICAgICAgcm9sZT1cXFwicHJvZ3Jlc3NiYXJcXFwiIGFyaWEtdmFsdWVtaW49XFxcIjBcXFwiIGFyaWEtdmFsdWVtYXg9XFxcIjEwMFxcXCI+XFxuICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OmtvUHJvZ3Jlc3NUZXh0XFxcIj48L3NwYW4+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3Byb2dyZXNzLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDg4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1ib29sZWFuXFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+XFxuICAgICAgPGxhYmVsIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5nZXRJdGVtQ3NzKClcXFwiPlxcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwiY2hlY2tib3hcXFwiIGRhdGEtYmluZD1cXFwiYXR0cjoge25hbWU6IHF1ZXN0aW9uLm5hbWUsIGlkOiBxdWVzdGlvbi5pbnB1dElkLCAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH0sIGNoZWNrZWQ6IHF1ZXN0aW9uLmNoZWNrZWRWYWx1ZSwgc3VydmV5UHJvcDoge2luZGV0ZXJtaW5hdGU6IHF1ZXN0aW9uLmlzSW5kZXRlcm1pbmF0ZX0sIGVuYWJsZTogIXF1ZXN0aW9uLmlzUmVhZE9ubHlcXFwiXFxuICAgICAgICAgIC8+XFxuICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLm1hdGVyaWFsRGVjb3JhdG9yXFxcIj5cXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJjaGVja1xcXCI+PC9zcGFuPlxcbiAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmxhYmVsXFxcIj5cXG4gICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBsb2NEaXNwbGF5TGFiZWwgfSAtLT5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8L3NwYW4+XFxuICAgICAgPC9sYWJlbD5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcblwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1ib29sZWFuLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDg5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1jaGVja2JveFxcXCI+XFxuICA8ZmllbGRzZXQgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+XFxuICAgICAgPGxlZ2VuZCBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWwgfVxcXCI+PC9sZWdlbmQ+XFxuICAgICAgPCEtLSBrbyBpZm5vdDogcXVlc3Rpb24uaGFzQ29sdW1ucyAgLS0+XFxuICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcXVlc3Rpb24udmlzaWJsZUNob2ljZXMsIGFzOiAnaXRlbScsIGFmdGVyUmVuZGVyOiBxdWVzdGlvbi5rb0FmdGVyUmVuZGVyIH0gIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6ICdzdXJ2ZXktY2hlY2tib3gtaXRlbScgLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5oYXNDb2x1bW5zICAtLT5cXG4gICAgICAgIDwhLS0ga28gZm9yZWFjaDogcXVlc3Rpb24uY29sdW1ucyAtLT5cXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5nZXRDb2x1bW5DbGFzcygpXFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogJGRhdGEsIGFzOiAnaXRlbScsIGFmdGVyUmVuZGVyOiBxdWVzdGlvbi5rb0FmdGVyUmVuZGVyIH0gIC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiAnc3VydmV5LWNoZWNrYm94LWl0ZW0nIC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L2ZpZWxkc2V0Plxcbjwvc2NyaXB0PlxcbjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LWNoZWNrYm94LWl0ZW1cXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uZ2V0SXRlbUNsYXNzKGl0ZW0pXFxcIj5cXG4gICAgICA8bGFiZWwgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkubGFiZWxcXFwiPlxcbiAgICAgICAgICA8IS0tIGtvIGlmOiBpdGVtID09IHF1ZXN0aW9uLnNlbGVjdEFsbEl0ZW0gLS0+XFxuICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJjaGVja2JveFxcXCIgZGF0YS1iaW5kPVxcXCJhdHRyOiB7bmFtZTogcXVlc3Rpb24ubmFtZSwgaWQ6IHF1ZXN0aW9uLmlucHV0SWQgKyAnXycgKyAkaW5kZXgoKSwgJ2FyaWEtbGFiZWwnOiBpdGVtLmxvY1RleHQucmVuZGVyZWRIdG1sIH0sIGNoZWNrZWQ6IHF1ZXN0aW9uLmtvQWxsU2VsZWN0ZWQsIGVuYWJsZTogIXF1ZXN0aW9uLmlzUmVhZE9ubHksIGNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtQ29udHJvbFxcXCIvPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPCEtLSBrbyBpZjogaXRlbSAhPSBxdWVzdGlvbi5zZWxlY3RBbGxJdGVtIC0tPlxcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwiY2hlY2tib3hcXFwiIGRhdGEtYmluZD1cXFwiYXR0cjoge25hbWU6IHF1ZXN0aW9uLm5hbWUsIGlkOiBxdWVzdGlvbi5pbnB1dElkICsgJ18nICsgJGluZGV4KCksICdhcmlhLWxhYmVsJzogaXRlbS5sb2NUZXh0LnJlbmRlcmVkSHRtbCB9LCBjaGVja2VkVmFsdWU6IGl0ZW0udmFsdWUsIGNoZWNrZWQ6IHF1ZXN0aW9uLmtvVmFsdWUsIGVuYWJsZTogIXF1ZXN0aW9uLmlzUmVhZE9ubHkgJiYgaXRlbS5pc0VuYWJsZWQsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtQ29udHJvbFxcXCIvPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkubWF0ZXJpYWxEZWNvcmF0b3JcXFwiPlxcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImNoZWNrXFxcIj48L3NwYW4+XFxuICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuY29udHJvbExhYmVsXFxcIj5cXG4gICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBpdGVtLmxvY1RleHQgfSAtLT5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8L3NwYW4+XFxuICAgICAgPC9sYWJlbD5cXG4gICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5oYXNPdGhlciAmJiAoaXRlbS52YWx1ZSA9PSBxdWVzdGlvbi5vdGhlckl0ZW0udmFsdWUpIC0tPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiIGRhdGEtYmluZD1cXFwidGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1jb21tZW50JywgZGF0YTogeydxdWVzdGlvbic6IHF1ZXN0aW9uLCAndmlzaWJsZSc6IHF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCB9IH1cXFwiPjwvZGl2PlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgPC9kaXY+XFxuPC9zY3JpcHQ+XFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWNoZWNrYm94Lmh0bWxcbi8vIG1vZHVsZSBpZCA9IDkwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1jb21tZW50XFxcIj5cXG4gICAgPHRleHRhcmVhIHR5cGU9XFxcInRleHRcXFwiIGRhdGEtYmluZD1cXFwiYXR0cjogeydyZWFkb25seSc6IHF1ZXN0aW9uLmlzUmVhZE9ubHksIG1heExlbmd0aDogcXVlc3Rpb24uZ2V0TWF4TGVuZ3RoKCksIGNvbHM6IHF1ZXN0aW9uLmNvbHMsIHJvd3M6IHF1ZXN0aW9uLnJvd3MsIGlkOiBxdWVzdGlvbi5pbnB1dElkLCBwbGFjZWhvbGRlcjogcXVlc3Rpb24ucGxhY2VIb2xkZXIsICdhcmlhLWxhYmVsJzogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sfSwgdmFsdWU6cXVlc3Rpb24udmFsdWUsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj48L3RleHRhcmVhPlxcbjwvc2NyaXB0PlwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1jb21tZW50Lmh0bWxcbi8vIG1vZHVsZSBpZCA9IDkxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1kcm9wZG93blxcXCI+XFxuICA8IS0tIGtvIGlmbm90OiBxdWVzdGlvbi5pc1JlYWRPbmx5IC0tPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5zZWxlY3RXcmFwcGVyXFxcIj5cXG4gICAgICA8c2VsZWN0IGRhdGEtYmluZD1cXFwiYXR0cjoge2lkOiBxdWVzdGlvbi5pbnB1dElkLCAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH0sIHZhbHVlOiBxdWVzdGlvbi5yZW5kZXJlZFZhbHVlLCB2YWx1ZUFsbG93VW5zZXQ6IHRydWUsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5jb250cm9sXFxcIj5cXG4gICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLnNob3dPcHRpb25zQ2FwdGlvbiAtLT5cXG4gICAgICAgIDxvcHRpb24gZGF0YS1iaW5kPVxcXCJ0ZXh0OnF1ZXN0aW9uLm9wdGlvbnNDYXB0aW9uLCB2YWx1ZTogbnVsbFxcXCI+PC9vcHRpb24+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwhLS0ga28gZm9yZWFjaDogcXVlc3Rpb24udmlzaWJsZUNob2ljZXMgLS0+XFxuICAgICAgICA8b3B0aW9uIGRhdGEtYmluZD1cXFwidmFsdWU6ICRkYXRhLnZhbHVlLCB0ZXh0OiAkZGF0YS50ZXh0LCBhdHRyOiB7IGRpc2FibGVkOiAhJGRhdGEuaXNFbmFibGVkIH1cXFwiPjwvb3B0aW9uPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPC9zZWxlY3Q+XFxuICA8L2Rpdj5cXG4gIDwhLS0gL2tvIC0tPlxcbiAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaXNSZWFkT25seSAtLT5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJ0ZXh0OiBxdWVzdGlvbi5oYXNPdGhlciAmJiBxdWVzdGlvbi5pc090aGVyU2VsZWN0ZWQgPyBxdWVzdGlvbi5vdGhlclRleHQgOiBxdWVzdGlvbi5kaXNwbGF5VmFsdWUsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5jb250cm9sXFxcIj48L2Rpdj5cXG4gIDwhLS0gL2tvIC0tPlxcbiAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaGFzT3RoZXIgLS0+XFxuICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIiBkYXRhLWJpbmQ9XFxcInRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktY29tbWVudCcsIGRhdGE6IHsncXVlc3Rpb24nOiBxdWVzdGlvbiwgJ3Zpc2libGUnOiBxdWVzdGlvbi5pc090aGVyU2VsZWN0ZWQgfSB9LCBzdHlsZToge2Rpc3BsYXk6IHF1ZXN0aW9uLmlzRmxvd0xheW91dCA/ICdpbmxpbmUnOiAnJ31cXFwiPjwvZGl2PlxcbiAgPCEtLSAva28gLS0+XFxuPC9zY3JpcHQ+XFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWRyb3Bkb3duLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDkyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1lbXB0eVxcXCI+XFxuPGRpdj48L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tZW1wdHkuaHRtbFxuLy8gbW9kdWxlIGlkID0gOTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWVycm9yc1xcXCI+XFxuICAgIDxkaXYgcm9sZT1cXFwiYWxlcnRcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZTogZXJyb3JzLmxlbmd0aCA+IDAsIGZvcmVhY2g6IHsgZGF0YTogZXJyb3JzLCBhczogJ2Vycm9yJ30sIGNzczogcXVlc3Rpb24ua29Dc3MoKS5lcnJvci5yb290XFxcIj5cXG4gICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmVycm9yLmljb25cXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5lcnJvci5pdGVtXFxcIj5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGVycm9yLmxvY1RleHQgfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWVycm9ycy5odG1sXG4vLyBtb2R1bGUgaWQgPSA5NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tZXhwcmVzc2lvblxcXCI+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ0ZXh0OnF1ZXN0aW9uLmtvRGlzcGxheVZhbHVlLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+PC9kaXY+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWV4cHJlc3Npb24uaHRtbFxuLy8gbW9kdWxlIGlkID0gOTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWZpbGVcXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uY3NzQ2xhc3Nlcy5yb290XFxcIj5cXG4gICAgICA8IS0tIGtvIGlmbm90OiBxdWVzdGlvbi5pc1JlYWRPbmx5IC0tPlxcbiAgICAgIDxpbnB1dCB0eXBlPVxcXCJmaWxlXFxcIiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uY3NzQ2xhc3Nlcy5maWxlSW5wdXQsIGF0dHI6IHtpZDogcXVlc3Rpb24uaW5wdXRJZCwgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWwsIG11bHRpcGxlOiBxdWVzdGlvbi5hbGxvd011bHRpcGxlID8gJ211bHRpcGxlJyA6IHVuZGVmaW5lZCwgdGl0bGU6IGtvSW5wdXRUaXRsZSwgYWNjZXB0OiBxdWVzdGlvbi5hY2NlcHRlZFR5cGVzIH0sIGV2ZW50OiB7Y2hhbmdlOiBxdWVzdGlvbi5kb2NoYW5nZX1cXFwiPlxcbiAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmtvSGFzVmFsdWUgLS0+XFxuICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5jc3NDbGFzc2VzLnJlbW92ZUJ1dHRvbiwgY2xpY2s6IHF1ZXN0aW9uLmRvY2xlYW4sIHRleHQ6IHF1ZXN0aW9uLmNsZWFuQnV0dG9uQ2FwdGlvblxcXCI+PC9idXR0b24+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaXNSZWFkT25seSAtLT5cXG4gICAgICA8aW5wdXQgdHlwZT1cXFwiZmlsZVxcXCIgZGlzYWJsZWQgZGF0YS1iaW5kPVxcXCJjc3M6ICdmb3JtLWNvbnRyb2wgJyArIHF1ZXN0aW9uLmNzc0NsYXNzZXMucGxhY2Vob2xkZXJJbnB1dCwgYXR0cjogeyBwbGFjZWhvbGRlcjogcXVlc3Rpb24udGl0bGUgfVxcXCIgc3R5bGU9XFxcImNvbG9yOiB0cmFuc3BhcmVudDtcXFwiLz5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiZm9yZWFjaDogcXVlc3Rpb24ua29EYXRhLCB2aXNpYmxlOiBxdWVzdGlvbi5rb0hhc1ZhbHVlXFxcIj5cXG4gICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBxdWVzdGlvbi5zaG93UHJldmlldywgY3NzOiBxdWVzdGlvbi5jc3NDbGFzc2VzLnByZXZpZXdcXFwiPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJGRhdGEubmFtZSAtLT5cXG4gICAgICAgICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgICA8YSBkYXRhLWJpbmQ9XFxcInN0eWxlOiB7IHdpZHRoOiBxdWVzdGlvbi5pbWFnZVdpZHRoICsgJ3B4JyB9LCB0ZXh0OiAkZGF0YS5uYW1lLCBhdHRyOiB7IGhyZWY6ICRkYXRhLmNvbnRlbnQsIHRpdGxlOiAkZGF0YS5uYW1lLCBkb3dubG9hZDogJGRhdGEubmFtZSB9XFxcIj48L2E+XFxuICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uY2FuUHJldmlld0ltYWdlKCRkYXRhKSAtLT5cXG4gICAgICAgICAgICAgIDxpbWcgZGF0YS1iaW5kPVxcXCJhdHRyOiB7IHNyYzogJGRhdGEuY29udGVudCwgaGVpZ2h0OiBxdWVzdGlvbi5pbWFnZUhlaWdodCwgd2lkdGg6IHF1ZXN0aW9uLmltYWdlV2lkdGggfVxcXCIgYWx0PVxcXCJGaWxlIHByZXZpZXdcXFwiPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAkZGF0YS5uYW1lIC0tPlxcbiAgICAgICAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWZub3Q6IHF1ZXN0aW9uLmlzUmVhZE9ubHkgLS0+XFxuICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uY3NzQ2xhc3Nlcy5yZW1vdmVGaWxlLCBjbGljazogcXVlc3Rpb24uZG9yZW1vdmVmaWxlLCB0ZXh0OiBxdWVzdGlvbi5yZW1vdmVGaWxlQ2FwdGlvblxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8L3NwYW4+XFxuICAgICAgPC9kaXY+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tZmlsZS5odG1sXG4vLyBtb2R1bGUgaWQgPSA5NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24taHRtbFxcXCI+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwiaHRtbDogcXVlc3Rpb24ubG9jSHRtbC5rb1JlbmRlcmVkSHRtbCwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPjwvZGl2Plxcbjwvc2NyaXB0PlxcblwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1odG1sLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDk3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1pbWFnZXBpY2tlclxcXCI+XFxuICA8ZmllbGRzZXQgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+XFxuICAgICAgPGxlZ2VuZCBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWwgfVxcXCI+PC9sZWdlbmQ+XFxuICAgICAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IHF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLCBhczogJ2l0ZW0nLCBhZnRlclJlbmRlcjogcXVlc3Rpb24ua29BZnRlclJlbmRlcn0gIC0tPlxcbiAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldEl0ZW1DbGFzcyhpdGVtKVxcXCI+XFxuICAgICAgICAgIDxsYWJlbCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5sYWJlbFxcXCI+XFxuICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9XFxcImRpc3BsYXk6IG5vbmU7XFxcIiBkYXRhLWJpbmQ9XFxcImF0dHI6IHt0eXBlOiBxdWVzdGlvbi5tdWx0aVNlbGVjdCA/ICdjaGVja2JveCcgOiAncmFkaW8nLCBuYW1lOiBxdWVzdGlvbi5uYW1lICsgJ18nICsgcXVlc3Rpb24uaWQsIHZhbHVlOiBpdGVtLnZhbHVlLCBpZDogKCRpbmRleCgpID09IDApID8gcXVlc3Rpb24uaW5wdXRJZCA6ICcnLCAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH0sIGNoZWNrZWQ6IHF1ZXN0aW9uLmtvVmFsdWUsIGVuYWJsZTogIXF1ZXN0aW9uLmlzUmVhZE9ubHksIGNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtQ29udHJvbFxcXCJcXG4gICAgICAgICAgICAgIC8+XFxuICAgICAgICAgICAgICA8ZGl2PlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmNvbnRlbnRNb2RlID09PSBcXFwiaW1hZ2VcXFwiIC0tPlxcbiAgICAgICAgICAgICAgICAgIDxpbWcgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuaW1hZ2UsIGF0dHI6IHsgc3JjOiAkZGF0YS5pbWFnZUxpbmssIHdpZHRoOiBxdWVzdGlvbi5pbWFnZVdpZHRoID8gcXVlc3Rpb24uaW1hZ2VXaWR0aCArICdweCcgOiB1bmRlZmluZWQsIGhlaWdodDogcXVlc3Rpb24uaW1hZ2VIZWlnaHQgPyBxdWVzdGlvbi5pbWFnZUhlaWdodCArICdweCcgOiB1bmRlZmluZWQgfSwgc3R5bGU6IHsgb2JqZWN0Rml0OiBxdWVzdGlvbi5pbWFnZUZpdCB9XFxcIi8+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uY29udGVudE1vZGUgPT09IFxcXCJ2aWRlb1xcXCIgLS0+XFxuICAgICAgICAgICAgICAgICAgPGVtYmVkIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmltYWdlLCBhdHRyOiB7IHNyYzogJGRhdGEuaW1hZ2VMaW5rLCB3aWR0aDogcXVlc3Rpb24uaW1hZ2VXaWR0aCA/IHF1ZXN0aW9uLmltYWdlV2lkdGggKyAncHgnIDogdW5kZWZpbmVkLCBoZWlnaHQ6IHF1ZXN0aW9uLmltYWdlSGVpZ2h0ID8gcXVlc3Rpb24uaW1hZ2VIZWlnaHQgKyAncHgnIDogdW5kZWZpbmVkIH0sIHN0eWxlOiB7IG9iamVjdEZpdDogcXVlc3Rpb24uaW1hZ2VGaXQgfVxcXCIvPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLnNob3dMYWJlbCAtLT5cXG4gICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6IHRleHQgfHwgdmFsdWUsIGF0dHI6IHsgdGl0bGU6IHRleHQgfHwgdmFsdWUgfSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLml0ZW1UZXh0XFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgPC9sYWJlbD5cXG4gICAgICA8L2Rpdj5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZmllbGRzZXQ+XFxuPC9zY3JpcHQ+XFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWltYWdlcGlja2VyLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDk4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1tYXRyaXhcXFwiPlxcbiAgPGZpZWxkc2V0PlxcbiAgICAgIDxsZWdlbmQgZGF0YS1iaW5kPVxcXCJhdHRyOiB7ICdhcmlhLWxhYmVsJzogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sIH1cXFwiPjwvbGVnZW5kPlxcbiAgICAgIDx0YWJsZSBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5zaG93SGVhZGVyIC0tPlxcbiAgICAgICAgICAgIDx0aGVhZD5cXG4gICAgICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24uaGFzUm93c1xcXCI+PC90ZD5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogcXVlc3Rpb24ua29WaXNpYmxlQ29sdW1ucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jVGV4dCB9IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgIDwvdGhlYWQ+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiBxdWVzdGlvbi5rb1Zpc2libGVSb3dzLCBhczogJ3JvdycgfSAtLT5cXG4gICAgICAgICAgICAgIDx0ciBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb3dcXFwiPlxcbiAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLmhhc1Jvd3NcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcm93LmxvY1RleHQgfSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHF1ZXN0aW9uLmtvVmlzaWJsZUNvbHVtbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaGFzQ2VsbFRleHQgLS0+XFxuICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5nZXRJdGVtQ3NzKHJvdywgJGRhdGEpLCBjbGljazogZnVuY3Rpb24oKSB7IGlmKCFxdWVzdGlvbi5pc1JlYWRPbmx5KSB7cm93LmtvQ2VsbENsaWNrKCRkYXRhKTsgfSB9XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IHF1ZXN0aW9uLmdldENlbGxEaXNwbGF5TG9jVGV4dChyb3cubmFtZSwgJGRhdGEpIH0gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogIXF1ZXN0aW9uLmhhc0NlbGxUZXh0IC0tPlxcbiAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgaGVhZGVyczogJGRhdGEubG9jVGV4dC5yZW5kZXJlZEh0bWwgfVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uZ2V0SXRlbUNzcyhyb3csICRkYXRhKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwicmFkaW9cXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLml0ZW1WYWx1ZSwgYXR0cjoge25hbWU6IHJvdy5mdWxsTmFtZSwgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWwsIHZhbHVlOiAnJyArICRkYXRhLnZhbHVlLCBpZDogcXVlc3Rpb24uaW5wdXRJZCArICdfJyArIHJvdy5uYW1lICsgJ18nICsgJGluZGV4KCl9LCBjaGVja2VkOiByb3cua29WYWx1ZSwgZW5hYmxlOiAhcXVlc3Rpb24uaXNSZWFkT25seVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiY2lyY2xlXFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiY2hlY2tcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVxcXCJkaXNwbGF5OiBub25lXFxcIiBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLmxvY1RleHQudGV4dFxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxcbiAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgPC90YWJsZT5cXG4gIDwvZmllbGRzZXQ+XFxuPC9zY3JpcHQ+XFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktdGV4dFxcXCI+XFxuICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6JGRhdGEucmVuZGVyZWRIdG1sXFxcIj48L3NwYW4+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLW1hdHJpeC5odG1sXG4vLyBtb2R1bGUgaWQgPSA5OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tbWF0cml4ZHluYW1pY1xcXCI+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24ua29Jc0FkZFJvd09uVG9wKCksIGNzczogcXVlc3Rpb24ua29Dc3MoKS5mb290ZXJcXFwiPlxcbiAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcImNsaWNrOnF1ZXN0aW9uLmtvQWRkUm93Q2xpY2ssIGNzczogcXVlc3Rpb24ua29Dc3MoKS5idXR0b24gKyAnICcgKyBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvbkFkZFxcXCI+XFxuICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDogcXVlc3Rpb24uYWRkUm93VGV4dFxcXCI+PC9zcGFuPlxcbiAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5pY29uQWRkXFxcIj48L3NwYW4+XFxuICAgICAgPC9idXR0b24+XFxuICA8L2Rpdj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJzdHlsZToge292ZXJmbG93WDogcXVlc3Rpb24uaG9yaXpvbnRhbFNjcm9sbD8gJ3Njcm9sbCc6ICcnfVxcXCI+XFxuICAgICAgPHRhYmxlIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24ua29Jc0hvcml6b250YWxDb2x1bW5MYXlvdXQsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICAgICAgPHRoZWFkIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24uc2hvd0hlYWRlclxcXCI+XFxuICAgICAgICAgICAgICA8dHI+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaGFzUm93VGV4dCAtLT48dGQ+PC90ZD48IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHF1ZXN0aW9uLmtvVmlzaWJsZUNvbHVtbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgPHRoIGRhdGEtYmluZD1cXFwic3R5bGU6IHsgbWluV2lkdGg6IHF1ZXN0aW9uLmdldENvbHVtbldpZHRoKCRkYXRhKSB9XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY1RpdGxlIH0gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwvdGg+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24ua29DYW5SZW1vdmVSb3cgLS0+XFxuICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICA8L3RoZWFkPlxcbiAgICAgICAgICA8dGJvZHk+XFxuICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcXVlc3Rpb24ua29Sb3dzLCBhczogJ3JvdycgfSAtLT5cXG4gICAgICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5oYXNSb3dUZXh0IC0tPjx0ZD48IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcm93LmxvY1RleHQgfSAtLT48IS0tIC9rbyAtLT48L3RkPjwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogcm93LmNlbGxzLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LW1hdHJpeGNlbGwnLCBkYXRhOiAkZGF0YSwgYXM6IFxcXCJjZWxsXFxcIiwgYWZ0ZXJSZW5kZXI6ICRkYXRhLmRhdGEua29DZWxsQWZ0ZXJSZW5kZXIgfSAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5rb0NhblJlbW92ZVJvdyAtLT5cXG4gICAgICAgICAgICAgICAgICA8dGQ+XFxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcImNsaWNrOnF1ZXN0aW9uLmtvUmVtb3ZlUm93Q2xpY2ssIGNzczogcXVlc3Rpb24ua29Dc3MoKS5idXR0b24gKyAnICcgKyBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvblJlbW92ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiBxdWVzdGlvbi5yZW1vdmVSb3dUZXh0XFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuaWNvblJlbW92ZVxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPC90cj5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8L3Rib2R5PlxcbiAgICAgICAgICA8IS0tIGtvIGlmOnF1ZXN0aW9uLmhhc0Zvb3RlciAtLT5cXG4gICAgICAgICAgPHRmb290PlxcbiAgICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaGFzUm93VGV4dCAtLT48dGQ+PCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IHF1ZXN0aW9uLmxvY1RvdGFsVGV4dCB9IC0tPjwhLS0gL2tvIC0tPjwvdGQ+PCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogcXVlc3Rpb24udmlzaWJsZVRvdGFsUm93LmNlbGxzLS0+XFxuICAgICAgICAgICAgICAgICAgPHRkPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJGRhdGEucXVlc3Rpb24gLS0+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6IFxcXCJzdXJ2ZXktcXVlc3Rpb24tZXhwcmVzc2lvblxcXCIsIGRhdGE6ICRkYXRhLnF1ZXN0aW9uLCBhczogJ3F1ZXN0aW9uJyB9IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24ua29DYW5SZW1vdmVSb3cgLS0+XFxuICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgPC90Zm9vdD5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L3RhYmxlPlxcbiAgICAgIDwhLS0ga28gaWY6ICFxdWVzdGlvbi5rb0lzSG9yaXpvbnRhbENvbHVtbkxheW91dCgpIC0tPlxcbiAgICAgIDx0YWJsZSBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaGFzUm93VGV4dCAtLT5cXG4gICAgICAgICAgICAgIDx0aGVhZD5cXG4gICAgICAgICAgICAgICAgICA8dHI+XFxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLnNob3dIZWFkZXJcXFwiPjwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiBxdWVzdGlvbi5rb1Jvd3MsIGFzOiAncm93JyB9IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiByb3cubG9jVGV4dCB9IC0tPjwhLS0gL2tvIC0tPjwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOnF1ZXN0aW9uLmhhc0Zvb3RlciAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgPHRoPjwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBxdWVzdGlvbi5sb2NUb3RhbFRleHQgfSAtLT48IS0tIC9rbyAtLT48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgPC90aGVhZD5cXG4gICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiBxdWVzdGlvbi5rb1Zpc2libGVDb2x1bW5zLCBhczogJ2NvbHVtbicgfSAtLT5cXG4gICAgICAgICAgICAgICAgICA8dHI+XFxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLnNob3dIZWFkZXIsIHN0eWxlOiB7IG1pbldpZHRoOiBxdWVzdGlvbi5nZXRDb2x1bW5XaWR0aCgkZGF0YSkgfVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jVGl0bGUgfSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcXVlc3Rpb24ua29Sb3dzLCBhczogJ3JvdycgfSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1tYXRyaXhjZWxsJywgZGF0YTogcm93LmNlbGxzW2NvbHVtbi5pbmRleF0sIGFzOiBcXFwiY2VsbFxcXCIsIGFmdGVyUmVuZGVyOiByb3cuZGF0YS5rb0NlbGxBZnRlclJlbmRlciB9IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjpxdWVzdGlvbi5oYXNGb290ZXIgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8dGQ+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBjb2x1bW4uaGFzVG90YWwgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiBcXFwic3VydmV5LXF1ZXN0aW9uLWV4cHJlc3Npb25cXFwiLCBkYXRhOiBxdWVzdGlvbi52aXNpYmxlVG90YWxSb3cuY2VsbHNbY29sdW1uLmluZGV4XS5xdWVzdGlvbiwgYXM6ICdxdWVzdGlvbicgfSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmtvQ2FuUmVtb3ZlUm93IC0tPlxcbiAgICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLnNob3dIZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiBxdWVzdGlvbi5rb1Jvd3MsIGFzOiAncm93JyB9IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJjbGljazpxdWVzdGlvbi5rb1JlbW92ZVJvd0NsaWNrLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uICsgJyAnICsgcXVlc3Rpb24ua29Dc3MoKS5idXR0b25SZW1vdmVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDogcXVlc3Rpb24ucmVtb3ZlUm93VGV4dFxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmljb25SZW1vdmVcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOnF1ZXN0aW9uLmhhc0Zvb3RlciAtLT5cXG4gICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPC90Ym9keT5cXG4gICAgICA8L3RhYmxlPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgPC9kaXY+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24ua29Jc0FkZFJvd09uQm90dG9tKCksIGNzczogcXVlc3Rpb24ua29Dc3MoKS5mb290ZXJcXFwiPlxcbiAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcImNsaWNrOnF1ZXN0aW9uLmtvQWRkUm93Q2xpY2ssIGNzczogcXVlc3Rpb24ua29Dc3MoKS5idXR0b24gKyAnICcgKyBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvbkFkZFxcXCI+XFxuICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDogcXVlc3Rpb24uYWRkUm93VGV4dFxcXCI+PC9zcGFuPlxcbiAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5pY29uQWRkXFxcIj48L3NwYW4+XFxuICAgICAgPC9idXR0b24+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tbWF0cml4ZHluYW1pYy5odG1sXG4vLyBtb2R1bGUgaWQgPSAxMDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLW11bHRpcGxldGV4dFxcXCI+XFxuICA8dGFibGUgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdCwgZm9yZWFjaDogeyBkYXRhOiAgcXVlc3Rpb24ua29Sb3dzLCBhczogJ3JvdycgfVxcXCI+XFxuICAgICAgPHRyIGRhdGEtYmluZD1cXFwiZm9yZWFjaDogeyBkYXRhOiByb3csIGFzOiAnaXRlbScgfSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvd1xcXCI+XFxuICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtVGl0bGVcXFwiPjwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBpdGVtLmxvY1RpdGxlIH0gLS0+PCEtLSAva28gLS0+PC90ZD5cXG4gICAgICAgICAgPHRkPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IGl0ZW0uZWRpdG9yLmVycm9yTG9jYXRpb24gPT0gJ3RvcCcgLS0+XFxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5lcnJvci5sb2NhdGlvblRvcFxcXCI+XFxuICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1xdWVzdGlvbi1lcnJvcnMnLCBkYXRhOiBpdGVtLmVkaXRvciB9IC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6IGl0ZW0uZWRpdG9yLmtvVGVtcGxhdGVOYW1lKCksIGRhdGE6IGl0ZW0uZWRpdG9yLCBhczogJ3F1ZXN0aW9uJyB9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IGl0ZW0uZWRpdG9yLmVycm9yTG9jYXRpb24gPT0gJ2JvdHRvbScgLS0+XFxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5lcnJvci5sb2NhdGlvbkJvdHRvbVxcXCI+XFxuICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1xdWVzdGlvbi1lcnJvcnMnLCBkYXRhOiBpdGVtLmVkaXRvciB9IC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwvdGQ+XFxuICAgICAgPC90cj5cXG4gIDwvdGFibGU+XFxuPC9zY3JpcHQ+XFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLW11bHRpcGxldGV4dC5odG1sXG4vLyBtb2R1bGUgaWQgPSAxMDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLXBhbmVsZHluYW1pYy1uYXZpZ2F0b3JcXFwiPlxcbiAgICA8aW5wdXQgdHlwZT1cXFwicmFuZ2VcXFwiIG1pbj1cXFwiMFxcXCIgc3R5bGU9XFxcIndpZHRoOjI1JTtmbG9hdDpsZWZ0O21hcmdpbjo1cHhcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZToga29Jc1JhbmdlLCB2YWx1ZTogcXVlc3Rpb24ua29SYW5nZVZhbHVlLCBhdHRyOiB7bWF4OiBxdWVzdGlvbi5rb1JhbmdlTWF4fVxcXCIgLz5cXG4gICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgc3R5bGU9XFxcImZsb2F0OmxlZnQ7bWFyZ2luOjVweFxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBxdWVzdGlvbi5rb0lzUHJldkJ1dHRvbiwgY2xpY2s6cXVlc3Rpb24ua29QcmV2UGFuZWxDbGljaywgY3NzOiBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvbiArICcgJyArIHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uUHJldiwgdmFsdWU6IHF1ZXN0aW9uLnBhbmVsUHJldlRleHRcXFwiIC8+XFxuICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIHN0eWxlPVxcXCJmbG9hdDpsZWZ0O21hcmdpbjo1cHhcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24ua29Jc05leHRCdXR0b24sIGNsaWNrOnF1ZXN0aW9uLmtvTmV4dFBhbmVsQ2xpY2ssIGNzczogcXVlc3Rpb24ua29Dc3MoKS5idXR0b24gKyAnICcgKyBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvbk5leHQsIHZhbHVlOiBxdWVzdGlvbi5wYW5lbE5leHRUZXh0XFxcIiAvPlxcbiAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBzdHlsZT1cXFwiZmxvYXQ6bGVmdDttYXJnaW46NXB4XFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6cXVlc3Rpb24ua29DYW5BZGRQYW5lbCwgY2xpY2s6cXVlc3Rpb24ua29BZGRQYW5lbENsaWNrLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uICsgJyAnICsgcXVlc3Rpb24ua29Dc3MoKS5idXR0b25BZGQsIHZhbHVlOiBxdWVzdGlvbi5wYW5lbEFkZFRleHRcXFwiIC8+XFxuPC9zY3JpcHQ+XFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLXBhbmVsZHluYW1pYy1uYXZpZ2F0b3IuaHRtbFxuLy8gbW9kdWxlIGlkID0gMTAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1wYW5lbGR5bmFtaWNcXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5rb0lzTGlzdCgpIC0tPlxcbiAgICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiBxdWVzdGlvbi5wYW5lbHMgfSAtLT5cXG4gICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcGFuZWwnLCBkYXRhOiAkZGF0YSwgYXM6ICdxdWVzdGlvbicsIGFmdGVyUmVuZGVyOiBxdWVzdGlvbi5rb1BhbmVsQWZ0ZXJSZW5kZXIgfSAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBzdHlsZT1cXFwibWFyZ2luLXRvcDo1cHhcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24ua29DYW5SZW1vdmVQYW5lbCgpICYmICEkZGF0YS5rb0lzQ29sbGFwc2VkKCksIGNsaWNrOnF1ZXN0aW9uLmtvUmVtb3ZlUGFuZWxDbGljaywgY3NzOiBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvbiArICcgJyArIHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uUmVtb3ZlLCB2YWx1ZTogcXVlc3Rpb24ucGFuZWxSZW1vdmVUZXh0XFxcIlxcbiAgICAgIC8+XFxuICAgICAgPGhyLz5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6cXVlc3Rpb24ua29DYW5BZGRQYW5lbCwgY2xpY2s6cXVlc3Rpb24ua29BZGRQYW5lbENsaWNrLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uICsgJyAnICsgcXVlc3Rpb24ua29Dc3MoKS5idXR0b25BZGQsIHZhbHVlOiBxdWVzdGlvbi5wYW5lbEFkZFRleHRcXFwiXFxuICAgICAgLz5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIGtvIGlmbm90OiBxdWVzdGlvbi5rb0lzTGlzdCgpICAtLT5cXG4gICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTpxdWVzdGlvbi5rb0lzUHJvZ3Jlc3NUb3BcXFwiPlxcbiAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tcGFuZWxkeW5hbWljLW5hdmlnYXRvcicsIGRhdGE6IHF1ZXN0aW9uLCBhczogJ3F1ZXN0aW9uJ30gLS0+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwvZGl2PlxcbiAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmtvUGFuZWwoKSAtLT5cXG4gICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXBhbmVsJywgZGF0YTogcXVlc3Rpb24ua29QYW5lbCgpLCBhczogJ3F1ZXN0aW9uJywgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmtvUGFuZWxBZnRlclJlbmRlciB9IC0tPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBzdHlsZT1cXFwibWFyZ2luLXRvcDo1cHhcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24ua29DYW5SZW1vdmVQYW5lbCwgY2xpY2s6cXVlc3Rpb24ua29SZW1vdmVQYW5lbENsaWNrLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uICsgJyAnICsgcXVlc3Rpb24ua29Dc3MoKS5idXR0b25SZW1vdmUsIHZhbHVlOiBxdWVzdGlvbi5wYW5lbFJlbW92ZVRleHRcXFwiXFxuICAgICAgLz5cXG4gICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTpxdWVzdGlvbi5rb0lzUHJvZ3Jlc3NCb3R0b21cXFwiPlxcbiAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tcGFuZWxkeW5hbWljLW5hdmlnYXRvcicsIGRhdGE6IHF1ZXN0aW9uLCBhczogJ3F1ZXN0aW9uJ30gLS0+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwvZGl2PlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgPC9kaXY+XFxuPC9zY3JpcHQ+XFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLXBhbmVsZHluYW1pYy5odG1sXG4vLyBtb2R1bGUgaWQgPSAxMDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLXJhZGlvZ3JvdXBcXFwiPlxcbiAgPGZpZWxkc2V0IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPlxcbiAgICAgIDxsZWdlbmQgZGF0YS1iaW5kPVxcXCJhdHRyOiB7ICdhcmlhLWxhYmVsJzogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sIH1cXFwiPjwvbGVnZW5kPlxcbiAgICAgIDwhLS0ga28gaWZub3Q6IHF1ZXN0aW9uLmhhc0NvbHVtbnMgIC0tPlxcbiAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IHF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLCBhczogJ2l0ZW0nLCBhZnRlclJlbmRlcjogcXVlc3Rpb24ua29BZnRlclJlbmRlciB9ICAtLT5cXG4gICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiAnc3VydmV5LXJhZGlvZ3JvdXAtaXRlbScgLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5oYXNDb2x1bW5zICAtLT5cXG4gICAgICAgIDwhLS0ga28gZm9yZWFjaDogcXVlc3Rpb24uY29sdW1ucyAtLT5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldENvbHVtbkNsYXNzKClcXFwiPlxcbiAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiAkZGF0YSwgYXM6ICdpdGVtJywgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmtvQWZ0ZXJSZW5kZXIgfSAgLS0+XFxuICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6ICdzdXJ2ZXktcmFkaW9ncm91cC1pdGVtJyAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5jYW5TaG93Q2xlYXJCdXR0b24gLS0+XFxuICAgICAgPGRpdj5cXG4gICAgICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJjbGljazpxdWVzdGlvbi5jbGVhclZhbHVlLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuY2xlYXJCdXR0b24sIHZhbHVlOiBxdWVzdGlvbi5jbGVhckJ1dHRvbkNhcHRpb25cXFwiLz5cXG4gICAgICA8L2Rpdj5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZmllbGRzZXQ+XFxuPC9zY3JpcHQ+XFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcmFkaW9ncm91cC1pdGVtXFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldEl0ZW1DbGFzcyhpdGVtKVxcXCI+XFxuICAgICAgPGxhYmVsIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmxhYmVsXFxcIj5cXG4gICAgICAgICAgPGlucHV0IHR5cGU9XFxcInJhZGlvXFxcIiBkYXRhLWJpbmQ9XFxcImF0dHI6IHtuYW1lOiBxdWVzdGlvbi5uYW1lICsgJ18nICsgcXVlc3Rpb24uaWQsIGlkOiBxdWVzdGlvbi5pbnB1dElkICsgJ18nICsgJGluZGV4KCksICdhcmlhLWxhYmVsJzogaXRlbS5sb2NUZXh0LnJlbmRlcmVkSHRtbH0sIGNoZWNrZWRWYWx1ZTogaXRlbS52YWx1ZSwgY2hlY2tlZDogcXVlc3Rpb24ucmVuZGVyZWRWYWx1ZSwgZW5hYmxlOiAhcXVlc3Rpb24uaXNSZWFkT25seSAmJiBpdGVtLmlzRW5hYmxlZCwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLml0ZW1Db250cm9sXFxcIlxcbiAgICAgICAgICAvPlxcbiAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5tYXRlcmlhbERlY29yYXRvclxcXCI+PC9zcGFuPlxcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiY2hlY2tcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuY29udHJvbExhYmVsXFxcIj5cXG4gICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBpdGVtLmxvY1RleHQgfSAtLT5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8L3NwYW4+XFxuICAgICAgPC9sYWJlbD5cXG4gICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5oYXNPdGhlciAmJiAoaXRlbS52YWx1ZSA9PSBxdWVzdGlvbi5vdGhlckl0ZW0udmFsdWUpIC0tPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiIGRhdGEtYmluZD1cXFwidGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1jb21tZW50JywgZGF0YTogeydxdWVzdGlvbic6IHF1ZXN0aW9uLCAndmlzaWJsZSc6IHF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZH19XFxcIj48L2Rpdj5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcblwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1yYWRpb2dyb3VwLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDEwNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tcmF0aW5nXFxcIj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICAgIDwhLS0ga28gZm9yZWFjaDogcXVlc3Rpb24ua29WaXNpYmxlUmF0ZVZhbHVlcyAtLT5cXG4gICAgICAgIDxsYWJlbCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29HZXRDc3MoJGRhdGEpXFxcIj5cXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwicmFkaW9cXFwiIHN0eWxlPVxcXCJkaXNwbGF5OiBub25lO1xcXCIgZGF0YS1iaW5kPVxcXCJhdHRyOiB7bmFtZTogcXVlc3Rpb24ubmFtZSwgaWQ6IHF1ZXN0aW9uLm5hbWUgKyAkaW5kZXgoKSwgdmFsdWU6ICRkYXRhLnZhbHVlLCAnYXJpYS1sYWJlbCc6ICRkYXRhLmxvY1RleHQudGV4dH0sIGV2ZW50OiB7IGNoYW5nZTogcXVlc3Rpb24ua29DaGFuZ2V9LCBlbmFibGU6ICFxdWVzdGlvbi5pc1JlYWRPbmx5XFxcIlxcbiAgICAgICAgICAgIC8+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjogJGluZGV4KCkgPT0gMCAtLT5cXG4gICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5taW5UZXh0XFxcIj5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IHF1ZXN0aW9uLmxvY01pblJhdGVEZXNjcmlwdGlvbiB9IC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuXFxuICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuaXRlbVRleHRcXFwiPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogJGRhdGEubG9jVGV4dCB9IC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L3NwYW4+XFxuXFxuICAgICAgICAgICAgPCEtLSBrbyBpZjogJGluZGV4KCkgPT0gKHF1ZXN0aW9uLmtvVmlzaWJsZVJhdGVWYWx1ZXMoKS5sZW5ndGgtMSkgLS0+XFxuICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkubWF4VGV4dFxcXCI+XFxuICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBxdWVzdGlvbi5sb2NNYXhSYXRlRGVzY3JpcHRpb24gfSAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC9sYWJlbD5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLmhhc090aGVyXFxcIj5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LWNvbW1lbnQnLCBkYXRhOiB7J3F1ZXN0aW9uJzogcXVlc3Rpb24gfSB9XFxcIj48L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLXJhdGluZy5odG1sXG4vLyBtb2R1bGUgaWQgPSAxMDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLXRleHRcXFwiPlxcbiAgPGlucHV0IGRhdGEtYmluZD1cXFwiZGlzYWJsZTogcXVlc3Rpb24uaXNSZWFkT25seSwgYXR0cjoge3R5cGU6IHF1ZXN0aW9uLmlucHV0VHlwZSwgc2l6ZTogcXVlc3Rpb24uc2l6ZSwgaWQ6IHF1ZXN0aW9uLmlucHV0SWQsIHBsYWNlaG9sZGVyOiBxdWVzdGlvbi5pbnB1dFR5cGUgPT09ICdyYW5nZScgPyB1bmRlZmluZWQgOiBxdWVzdGlvbi5wbGFjZUhvbGRlciwgbWF4TGVuZ3RoOiBxdWVzdGlvbi5nZXRNYXhMZW5ndGgoKSwgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9LCB2YWx1ZTpxdWVzdGlvbi52YWx1ZSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiLz5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tdGV4dC5odG1sXG4vLyBtb2R1bGUgaWQgPSAxMDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uXFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvUm9vdENsYXNzLCBzdHlsZTogeyBwYWRkaW5nTGVmdDogcXVlc3Rpb24ucGFkZGluZ0xlZnQsIHBhZGRpbmdSaWdodDogcXVlc3Rpb24ucGFkZGluZ1JpZ2h0LCB3aWR0aDogcXVlc3Rpb24ucmVuZGVyV2lkdGggfSwgYXR0cjoge2lkOiBxdWVzdGlvbi5pZH1cXFwiPlxcbiAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHsndGl0bGUtbGVmdCc6IHF1ZXN0aW9uLmhhc1RpdGxlT25MZWZ0fVxcXCI+XFxuICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmhhc1RpdGxlT25MZWZ0VG9wIC0tPlxcbiAgICAgICAgICA8IS0ta28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1xdWVzdGlvbi10aXRsZScsIGRhdGE6IHF1ZXN0aW9uICB9IC0tPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPC9kaXY+XFxuXFxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogeydjb250ZW50LWxlZnQnOiBxdWVzdGlvbi5oYXNUaXRsZU9uTGVmdH1cXFwiPlxcbiAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5lcnJvckxvY2F0aW9uID09ICd0b3AnIC0tPlxcbiAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5lcnJvci5sb2NhdGlvblRvcFxcXCI+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXF1ZXN0aW9uLWVycm9ycycsIGRhdGE6IHF1ZXN0aW9uIH0gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogcXVlc3Rpb24ua29UZW1wbGF0ZU5hbWUoKSwgZGF0YTogcXVlc3Rpb24sIGFmdGVyUmVuZGVyOiBxdWVzdGlvbi5rb1F1ZXN0aW9uQWZ0ZXJSZW5kZXIgfSAtLT5cXG4gICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmhhc0NvbW1lbnQgLS0+XFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBxdWVzdGlvbi5sb2NDb21tZW50VGV4dCB9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LWNvbW1lbnQnLCBkYXRhOiB7J3F1ZXN0aW9uJzogcXVlc3Rpb24sICd2aXNpYmxlJzogdHJ1ZSB9IH1cXFwiPjwvZGl2PlxcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmVycm9yTG9jYXRpb24gPT0gJ2JvdHRvbScgLS0+XFxuICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmVycm9yLmxvY2F0aW9uQm90dG9tXFxcIj5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tZXJyb3JzJywgZGF0YTogcXVlc3Rpb24gfSAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaGFzVGl0bGVPbkJvdHRvbSAtLT5cXG4gICAgICAgICAgPCEtLWtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tdGl0bGUnLCBkYXRhOiBxdWVzdGlvbiAgfSAtLT5cXG4gICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwvZGl2PlxcbiAgPC9kaXY+XFxuPC9zY3JpcHQ+XFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDEwN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tdGl0bGVcXFwiPlxcbiAgPGg1IGRhdGEtYmluZD1cXFwiY3NzOiBrb0NzcygpLnRpdGxlXFxcIj5cXG4gICAgICA8IS0tIGtvIGlmOiBubyAtLT5cXG4gICAgICA8c3BhbiBzdHlsZT1cXFwicG9zaXRpb246IHN0YXRpYztcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBrb0NzcygpLm51bWJlciwgdGV4dDogbm9cXFwiPjwvc3Bhbj5cXG4gICAgICA8c3BhbiBzdHlsZT1cXFwicG9zaXRpb246IHN0YXRpYztcXFwiPi4mbmJzcDwvc3Bhbj5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jVGl0bGUgfSAtLT48IS0tIC9rbyAtLT5cXG4gIDwvaDU+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTogIWxvY0Rlc2NyaXB0aW9uLmlzRW1wdHksIGNzczoga29Dc3MoKS5kZXNjcmlwdGlvblxcXCI+XFxuICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY0Rlc2NyaXB0aW9uIH0gLS0+PCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb250aXRsZS5odG1sXG4vLyBtb2R1bGUgaWQgPSAxMDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXJvd3NcXFwiPlxcbiAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcm93cywgYXM6ICdyb3cnfSAtLT5cXG4gICAgPCEtLSBrbyBpZjogcm93LnZpc2libGUgLS0+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHBhbmVsLmNzc0NsYXNzZXMucm93XFxcIj5cXG4gICAgICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiByb3cuZWxlbWVudHMsIGFzOiAncXVlc3Rpb24nICwgYWZ0ZXJSZW5kZXI6IHJvdy5rb0FmdGVyUmVuZGVyIH0gLS0+XFxuICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5pc1Zpc2libGUgLS0+XFxuICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6IHF1ZXN0aW9uLmtvRWxlbWVudFR5cGUsIGRhdGE6IHF1ZXN0aW9uLCBhZnRlclJlbmRlcjogJHBhcmVudC5rb0VsZW1lbnRBZnRlclJlbmRlciB9IC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L2Rpdj5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0gL2tvIC0tPlxcbjwvc2NyaXB0PlwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9yb3dzLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDEwOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktc3RyaW5nXFxcIj5cXG4gICAgPCEtLSBrbyBpZm5vdDoga29IYXNIdG1sIC0tPlxcbiAgICA8c3BhbiBzdHlsZT1cXFwicG9zaXRpb246IHN0YXRpYztcXFwiIGRhdGEtYmluZD1cXFwidGV4dDoga29SZW5kZXJlZEh0bWxcXFwiPjwvc3Bhbj5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0ga28gaWY6IGtvSGFzSHRtbCAtLT5cXG4gICAgPHNwYW4gc3R5bGU9XFxcInBvc2l0aW9uOiBzdGF0aWM7XFxcIiBkYXRhLWJpbmQ9XFxcImh0bWw6IGtvUmVuZGVyZWRIdG1sXFxcIj48L3NwYW4+XFxuICAgIDwhLS0gL2tvIC0tPlxcbjwvc2NyaXB0PlxcblwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9zdHJpbmcuaHRtbFxuLy8gbW9kdWxlIGlkID0gMTEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS10aW1lcnBhbmVsXFxcIj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInRleHQ6a29UaW1lckluZm9UZXh0XFxcIj48L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvdGltZXJwYW5lbC5odG1sXG4vLyBtb2R1bGUgaWQgPSAxMTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIlwiICsgcmVxdWlyZSgnLi9pbmRleC5odG1sJykgKyBcIiBcIiArIHJlcXVpcmUoJy4vY29tbWVudC5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9wYWdlLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3BhbmVsLmh0bWwnKSArIFwiXCIgKyByZXF1aXJlKCcuL2Zsb3dwYW5lbC5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9wcm9ncmVzcy5odG1sJykgKyBcIiBcIiArIHJlcXVpcmUoJy4vcm93cy5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9zdHJpbmcuaHRtbCcpICsgXCIgXCIgKyByZXF1aXJlKCcuL3RpbWVycGFuZWwuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vbWF0cml4Y2VsbC5odG1sJykgKyBcIiBcIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24uaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb250aXRsZS5odG1sJykgKyBcIiBcIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tY2hlY2tib3guaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tY29tbWVudC5odG1sJykgKyBcIiBcIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tZHJvcGRvd24uaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tZXJyb3JzLmh0bWwnKSArIFwiIFwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1maWxlLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWh0bWwuaHRtbCcpICsgXCIgXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLW1hdHJpeC5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1tYXRyaXhkeW5hbWljLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLXBhbmVsZHluYW1pYy5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1wYW5lbGR5bmFtaWMtbmF2aWdhdG9yLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLW11bHRpcGxldGV4dC5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1yYWRpb2dyb3VwLmh0bWwnKSArIFwiIFwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1yYXRpbmcuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tdGV4dC5odG1sJykgKyBcIiBcIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tYm9vbGVhbi5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1lbXB0eS5odG1sJykgKyBcIiBcIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tZXhwcmVzc2lvbi5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1pbWFnZXBpY2tlci5odG1sJykgKyBcIlxcblwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9odG1sLWxvYWRlcj9pbnRlcnBvbGF0ZSEuL34vdmFsLWxvYWRlciEuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvZW50cnkuaHRtbFxuLy8gbW9kdWxlIGlkID0gMTEyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IHN0eWxlPVxcXCJwb3NpdGlvbjogZml4ZWQ7IGJvdHRvbTogM3B4OyByaWdodDogMTBweDsgbWF4LXdpZHRoOiA2MCU7XFxcIiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLndpbmRvdy5yb290XFxcIj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLndpbmRvdy5oZWFkZXIucm9vdFxcXCI+XFxuICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNsaWNrOmRvRXhwYW5kXFxcIiBzdHlsZT1cXFwid2lkdGg6IDEwMCU7IGN1cnNvcjogcG9pbnRlcjtcXFwiPlxcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVxcXCJwYWRkaW5nLXJpZ2h0OjEwcHhcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBjc3Mud2luZG93LmhlYWRlci50aXRsZSwgdGV4dDogbG9jVGl0bGUua29SZW5kZXJlZEh0bWxcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCIgZGF0YS1iaW5kPVxcXCJjc3M6IGtvRXhwYW5kZWRDc3NcXFwiPjwvc3Bhbj5cXG4gICAgICAgIDwvc3Bhbj5cXG4gICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidmlzaWJsZTprb0V4cGFuZGVkLCBjbGljazpkb0V4cGFuZFxcXCIgc3R5bGU9XFxcImZsb2F0OiByaWdodDsgY3Vyc29yOiBwb2ludGVyO1xcXCI+XFxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XFxcInBhZGRpbmctcmlnaHQ6MTBweFxcXCIgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy53aW5kb3cuaGVhZGVyLnRpdGxlXFxcIj5YPC9zcGFuPlxcbiAgICAgICAgPC9zcGFuPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6a29FeHBhbmRlZCwgY3NzOiBjc3Mud2luZG93LmJvZHlcXFwiPlxcbiAgICAgICAgPGRpdiBpZD1cXFwid2luZG93U3VydmV5SlNcXFwiPjwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vaHRtbC1sb2FkZXI/aW50ZXJwb2xhdGUhLi9+L3ZhbC1sb2FkZXIhLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3dpbmRvdy93aW5kb3cuaHRtbFxuLy8gbW9kdWxlIGlkID0gMTEzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIHRzbGludDpkaXNhYmxlOm9ubHktYXJyb3ctZnVuY3Rpb25zXG4vLyB0c2xpbnQ6ZGlzYWJsZTpvYmplY3QtbGl0ZXJhbC1zaG9ydGhhbmRcbi8vIHRzbGludDpkaXNhYmxlOnRyYWlsaW5nLWNvbW1hXG4vLyB0c2xpbnQ6ZGlzYWJsZTpvYmplY3QtbGl0ZXJhbC1zb3J0LWtleXNcbi8vIHRzbGludDpkaXNhYmxlOm9uZS12YXJpYWJsZS1wZXItZGVjbGFyYXRpb25cbi8vIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aFxuLy8gdHNsaW50OmRpc2FibGU6bm8tY29uc2VjdXRpdmUtYmxhbmstbGluZXNcbi8vIHRzbGludDpkaXNhYmxlOmFsaWduXG5cblxuLy8gR2VuZXJhdGVkIGJ5IFBFRy5qcyB2LiAwLjEwLjAgKHRzLXBlZ2pzIHBsdWdpbiB2LiAwLjIuMyApXG4vL1xuLy8gaHR0cHM6Ly9wZWdqcy5vcmcvICAgaHR0cHM6Ly9naXRodWIuY29tL21ldGFkZXZwcm8vdHMtcGVnanNcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7XG5Db25zdCxcbkJpbmFyeU9wZXJhbmQsXG5WYXJpYWJsZSxcbk9wZXJhbmQsXG5VbmFyeU9wZXJhbmQsXG5GdW5jdGlvbk9wZXJhbmQsXG5BcnJheU9wZXJhbmRcbn0gZnJvbSBcIi4vZXhwcmVzc2lvbnNcIjtcbmV4cG9ydCBpbnRlcmZhY2UgSUZpbGVQb3NpdGlvbiB7XG4gIG9mZnNldDogbnVtYmVyO1xuICBsaW5lOiBudW1iZXI7XG4gIGNvbHVtbjogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlUmFuZ2Uge1xuICBzdGFydDogSUZpbGVQb3NpdGlvbjtcbiAgZW5kOiBJRmlsZVBvc2l0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElMaXRlcmFsRXhwZWN0YXRpb24ge1xuICB0eXBlOiBcImxpdGVyYWxcIjtcbiAgdGV4dDogc3RyaW5nO1xuICBpZ25vcmVDYXNlOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDbGFzc1BhcnRzIGV4dGVuZHMgQXJyYXk8c3RyaW5nIHwgSUNsYXNzUGFydHM+IHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNsYXNzRXhwZWN0YXRpb24ge1xuICB0eXBlOiBcImNsYXNzXCI7XG4gIHBhcnRzOiBJQ2xhc3NQYXJ0cztcbiAgaW52ZXJ0ZWQ6IGJvb2xlYW47XG4gIGlnbm9yZUNhc2U6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFueUV4cGVjdGF0aW9uIHtcbiAgdHlwZTogXCJhbnlcIjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRW5kRXhwZWN0YXRpb24ge1xuICB0eXBlOiBcImVuZFwiO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElPdGhlckV4cGVjdGF0aW9uIHtcbiAgdHlwZTogXCJvdGhlclwiO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBFeHBlY3RhdGlvbiA9IElMaXRlcmFsRXhwZWN0YXRpb24gfCBJQ2xhc3NFeHBlY3RhdGlvbiB8IElBbnlFeHBlY3RhdGlvbiB8IElFbmRFeHBlY3RhdGlvbiB8IElPdGhlckV4cGVjdGF0aW9uO1xuXG5leHBvcnQgY2xhc3MgU3ludGF4RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyBzdGF0aWMgYnVpbGRNZXNzYWdlKGV4cGVjdGVkOiBFeHBlY3RhdGlvbltdLCBmb3VuZDogc3RyaW5nIHwgbnVsbCkge1xuICAgIGZ1bmN0aW9uIGhleChjaDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBjaC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpdGVyYWxFc2NhcGUoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBzXG4gICAgICAgIC5yZXBsYWNlKC9cXFxcL2csIFwiXFxcXFxcXFxcIilcbiAgICAgICAgLnJlcGxhY2UoL1wiL2csICBcIlxcXFxcXFwiXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXDAvZywgXCJcXFxcMFwiKVxuICAgICAgICAucmVwbGFjZSgvXFx0L2csIFwiXFxcXHRcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCBcIlxcXFxuXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXHIvZywgXCJcXFxcclwiKVxuICAgICAgICAucmVwbGFjZSgvW1xceDAwLVxceDBGXS9nLCAgICAgICAgICAgIChjaCkgPT4gXCJcXFxceDBcIiArIGhleChjaCkgKVxuICAgICAgICAucmVwbGFjZSgvW1xceDEwLVxceDFGXFx4N0YtXFx4OUZdL2csIChjaCkgPT4gXCJcXFxceFwiICArIGhleChjaCkgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGFzc0VzY2FwZShzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHNcbiAgICAgICAgLnJlcGxhY2UoL1xcXFwvZywgXCJcXFxcXFxcXFwiKVxuICAgICAgICAucmVwbGFjZSgvXFxdL2csIFwiXFxcXF1cIilcbiAgICAgICAgLnJlcGxhY2UoL1xcXi9nLCBcIlxcXFxeXCIpXG4gICAgICAgIC5yZXBsYWNlKC8tL2csICBcIlxcXFwtXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXDAvZywgXCJcXFxcMFwiKVxuICAgICAgICAucmVwbGFjZSgvXFx0L2csIFwiXFxcXHRcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCBcIlxcXFxuXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXHIvZywgXCJcXFxcclwiKVxuICAgICAgICAucmVwbGFjZSgvW1xceDAwLVxceDBGXS9nLCAgICAgICAgICAgIChjaCkgPT4gXCJcXFxceDBcIiArIGhleChjaCkgKVxuICAgICAgICAucmVwbGFjZSgvW1xceDEwLVxceDFGXFx4N0YtXFx4OUZdL2csIChjaCkgPT4gXCJcXFxceFwiICArIGhleChjaCkgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXNjcmliZUV4cGVjdGF0aW9uKGV4cGVjdGF0aW9uOiBFeHBlY3RhdGlvbikge1xuICAgICAgc3dpdGNoIChleHBlY3RhdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJsaXRlcmFsXCI6XG4gICAgICAgICAgcmV0dXJuIFwiXFxcIlwiICsgbGl0ZXJhbEVzY2FwZShleHBlY3RhdGlvbi50ZXh0KSArIFwiXFxcIlwiO1xuICAgICAgICBjYXNlIFwiY2xhc3NcIjpcbiAgICAgICAgICBjb25zdCBlc2NhcGVkUGFydHMgPSBleHBlY3RhdGlvbi5wYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcnQpXG4gICAgICAgICAgICAgID8gY2xhc3NFc2NhcGUocGFydFswXSBhcyBzdHJpbmcpICsgXCItXCIgKyBjbGFzc0VzY2FwZShwYXJ0WzFdIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgOiBjbGFzc0VzY2FwZShwYXJ0KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBcIltcIiArIChleHBlY3RhdGlvbi5pbnZlcnRlZCA/IFwiXlwiIDogXCJcIikgKyBlc2NhcGVkUGFydHMgKyBcIl1cIjtcbiAgICAgICAgY2FzZSBcImFueVwiOlxuICAgICAgICAgIHJldHVybiBcImFueSBjaGFyYWN0ZXJcIjtcbiAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgIHJldHVybiBcImVuZCBvZiBpbnB1dFwiO1xuICAgICAgICBjYXNlIFwib3RoZXJcIjpcbiAgICAgICAgICByZXR1cm4gZXhwZWN0YXRpb24uZGVzY3JpcHRpb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVzY3JpYmVFeHBlY3RlZChleHBlY3RlZDE6IEV4cGVjdGF0aW9uW10pIHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9ucyA9IGV4cGVjdGVkMS5tYXAoZGVzY3JpYmVFeHBlY3RhdGlvbik7XG4gICAgICBsZXQgaTtcbiAgICAgIGxldCBqO1xuXG4gICAgICBkZXNjcmlwdGlvbnMuc29ydCgpO1xuXG4gICAgICBpZiAoZGVzY3JpcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChpID0gMSwgaiA9IDE7IGkgPCBkZXNjcmlwdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZGVzY3JpcHRpb25zW2kgLSAxXSAhPT0gZGVzY3JpcHRpb25zW2ldKSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbnNbal0gPSBkZXNjcmlwdGlvbnNbaV07XG4gICAgICAgICAgICBqKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlc2NyaXB0aW9ucy5sZW5ndGggPSBqO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGRlc2NyaXB0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbnNbMF07XG5cbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbnNbMF0gKyBcIiBvciBcIiArIGRlc2NyaXB0aW9uc1sxXTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbnMuc2xpY2UoMCwgLTEpLmpvaW4oXCIsIFwiKVxuICAgICAgICAgICAgKyBcIiwgb3IgXCJcbiAgICAgICAgICAgICsgZGVzY3JpcHRpb25zW2Rlc2NyaXB0aW9ucy5sZW5ndGggLSAxXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXNjcmliZUZvdW5kKGZvdW5kMTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgcmV0dXJuIGZvdW5kMSA/IFwiXFxcIlwiICsgbGl0ZXJhbEVzY2FwZShmb3VuZDEpICsgXCJcXFwiXCIgOiBcImVuZCBvZiBpbnB1dFwiO1xuICAgIH1cblxuICAgIHJldHVybiBcIkV4cGVjdGVkIFwiICsgZGVzY3JpYmVFeHBlY3RlZChleHBlY3RlZCkgKyBcIiBidXQgXCIgKyBkZXNjcmliZUZvdW5kKGZvdW5kKSArIFwiIGZvdW5kLlwiO1xuICB9XG5cbiAgcHVibGljIG1lc3NhZ2U6IHN0cmluZztcbiAgcHVibGljIGV4cGVjdGVkOiBFeHBlY3RhdGlvbltdO1xuICBwdWJsaWMgZm91bmQ6IHN0cmluZyB8IG51bGw7XG4gIHB1YmxpYyBsb2NhdGlvbjogSUZpbGVSYW5nZTtcbiAgcHVibGljIG5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGV4cGVjdGVkOiBFeHBlY3RhdGlvbltdLCBmb3VuZDogc3RyaW5nIHwgbnVsbCwgbG9jYXRpb246IElGaWxlUmFuZ2UpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5leHBlY3RlZCA9IGV4cGVjdGVkO1xuICAgIHRoaXMuZm91bmQgPSBmb3VuZDtcbiAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247XG4gICAgdGhpcy5uYW1lID0gXCJTeW50YXhFcnJvclwiO1xuXG4gICAgaWYgKHR5cGVvZiAoRXJyb3IgYXMgYW55KS5jYXB0dXJlU3RhY2tUcmFjZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAoRXJyb3IgYXMgYW55KS5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBTeW50YXhFcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNhY2hlZCB7XG4gIG5leHRQb3M6IG51bWJlcjtcbiAgcmVzdWx0OiBhbnk7XG59XG5cbmZ1bmN0aW9uIHBlZyRwYXJzZShpbnB1dDogc3RyaW5nLCBvcHRpb25zPzogSVBhcnNlT3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucyA6IHt9O1xuXG4gIGNvbnN0IHBlZyRGQUlMRUQ6IGFueSA9IHt9O1xuXG4gIGNvbnN0IHBlZyRzdGFydFJ1bGVGdW5jdGlvbnM6IHtbaWQ6IHN0cmluZ106IGFueX0gPSB7IEV4cHJlc3Npb246IHBlZyRwYXJzZUV4cHJlc3Npb24gfTtcbiAgbGV0IHBlZyRzdGFydFJ1bGVGdW5jdGlvbjogKCkgPT4gYW55ID0gcGVnJHBhcnNlRXhwcmVzc2lvbjtcblxuICBjb25zdCBwZWckYzAgPSBmdW5jdGlvbihoZWFkOiBhbnksIHRhaWw6IGFueSk6IGFueSB7XG4gICAgICByZXR1cm4gYnVpbGRCaW5hcnlPcGVyYW5kKGhlYWQsIHRhaWwsIHRydWUpO1xuICAgIH07XG4gIGNvbnN0IHBlZyRjMSA9IFwifHxcIjtcbiAgY29uc3QgcGVnJGMyID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcInx8XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMzID0gXCJvclwiO1xuICBjb25zdCBwZWckYzQgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwib3JcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjNSA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIm9yXCI7IH07XG4gIGNvbnN0IHBlZyRjNiA9IFwiJiZcIjtcbiAgY29uc3QgcGVnJGM3ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIiYmXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM4ID0gXCJhbmRcIjtcbiAgY29uc3QgcGVnJGM5ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImFuZFwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGMxMCA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcImFuZFwiOyB9O1xuICBjb25zdCBwZWckYzExID0gZnVuY3Rpb24oaGVhZDogYW55LCB0YWlsOiBhbnkpOiBhbnkge1xuICAgICAgcmV0dXJuIGJ1aWxkQmluYXJ5T3BlcmFuZChoZWFkLCB0YWlsKTtcbiAgICB9O1xuICBjb25zdCBwZWckYzEyID0gXCI8PVwiO1xuICBjb25zdCBwZWckYzEzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIjw9XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxNCA9IFwiPTxcIjtcbiAgY29uc3QgcGVnJGMxNSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCI9PFwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTYgPSBcImxlc3NvcmVxdWFsXCI7XG4gIGNvbnN0IHBlZyRjMTcgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwibGVzc29yZXF1YWxcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjMTggPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJsZXNzb3JlcXVhbFwiOyB9O1xuICBjb25zdCBwZWckYzE5ID0gXCI+PVwiO1xuICBjb25zdCBwZWckYzIwID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIj49XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMyMSA9IFwiPT5cIjtcbiAgY29uc3QgcGVnJGMyMiA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCI9PlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMjMgPSBcImdyZWF0ZXJvcmVxdWFsXCI7XG4gIGNvbnN0IHBlZyRjMjQgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiZ3JlYXRlcm9yZXF1YWxcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjMjUgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJncmVhdGVyb3JlcXVhbFwiOyB9O1xuICBjb25zdCBwZWckYzI2ID0gXCI9PVwiO1xuICBjb25zdCBwZWckYzI3ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIj09XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMyOCA9IFwiPVwiO1xuICBjb25zdCBwZWckYzI5ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIj1cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzMwID0gXCJlcXVhbHNcIjtcbiAgY29uc3QgcGVnJGMzMSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJlcXVhbHNcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjMzIgPSBcImVxdWFsXCI7XG4gIGNvbnN0IHBlZyRjMzMgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiZXF1YWxcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjMzQgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJlcXVhbFwiOyB9O1xuICBjb25zdCBwZWckYzM1ID0gXCIhPVwiO1xuICBjb25zdCBwZWckYzM2ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIiE9XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMzNyA9IFwiPD5cIjtcbiAgY29uc3QgcGVnJGMzOCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCI8PlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMzkgPSBcIm5vdGVxdWFsc1wiO1xuICBjb25zdCBwZWckYzQwID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIm5vdGVxdWFsc1wiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM0MSA9IFwibm90ZXF1YWxcIjtcbiAgY29uc3QgcGVnJGM0MiA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJub3RlcXVhbFwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM0MyA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIm5vdGVxdWFsXCI7IH07XG4gIGNvbnN0IHBlZyRjNDQgPSBcIjxcIjtcbiAgY29uc3QgcGVnJGM0NSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCI8XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM0NiA9IFwibGVzc1wiO1xuICBjb25zdCBwZWckYzQ3ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImxlc3NcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjNDggPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJsZXNzXCI7IH07XG4gIGNvbnN0IHBlZyRjNDkgPSBcIj5cIjtcbiAgY29uc3QgcGVnJGM1MCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCI+XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM1MSA9IFwiZ3JlYXRlclwiO1xuICBjb25zdCBwZWckYzUyID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImdyZWF0ZXJcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjNTMgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJncmVhdGVyXCI7IH07XG4gIGNvbnN0IHBlZyRjNTQgPSBcIitcIjtcbiAgY29uc3QgcGVnJGM1NSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIrXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM1NiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcInBsdXNcIjsgIH07XG4gIGNvbnN0IHBlZyRjNTcgPSBcIi1cIjtcbiAgY29uc3QgcGVnJGM1OCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCItXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM1OSA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIm1pbnVzXCI7IH07XG4gIGNvbnN0IHBlZyRjNjAgPSBcIipcIjtcbiAgY29uc3QgcGVnJGM2MSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIqXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM2MiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIm11bFwiOyB9O1xuICBjb25zdCBwZWckYzYzID0gXCIvXCI7XG4gIGNvbnN0IHBlZyRjNjQgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiL1wiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjNjUgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJkaXZcIjsgfTtcbiAgY29uc3QgcGVnJGM2NiA9IFwiJVwiO1xuICBjb25zdCBwZWckYzY3ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIiVcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzY4ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwibW9kXCI7IH07XG4gIGNvbnN0IHBlZyRjNjkgPSBcIl5cIjtcbiAgY29uc3QgcGVnJGM3MCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJeXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM3MSA9IFwicG93ZXJcIjtcbiAgY29uc3QgcGVnJGM3MiA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJwb3dlclwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM3MyA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcInBvd2VyXCI7IH07XG4gIGNvbnN0IHBlZyRjNzQgPSBcIio9XCI7XG4gIGNvbnN0IHBlZyRjNzUgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiKj1cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzc2ID0gXCJjb250YWluc1wiO1xuICBjb25zdCBwZWckYzc3ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImNvbnRhaW5zXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzc4ID0gXCJjb250YWluXCI7XG4gIGNvbnN0IHBlZyRjNzkgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiY29udGFpblwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM4MCA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcImNvbnRhaW5zXCI7IH07XG4gIGNvbnN0IHBlZyRjODEgPSBcIm5vdGNvbnRhaW5zXCI7XG4gIGNvbnN0IHBlZyRjODIgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwibm90Y29udGFpbnNcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjODMgPSBcIm5vdGNvbnRhaW5cIjtcbiAgY29uc3QgcGVnJGM4NCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJub3Rjb250YWluXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzg1ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwibm90Y29udGFpbnNcIjsgfTtcbiAgY29uc3QgcGVnJGM4NiA9IFwiYW55b2ZcIjtcbiAgY29uc3QgcGVnJGM4NyA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJhbnlvZlwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM4OCA9IGZ1bmN0aW9uKCk6IGFueSB7cmV0dXJuIFwiYW55b2ZcIjsgfTtcbiAgY29uc3QgcGVnJGM4OSA9IFwiYWxsb2ZcIjtcbiAgY29uc3QgcGVnJGM5MCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJhbGxvZlwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM5MSA9IGZ1bmN0aW9uKCk6IGFueSB7cmV0dXJuIFwiYWxsb2ZcIjsgfTtcbiAgY29uc3QgcGVnJGM5MiA9IFwiKFwiO1xuICBjb25zdCBwZWckYzkzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIihcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzk0ID0gXCIpXCI7XG4gIGNvbnN0IHBlZyRjOTUgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiKVwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjOTYgPSBmdW5jdGlvbihleHByOiBhbnkpOiBhbnkgeyByZXR1cm4gZXhwcjsgfTtcbiAgY29uc3QgcGVnJGM5NyA9IGZ1bmN0aW9uKG5hbWU6IGFueSwgcGFyYW1zOiBhbnkpOiBhbnkgeyByZXR1cm4gbmV3IEZ1bmN0aW9uT3BlcmFuZChuYW1lLCBwYXJhbXMpOyB9O1xuICBjb25zdCBwZWckYzk4ID0gXCIhXCI7XG4gIGNvbnN0IHBlZyRjOTkgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiIVwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTAwID0gXCJuZWdhdGVcIjtcbiAgY29uc3QgcGVnJGMxMDEgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwibmVnYXRlXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzEwMiA9IGZ1bmN0aW9uKGV4cHI6IGFueSk6IGFueSB7IHJldHVybiBuZXcgVW5hcnlPcGVyYW5kKGV4cHIsIFwibmVnYXRlXCIpOyB9O1xuICBjb25zdCBwZWckYzEwMyA9IGZ1bmN0aW9uKGV4cHI6IGFueSwgb3A6IGFueSk6IGFueSB7IHJldHVybiBuZXcgVW5hcnlPcGVyYW5kKGV4cHIsIG9wKTsgfTtcbiAgY29uc3QgcGVnJGMxMDQgPSBcImVtcHR5XCI7XG4gIGNvbnN0IHBlZyRjMTA1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImVtcHR5XCIsIHRydWUpO1xuICBjb25zdCBwZWckYzEwNiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcImVtcHR5XCI7IH07XG4gIGNvbnN0IHBlZyRjMTA3ID0gXCJub3RlbXB0eVwiO1xuICBjb25zdCBwZWckYzEwOCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJub3RlbXB0eVwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGMxMDkgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJub3RlbXB0eVwiOyB9O1xuICBjb25zdCBwZWckYzExMCA9IFwidW5kZWZpbmVkXCI7XG4gIGNvbnN0IHBlZyRjMTExID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcInVuZGVmaW5lZFwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTEyID0gXCJudWxsXCI7XG4gIGNvbnN0IHBlZyRjMTEzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIm51bGxcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzExNCA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBudWxsOyB9O1xuICBjb25zdCBwZWckYzExNSA9IGZ1bmN0aW9uKHZhbHVlOiBhbnkpOiBhbnkgeyByZXR1cm4gbmV3IENvbnN0KHZhbHVlKTsgfTtcbiAgY29uc3QgcGVnJGMxMTYgPSBcIntcIjtcbiAgY29uc3QgcGVnJGMxMTcgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwie1wiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTE4ID0gXCJ9XCI7XG4gIGNvbnN0IHBlZyRjMTE5ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIn1cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzEyMCA9IGZ1bmN0aW9uKHZhbHVlOiBhbnkpOiBhbnkgeyByZXR1cm4gbmV3IFZhcmlhYmxlKHZhbHVlKTsgfTtcbiAgY29uc3QgcGVnJGMxMjEgPSBcIidcIjtcbiAgY29uc3QgcGVnJGMxMjIgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiJ1wiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTIzID0gZnVuY3Rpb24odmFsdWU6IGFueSk6IGFueSB7IHJldHVybiB2YWx1ZTsgfTtcbiAgY29uc3QgcGVnJGMxMjQgPSBcIlxcXCJcIjtcbiAgY29uc3QgcGVnJGMxMjUgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiXFxcIlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTI2ID0gXCJbXCI7XG4gIGNvbnN0IHBlZyRjMTI3ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIltcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzEyOCA9IFwiXVwiO1xuICBjb25zdCBwZWckYzEyOSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJdXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMzAgPSBmdW5jdGlvbihzZXF1ZW5jZTogYW55KTogYW55IHsgcmV0dXJuIHNlcXVlbmNlOyB9O1xuICBjb25zdCBwZWckYzEzMSA9IFwiLFwiO1xuICBjb25zdCBwZWckYzEzMiA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIsXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMzMgPSBmdW5jdGlvbihleHByOiBhbnksIHRhaWw6IGFueSk6IGFueSB7XG4gICAgICBpZiAoZXhwciA9PSBudWxsKVxuICAgICAgICByZXR1cm4gW107XG5cbiAgICAgIHZhciBhcnJheSA9IFtleHByXTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRhaWwpKSB7XG4gICAgICAgIHZhciBmbGF0dGVuID0gZmxhdHRlbkFycmF5KHRhaWwpO1xuICAgICAgICBmb3IgKHZhciBpID0gMzsgaSA8IGZsYXR0ZW4ubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgICBhcnJheS5wdXNoKGZsYXR0ZW5baV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgQXJyYXlPcGVyYW5kKGFycmF5KTtcbiAgICB9O1xuICBjb25zdCBwZWckYzEzNCA9IFwidHJ1ZVwiO1xuICBjb25zdCBwZWckYzEzNSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJ0cnVlXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzEzNiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiB0cnVlOyB9O1xuICBjb25zdCBwZWckYzEzNyA9IFwiZmFsc2VcIjtcbiAgY29uc3QgcGVnJGMxMzggPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiZmFsc2VcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjMTM5ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIGZhbHNlOyB9O1xuICBjb25zdCBwZWckYzE0MCA9IFwiMHhcIjtcbiAgY29uc3QgcGVnJGMxNDEgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiMHhcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE0MiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBwYXJzZUludCh0ZXh0KCksIDE2KTsgfTtcbiAgY29uc3QgcGVnJGMxNDMgPSAvXltcXC1dLztcbiAgY29uc3QgcGVnJGMxNDQgPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbXCItXCJdLCBmYWxzZSwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE0NSA9IGZ1bmN0aW9uKHNpZ246IGFueSwgbnVtOiBhbnkpOiBhbnkgeyByZXR1cm4gc2lnbiA9PSBudWxsID8gbnVtIDogLW51bTsgfTtcbiAgY29uc3QgcGVnJGMxNDYgPSBcIi5cIjtcbiAgY29uc3QgcGVnJGMxNDcgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiLlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTQ4ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIHBhcnNlRmxvYXQodGV4dCgpKTsgfTtcbiAgY29uc3QgcGVnJGMxNDkgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gcGFyc2VJbnQodGV4dCgpLCAxMCk7IH07XG4gIGNvbnN0IHBlZyRjMTUwID0gXCIwXCI7XG4gIGNvbnN0IHBlZyRjMTUxID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIjBcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE1MiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiAwOyB9O1xuICBjb25zdCBwZWckYzE1MyA9IGZ1bmN0aW9uKGNoYXJzOiBhbnkpOiBhbnkgeyByZXR1cm4gY2hhcnMuam9pbihcIlwiKTsgfTtcbiAgY29uc3QgcGVnJGMxNTQgPSBcIlxcXFwnXCI7XG4gIGNvbnN0IHBlZyRjMTU1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIlxcXFwnXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxNTYgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCInXCI7IH07XG4gIGNvbnN0IHBlZyRjMTU3ID0gXCJcXFxcXFxcIlwiO1xuICBjb25zdCBwZWckYzE1OCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJcXFxcXFxcIlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTU5ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiXFxcIlwiOyB9O1xuICBjb25zdCBwZWckYzE2MCA9IC9eW15cIid7fV0vO1xuICBjb25zdCBwZWckYzE2MSA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtcIlxcXCJcIiwgXCInXCIsIFwie1wiLCBcIn1cIl0sIHRydWUsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxNjIgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gdGV4dCgpOyB9O1xuICBjb25zdCBwZWckYzE2MyA9IC9eW157fV0vO1xuICBjb25zdCBwZWckYzE2NCA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtcIntcIiwgXCJ9XCJdLCB0cnVlLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTY1ID0gL15bMC05XS87XG4gIGNvbnN0IHBlZyRjMTY2ID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1tcIjBcIiwgXCI5XCJdXSwgZmFsc2UsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxNjcgPSAvXlsxLTldLztcbiAgY29uc3QgcGVnJGMxNjggPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbW1wiMVwiLCBcIjlcIl1dLCBmYWxzZSwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE2OSA9IC9eW2EtekEtWl0vO1xuICBjb25zdCBwZWckYzE3MCA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtbXCJhXCIsIFwielwiXSwgW1wiQVwiLCBcIlpcIl1dLCBmYWxzZSwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE3MSA9IHBlZyRvdGhlckV4cGVjdGF0aW9uKFwid2hpdGVzcGFjZVwiKTtcbiAgY29uc3QgcGVnJGMxNzIgPSAvXlsgXFx0XFxuXFxyXS87XG4gIGNvbnN0IHBlZyRjMTczID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wiIFwiLCBcIlxcdFwiLCBcIlxcblwiLCBcIlxcclwiXSwgZmFsc2UsIGZhbHNlKTtcblxuICBsZXQgcGVnJGN1cnJQb3MgPSAwO1xuICBsZXQgcGVnJHNhdmVkUG9zID0gMDtcbiAgY29uc3QgcGVnJHBvc0RldGFpbHNDYWNoZSA9IFt7IGxpbmU6IDEsIGNvbHVtbjogMSB9XTtcbiAgbGV0IHBlZyRtYXhGYWlsUG9zID0gMDtcbiAgbGV0IHBlZyRtYXhGYWlsRXhwZWN0ZWQ6IGFueVtdID0gW107XG4gIGxldCBwZWckc2lsZW50RmFpbHMgPSAwO1xuXG4gIGNvbnN0IHBlZyRyZXN1bHRzQ2FjaGU6IHtbaWQ6IG51bWJlcl06IElDYWNoZWR9ID0ge307XG5cbiAgbGV0IHBlZyRyZXN1bHQ7XG5cbiAgaWYgKG9wdGlvbnMuc3RhcnRSdWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIShvcHRpb25zLnN0YXJ0UnVsZSBpbiBwZWckc3RhcnRSdWxlRnVuY3Rpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3Qgc3RhcnQgcGFyc2luZyBmcm9tIHJ1bGUgXFxcIlwiICsgb3B0aW9ucy5zdGFydFJ1bGUgKyBcIlxcXCIuXCIpO1xuICAgIH1cblxuICAgIHBlZyRzdGFydFJ1bGVGdW5jdGlvbiA9IHBlZyRzdGFydFJ1bGVGdW5jdGlvbnNbb3B0aW9ucy5zdGFydFJ1bGVdO1xuICB9XG5cbiAgZnVuY3Rpb24gdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBpbnB1dC5zdWJzdHJpbmcocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcyk7XG4gIH1cblxuICBmdW5jdGlvbiBsb2NhdGlvbigpOiBJRmlsZVJhbmdlIHtcbiAgICByZXR1cm4gcGVnJGNvbXB1dGVMb2NhdGlvbihwZWckc2F2ZWRQb3MsIHBlZyRjdXJyUG9zKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4cGVjdGVkKGRlc2NyaXB0aW9uOiBzdHJpbmcsIGxvY2F0aW9uMT86IElGaWxlUmFuZ2UpIHtcbiAgICBsb2NhdGlvbjEgPSBsb2NhdGlvbjEgIT09IHVuZGVmaW5lZFxuICAgICAgPyBsb2NhdGlvbjFcbiAgICAgIDogcGVnJGNvbXB1dGVMb2NhdGlvbihwZWckc2F2ZWRQb3MsIHBlZyRjdXJyUG9zKTtcblxuICAgIHRocm93IHBlZyRidWlsZFN0cnVjdHVyZWRFcnJvcihcbiAgICAgIFtwZWckb3RoZXJFeHBlY3RhdGlvbihkZXNjcmlwdGlvbildLFxuICAgICAgaW5wdXQuc3Vic3RyaW5nKHBlZyRzYXZlZFBvcywgcGVnJGN1cnJQb3MpLFxuICAgICAgbG9jYXRpb24xXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgbG9jYXRpb24xPzogSUZpbGVSYW5nZSkge1xuICAgIGxvY2F0aW9uMSA9IGxvY2F0aW9uMSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGxvY2F0aW9uMVxuICAgICAgOiBwZWckY29tcHV0ZUxvY2F0aW9uKHBlZyRzYXZlZFBvcywgcGVnJGN1cnJQb3MpO1xuXG4gICAgdGhyb3cgcGVnJGJ1aWxkU2ltcGxlRXJyb3IobWVzc2FnZSwgbG9jYXRpb24xKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRsaXRlcmFsRXhwZWN0YXRpb24odGV4dDE6IHN0cmluZywgaWdub3JlQ2FzZTogYm9vbGVhbik6IElMaXRlcmFsRXhwZWN0YXRpb24ge1xuICAgIHJldHVybiB7IHR5cGU6IFwibGl0ZXJhbFwiLCB0ZXh0OiB0ZXh0MSwgaWdub3JlQ2FzZTogaWdub3JlQ2FzZSB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGNsYXNzRXhwZWN0YXRpb24ocGFydHM6IElDbGFzc1BhcnRzLCBpbnZlcnRlZDogYm9vbGVhbiwgaWdub3JlQ2FzZTogYm9vbGVhbik6IElDbGFzc0V4cGVjdGF0aW9uIHtcbiAgICByZXR1cm4geyB0eXBlOiBcImNsYXNzXCIsIHBhcnRzOiBwYXJ0cywgaW52ZXJ0ZWQ6IGludmVydGVkLCBpZ25vcmVDYXNlOiBpZ25vcmVDYXNlIH07XG4gIH1cblxuICBmdW5jdGlvbiBwZWckYW55RXhwZWN0YXRpb24oKTogSUFueUV4cGVjdGF0aW9uIHtcbiAgICByZXR1cm4geyB0eXBlOiBcImFueVwiIH07XG4gIH1cblxuICBmdW5jdGlvbiBwZWckZW5kRXhwZWN0YXRpb24oKTogSUVuZEV4cGVjdGF0aW9uIHtcbiAgICByZXR1cm4geyB0eXBlOiBcImVuZFwiIH07XG4gIH1cblxuICBmdW5jdGlvbiBwZWckb3RoZXJFeHBlY3RhdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogSU90aGVyRXhwZWN0YXRpb24ge1xuICAgIHJldHVybiB7IHR5cGU6IFwib3RoZXJcIiwgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uIH07XG4gIH1cblxuICBmdW5jdGlvbiBwZWckY29tcHV0ZVBvc0RldGFpbHMocG9zOiBudW1iZXIpIHtcbiAgICBsZXQgZGV0YWlscyA9IHBlZyRwb3NEZXRhaWxzQ2FjaGVbcG9zXTtcbiAgICBsZXQgcDtcblxuICAgIGlmIChkZXRhaWxzKSB7XG4gICAgICByZXR1cm4gZGV0YWlscztcbiAgICB9IGVsc2Uge1xuICAgICAgcCA9IHBvcyAtIDE7XG4gICAgICB3aGlsZSAoIXBlZyRwb3NEZXRhaWxzQ2FjaGVbcF0pIHtcbiAgICAgICAgcC0tO1xuICAgICAgfVxuXG4gICAgICBkZXRhaWxzID0gcGVnJHBvc0RldGFpbHNDYWNoZVtwXTtcbiAgICAgIGRldGFpbHMgPSB7XG4gICAgICAgIGxpbmU6IGRldGFpbHMubGluZSxcbiAgICAgICAgY29sdW1uOiBkZXRhaWxzLmNvbHVtblxuICAgICAgfTtcblxuICAgICAgd2hpbGUgKHAgPCBwb3MpIHtcbiAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocCkgPT09IDEwKSB7XG4gICAgICAgICAgZGV0YWlscy5saW5lKys7XG4gICAgICAgICAgZGV0YWlscy5jb2x1bW4gPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRldGFpbHMuY29sdW1uKys7XG4gICAgICAgIH1cblxuICAgICAgICBwKys7XG4gICAgICB9XG5cbiAgICAgIHBlZyRwb3NEZXRhaWxzQ2FjaGVbcG9zXSA9IGRldGFpbHM7XG5cbiAgICAgIHJldHVybiBkZXRhaWxzO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRjb21wdXRlTG9jYXRpb24oc3RhcnRQb3M6IG51bWJlciwgZW5kUG9zOiBudW1iZXIpOiBJRmlsZVJhbmdlIHtcbiAgICBjb25zdCBzdGFydFBvc0RldGFpbHMgPSBwZWckY29tcHV0ZVBvc0RldGFpbHMoc3RhcnRQb3MpO1xuICAgIGNvbnN0IGVuZFBvc0RldGFpbHMgPSBwZWckY29tcHV0ZVBvc0RldGFpbHMoZW5kUG9zKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdGFydDoge1xuICAgICAgICBvZmZzZXQ6IHN0YXJ0UG9zLFxuICAgICAgICBsaW5lOiBzdGFydFBvc0RldGFpbHMubGluZSxcbiAgICAgICAgY29sdW1uOiBzdGFydFBvc0RldGFpbHMuY29sdW1uXG4gICAgICB9LFxuICAgICAgZW5kOiB7XG4gICAgICAgIG9mZnNldDogZW5kUG9zLFxuICAgICAgICBsaW5lOiBlbmRQb3NEZXRhaWxzLmxpbmUsXG4gICAgICAgIGNvbHVtbjogZW5kUG9zRGV0YWlscy5jb2x1bW5cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGZhaWwoZXhwZWN0ZWQxOiBFeHBlY3RhdGlvbikge1xuICAgIGlmIChwZWckY3VyclBvcyA8IHBlZyRtYXhGYWlsUG9zKSB7IHJldHVybjsgfVxuXG4gICAgaWYgKHBlZyRjdXJyUG9zID4gcGVnJG1heEZhaWxQb3MpIHtcbiAgICAgIHBlZyRtYXhGYWlsUG9zID0gcGVnJGN1cnJQb3M7XG4gICAgICBwZWckbWF4RmFpbEV4cGVjdGVkID0gW107XG4gICAgfVxuXG4gICAgcGVnJG1heEZhaWxFeHBlY3RlZC5wdXNoKGV4cGVjdGVkMSk7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckYnVpbGRTaW1wbGVFcnJvcihtZXNzYWdlOiBzdHJpbmcsIGxvY2F0aW9uMTogSUZpbGVSYW5nZSkge1xuICAgIHJldHVybiBuZXcgU3ludGF4RXJyb3IobWVzc2FnZSwgW10sIFwiXCIsIGxvY2F0aW9uMSk7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckYnVpbGRTdHJ1Y3R1cmVkRXJyb3IoZXhwZWN0ZWQxOiBFeHBlY3RhdGlvbltdLCBmb3VuZDogc3RyaW5nIHwgbnVsbCwgbG9jYXRpb24xOiBJRmlsZVJhbmdlKSB7XG4gICAgcmV0dXJuIG5ldyBTeW50YXhFcnJvcihcbiAgICAgIFN5bnRheEVycm9yLmJ1aWxkTWVzc2FnZShleHBlY3RlZDEsIGZvdW5kKSxcbiAgICAgIGV4cGVjdGVkMSxcbiAgICAgIGZvdW5kLFxuICAgICAgbG9jYXRpb24xXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUV4cHJlc3Npb24oKTogT3BlcmFuZCB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNywgczg7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMDtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlXygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2VMb2dpY09yKCk7XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBbXTtcbiAgICAgICAgczQgPSBwZWckY3VyclBvcztcbiAgICAgICAgczUgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlT3JTaWduKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzOCA9IHBlZyRwYXJzZUxvZ2ljT3IoKTtcbiAgICAgICAgICAgICAgaWYgKHM4ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczUgPSBbczUsIHM2LCBzNywgczhdO1xuICAgICAgICAgICAgICAgIHM0ID0gczU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzNDtcbiAgICAgICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzNDtcbiAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzNDtcbiAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczMucHVzaChzNCk7XG4gICAgICAgICAgczQgPSBwZWckY3VyclBvcztcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlT3JTaWduKCk7XG4gICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM4ID0gcGVnJHBhcnNlTG9naWNPcigpO1xuICAgICAgICAgICAgICAgIGlmIChzOCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgczUgPSBbczUsIHM2LCBzNywgczhdO1xuICAgICAgICAgICAgICAgICAgczQgPSBzNTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzNDtcbiAgICAgICAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzNDtcbiAgICAgICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzNDtcbiAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgIHMxID0gcGVnJGMwKHMyLCBzMyk7XG4gICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZU9yU2lnbigpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzEpIHtcbiAgICAgIHMxID0gcGVnJGMxO1xuICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzIpOyB9XG4gICAgfVxuICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGMzKSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKTtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQpOyB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjNSgpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlTG9naWNPcigpOiBCaW5hcnlPcGVyYW5kIHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDI7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZUxvZ2ljQW5kKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IFtdO1xuICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHM1ID0gcGVnJHBhcnNlQW5kU2lnbigpO1xuICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlTG9naWNBbmQoKTtcbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZUFuZFNpZ24oKTtcbiAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlTG9naWNBbmQoKTtcbiAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzAoczEsIHMyKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VBbmRTaWduKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAzO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjNikge1xuICAgICAgczEgPSBwZWckYzY7XG4gICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNyk7IH1cbiAgICB9XG4gICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAzKS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzgpIHtcbiAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDMpO1xuICAgICAgICBwZWckY3VyclBvcyArPSAzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjOSk7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGMxMCgpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlTG9naWNBbmQoKTogQmluYXJ5T3BlcmFuZCB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNztcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyA0O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VDb21wT3BzKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IFtdO1xuICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHM1ID0gcGVnJHBhcnNlQ29tcGFyYWJsZU9wZXJhdG9ycygpO1xuICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlQ29tcE9wcygpO1xuICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMi5wdXNoKHMzKTtcbiAgICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM1ID0gcGVnJHBhcnNlQ29tcGFyYWJsZU9wZXJhdG9ycygpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VDb21wT3BzKCk7XG4gICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxMShzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUNvbXBhcmFibGVPcGVyYXRvcnMoKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDU7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGMxMikge1xuICAgICAgczEgPSBwZWckYzEyO1xuICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEzKTsgfVxuICAgIH1cbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzE0KSB7XG4gICAgICAgIHMxID0gcGVnJGMxNDtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE1KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDExKS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzE2KSB7XG4gICAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDExKTtcbiAgICAgICAgICBwZWckY3VyclBvcyArPSAxMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE3KTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMTgoKTtcbiAgICB9XG4gICAgczAgPSBzMTtcbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGMxOSkge1xuICAgICAgICBzMSA9IHBlZyRjMTk7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMyMCk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGMyMSkge1xuICAgICAgICAgIHMxID0gcGVnJGMyMTtcbiAgICAgICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMjIpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTQpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMjMpIHtcbiAgICAgICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAxNCk7XG4gICAgICAgICAgICBwZWckY3VyclBvcyArPSAxNDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzI0KTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMjUoKTtcbiAgICAgIH1cbiAgICAgIHMwID0gczE7XG4gICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMjYpIHtcbiAgICAgICAgICBzMSA9IHBlZyRjMjY7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzI3KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNjEpIHtcbiAgICAgICAgICAgIHMxID0gcGVnJGMyODtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMyOSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA2KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzMwKSB7XG4gICAgICAgICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA2KTtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzMxKTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMzIpIHtcbiAgICAgICAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSk7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzMzKTsgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMzNCgpO1xuICAgICAgICB9XG4gICAgICAgIHMwID0gczE7XG4gICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMzUpIHtcbiAgICAgICAgICAgIHMxID0gcGVnJGMzNTtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMzNik7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGMzNykge1xuICAgICAgICAgICAgICBzMSA9IHBlZyRjMzc7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMzOCk7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA5KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzM5KSB7XG4gICAgICAgICAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDkpO1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0MCk7IH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA4KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzQxKSB7XG4gICAgICAgICAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgOCk7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyArPSA4O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDIpOyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjNDMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDYwKSB7XG4gICAgICAgICAgICAgIHMxID0gcGVnJGM0NDtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQ1KTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDQpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjNDYpIHtcbiAgICAgICAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNCk7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQ3KTsgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgIHMxID0gcGVnJGM0OCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDYyKSB7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckYzQ5O1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM1MCk7IH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA3KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzUxKSB7XG4gICAgICAgICAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNyk7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyArPSA3O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNTIpOyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMxID0gcGVnJGM1MygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlQ29tcE9wcygpOiBCaW5hcnlPcGVyYW5kIHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDY7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZVBsdXNNaW51c09wcygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZVBsdXNNaW51c1NpZ25zKCk7XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczcgPSBwZWckcGFyc2VQbHVzTWludXNPcHMoKTtcbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZVBsdXNNaW51c1NpZ25zKCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZVBsdXNNaW51c09wcygpO1xuICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMChzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZVBsdXNNaW51c1NpZ25zKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyA3O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0Mykge1xuICAgICAgczEgPSBwZWckYzU0O1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzU1KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzU2KCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0NSkge1xuICAgICAgICBzMSA9IHBlZyRjNTc7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM1OCk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzU5KCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZVBsdXNNaW51c09wcygpOiBCaW5hcnlPcGVyYW5kIHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDg7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZU11bERpdk9wcygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZU11bERpdlNpZ25zKCk7XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczcgPSBwZWckcGFyc2VNdWxEaXZPcHMoKTtcbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZU11bERpdlNpZ25zKCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZU11bERpdk9wcygpO1xuICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMChzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZU11bERpdlNpZ25zKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyA5O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0Mikge1xuICAgICAgczEgPSBwZWckYzYwO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzYxKTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzYyKCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0Nykge1xuICAgICAgICBzMSA9IHBlZyRjNjM7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM2NCk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzY1KCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMzcpIHtcbiAgICAgICAgICBzMSA9IHBlZyRjNjY7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzY3KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGM2OCgpO1xuICAgICAgICB9XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlTXVsRGl2T3BzKCk6IEJpbmFyeU9wZXJhbmQge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczc7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTA7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZUJpbmFyeUZ1bmNPcCgpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZVBvd2VyU2lnbnMoKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUJpbmFyeUZ1bmNPcCgpO1xuICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMi5wdXNoKHMzKTtcbiAgICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM1ID0gcGVnJHBhcnNlUG93ZXJTaWducygpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VCaW5hcnlGdW5jT3AoKTtcbiAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzAoczEsIHMyKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VQb3dlclNpZ25zKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAxMTtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gOTQpIHtcbiAgICAgIHMxID0gcGVnJGM2OTtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM3MCk7IH1cbiAgICB9XG4gICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA1KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzcxKSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA1KTtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gNTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzcyKTsgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzczKCk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VCaW5hcnlGdW5jT3AoKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDEyO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VGYWN0b3IoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gW107XG4gICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczUgPSBwZWckcGFyc2VCaW5GdW5jdGlvbnMoKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUZhY3RvcigpO1xuICAgICAgICAgICAgaWYgKHM3ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM3ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZUJpbkZ1bmN0aW9ucygpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VGYWN0b3IoKTtcbiAgICAgICAgICAgICAgaWYgKHM3ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczcgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxMShzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUJpbkZ1bmN0aW9ucygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTM7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGM3NCkge1xuICAgICAgczEgPSBwZWckYzc0O1xuICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzc1KTsgfVxuICAgIH1cbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDgpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjNzYpIHtcbiAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDgpO1xuICAgICAgICBwZWckY3VyclBvcyArPSA4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNzcpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNykudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM3OCkge1xuICAgICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA3KTtcbiAgICAgICAgICBwZWckY3VyclBvcyArPSA3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNzkpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGM4MCgpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDExKS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzgxKSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAxMSk7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDExO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjODIpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTApLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjODMpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTApO1xuICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDEwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjODQpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzg1KCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjODYpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzg3KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGM4OCgpO1xuICAgICAgICB9XG4gICAgICAgIHMwID0gczE7XG4gICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM4OSkge1xuICAgICAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpO1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzkwKTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgczEgPSBwZWckYzkxKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VGYWN0b3IoKTogT3BlcmFuZCB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNCwgczU7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTQ7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQwKSB7XG4gICAgICBzMSA9IHBlZyRjOTI7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjOTMpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0MSkge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRjOTQ7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM5NSk7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzNSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgIHMxID0gcGVnJGM5NihzMyk7XG4gICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckcGFyc2VGdW5jdGlvbk9wKCk7XG4gICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAgPSBwZWckcGFyc2VVbmFyeUZ1bmN0aW9uT3AoKTtcbiAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczAgPSBwZWckcGFyc2VBdG9tKCk7XG4gICAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzMCA9IHBlZyRwYXJzZUFycmF5T3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VGdW5jdGlvbk9wKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNDtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAxNTtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlTGV0dGVyc0FuZERpZ2l0cygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0MCkge1xuICAgICAgICBzMiA9IHBlZyRjOTI7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM5Myk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZVNlcXVlbmNlKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDEpIHtcbiAgICAgICAgICAgIHM0ID0gcGVnJGM5NDtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM5NSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHM0ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjOTcoczEsIHMzKTtcbiAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlVW5hcnlGdW5jdGlvbk9wKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDE2O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzMykge1xuICAgICAgczEgPSBwZWckYzk4O1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzk5KTsgfVxuICAgIH1cbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDYpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMTAwKSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA2KTtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gNjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEwMSk7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzEwMihzMyk7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMSA9IHBlZyRwYXJzZUF0b20oKTtcbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczMgPSBwZWckcGFyc2VVbkZ1bmN0aW9ucygpO1xuICAgICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjMTAzKHMxLCBzMyk7XG4gICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZVVuRnVuY3Rpb25zKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAxNztcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMTA0KSB7XG4gICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSk7XG4gICAgICBwZWckY3VyclBvcyArPSA1O1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTA1KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzEwNigpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDgpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMTA3KSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA4KTtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gODtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEwOCk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzEwOSgpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VBdG9tKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNDtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAxODtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlXygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgOSkgPT09IHBlZyRjMTEwKSB7XG4gICAgICAgIHMyID0gcGVnJGMxMTA7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMTEpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczIgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNCkgPT09IHBlZyRjMTEyKSB7XG4gICAgICAgICAgczIgPSBwZWckYzExMjtcbiAgICAgICAgICBwZWckY3VyclBvcyArPSA0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTEzKTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxMTQoKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBwZWckcGFyc2VDb25zdFZhbHVlKCk7XG4gICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMxMTUoczIpO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzMSA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjMpIHtcbiAgICAgICAgICAgIHMyID0gcGVnJGMxMTY7XG4gICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTE3KTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMzID0gcGVnJHBhcnNlVmFsdWVJbnB1dCgpO1xuICAgICAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMTI1KSB7XG4gICAgICAgICAgICAgICAgczQgPSBwZWckYzExODtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTE5KTsgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMxID0gcGVnJGMxMjAoczMpO1xuICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VDb25zdFZhbHVlKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDE5O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJHBhcnNlTG9naWNWYWx1ZSgpO1xuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckcGFyc2VBcml0aG1ldGljVmFsdWUoKTtcbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMCA9IHBlZyRwYXJzZUxldHRlcnNBbmREaWdpdHMoKTtcbiAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDM5KSB7XG4gICAgICAgICAgICBzMSA9IHBlZyRjMTIxO1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEyMik7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzMiA9IHBlZyRwYXJzZUFueUlucHV0KCk7XG4gICAgICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzOSkge1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJGMxMjE7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEyMik7IH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMTIzKHMyKTtcbiAgICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMzQpIHtcbiAgICAgICAgICAgICAgczEgPSBwZWckYzEyNDtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEyNSk7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzMiA9IHBlZyRwYXJzZUFueUlucHV0KCk7XG4gICAgICAgICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMzQpIHtcbiAgICAgICAgICAgICAgICAgIHMzID0gcGVnJGMxMjQ7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTI1KTsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgczEgPSBwZWckYzEyMyhzMik7XG4gICAgICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUFycmF5T3AoKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczM7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMjA7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDkxKSB7XG4gICAgICBzMSA9IHBlZyRjMTI2O1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEyNyk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IHBlZyRwYXJzZVNlcXVlbmNlKCk7XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA5Mykge1xuICAgICAgICAgIHMzID0gcGVnJGMxMjg7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEyOSk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMTMwKHMyKTtcbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlU2VxdWVuY2UoKTogQXJyYXlPcGVyYW5kIHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDIxO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VFeHByZXNzaW9uKCk7XG4gICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgICAgczUgPSBwZWckYzEzMTtcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHM1ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTMyKTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczcgPSBwZWckcGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyLnB1c2goczMpO1xuICAgICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0NCkge1xuICAgICAgICAgICAgczUgPSBwZWckYzEzMTtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHM1ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMzIpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxMzMoczEsIHMyKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VMb2dpY1ZhbHVlKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAyMjtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDQpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMTM0KSB7XG4gICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNCk7XG4gICAgICBwZWckY3VyclBvcyArPSA0O1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTM1KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzEzNigpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMTM3KSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA1KTtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gNTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEzOCk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzEzOSgpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VBcml0aG1ldGljVmFsdWUoKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMjtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAyMztcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzE0MCkge1xuICAgICAgczEgPSBwZWckYzE0MDtcbiAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNDEpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2VEaWdpdHMoKTtcbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzE0MigpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBpZiAocGVnJGMxNDMudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNDQpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczEgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlTnVtYmVyKCk7XG4gICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMxNDUoczEsIHMyKTtcbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlTnVtYmVyKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDI0O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VEaWdpdHMoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDYpIHtcbiAgICAgICAgczIgPSBwZWckYzE0NjtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE0Nyk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZURpZ2l0cygpO1xuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMTQ4KCk7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMSA9IHBlZyRwYXJzZU5vblplcm9EaWdpdHMoKTtcbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IHBlZyRwYXJzZURpZ2l0cygpO1xuICAgICAgICBpZiAoczIgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzE0OSgpO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ4KSB7XG4gICAgICAgICAgczEgPSBwZWckYzE1MDtcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTUxKTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMxNTIoKTtcbiAgICAgICAgfVxuICAgICAgICBzMCA9IHMxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZVZhbHVlSW5wdXQoKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMjtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAyNTtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gW107XG4gICAgczIgPSBwZWckcGFyc2VWYWx1ZUNoYXJhY3RlcnMoKTtcbiAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHdoaWxlIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMS5wdXNoKHMyKTtcbiAgICAgICAgczIgPSBwZWckcGFyc2VWYWx1ZUNoYXJhY3RlcnMoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzE1MyhzMSk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VBbnlJbnB1dCgpOiBhbnkge1xuICAgIGxldCBzMCwgczEsIHMyO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDI2O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBbXTtcbiAgICBzMiA9IHBlZyRwYXJzZUFueUNoYXJhY3RlcnMoKTtcbiAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHdoaWxlIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMS5wdXNoKHMyKTtcbiAgICAgICAgczIgPSBwZWckcGFyc2VBbnlDaGFyYWN0ZXJzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGMxNTMoczEpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlQW55Q2hhcmFjdGVycygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMjc7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGMxNTQpIHtcbiAgICAgIHMxID0gcGVnJGMxNTQ7XG4gICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTU1KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzE1NigpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzE1Nykge1xuICAgICAgICBzMSA9IHBlZyRjMTU3O1xuICAgICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTU4KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMTU5KCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIGlmIChwZWckYzE2MC50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNjEpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzE2MigpO1xuICAgICAgICB9XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlVmFsdWVDaGFyYWN0ZXJzKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAyODtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChwZWckYzE2My50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTY0KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzE2MigpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlTGV0dGVyc0FuZERpZ2l0cygpOiBhbnkge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNjtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAyOTtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlTGV0dGVycygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZURpZ2l0cygpO1xuICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHM1ID0gW107XG4gICAgICAgIHM2ID0gcGVnJHBhcnNlTGV0dGVycygpO1xuICAgICAgICB3aGlsZSAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNS5wdXNoKHM2KTtcbiAgICAgICAgICBzNiA9IHBlZyRwYXJzZUxldHRlcnMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNCA9IFtzNCwgczVdO1xuICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMi5wdXNoKHMzKTtcbiAgICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgICAgczQgPSBwZWckcGFyc2VEaWdpdHMoKTtcbiAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczUgPSBbXTtcbiAgICAgICAgICBzNiA9IHBlZyRwYXJzZUxldHRlcnMoKTtcbiAgICAgICAgICB3aGlsZSAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM1LnB1c2goczYpO1xuICAgICAgICAgICAgczYgPSBwZWckcGFyc2VMZXR0ZXJzKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczQgPSBbczQsIHM1XTtcbiAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxNjIoKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VEaWdpdHMoKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDMwO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gW107XG4gICAgaWYgKHBlZyRjMTY1LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNjYpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgd2hpbGUgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwLnB1c2goczEpO1xuICAgICAgICBpZiAocGVnJGMxNjUudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTY2KTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VOb25aZXJvRGlnaXRzKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAzMTtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IFtdO1xuICAgIGlmIChwZWckYzE2Ny50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTY4KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHdoaWxlIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMC5wdXNoKHMxKTtcbiAgICAgICAgaWYgKHBlZyRjMTY3LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE2OCk7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlTGV0dGVycygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMzI7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBbXTtcbiAgICBpZiAocGVnJGMxNjkudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE3MCk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICB3aGlsZSAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAucHVzaChzMSk7XG4gICAgICAgIGlmIChwZWckYzE2OS50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNzApOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZV8oKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDMzO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHBlZyRzaWxlbnRGYWlscysrO1xuICAgIHMwID0gW107XG4gICAgaWYgKHBlZyRjMTcyLnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNzMpOyB9XG4gICAgfVxuICAgIHdoaWxlIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAucHVzaChzMSk7XG4gICAgICBpZiAocGVnJGMxNzIudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNzMpOyB9XG4gICAgICB9XG4gICAgfVxuICAgIHBlZyRzaWxlbnRGYWlscy0tO1xuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE3MSk7IH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuXG4gICAgZnVuY3Rpb24gYnVpbGRCaW5hcnlPcGVyYW5kKGhlYWQ6IE9wZXJhbmQsIHRhaWw6IEFycmF5PGFueT4sIGlzQXJpdGhtZXRpY09wOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB0YWlsLnJlZHVjZShcbiAgICAgICAgZnVuY3Rpb24ocmVzdWx0LCBlbGVtZW50cykge1xuICAgICAgICAgIHJldHVybiBuZXcgQmluYXJ5T3BlcmFuZChlbGVtZW50c1sxXSwgcmVzdWx0LCBlbGVtZW50c1szXSwgaXNBcml0aG1ldGljT3ApO1xuICAgICAgICB9LCBcbiAgICAgICAgaGVhZCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmxhdHRlbkFycmF5KGFycmF5OiBBcnJheTxhbnk+KTogQXJyYXk8YW55PiB7XG4gICAgICByZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBhcnJheSk7XG4gICAgfVxuXG5cbiAgcGVnJHJlc3VsdCA9IHBlZyRzdGFydFJ1bGVGdW5jdGlvbigpO1xuXG4gIGlmIChwZWckcmVzdWx0ICE9PSBwZWckRkFJTEVEICYmIHBlZyRjdXJyUG9zID09PSBpbnB1dC5sZW5ndGgpIHtcbiAgICByZXR1cm4gcGVnJHJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICBpZiAocGVnJHJlc3VsdCAhPT0gcGVnJEZBSUxFRCAmJiBwZWckY3VyclBvcyA8IGlucHV0Lmxlbmd0aCkge1xuICAgICAgcGVnJGZhaWwocGVnJGVuZEV4cGVjdGF0aW9uKCkpO1xuICAgIH1cblxuICAgIHRocm93IHBlZyRidWlsZFN0cnVjdHVyZWRFcnJvcihcbiAgICAgIHBlZyRtYXhGYWlsRXhwZWN0ZWQsXG4gICAgICBwZWckbWF4RmFpbFBvcyA8IGlucHV0Lmxlbmd0aCA/IGlucHV0LmNoYXJBdChwZWckbWF4RmFpbFBvcykgOiBudWxsLFxuICAgICAgcGVnJG1heEZhaWxQb3MgPCBpbnB1dC5sZW5ndGhcbiAgICAgICAgPyBwZWckY29tcHV0ZUxvY2F0aW9uKHBlZyRtYXhGYWlsUG9zLCBwZWckbWF4RmFpbFBvcyArIDEpXG4gICAgICAgIDogcGVnJGNvbXB1dGVMb2NhdGlvbihwZWckbWF4RmFpbFBvcywgcGVnJG1heEZhaWxQb3MpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQYXJzZU9wdGlvbnMge1xuICBmaWxlbmFtZT86IHN0cmluZztcbiAgc3RhcnRSdWxlPzogc3RyaW5nO1xuICB0cmFjZXI/OiBhbnk7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cbmV4cG9ydCB0eXBlIFBhcnNlRnVuY3Rpb24gPSAoaW5wdXQ6IHN0cmluZywgb3B0aW9ucz86IElQYXJzZU9wdGlvbnMpID0+IGFueTtcbmV4cG9ydCBjb25zdCBwYXJzZTogUGFyc2VGdW5jdGlvbiA9IHBlZyRwYXJzZTtcblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V4cHJlc3Npb25zL2V4cHJlc3Npb25QYXJzZXIudHMiLCJpbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IGNvbnRhaW5zIGV4cHJlc3Npb24gYW5kIGh0bWwgcHJvcGV0aWVzLiBJdCB1c2VzIGluIHN1cnZleS5jb21wbGV0ZWRIdG1sT25Db25kaXRpb24gYXJyYXkuXG4gKiBJZiB0aGUgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUgdGhlbiBodG1sIG9mIHRoaXMgaXRlbSB1c2VzIGluc3RlYWQgb2Ygc3VydmV5LmNvbXBsZXRlZEh0bWwgcHJvcGVydHlcbiAqIEBzZWUgU3VydmV5TW9kZWwuY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uXG4gKiBAc2VlIFN1cnZleU1vZGVsLmNvbXBsZXRlZEh0bWxcbiAqL1xuZXhwb3J0IGNsYXNzIEh0bWxDb25kaXRpb25JdGVtIGV4dGVuZHMgQmFzZSBpbXBsZW1lbnRzIElMb2NhbGl6YWJsZU93bmVyIHtcbiAgcHVibGljIGxvY093bmVyOiBJTG9jYWxpemFibGVPd25lcjtcbiAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogc3RyaW5nID0gbnVsbCwgaHRtbDogc3RyaW5nID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImh0bWxcIiwgdGhpcyk7XG4gICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICB0aGlzLmh0bWwgPSBodG1sO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiaHRtbGNvbmRpdGlvbml0ZW1cIjtcbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogYW55LCBwcm9wZXJ0aWVzOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuZXhwcmVzc2lvbikucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBleHByZXNzaW9uIHByb3BlcnR5LiBJZiB0aGlzIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLCB0aGVuIHN1cnZleSB3aWxsIHVzZSBodG1sIHByb3BlcnR5IHRvIHNob3cgb24gY29tcGxldGUgcGFnZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJleHByZXNzaW9uXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXhwcmVzc2lvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGh0bWwgdGhhdCBzaG93cyBvbiBjb21wbGV0ZWQgKCdUaGFuayB5b3UnKSBwYWdlLiBUaGUgZXhwcmVzc2lvbiBzaG91bGQgcmV0dXJuIHRydWVcbiAgICogQHNlZSBleHByZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGh0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJodG1sXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaHRtbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJodG1sXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJodG1sXCIpO1xuICB9XG5cbiAgcHVibGljIGdldExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMubG9jT3duZXIgPyB0aGlzLmxvY093bmVyLmdldExvY2FsZSgpIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5sb2NPd25lciA/IHRoaXMubG9jT3duZXIuZ2V0TWFya2Rvd25IdG1sKHRleHQpIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY093bmVyID8gdGhpcy5sb2NPd25lci5nZXRQcm9jZXNzZWRUZXh0KHRleHQpIDogdGV4dDtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImh0bWxjb25kaXRpb25pdGVtXCIsXG4gIFtcbiAgICBcImV4cHJlc3Npb246Y29uZGl0aW9uXCIsXG4gICAgeyBuYW1lOiBcImh0bWw6aHRtbFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jSHRtbFwiIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBIdG1sQ29uZGl0aW9uSXRlbSgpO1xuICB9LFxuICBcImJhc2VcIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9odG1sQ29uZGl0aW9uSXRlbS50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgYXJhYmljU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcItin2YTYs9in2KjZglwiLFxuICBwYWdlTmV4dFRleHQ6IFwi2KfZhNiq2KfZhNmKXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLYp9mG2YfYp9ihLSDYqtmFXCIsXG4gIHByb2dyZXNzVGV4dDogXCJ7MX0g2LXZgdit2KkgezB9INmF2YZcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLZhti1INii2K7YsVwiLFxuICBlbXB0eVN1cnZleTogXCLZhNinINiq2YjYrNivINi12YHYrdipINmF2LHYptmK2Kkg2KPZiCDYs9ik2KfZhCDZgdmKINin2YTZhdiz2K1cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCLYtNmD2LHYpyDZhNmDINmE2KfYs9iq2YPZhdin2YQg2KfZhNin2LPYqtio2YrYp9mGIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIi4uLtmK2KrZhSDYqtit2YXZitmEINin2YTYp9iz2KrYqNmK2KfZhlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCIuLi7Yp9iu2KrYsVwiLFxuICByZXF1aXJlZEVycm9yOiBcIi7Zitix2KzZiSDYp9mE2KXYrNin2KjYqSDYudmE2Ykg2KfZhNiz2KTYp9mEXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwi2YrYsdis2Ykg2KfZhNil2KzYp9io2Kkg2LnZhNmJINin2YTYo9iz2KbZhNipINmB2Yog2KzZhdmK2Lkg2KfZhNi12YHZiNmBXCIsXG4gIG51bWVyaWNFcnJvcjogXCLZitis2Kgg2KPZhiDYqtmD2YjZhiDYp9mE2YLZitmF2Kkg2KfZhNix2YLZhdmK2KkuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi2KfZhNix2KzYp9ihINil2K/Yrtin2YQg2YXYpyDZhNinINmK2YLZhCDYudmGIHswfSDYrdix2YFcIixcbiAgdGV4dE1heExlbmd0aDogXCLYp9mE2LHYrNin2KEg2KXYr9iu2KfZhCDYo9mC2YQg2YXZhiB7MH0g2K3YsdmBXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi2YrYsdis2Ykg2KXYr9iu2KfZhCDYo9mD2KvYsSDZhdmGIHswfSDZiNij2YLZhCDZhdmGIHsxfSDYrdix2YFcIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLZitix2KzZiSDZhdmE2KEg2YXYpyDZhNinINmK2YLZhCDYudmGIHswfSDYp9mE2LXZgdmI2YFcIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi2YrYsdis2Ykg2KrYrdiv2YrYryDZhdinINmE2Kcg2YrZgtmEINi52YYgezB9INin2YTZhdiq2LrZitix2KfYqlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLZitix2KzZiSDYqtit2K/ZitivINmF2Kcg2YTYpyDZitiy2YrYryDYudmGIHswfSDYp9mE2YXYqti62YrYsdin2KpcIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcItmIJ3swfScg2YrYrNioINij2YYg2KrZg9mI2YYg2YXYs9in2YjZitipINij2Ygg2KPZg9ir2LEg2YXZhiB7MX0g2YjZitiz2KfZiNmKINij2Ygg2KPZgtmEINmF2YYgezJ92KdcIixcbiAgbnVtZXJpY01pbjogXCLZiCd7MH0nINmK2KzYqCDYo9mGINiq2YPZiNmGINmF2LPYp9mI2YrYqSDYo9mIINij2YPYq9ixINmF2YYgezF92KdcIixcbiAgbnVtZXJpY01heDogXCLZiCd7MH0nINmK2KzYqCDYo9mGINiq2YPZiNmGINmF2LPYp9mI2YrYqSDYo9mIINij2YLZhCDZhdmGIHsxfdinXCIsXG4gIGludmFsaWRFbWFpbDogXCLYsdis2KfYoSDZgtmFINio2KXYr9iu2KfZhCDYqNix2YrYryDYp9mE2YPYqtix2YjZhtmKINi12K3ZititXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLYt9mE2Kgg2KXYsdis2KfYuSDYrti32KMgJ3swfScuIHsxfdinXCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCLYudin2K8g2LfZhNioINio2YrYp9mG2KfYqiDZgdin2LHYutipINij2YggJ9in2YTZhdiz2KfYsScg2YXZhdiq2YTZg9in2Kog2LrZitixINi12K3Zitit2KkgXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi2YjZitmG2KjYutmKINij2YTYpyDZitiq2KzYp9mI2LIg2K3YrNmFINin2YTZhdmE2YEgezB92KdcIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcItin2YTYsdis2KfYoSDYpdiv2K7Yp9mEINmC2YrZhdipINij2K7YsdmJXCIsXG4gIHVwbG9hZGluZ0ZpbGU6IFwi2KfZhNmF2YTZgSDYp9mE2K7Yp9i1INio2YMg2KrYrdmF2YrZhC4g2YrYsdis2Ykg2KfZhNin2YbYqti42KfYsSDYudiv2Kkg2KvZiNin2YYg2YjYrdin2YjZhCDZhdix2Kkg2KPYrtix2YlcIixcbiAgYWRkUm93OiBcItin2LbYp9mB2Kkg2LXZgVwiLFxuICByZW1vdmVSb3c6IFwi2KXYstin2YTYqSDYtdmBXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiYXJcIl0gPSBhcmFiaWNTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiYXJcIl0gPSBcItin2YTYudix2KjZitipXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2FyYWJpYy50cyIsIi8vVW5jb21tZW50IHRoaXMgbGluZSBvbiBjcmVhdGluZyBhIHRyYW5zbGF0aW9uIGZpbGVcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgYnVsZ2FyaWFuU3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcItCd0LDQt9Cw0LRcIixcbiAgcGFnZU5leHRUZXh0OiBcItCd0LDQv9GA0LXQtFwiLFxuICBjb21wbGV0ZVRleHQ6IFwi0JrRgNCw0LlcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcItCd0LDRh9Cw0LvQvlwiLFxuICBvdGhlckl0ZW1UZXh0OiBcItCU0YDRg9Cz0L4gKNC+0L/QuNGI0LXRgtC1KVwiLFxuICBub25lSXRlbVRleHQ6IFwi0J3QuNGC0L4g0LXQtNC40L1cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwi0JLRgdC40YfQutC4XCIsXG4gIHByb2dyZXNzVGV4dDogXCLRgdGC0YAuIHswfSwg0L7QsdGJ0L4g0YHRgtGALiB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwi0JDQvdC60LXRgtCw0YLQsCDQvdC1INGB0YrQtNGK0YDQttCwINCy0LjQtNC40LzQuCDRgdGC0YDQsNC90LjRhtC4INC40LvQuCDQstGK0L/RgNC+0YHQuC5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCLQkdC70LDQs9C+0LTQsNGA0LjQvCDQstC4INC30LAg0YPRh9Cw0YHRgtC40LXRgtC+INCyINCw0L3QutC10YLQsNGC0LAhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCLQmNC30LPQu9C10LbQtNCwLCDRh9C1INCy0LjQtSDQstC10YfQtSDRgdGC0LUg0L/QvtC/0YrQu9C90LjQu9C4INCw0L3QutC10YLQsNGC0LAuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi0JfQsNGA0LXQttC00LDQvdC1INC90LAg0LDQvdC60LXRgtCw0YLQsC4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLQmNC30LHQtdGA0LXRgtC1Li4uXCIsXG4gIHZhbHVlOiBcInZhbHVlXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi0JzQvtC70Y8sINC+0YLQs9C+0LLQvtGA0LXRgtC1INC90LAg0YHQu9C10LTQvdC40Y8g0LLRitC/0YDQvtGBLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCLQnNC+0LvRjywg0L7RgtCz0L7QstC+0YDQtdGC0LUg0L/QvtC90LUg0L3QsCDQtdC00LjQvSDQvtGCINCy0YrQv9GA0L7RgdC40YLQtS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLQnNC+0LvRjywg0L7RgtCz0L7QstC+0YDQtdGC0LUg0L3QsCDQstGK0L/RgNC+0YHQuNGC0LUg0L3QsCDQstGB0LjRh9C60Lgg0YDQtdC00L7QstC1LlwiLFxuICBudW1lcmljRXJyb3I6IFwi0KHRgtC+0LnQvdC+0YHRgtGC0LAg0YHQu9C10LTQstCwINC00LAg0LHRitC00LUg0YfQuNGB0LvQvi5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLQnNC+0LvRjywg0LjQt9C/0L7Qu9C30LLQsNC50YLQtSDQv9C+0L3QtSB7MH0g0YHQuNC80LLQvtC70LAuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi0JzQvtC70Y8sINC40LfQv9C+0LvQt9Cy0LDQudGC0LUg0L3QtSDQv9C+0LLQtdGH0LUg0L7RgiB7MH0g0YHQuNC80LLQvtC70LAuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi0JzQvtC70Y8sINC40LfQv9C+0LvQt9Cy0LDQudGC0LUg0L/QvtCy0LXRh9C1INC+0YIgezB9INC4INC/0L4t0LzQsNC70LrQviDQvtGCIHsxfSDRgdC40LzQstC+0LvQsC5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLQnNC+0LvRjywg0L/QvtC/0YrQu9C90LXRgtC1INC/0L7QvdC1IHswfSDRgNC10LTQsC5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi0JzQvtC70Y8sINC40LfQsdC10YDQtdGC0LUg0L/QvtC90LUgezB9INCy0LDRgNC40LDQvdGC0LAuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcItCc0L7Qu9GPLCDQuNC30LHQtdGA0LXRgtC1INC90LUg0L/QvtCy0LXRh9C1INC+0YIgezB9INCy0LDRgNC40LDQvdGC0LAuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCLQodGC0L7QudC90L7RgdGC0YLQsCAnezB9JyDRgdC70LXQtNCy0LAg0LTQsCDQsdGK0LTQtSDRgNCw0LLQvdCwINC40LvQuCDQv9C+LdCz0L7Qu9GP0LzQsCDQvtGCIHsxfSDQuCDRgNCw0LLQvdCwINC40LvQuCDQv9C+LdC80LDQu9C60LAg0L7RgiB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCLQodGC0L7QudC90L7RgdGC0YLQsCAnezB9JyDRgdC70LXQtNCy0LAg0LTQsCDQsdGK0LTQtSDRgNCw0LLQvdCwINC40LvQuCDQv9C+LdCz0L7Qu9GP0LzQsCDQvtGCIHsxfVwiLFxuICBudW1lcmljTWF4OiBcItCh0YLQvtC50L3QvtGB0YLRgtCwICd7MH0nINGB0LvQtdC00LLQsCDQtNCwINCx0YrQtNC1INGA0LDQstC90LAg0LjQu9C4INC/0L4t0LzQsNC70LrQsCDQvtGCIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwi0JzQvtC70Y8sINCy0YrQstC10LTQtdGC0LUg0LLQsNC70LjQtNC10L0g0LDQtNGA0LXRgSDQvdCwINC10LvQtdC60YLRgNC+0L3QvdCwINC/0L7RidCwLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLQmNC30YDQsNC30YrRgjogezB9INGC0YDRj9Cx0LLQsCDQtNCwINC00LDQstCwINGA0LXQt9GD0LvRgtCw0YIgJ3RydWUnICjQuNGB0YLQuNC90LApLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi0JfQsNGP0LLQutCw0YLQsCDQstC+0LTQuCDQtNC+INCz0YDQtdGI0LrQsCAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcItCX0LDRj9Cy0LrQsNGC0LAg0L3QtSDQstGA0YrRidCwINC00LDQvdC90Lgg0LjQu9C4INGH0LDRgdGC0YLQsCAncGF0aCcgKNC/0YrRgiDQtNC+INGC0YrRgNGB0LXQvdC40Y8g0YDQtdGB0YPRgNGBINC90LAg0YHRitGA0LLRitGA0LApINC1INC90LXQv9GA0LDQstC40LvQvdC+INC30LDQtNCw0LTQtdC90LBcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLQoNCw0LfQvNC10YDRitGCINC90LAg0YTQsNC50LvQsCDRgdC70LXQtNCy0LAg0LTQsCDQvdC1INC/0YDQtdCy0LjRiNCw0LLQsCB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLQnNC+0LvRjywg0LLRitCy0LXQtNC10YLQtSDQtNGA0YPQs9Cw0YLQsCDRgdGC0L7QudC90L7RgdGCLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwi0JLQsNGI0LjRgiDRhNCw0LnQuyDRgdC1INC30LDRgNC10LbQtNCwINC90LAg0YHRitGA0LLRitGA0LAuINCc0L7Qu9GPLCDQuNC30YfQsNC60LDQudGC0LUg0L3Rj9C60L7Qu9C60L4g0YHQtdC60YPQvdC00Lgg0Lgg0YLQvtCz0LDQstCwINC+0L/QuNGC0LLQsNC50YLQtSDQvtGC0L3QvtCy0L4uXCIsXG4gIGxvYWRpbmdGaWxlOiBcItCX0LDRgNC10LbQtNCw0L3QtS4uLlwiLFxuICBjaG9vc2VGaWxlOiBcItCY0LfQsdC10YDQtdGC0LUg0YTQsNC50Lso0L7QstC1KS4uLlwiLFxuICBjb25maXJtRGVsZXRlOiBcItCW0LXQu9Cw0LXRgtC1INC70Lgg0LTQsCDQuNC30YLRgNC40LXRgtC1INC30LDQv9C40YHQsD9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLQodGC0L7QudC90L7RgdGC0YLQsCDRgdC70LXQtNCy0LAg0LTQsCDQsdGK0LTQtSDRg9C90LjQutCw0LvQvdCwLlwiLFxuICBhZGRDb2x1bW46IFwi0JTQvtCx0LDQstGP0L3QtSDQvdCwINC60L7Qu9C+0L3QsFwiLFxuICBhZGRSb3c6IFwi0JTQvtCx0LDQstGP0L3QtSDQvdCwINGA0LXQtFwiLFxuICByZW1vdmVSb3c6IFwi0J/RgNC10LzQsNGF0LLQsNC90LUg0L3QsCDRgNC10LRcIixcbiAgYWRkUGFuZWw6IFwi0JTQvtCx0LDQstGP0L3QtSDQvdCwINC/0LDQvdC10LtcIixcbiAgcmVtb3ZlUGFuZWw6IFwi0J/RgNC10LzQsNGF0LLQsNC90LUg0L3QsCDQv9Cw0L3QtdC7XCIsXG4gIGNob2ljZXNfSXRlbTogXCLQtdC70LXQvNC10L3RglwiLFxuICBtYXRyaXhfY29sdW1uOiBcItCa0L7Qu9C+0L3QsFwiLFxuICBtYXRyaXhfcm93OiBcItCg0LXQtFwiLFxuICBzYXZpbmdEYXRhOiBcItCg0LXQt9GD0LvRgtCw0YLQuNGC0LUg0YHQtSDQt9Cw0L/QsNC30LLQsNGCINC90LAg0YHRitGA0LLRitGA0LAuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcItCf0L7RgNCw0LTQuCDQstGK0LfQvdC40LrQvdCw0LvQsCDQs9GA0LXRiNC60LAg0YDQtdC30YPQu9GC0LDRgtC40YLQtSDQvdC1INC80L7QttCw0YXQsCDQtNCwINCx0YrQtNCw0YIg0LfQsNC/0LDQt9C10L3QuC5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi0KDQtdC30YPQu9GC0LDRgtC40YLQtSDQsdGP0YXQsCDQt9Cw0L/QsNC30LXQvdC4INGD0YHQv9C10YjQvdC+IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi0J3QvtCyINC+0L/QuNGCXCIsXG4gIHRpbWVyTWluOiBcItC80LjQvVwiLFxuICB0aW1lclNlYzogXCLRgdC10LpcIixcbiAgdGltZXJTcGVudEFsbDogXCLQktC40LUg0LjQt9C/0L7Qu9C30LLQsNGF0YLQtSB7MH0g0L3QsCDRgtCw0LfQuCDRgdGC0YDQsNC90LjRhtCwINC4INC+0LHRidC+IHsxfS5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwi0JLQuNC1INC40LfQv9C+0LvQt9Cy0LDRhdGC0LUgezB9INC90LAg0YLQsNC30Lgg0YHRgtGA0LDQvdC40YbQsC5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCLQktC40LUg0LjQt9C/0L7Qu9C30LLQsNGF0YLQtSDQvtCx0YnQviB7MH0uXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLQktC40LUg0LjQt9C/0L7Qt9Cy0LDRhdGC0LUgezB9INC+0YIgezF9INC90LAg0YLQsNC30Lgg0YHRgtGA0LDQvdC40YbQsCDQuCDQvtCx0YnQviB7Mn0g0L7RgiB7M30uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcItCS0LjQtSDQuNC30L/QvtC70LfQstCw0YXRgtC1IHswfSDQvtGCIHsxfSDQvdCwINGC0LDQt9C4INGB0YLRgNCw0L3QuNGG0LAuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi0JLQuNC1INC40LfQv9C+0LvQt9Cy0LDRhdGC0LUg0L7QsdGJ0L4gezB9INC+0YIgezF9LlwiLFxuICBjbGVhbkNhcHRpb246IFwi0JjQt9GH0LjRgdGC0LLQsNC90LVcIixcbiAgY2xlYXJDYXB0aW9uOiBcItCd0LDRh9Cw0LvQvdC+INGB0YrRgdGC0L7Rj9C90LjQtVwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLQn9GA0LXQvNCw0YXQstCw0L3QtSDQvdCwINGE0LDQudC70LBcIlxufTtcblxuLy9VbmNvbW1lbnQgdGhlc2UgdHdvIGxpbmVzIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZS4gWW91IHNob3VsZCByZXBsYWNlIFwiZW5cIiBhbmQgZW5TdHJpbmdzIHdpdGggeW91ciBsb2NhbGUgKFwiZnJcIiwgXCJkZVwiIGFuZCBzbyBvbikgYW5kIHlvdXIgdmFyaWFibGUuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImJnXCJdID0gYnVsZ2FyaWFuU3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImJnXCJdID0gXCJCdWxnYXJpYW5cIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vYnVsZ2FyaWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBjYXRhbGFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkFudGVyaW9yXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJTZWfDvGVudFwiLFxuICBjb21wbGV0ZVRleHQ6IFwiQ29tcGxldFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIlVuIGFsdHJlIChkZXNjcmlndWkpXCIsXG4gIHByb2dyZXNzVGV4dDogXCJQw6BnaW5hIHswfSBkZSB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTm8gaGkgaGEgY2FwIHDDoGdpbmEgdmlzaWJsZSBvIHByZWd1bnRhIGEgbCdlbnF1ZXN0YS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJHcsOgY2llcyBwZXIgY29tcGxldGFyIGwnZW5xdWVzdGEhXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiTCdlbnF1ZXN0YSBzJ2VzdMOgIGNhcnJlZ2FudCAuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiU2VsZWNjaW9uYSAuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCJTaSB1cyBwbGF1IGNvbnRlc3RpIGxhIHByZWd1bnRhLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlNpIHVzIHBsYXUgY29udGVzdGkgbGVzIHByZWd1bnRlcyBkZSBjYWRhIGZpbGVyYS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIkwnZXN0aW1hY2nDsyBoYSBkZSBzZXIgbnVtw6hyaWNhLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlNpIHVzIHBsYXUgZW50cmUgYWxtZW55cyB7MH0gc8OtbWJvbHMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiU2kgdXMgcGxhdSBlbnRyZSBtZW55cyBkZSB7MH0gc8OtbWJvbHMuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiU2kgdXMgcGxhdSBlbnRyZSBtw6lzIGRlIHswfSBpIG1lbnlzIGRlIHsxfSBzw61tYm9scy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJTaSB1cyBwbGF1IG9tcGxpIGFsbWVueXMgezB9IGZpbGVyZXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlNpIHVzIHBsYXUgc2VsZWNjaW9uaSBhbG1lbnlzIHswfSB2YXJpYW50cy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiU2kgdXMgcGxhdSBzZWxlY2Npb25pIG5vIG3DqXMgZGUgezB9IHZhcmlhbnRzLlwiLFxuICBudW1lcmljTWluTWF4OiBcIkVsICd7MH0nIGRldSBzZXIgaWd1YWwgbyBtw6lzIGRlIHsxfSBpIGlndWFsIG8gbWVueXMgZGUgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiRWwgJ3swfScgaGEgZGUgc2VyIGlndWFsIG8gbcOpcyBkZSB7MX1cIixcbiAgbnVtZXJpY01heDogXCJFbCAnezB9JyBoYSBkZSBzZXIgaWd1YWwgbyBtZW55cyBkZSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlNpIHVzIHBsYXUgYWZlZ2l1IHVuIGNvcnJldSBlbGVjdHLDsm5pYyB2w6BsaWQuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJMYSBzb2zCt2xpY2l0dWQgdmEgdG9ybmFyIGVycm9yICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiTGEgc29swrdsaWNpdHVkIHZhIHRvcm5hciBidWlkYSBkZSBkYXRlcyBvIGxhIHByb3BpZXRhdCAndHJhamVjdMOycmlhJyBubyDDqXMgY29ycmVjdGFcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJMYSBtaWRhIGRlIGwnYXJ4aXUgbm8gcG90IGV4Y2VkaXIgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiU2kgdXMgcGxhdSBhZmVnaXUgbCdhbHRyYSBlc3RpbWFjacOzLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiRWwgc2V1IGFyeGl1IHMnZXN0w6AgcHVqYW50LiBTaSB1cyBwbGF1IGVzcGVyaSB1bnMgc2Vnb25zIGkgaW50ZW50ZXUtaG8gZGUgbm91LlwiLFxuICBhZGRSb3c6IFwiQWZlZ2l1IHVuYSBmaWxlcmFcIixcbiAgcmVtb3ZlUm93OiBcIkVsaW1pbmFyIHVuYSBmaWxlcmFcIixcbiAgY2hvaWNlc19maXJzdEl0ZW06IFwicHJpbWVyIGFydGljbGVcIixcbiAgY2hvaWNlc19zZWNvbmRJdGVtOiBcInNlZ29uIGFydGljbGVcIixcbiAgY2hvaWNlc190aGlyZEl0ZW06IFwidGVyY2VyIGFydGljbGVcIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2x1bW5hXCIsXG4gIG1hdHJpeF9yb3c6IFwiRmlsZXJhXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiY2FcIl0gPSBjYXRhbGFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImNhXCJdID0gXCJjYXRhbMOgXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2NhdGFsYW4udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGN6ZWNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlDFmWVkY2hvesOtXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJEYWzFocOtXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJIb3Rvdm9cIixcbiAgb3RoZXJJdGVtVGV4dDogXCJKaW7DoSBvZHBvdsSbxI8gKG5hcGnFoXRlKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU3RyYW5hIHswfSB6IHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJQcsWvemt1bXUgbmVvYnNhaHVqZSDFvsOhZG7DqSBvdMOhemt5LlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkTEm2t1amVtZSB6YSB2eXBsbsSbbsOtIHByxa96a3VtdSFcIixcbiAgbG9hZGluZ1N1cnZleTogXCJQcm9iw61ow6EgbmHEjcOtdMOhbsOtIHByxa96a3VtdS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWeWJlci4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIk9kcG92xJt6dGUgcHJvc8OtbSBuYSBvdMOhemt1LlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIk9kcG92xJt6dGUgcHJvc8OtbSBuYSB2xaFlY2hueSBvdMOhemt5LlwiLFxuICBudW1lcmljRXJyb3I6IFwiViB0b210byBwb2xpIGx6ZSB6YWRhdCBwb3V6ZSDEjcOtc2xhLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlphZGVqdGUgcHJvc8OtbSBhbGVzcG/FiCB7MH0gem5ha8WvLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlphZGVqdGUgcHJvc8OtbSBtw6luxJsgbmXFviB7MH0gem5ha8WvLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlphZGVqdGUgcHJvc8OtbSB2w61jZSBuZcW+IHswfSBhIG3DqW7EmyBuZcW+IHsxfSB6bmFrxa8uXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiVnlwbMWIdGUgcHJvc8OtbSBhbGVzcG/FiCB7MH0gxZnDoWRrxa8uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlZ5YmVydGUgcHJvc8OtbSBhbGVzcG/FiCB7MH0gdmFyaWFudHkuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIk5ldnliw61yZWp0ZSBwcm9zw61tIHbDrWNlIG5lxb4gezB9IHZhcmlhbnQuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJPZHBvdsSbxI8gJ3swfScgYnkgbcSbbG8gYsO9dCB2xJt0xaHDrSBuZWJvIHJvdm5vIHsxfSBhIG1lbsWhw60gbmVibyByb3ZubyB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJPZHBvdsSbxI8gJ3swfScgYnkgbcSbbG8gYsO9dCB2xJt0xaHDrSBuZWJvIHJvdm5vIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIk9kcG92xJvEjyAnezB9JyBieSBtxJtsbyBiw710IG1lbsWhw60gbmVibyByb3ZubyB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlphZGVqdGUgcHJvc8OtbSBwbGF0bm91IGUtbWFpbG92b3UgYWRyZXN1LlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiUG/FvmFkYXZlayB2csOhdGlsIGNoeWJ1ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIlBvxb5hZGF2ZWsgbmV2csOhdGlsIGRhdGEgbmVibyBjZXN0YSBqZSBuZXBsYXRuw6FcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJWZWxpa29zdCBzb3Vib3J1IGJ5IG5lbcSbbGEgYsO9dCB2xJt0xaHDrSBuZcW+IHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlphZGVqdGUgcHJvc8OtbSBqaW5vdSBob2Rub3R1LlwiLFxuICB1cGxvYWRpbmdGaWxlOiBcIlbDocWhIHNvdWJvciBzZSBuYWhyw6F2w6EuIFprdXN0ZSB0byBwcm9zw61tIHphIG7Em2tvbGlrIHNla3VuZC5cIixcbiAgYWRkUm93OiBcIlDFmWlkYXQgxZnDoWRla1wiLFxuICByZW1vdmVSb3c6IFwiT2RzdHJhbml0XCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiY3pcIl0gPSBjemVjaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJjelwiXSA9IFwixI1lxaF0aW5hXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2N6ZWNoLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBkYW5pc2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiVGlsYmFnZVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiVmlkZXJlXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJGw6ZyZGlnXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJTdGFydFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIlZhbGdmcml0IHN2YXIuLi5cIixcbiAgbm9uZUl0ZW1UZXh0OiBcIkluZ2VuXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlbDpmxnIGFsbGVcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNpZGUgezB9IGFmIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJEZXIgZXIgaW5nZW4gc3lubGlnZSBzcMO4cmdzbcOlbC5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJNYW5nZSB0YWsgZm9yIGRpbiBiZXN2YXJlbHNlIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiVm9yZXMgZGF0YSB2aXNlciBhdCBkdSBhbGxlcmVkZSBoYXIgZ2VubmVtZsO4cnQgZGV0dGUgc3DDuHJnZXNrZW1hLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIlNww7hyZ2Vza2VtYWV0IGhlbnRlcyBmcmEgc2VydmVyZW4uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiVsOmbGcuLi5cIixcbiAgdmFsdWU6IFwidsOmcmRpXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiQmVzdmFyIHZlbmxpZ3N0IHNww7hyZ3Ntw6VsZXQuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIkJlc3ZhciB2ZW5saWdzdCBtaW5kc3Qgw6l0IHNww7hyZ3Ntw6VsLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIkJlc3ZhciB2ZW5saWdzdCBzcMO4cmdzbcOlbCBpIGFsbGUgcsOma2tlci5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIkFuZ2l2IGV0IHRhbC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJBbmdpdiBtaW5kc3QgezB9IHRlZ24uXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUGxlYXNlIGVudGVyIGxlc3MgdGhhbiB7MH0gY2hhcmFjdGVycy5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJBbmdpdiBtZXJlIGVuZCB7MH0gb2cgbWluZHJlIGVuZCB7MX0gdGVnbi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJVZGZ5bGQgbWluZHN0IHswfSByw6Zra2VyLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJWw6ZsZyB2ZW5saWdzdCBtaW5kc3QgezB9IHN2YXJtdWxpZ2hlZChlcikuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlbDpmxnIHZlbmxpZ3N0IGbDpnJyZSB7MH0gc3Zhcm11bGlnaGVkZXIoZXIpLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgc2thbCB2w6ZyZSBsaWcgbWVkIGVsbGVyIHN0w7hycmUgZW5kIHsxfSBvZyBsaWcgbWVkIGVsbGVyIG1pbmRyZSBlbmQgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgc2thbCB2w6ZyZSBsaWcgbWVkIGVsbGVyIHN0w7hycmUgZW5kIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIHNrYWwgdsOmcmUgbGlnIG1lZCBlbGxlciBtaW5kcmUgZW5kIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiQW5naXYgdmVubGlnc3QgZW4gZ3lsZGlnIGUtbWFpbCBhZHJlc3NlLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJVZHRyeWtrZXQ6IHswfSBza2FsIHJldHVybmVyZSAndHJ1ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJGb3Jlc3DDuHJnc2xlbiByZXR1cm5lcmVkZSBmZWpsZW4gJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJGb3Jlc3DDuHJnc2xlbiByZXR1cm5lcmVkZSBpbmdlbiBkYXRhIGVsbGVyICdwYXRoJyBwYXJhbWV0ZXJlbiBlciBmb3JrZXJ0XCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRmlsc3TDuHJyZWxzZW4gbcOlIGlra2Ugb3ZlcnN0aWdlIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIkFuZ2l2IGVuIHbDpnJkaSBmb3IgZGl0IHZhbGdmcmllIHN2YXIuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJEaW4gZmlsIGJsaXZlciB1cGxvYWRldC4gVmVudCBub2dsZSBzZWt1bmRlciBvZyBwcsO4diBldmVudHVlbHQgaWdlbi5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiSW5kbMOmc2VyLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiVsOmbGcgZmlsKGVyKS4uLlwiLFxuICBjb25maXJtRGVsZXRlOiBcIlZpbCBkdSBmamVybmUgZGVuP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkRlbm5lIHbDpnJkaSBza2FsIHbDpnJlIHVuaWsuXCIsXG4gIGFkZENvbHVtbjogXCJUaWxmw7hqIGtvbG9ubmVcIixcbiAgYWRkUm93OiBcIlRpbGbDuGogcsOma2tlXCIsXG4gIHJlbW92ZVJvdzogXCJGamVyblwiLFxuICBhZGRQYW5lbDogXCJUaWxmw7hqIG55XCIsXG4gIHJlbW92ZVBhbmVsOiBcIkZqZXJuXCIsXG4gIGNob2ljZXNfSXRlbTogXCJ2YWxnXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiS29sb25uZVwiLFxuICBtYXRyaXhfcm93OiBcIlLDpmtrZVwiLFxuICBzYXZpbmdEYXRhOiBcIlJlc3VsdGF0ZXJuZSBibGl2ZXIgZ2VtdCBww6Ugc2VydmVyZW4uLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkRlciBvcHN0b2QgZW4gZmVqbCBvZyB2aSBrdW5uZSBpa2tlIGdlbW1lIHJlc3VsdGF0ZXQuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlJlc3VsdGF0ZXQgYmxldiBnZW10IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUHLDuHYgaWdlblwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiRHUgaGFyIGJydWd0IHswfSBww6UgZGVubmUgc2lkZSBvZyB7MX0gaSBhbHQuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIkR1IGhhciBicnVndCB7MH0gcMOlIGRlbm5lIHNpZGUuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiRHUgaGFyIGJydWd0IHswfSBpIGFsdC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIkR1IGhhciBicnVndCB7MH0gYWYgezF9IHDDpSBkZW5uZSBzaWRlIG9nIHsyfSBhZiB7M30gaSBhbHQuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIkR1IGhhciBicnVndCB7MH0gYWYgezF9IHDDpSBkZW5uZSBzaWRlLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIkR1IGhhciBicnVndCB7MH0gYWYgezF9IGkgYWx0LlwiLFxuICBjbGVhbkNhcHRpb246IFwiUmVuc1wiLFxuICBjbGVhckNhcHRpb246IFwiRmplcm5cIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiRmplcm4gZGVubmUgZmlsXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZGFcIl0gPSBkYW5pc2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZGFcIl0gPSBcImRhbnNrXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2RhbmlzaC50cyIsIi8vQ3JlYXRlZCBvbiBiZWhhbGYgaHR0cHM6Ly9naXRodWIuY29tL0ZyYW5rMTNcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgZHV0Y2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiVm9yaWdlXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJWb2xnZW5kZVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiVmVyemVuZGVuXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiQW5kZXJlXCIsXG4gIHByb2dyZXNzVGV4dDogXCJQYWdpbmEgezB9IHZhbiB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiRXIgaXMgZ2VlbiB6aWNodGJhcmUgcGFnaW5hIG9mIHZyYWFnIGluIGRlemUgdnJhZ2VubGlqc3RcIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJCZWRhbmt0IHZvb3IgaGV0IGludnVsbGVuIHZhbiBkZSB2cmFnZW5saWpzdFwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkRlIHZyYWdlbmxpanN0IGlzIGFhbiBoZXQgbGFkZW4uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiS2llcy4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIkdlbGlldmUgZWVuIGFudHdvb3JkIGluIHRlIHZ1bGxlblwiLFxuICBudW1lcmljRXJyb3I6IFwiSGV0IGFudHdvb3JkIG1vZXQgZWVuIGdldGFsIHppam5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJHZWxpZXZlIG1pbnN0ZW4gezB9IGthcmFrdGVycyBpbiB0ZSB2dWxsZW4uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIkdlbGlldmUgbWluaW11bSB7MH0gYW50d29vcmRlbiB0ZSBzZWxlY3RlcmVuLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJHZWxpZXZlIG5pZXQgbWVlciBkYW4gezB9IGFudHdvb3JkZW4gdGUgc2VsZWN0ZXJlbi5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIlV3IGFudHdvb3JkICd7MH0nIG1vZXQgZ3JvdGVyIG9mIGdlbGlqayB6aWpuIGFhbiB7MX0gZW4ga2xlaW5lciBvZiBnZWxpamsgYWFuIHsyfVwiLFxuICBudW1lcmljTWluOiBcIlV3IGFudHdvb3JkICd7MH0nIG1vZXQgZ3JvdGVyIG9mIGdlbGlqayB6aWpuIGFhbiB7MX1cIixcbiAgbnVtZXJpY01heDogXCJVdyBhbnR3b29yZCAnezB9JyBtb2V0IGdyb3RlciBvZiBnZWxpamsgemlqbiBhYW4gezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJHZWxpZXZlIGVlbiBnZWxkaWcgZS1tYWlsYWRyZXMgaW4gdGUgdnVsbGVuLlwiLFxuICBleGNlZWRNYXhTaXplOiBcIkRlIGdyb290dGUgdmFuIGhldCBiZXN0YW5kIG1hZyBuaWV0IGdyb3RlciB6aWpuIGRhbiB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJHZWxpZXZlIGhldCB2ZWxkICdBbmRlcmUnIGluIHRlIHZ1bGxlblwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcIm5sXCJdID0gZHV0Y2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wibmxcIl0gPSBcIm5lZGVybGFuZHNcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vZHV0Y2gudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGZpbm5pc2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiRWRlbGxpbmVuXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJTZXVyYWF2YVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiVmFsbWlzXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiTXV1IChrdXZhaWxlKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU2l2dSB7MH0vezF9XCIsXG4gIGVtcHR5U3VydmV5OlxuICAgIFwiVMOkc3PDpCBreXNlbHlzc8OkIGVpIG9sZSB5aHTDpGvDpMOkbiBuw6RreXZpbGzDpCBvbGV2YWEgc2l2dWEgdGFpIGt5c3lteXN0w6QuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiS2lpdG9zIGt5c2VseXluIHZhc3RhYW1pc2VzdGEhXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiS3lzZWx5w6QgbGFkYXRhYW4gcGFsdmVsaW1lbHRhLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlZhbGl0c2UuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCJWYXN0YWEga3lzeW15a3NlZW4sIGtpaXRvcy5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIkFydm9uIHR1bGVlIG9sbGEgbnVtZWVyaW5lbi5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJPbGUgaHl2w6QgamEgc3nDtnTDpCB2w6RoaW50w6TDpG4gezB9IG1lcmtracOkLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJPbGUgaHl2w6QgamEgdmFsaXRzZSB2w6RoaW50w6TDpG4gezB9IHZhaWh0b2VodG9hLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJPbGUgaHl2w6QgamEgdmFsaXRzZSBlbmludMOkw6RuIHswfSB2YWlodG9laHRvYS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIHTDpHl0eXkgb2xsYSBlbmVtbcOkbiB0YWkgeWh0w6Qgc3V1cmkga3VpbiB7MX0gamEgdsOkaGVtbcOkbiB0YWkgeWh0w6Qgc3V1cmkga3VpbiB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyB0w6R5dHl5IG9sbGEgZW5lbW3DpG4gdGFpIHlodMOkIHN1dXJpIGt1aW4gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgdMOkeXR5eSBvbGxhIHbDpGhlbW3DpG4gdGFpIHlodMOkIHN1dXJpIGt1aW4gezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJTecO2dMOkIHZhbGlkaSBzw6Roa8O2cG9zdGlvc29pdGUuXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogJ09sZSBoeXbDpCBqYSBzecO2dMOkIFwiTXV1IChrdXZhaWxlKVwiJ1xufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJmaVwiXSA9IGZpbm5pc2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZmlcIl0gPSBcInN1b21hbGFpbmVuXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2Zpbm5pc2gudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGZyZW5jaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJQcsOpY8OpZGVudFwiLFxuICBwYWdlTmV4dFRleHQ6IFwiU3VpdmFudFwiLFxuICBjb21wbGV0ZVRleHQ6IFwiVGVybWluZXJcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkNvbW1lbmNlclwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkF1dHJlIChwcsOpY2lzZXIpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJBdWN1blwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJUb3V0IHPDqWxlY3Rpb25uZXJcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlBhZ2UgezB9IHN1ciB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiSWwgbid5IGEgbmkgcGFnZSB2aXNpYmxlIG5pIHF1ZXN0aW9uIHZpc2libGUgZGFucyBjZSBxdWVzdGlvbm5haXJlXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiTWVyY2kgZCdhdm9pciByw6lwb25kdSBhdSBxdWVzdGlvbm5haXJlICFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTogXCJOb3MgZG9ubsOpZXMgaW5kaXF1ZW50IHF1ZSB2b3VzIGF2ZXogZMOpasOgIHJlbXBsaSBjZSBxdWVzdGlvbm5haXJlLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkxlIHF1ZXN0aW9ubmFpcmUgZXN0IGVuIGNvdXJzIGRlIGNoYXJnZW1lbnQuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiQ2hvaXNpc3Nlei4uLlwiLFxuICB2YWx1ZTogXCJ2YWxldXJcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJMYSByw6lwb25zZSDDoCBjZXR0ZSBxdWVzdGlvbiBlc3Qgb2JsaWdhdG9pcmUuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIk1lcmNpIGRlIHLDqXBvbmRyZSBhdSBtb2lucyDDoCB1bmUgcXVlc3Rpb24uXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiVG91dGVzIGxlcyBsaWduZXMgc29udCBvYmxpZ2F0b2lyZXNcIixcbiAgbnVtZXJpY0Vycm9yOiBcIkxhIHLDqXBvbnNlIGRvaXQgw6p0cmUgdW4gbm9tYnJlLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIk1lcmNpIGRlIHNhaXNpciBhdSBtb2lucyB7MH0gY2FyYWN0w6hyZXMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiTWVyY2kgZGUgc2Fpc2lyIG1vaW5zIGRlIHswfSBjYXJhY3TDqHJlcy5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJNZXJjaSBkZSBzYWlzaXIgZW50cmUgezB9IGV0IHsxfSBjYXJhY3TDqHJlcy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJNZXJjaSBkZSBjb21wbMOpdGVyIGF1IG1vaW5zIHswfSBsaWduZXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIk1lcmNpIGRlIHPDqWxlY3Rpb25uZXIgYXUgbWluaW11bSB7MH0gcsOpcG9uc2VzLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJNZXJjaSBkZSBzw6lsZWN0aW9ubmVyIGF1IG1heGltdW0gezB9IHLDqXBvbnNlcy5cIixcbiAgbnVtZXJpY01pbk1heDogXCJWb3RyZSByw6lwb25zZSAnezB9JyBkb2l0IMOqdHJlIHN1cMOpcmlldXJlIG91IMOpZ2FsZSDDoCB7MX0gZXQgaW5mw6lyaWV1cmUgb3Ugw6lnYWxlIMOgIHsyfVwiLFxuICBudW1lcmljTWluOiBcIlZvdHJlIHLDqXBvbnNlICd7MH0nIGRvaXQgw6p0cmUgc3Vww6lyaWV1cmUgb3Ugw6lnYWxlIMOgIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIlZvdHJlIHLDqXBvbnNlICd7MH0nIGRvaXQgw6p0cmUgaW5mw6lyaWV1cmUgb3Ugw6lnYWxlIMOgIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiTWVyY2kgZCdlbnRyZXIgdW5lIGFkcmVzc2UgbWFpbCB2YWxpZGUuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkwnZXhwcmVzc2lvbjogezB9IGRvaXQgcmV0b3VybmVyICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkxhIHJlcXXDqnRlIGEgcmVudm95w6kgdW5lIGVycmV1ciAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCJMYSByZXF1w6p0ZSBhIHJlbnZvecOpIGRlcyBkb25uw6llcyB2aWRlcyBvdSBsYSBwcm9wcmnDqXTDqSAncGF0aCcgZXN0IGluY29ycmVjdGVcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJMYSB0YWlsbGUgZHUgZmljaGllciBuZSBkb2l0IHBhcyBleGPDqWRlciB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJNZXJjaSBkZSBwcsOpY2lzZXIgbGUgY2hhbXAgJ0F1dHJlJy5cIixcbiAgdXBsb2FkaW5nRmlsZTogXCJWb3RyZSBmaWNoaWVyIGVzdCBlbiBjb3VycyBkZSBjaGFyZ2VtZW50LiBNZXJjaSBkJ2F0dGVuZHJlIHF1ZWxxdWVzIHNlY29uZGVzIGV0IGRlIHLDqWVzc2F5ZXIuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkNoYXJnZW1lbnQuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJBam91dGVyIGRlcyBmaWNoaWVycy4uLlwiLFxuICBjb25maXJtRGVsZXRlOiBcIlZvdWxlei12b3VzIHN1cHByaW1lciBjZXQgZW5yZWdpc3RyZW1lbnQgP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkNldHRlIHZhbGV1ciBkb2l0IMOqdHJlIHVuaXF1ZS5cIixcbiAgYWRkQ29sdW1uOiBcIkFqb3V0ZXIgdW5lIGNvbG9ubmVcIixcbiAgYWRkUm93OiBcIkFqb3V0ZXIgdW5lIGxpZ25lXCIsXG4gIHJlbW92ZVJvdzogXCJTdXBwcmltZXJcIixcbiAgYWRkUGFuZWw6IFwiQWpvdXRlclwiLFxuICByZW1vdmVQYW5lbDogXCJTdXBwcmltZXJcIixcbiAgY2hvaWNlc19JdGVtOiBcIml0ZW1cIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2xvbm5lXCIsXG4gIG1hdHJpeF9yb3c6IFwiTGlnbmVcIixcbiAgc2F2aW5nRGF0YTogXCJMZXMgcsOpc3VsdGF0cyBzb250IGVuIGNvdXJzIGRlIHNhdXZlZ2FyZGUgc3VyIGxlIHNlcnZldXIuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIlVuZSBlcnJldXIgZXN0IHN1cnZlbnVlIGV0IGEgZW1ww6pjaMOpIGxhIHNhdXZlZ2FyZGUgZGVzIHLDqXN1bHRhdHMuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIkxlcyByw6lzdWx0YXRzIG9udCBiaWVuIMOpdMOpIGVucmVnaXN0csOpcyAhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJSw6llc3NheWVyXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWNcIixcbiAgdGltZXJTcGVudEFsbDogXCJWb3VzIGF2ZXogcGFzc8OpIHswfSBzdXIgY2V0dGUgcGFnZSBldCB7MX0gYXUgdG90YWwuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIlZvdXMgYXZleiBwYXNzw6kgezB9IHN1ciBjZXR0ZSBwYWdlLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIlZvdXMgYXZleiBwYXNzw6kgezB9IGF1IHRvdGFsLlwiLFxuICB0aW1lckxpbWl0QWxsOiBcIlZvdXMgYXZleiBwYXNzw6kgezB9IHN1ciB7MX0gc3VyIGNldHRlIHBhZ2UgZXQgezJ9IHN1ciB7M30gYXUgdG90YWwuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIlZvdXMgYXZleiBwYXNzw6kgezB9IHN1ciB7MX0gc3VyIGNldHRlIHBhZ2UuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiVm91cyBhdmV6IHBhc3PDqSB7MH0gc3VyIHsxfSBhdSB0b3RhbC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIk5ldHRveWVyXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJWaWRlclwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJFbmxldmVyIGNlIGZpY2hpZXJcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJmclwiXSA9IGZyZW5jaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJmclwiXSA9IFwiZnJhbsOnYWlzXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2ZyZW5jaC50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgZ2VvcmdpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi4YOj4YOZ4YOQ4YOcXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLhg6jhg5Thg5vhg5Phg5Thg5JcIixcbiAgY29tcGxldGVUZXh0OiBcIuGDk+GDkOGDoeGDoOGDo+GDmuGDlOGDkeGDkFwiLFxuICBwcm9ncmVzc1RleHQ6IFwi4YOS4YOV4YOU4YOg4YOT4YOYIHswfSAvIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCLhg5Dhg6Dhg6rhg5Thg6Dhg5fhg5gg4YOZ4YOY4YOX4YOu4YOV4YOQIOGDkOGDoCDhg5Dhg6Dhg5jhg6EuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi4YOS4YOb4YOQ4YOT4YOa4YOd4YOR4YOXIOGDmeGDmOGDl+GDruGDleGDkOGDoOGDmOGDoSDhg6jhg5Thg5Xhg6Hhg5Thg5Hhg5jhg6Hhg5fhg5Xhg5jhg6EhXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi4YOp4YOQ4YOi4YOV4YOY4YOg4YOX4YOV4YOQIOGDoeGDlOGDoOGDleGDlOGDoOGDmOGDk+GDkOGDnC4uLlwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIuGDoeGDruGDleGDkCAo4YOS4YOX4YOu4YOd4YOV4YOXIOGDm+GDmOGDo+GDl+GDmOGDl+GDlOGDlylcIixcbiAgb3B0aW9uc0NhcHRpb246IFwi4YOQ4YOg4YOp4YOU4YOV4YOQLi4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi4YOS4YOX4YOu4YOd4YOV4YOXIOGDo+GDnuGDkOGDoeGDo+GDruGDlOGDlyDhg5nhg5jhg5fhg67hg5Xhg5Dhg6EuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLhg57hg5Dhg6Hhg6Phg67hg5gg4YOj4YOc4YOT4YOQIOGDmOGDp+GDneGDoSDhg6Dhg5jhg6rhg67hg5Xhg5guXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi4YOS4YOX4YOu4YOd4YOV4YOXIOGDqOGDlOGDmOGDp+GDleGDkOGDnOGDlOGDlyDhg5Dhg6Dhg5Dhg5zhg5Dhg5nhg5rhg5Thg5EgezB9IOGDoeGDmOGDm+GDkeGDneGDmuGDnS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi4YOS4YOX4YOu4YOd4YOV4YOXIOGDkOGDmOGDoOGDqeGDmOGDlOGDlyDhg5Dhg6Dhg5Dhg5zhg5Dhg5nhg5rhg5Thg5EgezB9IOGDleGDkOGDoOGDmOGDkOGDnOGDouGDmC5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi4YOS4YOX4YOu4YOd4YOV4YOXIOGDkOGDmOGDoOGDqeGDmOGDlOGDlyDhg5Dhg6Dhg5Dhg6Phg5vhg5Thg6Lhg5Thg6EgezB9IOGDleGDkOGDoOGDmOGDkOGDnOGDouGDmC5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIOGDo+GDnOGDk+GDkCDhg5jhg6fhg53hg6Eg4YOb4YOU4YOi4YOYIOGDkOGDnCDhg6Lhg53hg5rhg5gsIOGDleGDmOGDk+GDoOGDlCB7MX0sIOGDk+GDkCDhg5zhg5Dhg5nhg5rhg5Thg5Hhg5gg4YOQ4YOcIOGDouGDneGDmuGDmCDhg5Xhg5jhg5Phg6Dhg5QgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScg4YOj4YOc4YOT4YOQIOGDmOGDp+GDneGDoSDhg5vhg5Thg6Lhg5gg4YOQ4YOcIOGDouGDneGDmuGDmCDhg5Xhg5jhg5Phg6Dhg5QgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScg4YOj4YOc4YOT4YOQIOGDmOGDp+GDneGDoSDhg5zhg5Dhg5nhg5rhg5Thg5Hhg5gg4YOQ4YOcIOGDouGDneGDmuGDmCDhg5Xhg5jhg5Phg6Dhg5QgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCLhg5Lhg5fhg67hg53hg5Xhg5cg4YOo4YOU4YOY4YOn4YOV4YOQ4YOc4YOd4YOXIOGDlOGDmi4g4YOk4YOd4YOh4YOi4YOY4YOhIOGDoOGDlOGDkOGDmuGDo+GDoOGDmCDhg5vhg5jhg6Hhg5Dhg5vhg5Dhg6Dhg5fhg5guXCIsXG4gIG90aGVyUmVxdWlyZWRFcm9yOiBcIuGDkuGDl+GDruGDneGDleGDlyDhg6jhg5Thg5Dhg5Xhg6Hhg5Thg5cg4YOV4YOU4YOa4YOYICfhg6Hhg67hg5Xhg5AnXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wia2FcIl0gPSBnZW9yZ2lhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJrYVwiXSA9IFwi4YOl4YOQ4YOg4YOX4YOj4YOa4YOYXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2dlb3JnaWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBnZXJtYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiWnVyw7xja1wiLFxuICBwYWdlTmV4dFRleHQ6IFwiV2VpdGVyXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJBYnNjaGxpZcOfZW5cIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlN0YXJ0XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiU29uc3RpZ2VzIChCZXNjaHJlaWJ1bmcpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJOaWNodHNcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiQWxsZSBhdXN3w6RobGVuXCIsXG4gIHByb2dyZXNzVGV4dDogXCJTZWl0ZSB7MH0gdm9uIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJFcyBpc3Qga2VpbmUgRnJhZ2Ugdm9yaGFuZGVuLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkRhbmtlLCBkYXNzIFNpZSBkaWUgVW1mcmFnZSBhYmdlc2NobG9zc2VuIGhhYmVuIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiV2lyIGhhYmVuIGZlc3RnZXN0ZWxsdCwgZGFzcyBTaWUgZGllc2UgVW1mcmFnZSBiZXJlaXRzIGFiZ2VzY2hsb3NzZW4gaGFiZW4uXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiRnJhZ2Vib2dlbiB3aXJkIGdlbGFkZW4uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiQml0dGUgYXVzd8OkaGxlbi4uLlwiLFxuICB2YWx1ZTogXCJXZXJ0XCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiQml0dGUgYmVhbnR3b3J0ZW4gU2llIGRpZXNlIEZyYWdlLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJCaXR0ZSBiZWFudHdvcnRlbiBTaWUgbWluZGVzdGVucyBlaW5lIEZyYWdlLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIkJpdHRlIGJlYW50d29ydGVuIFNpZSBhbGxlIEZyYWdlbi5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIkRlciBXZXJ0IG11c3MgZWluZSBaYWhsIHNlaW4uXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiQml0dGUgZ2ViZW4gc2llIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZWluLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIkJpdHRlIGdlYmVuIFNpZSBuaWNodCBtZWhyIGFscyB7MH0gWmVpY2hlbiBlaW4uXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiQml0dGUgZ2ViZW4gc2llIG1pbmRlc3RlbnMgezB9IHVuZCBtYXhpbWFsIHsxfSBaZWljaGVuIGVpbi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJCaXR0ZSBtYWNoZW4gU2llIGluIG1pbmRlc3RlbnMgezB9IFplaWxlbiBlaW5lIEVpbmdhYmUuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIkJpdHRlIHfDpGhsZW4gU2llIG1pbmRlc3RlbnMgezB9IFZhcmlhbnRlKG4pIGF1cy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiQml0dGUgd8OkaGxlbiBTaWUgbmljaHQgbWVociBhbHMgezB9IFZhcmlhbnRlKG4pIGF1cy5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIG11c3MgZ3LDtsOfZXIgb2RlciBnbGVpY2ggezF9IHVuZCBrbGVpbmVyIG9kZXIgZ2xlaWNoIHsyfSBzZWluXCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgbXVzcyBncsO2w59lciBvZGVyIGdsZWljaCB7MX0gc2VpblwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIG11c3Mga2xlaW5lciBvZGVyIGdsZWljaCB7MX0gc2VpblwiLFxuICBpbnZhbGlkRW1haWw6IFwiQml0dGUgZ2ViZW4gU2llIGVpbmUgZ8O8bHRpZ2UgRS1NYWlsLUFkcmVzc2UgZWluLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJEZXIgQXVzZHJ1Y2s6IHswfSBtdXNzIGRlbiBXZXJ0ICd3YWhyJyh0cnVlKSB6dXLDvGNrbGllZmVybi5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkRpZSBBbmZyYWdlIGxpZWZlcnRlIGRlbiBmb2xnZW5kZW4gRmVobGVyIHp1csO8Y2sgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJEaWUgQW5mcmFnZSBsaWVmZXJ0ZSBsZWVyZSBEYXRlbiB6dXLDvGNrIG9kZXIgZGVyIFdlcnQgZGVyIFZhcmlhYmxlICdwYXRoJyBpc3QgZmFsc2NoXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRGllIERhdGVpZ3LDtsOfZSBkYXJmIHswfSBuaWNodCDDvGJlcnNjaHJlaXRlbi5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIkJpdHRlIGdlYmVuIFNpZSBkZW4gYW5kZXJlbiBXZXJ0IGVpbi5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIklocmUgRGF0ZWkgd2lyZCBob2NoZ2VsYWRlbi4gQml0dGUgd2FydGVuIFNpZSBlaW4gcGFhciBTZWt1bmRlbiB1bmQgdmVyc3VjaGVuIFNpZSBlcyBkYW5uIGVybmV1dC5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiV2lyZCBnZWxhZGVuLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiRGF0ZWkoZW4pIGF1c3fDpGhsZW4uLi5cIixcbiAgY29uZmlybURlbGV0ZTogXCJXb2xsZW4gU2llIGRlbiBFaW50cmFnIGzDtnNjaGVuP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkRpZXNlciBXZXJ0IG11c3MgZWluZGV1dGlnIHNlaW4uXCIsXG4gIGFkZENvbHVtbjogXCJTcGFsdGUgaGluenVmw7xnZW5cIixcbiAgYWRkUm93OiBcIlplaWxlIGhpbnp1ZsO8Z2VuXCIsXG4gIHJlbW92ZVJvdzogXCJFbnRmZXJuZW5cIixcbiAgYWRkUGFuZWw6IFwiTmV1IGhpbnp1ZsO8Z2VuXCIsXG4gIHJlbW92ZVBhbmVsOiBcIkVudGZlcm5lblwiLFxuICBjaG9pY2VzX0l0ZW06IFwiRWxlbWVudFwiLFxuICBtYXRyaXhfY29sdW1uOiBcIlNwYWx0ZVwiLFxuICBtYXRyaXhfcm93OiBcIlplaWxlXCIsXG4gIHNhdmluZ0RhdGE6IFwiRGllIEVyZ2Vibmlzc2Ugd2VyZGVuIGF1ZiBkZW0gU2VydmVyIGdlc3BlaWNoZXJ0Li4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJFcyBpc3QgZWluIEZlaGxlciBhdWZnZXRyZXRlbi4gRGllIEVyZ2Vibmlzc2Uga29ubnRlbiBuaWNodCBnZXNwZWljaGVydCB3ZXJkZW4uXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIkRpZSBFcmdlYm5pc3NlIHd1cmRlbiBnZXNwZWljaGVydCFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIkJpdHRlIHZlcnN1Y2hlbiBTaWUgZXMgZXJuZXV0XCIsXG4gIHRpbWVyTWluOiBcIk1pbi5cIixcbiAgdGltZXJTZWM6IFwiU2VrLlwiLFxuICB0aW1lclNwZW50QWxsOiBcIlNpZSB3YXJlbiB7MH0gYXVmIGRpZXNlciBTZWl0ZSB1bmQgaW5zZ2VzYW10IHsxfS5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiU2llIHdhcmVuIHswfSBhdWYgZGllc2VyIFNlaXRlLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIlNpZSBoYWJlbiBpbnNnZXNhbXQgezB9IGJlbsO2dGlndC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIlNpZSB3YXJlbiB7MH0gdm9uIHsxfSBhdWYgZGllc2VyIFNlaXRlIHVuZCBpbnNnZXNhbXQgezJ9IHZvbiB7M30uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIlNpZSB3YXJlbiB7MH0gdm9uIHsxfSBhdWYgZGllc2VyIFNlaXRlLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIlNpZSBoYWJlbiBpbnNnZXNhbXQgezB9IHZvbiB7MX0gYmVuw7Z0aWd0LlwiLFxuICBjbGVhbkNhcHRpb246IFwiU2F1YmVyXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJMZWVyZW5cIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiRGF0ZWkgbMO2c2NoZW5cIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJkZVwiXSA9IGdlcm1hblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJkZVwiXSA9IFwiZGV1dHNjaFwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9nZXJtYW4udHMiLCIvL0NyZWF0ZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL2FnZWxvc3BhbmFnaW90YWtpc1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBncmVla1N1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLOoM+Bzr/Ot86zzr/Pjc68zrXOvc6/XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLOlc+Az4zOvM61zr3Ov1wiLFxuICBjb21wbGV0ZVRleHQ6IFwizp/Ou86/zrrOu86uz4HPic+DzrdcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLOhs67zrvOvyAoz4DOsc+BzrHOus6xzrvPjiDOtM65zrXPhc66z4HOuc69zq/Pg8+EzrUpXCIsXG4gIHByb2dyZXNzVGV4dDogXCLOo861zrvOr860zrEgezB9IM6xz4DPjCB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6XG4gICAgXCLOlM61zr0gz4XPgM6sz4HPh861zrkgzrrOsc68zq/OsSDOv8+BzrHPhM6uIM+DzrXOu86vzrTOsSDOriDOv8+BzrHPhM6uIM61z4HPjs+EzrfPg863IM+DzrUgzrHPhc+Ez4wgz4TOvyDOtc+Bz4nPhM63zrzOsc+Ezr/Ou8+MzrPOuc6/LlwiLFxuICBjb21wbGV0aW5nU3VydmV5OlxuICAgIFwizpXPhc+HzrHPgc65z4PPhM6/z43OvM61IM6zzrnOsSDPhM63zr0gz4PPhc68z4DOu86uz4HPic+DzrcgzrHPhc+Ezr/PjSDPhM6/z4UgzrXPgc+Jz4TOt868zrHPhM6/zrvOv86zzq/Ov8+FIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIs6kzr8gzrXPgc+Jz4TOt868zrHPhM6/zrvPjM6zzrnOvyDPhs6/z4HPhM+Ozr3Otc+EzrHOuSDOsc+Azr8gz4TOvyDOtM65zrHOus6/zrzOuc+Dz4TOri4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLOlc+AzrnOu86tzr7PhM61Li4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDOsc+AzrHOvc+Ezq7Pg8+EzrUgz4PPhM63zr0gzrXPgc+Oz4TOt8+DzrcuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6XG4gICAgXCLOoM6xz4HOsc66zrHOu8+OIM6xz4DOsc69z4TOrs+Dz4TOtSDPg8+EzrnPgiDOtc+Bz4nPhM6uz4POtc65z4Igz4POtSDPjM67zrXPgiDPhM65z4IgzrPPgc6xzrzOvM6tz4IuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLOlyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM6xz4HOuc64zrzOt8+EzrnOus6uLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIs6gzrHPgc6xzrrOsc67z44gz4PPhc68z4DOu863z4HPjs+Dz4TOtSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDPg8+NzrzOss6/zrvOsS5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLOoM6xz4HOsc66zrHOu8+OIM+Dz4XOvM+AzrvOt8+Bz47Pg8+EzrUgz4TOv8+FzrvOrM+HzrnPg8+Ezr/OvSB7MH0gzrPPgc6xzrzOvM6tz4IuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIs6gzrHPgc6xzrrOsc67z44gzrXPgM65zrvOrc6+z4TOtSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDPgM6xz4HOsc67zrvOsc6zzq3Pgi5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDOtc+AzrnOu86tzr7PhM61IM+Mz4fOuSDPgM6xz4HOsc+AzqzOvc+JIM6xz4DOvyB7MH0gz4DOsc+BzrHOu867zrHOs86tz4IuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCLOpM6/ICd7MH0nIM64zrEgz4DPgc6tz4DOtc65IM69zrEgzrXOr869zrHOuSDOr8+Dzr8gzq4gzrzOtc6zzrHOu8+Nz4TOtc+Bzr8gzrHPgM6/IM+Ezr8gezF9IM66zrHOuSDOr8+Dzr8gzq4gzrzOuc66z4HPjM+EzrXPgc6/IM6xz4DOvyDPhM6/IHsyfVwiLFxuICBudW1lcmljTWluOiBcIs6kzr8gJ3swfScgz4DPgc6tz4DOtc65IM69zrEgzrXOr869zrHOuSDOvM61zrPOsc67z43PhM61z4HOvyDOriDOuc+Dzr8gzrzOtSDPhM6/IHsxfVwiLFxuICBudW1lcmljTWF4OiBcIs6kzr8gJ3swfScgz4DPgc6tz4DOtc65IM69zrEgzrXOr869zrHOuSDOvM65zrrPgc+Mz4TOtc+Bzr8gzq4gzq/Pg86/IM6xz4DOvyDPhM6/IHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwizqDOsc+BzrHOus6xzrvPjiDOtM+Oz4PPhM61IM68zrnOsSDOsc+Azr/OtM61zrrPhM6uIM60zrnOtc+NzrjPhc69z4POtyBlLW1haWwuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLOlyDOsc6vz4TOt8+DzrcgzrXPgM6tz4PPhM+BzrXPiM61IM+Dz4bOrM67zrzOsSAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIs6XIM6xzq/PhM63z4POtyDOtc+Azq3Pg8+Ez4HOtc+IzrUgzrrOtc69zqwgzrTOtc60zr/OvM6tzr3OsSDOriDOtyDOuc60zrnPjM+EzrfPhM6xICfOvM6/zr3Ov8+AzqzPhM65L3BhdGgnIM61zq/Ovc6xzrkgzrXPg8+GzrHOu868zq3Ovc63XCIsXG4gIGV4Y2VlZE1heFNpemU6IFwizqTOvyDOvM6tzrPOtc64zr/PgiDOtM61zr0gzrzPgM6/z4HOtc6vIM69zrEgz4XPgM61z4HOss6xzq/Ovc61zrkgz4TOsSB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLOoM6xz4HOsc66zrHOu8+OIM+Dz4XOvM+AzrvOt8+Bz47Pg8+EzrUgz4TOt869IM+EzrnOvM6uIM6zzrnOsSDPhM6/IM+AzrXOtM6vzr8gJ86szrvOu86/Jy5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIs6kzr8gzrHPgc+HzrXOr86/IM+DzrHPgiDOsc69zrXOss6xzq/Ovc61zrkuIM6gzrHPgc6xzrrOsc67z44gz4DOtc+BzrnOvM6tzr3Otc+EzrUgzrrOsc+Azr/Ouc6xIM60zrXPhc+EzrXPgc+MzrvOtc+Az4TOsSDOus6xzrkgzrTOv866zrnOvM6sz4PPhM61IM6+zrHOvc6sLlwiLFxuICBhZGRSb3c6IFwizqDPgc6/z4POuM6uzrrOtyDOs8+BzrHOvM68zq7PglwiLFxuICByZW1vdmVSb3c6IFwizpHPhs6xzq/Pgc61z4POt1wiXG59O1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJnclwiXSA9IGdyZWVrU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImdyXCJdID0gXCLOtc67zrvOt869zrnOus6sXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2dyZWVrLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBoZWJyZXdTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi15DXl9eV16jXlFwiLFxuICBwYWdlTmV4dFRleHQ6IFwi16fXk9eZ157XlFwiLFxuICBjb21wbGV0ZVRleHQ6IFwi16HXmdeV151cIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIteT16MgezF9INee16rXldeaIHswfVwiLFxuICBlbXB0eVN1cnZleTogXCLXkNeZ158g16nXkNec15XXqlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIteq15XXk9eUINei15wg157Xmdec15XXmSDXlNep15DXnNeV158hXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi15jXoteZ16DXlCDXnteU16nXqNeqLi4uXCIsXG4gIG90aGVySXRlbVRleHQ6IFwi15DXl9eoICjXoNeQINec16rXkNeoKVwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLXkdeX16guLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCLXkNeg15Ag15TXqdeRINei15wg15TXqdeQ15zXlFwiLFxuICBudW1lcmljRXJyb3I6IFwi15TXqtep15XXkdeUINem16jXmdeb15Qg15zXlNeZ15XXqiDXnteh16TXqC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLXlNeW158g15zXpNeX15XXqiB7MH0g16rXldeV15nXnS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi15HXl9eoINec16TXl9eV16ogezB9INeQ16TXqdeo15XXmdeV16ouXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIteR15fXqCDXoteTIHswfSDXkNek16nXqNeV15nXldeqLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScg15fXmdeZ15Eg15zXlNeZ15XXqiDXqdeV15XXlCDXkNeVINeS15PXldecINeeIHsxfSwg15XXqdeV15XXlCDXnC0gezJ9INeQ15Ug16TXl9eV16og154tIHt9fVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nINeX15nXmdeRINec15TXmdeV16og16nXldeV15Qg15DXlSDXkteT15XXnCDXniB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyDXl9eZ15nXkSDXnNeU15nXldeqINep15XXldeUINeQ15Ug16fXmNefINeeIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6ICfXlNeW158g15vXqteV15HXqiDXk9eV15BcItecINeX15XXp9eZ16ouJyxcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiAn16DXkCDXnNeU15bXmdefINeg16rXldeg15nXnSDXkdep15PXlCBcIteQ15fXqFwiJ1xufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJoZVwiXSA9IGhlYnJld1N1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJoZVwiXSA9IFwi16LXkdeo15nXqlwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9oZWJyZXcudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGh1bmdhcmlhblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJWaXNzemFcIixcbiAgcGFnZU5leHRUZXh0OiBcIlRvdsOhYmJcIixcbiAgY29tcGxldGVUZXh0OiBcIkvDqXN6XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiRWd5w6liIChhZGphIG1lZylcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcInswfS4vezF9IG9sZGFsXCIsXG4gIGVtcHR5U3VydmV5OiBcIlRoZXJlIGlzIG5vIHZpc2libGUgcGFnZSBvciBxdWVzdGlvbiBpbiB0aGUgc3VydmV5LlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkvDtnN6w7ZuasO8aywgaG9neSBraXTDtmx0w7Z0dGUgZmVsbcOpcsOpc8O8bmtldCFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTogXCJNw6FyIGtpdMO2bHTDtnR0ZSBhIGZlbG3DqXLDqXN0LlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkZlbG3DqXLDqXMgYmV0w7ZsdMOpc2UuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiVsOhbGFzc3pvbi4uLlwiLFxuICB2YWx1ZTogXCLDqXJ0w6lrXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiS8OpcmrDvGssIHbDoWxhc3pvbGphIG1lZyBlenQgYSBrw6lyZMOpc3QhXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiS8OpcmrDvGsgYWRqb24gdsOhbGFzenQgbWluZGVuIHNvcmJhbiFcIixcbiAgbnVtZXJpY0Vycm9yOiBcIkF6IMOpcnTDqWsgc3rDoW0ga2VsbCwgaG9neSBsZWd5ZW4hXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiQWRqb24gbWVnIGxlZ2Fsw6FiYiB7MH0ga2FyYWt0ZXJ0IVwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIkxlZ2ZlbGplYmIgezB9IGthcmFrdGVydCBhZGpvbiBtZWchXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiQWRqb24gbWVnIGxlZ2Fsw6FiYiB7MH0sIGRlIGxlZ2ZlbGplYmIgezF9IGthcmFrdGVydCFcIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJUw7ZsdHPDtm4ga2kgbWluaW11bSB7MH0gc29ydCFcIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiVsOhbGFzc3pvbiBraSBsZWdhbMOhYmIgezB9IGxlaGV0xZFzw6lnZXQhXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIk5lIHbDoWxhc3N6b24gdMO2YmJldCwgbWludCB7MH0gbGVoZXTFkXPDqWchXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBsZWd5ZW4gbmFneW9iYiwgdmFneSBlZ3llbmzFkSwgbWludCB7MX0gw6lzIGtpc2ViYiwgdmFneSBlZ3llbmzFkSwgbWludCB7Mn0hXCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgbGVneWVuIGxlZ2Fsw6FiYiB7MX0hXCIsXG4gIG51bWVyaWNNYXg6IFwiVGhlICd7MH0nIG5lIGxlZ3llbiBuYWd5b2JiLCBtaW50IHsxfSFcIixcbiAgaW52YWxpZEVtYWlsOiBcIkFkam9uIG1lZyBlZ3kgdmFsw7NzIGVtYWlsIGPDrW1ldCFcIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkEgbGVrw6lyZGV6w6lzIGhpYsOhdmFsIHTDqXJ0IHZpc3N6YTogJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJBIGxla8OpcmRlesOpcyDDvHJlcyBhZGF0dGFsIHTDqXJ0IHZpc3N6YSwgdmFneSBhICdwYXRoJyBwYXJhbcOpdGVyIGhlbHl0ZWxlbi5cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJBIG3DqXJldCBuZW0gbGVoZXQgbmFneW9iYiwgbWludCB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJBZGphIG1lZyBheiBlZ3nDqWIgw6lydMOpa2V0IVwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiRmVsdMO2bHTDqXMgZm9seWFtYXRiYW4uIFbDoXJqb24gcMOhciBtw6Fzb2RwZXJjZXQsIG1hamQgcHLDs2LDoWxqYSDDumpyYS5cIixcbiAgY29uZmlybURlbGV0ZTogXCJUw7ZybGkgZXp0IGEgcmVrb3Jkb3Q/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiQXogw6lydMOpa25layBlZ3llZGluZWsga2VsbCBsZW5uaWUuXCIsXG4gIGFkZFJvdzogXCJTb3IgaG96esOhYWTDoXNhXCIsXG4gIHJlbW92ZVJvdzogXCJFbHTDoXZvbMOtdMOhc1wiLFxuICBhZGRQYW5lbDogXCLDmmogaG96esOhYWTDoXNhXCIsXG4gIHJlbW92ZVBhbmVsOiBcIkVsdMOhdm9sw610w6FzXCIsXG4gIGNob2ljZXNfSXRlbTogXCJlbGVtXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiT3N6bG9wXCIsXG4gIG1hdHJpeF9yb3c6IFwiU29yXCIsXG4gIHNhdmluZ0RhdGE6IFwiRXJlZG3DqW55IG1lbnTDqXNlIGEgc3plcnZlcnJlLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJFZ3kgaGliYSBmb2x5dMOhbiBuZW0gdHVkdHVrIGVsbWVudGVuaSBheiBlcmVkbcOpbnl0LlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJFcmVkbcOpbnkgc2lrZXJlc2VuIG1lbnR2ZSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlByw7Niw6FsamEgw7pqcmFcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJodVwiXSA9IGh1bmdhcmlhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJodVwiXSA9IFwibWFneWFyXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2h1bmdhcmlhbi50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgaWNlbGFuZGljU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlRpbGJha2FcIixcbiAgcGFnZU5leHRUZXh0OiBcIsOBZnJhbVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiTG9racOwXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiSGlubiAoc2vDvXJpbmcpXCIsXG4gIHByb2dyZXNzVGV4dDogXCJTw63DsGEgezB9IG9mIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCLDnmHDsCBlciBlbmdpbm4gc8Otw7BhIGXDsGEgc3B1cm5pbmdhciDDrSDDvmVzc2FyaSBrw7ZubnVuLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlRha2sgZnlyaXIgYcOwIGZ5bGxqYSDDunQgw75lc3NhIGvDtm5udW4hXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiS8O2bm51bmluIGVyIGHDsCBobGHDsGEuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiVmVsZHUuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCJWaW5zYW1sZWdhc3Qgc3ZhcmnDsCBzcHVybmluZ3VubmkuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiVmluc2FtbGVnYXN0IHN2YXJpw7Agc3B1cm5pbmd1bSDDrSDDtmxsdW0gcsO2w7B1bS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIsOeZXR0YSBnaWxkaSB2ZXLDsHVyIGHDsCB2ZXJhIHRhbGEuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiw55hw7Agw6Z0dGkgYcOwIHZlcmEgbWlubnN0IHswfSB0w6Frbi5cIixcbiAgdGV4dE1heExlbmd0aDogXCLDnmHDsCDDpnR0aSBhw7AgdmVyYSBtZXN0IHswfSB0w6Frbi5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLDnmHDsCDDpnR0aSBhw7AgdmVyYSBmbGVpcmkgZW4gezB9IG9nIGbDpnJyaSBlbiB7MX0gdMOha24uXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiVmluc2FtbGVnYXN0IGZ5bGxpw7Agw7pyIGHDsCBtaW5uc3RhIGtvc3RpIHswfSByYcOwaXIuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlZpbnNhbWxlZ2FzdCB2ZWxqacOwIGHDsCBtaW5uc3RhIGtvc3RpIHswfSBtw7ZndWxlaWthLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJWaW5zYW1sZWdhc3QgdmVsamnDsCBla2tpIGZsZWlyaSBlbiB7MH0gbcO2Z3VsZWlrYS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIMOmdHRpIGHDsCB2ZXJhIG1laXJhIGVuIGXDsGEgamFmbnQgb2cgezF9IG1pbm5hIGVuIGXDsGEgamFmbnQgb2cgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiezB9JyDDpnR0aSBhw7AgdmVyYSBtZWlyYSBlbiBlw7BhIGphZm50IG9nIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIMOmdHRpIGHDsCB2ZXJhIG1pbm5hIGVuIGXDsGEgamFmbnQgb2cgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJWaW5zYW1sZWdhc3Qgc2zDoWnDsCBpbm4gZ2lsdCBuZXRmYW5nLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiQmVpw7BuaW5uIHNraWxhw7BpIGVmdGlyZmFyYW5hZGkgdmlsbHUgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwiQmVpw7BuaW5uZyBza2lsYcOwaSBlbmd1bSBnw7ZnbnVtIGXDsGEgc2zDs8OwaW5uIHZhciByw7ZuZ1wiLFxuICBleGNlZWRNYXhTaXplOiBcIlNrcsOhaW5uIHNrYWwgZWtraSB2ZXJhIHN0w6ZycmkgZW4gezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiVmluYW1sZWdhc3QgZnlsbGnDsCDDunQgaGl0dCBnaWxkacOwLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiU2tyw6Fpbm4gw77DrW4gdmFyIHNlbmQuIFZpbnNhbWxlZ2FzdCBiw63DsGnDsCDDrSBub2trcmFyIHNla8O6bmR1ciBvZyByZXluacOwIGFmdHVyLlwiLFxuICBhZGRSb3c6IFwiQsOmdGEgdmnDsCByw7bDsFwiLFxuICByZW1vdmVSb3c6IFwiRmphcmzDpmdqYVwiLFxuICBjaG9pY2VzX2ZpcnN0SXRlbTogXCJmeXJzdGkgaGx1dHVyXCIsXG4gIGNob2ljZXNfc2Vjb25kSXRlbTogXCJhbm5hciBobHV0dXJcIixcbiAgY2hvaWNlc190aGlyZEl0ZW06IFwiw75yacOwamkgaGx1dHVyXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiRMOhbGt1clwiLFxuICBtYXRyaXhfcm93OiBcIlLDtsOwXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaXNcIl0gPSBpY2VsYW5kaWNTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiaXNcIl0gPSBcIsOtc2xlbnNrYVwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9pY2VsYW5kaWMudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGluZG9uZXNpYW5TdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiU2ViZWx1bW55YVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiU2VsYW5qdXRueWFcIixcbiAgY29tcGxldGVUZXh0OiBcIlNlbGVzYWlcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIk11bGFpXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiTGFpbm55YSAoamVsYXNrYW4pXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJUaWRhayBBZGFcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiUGlsaWggU2VtdWFcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIkhhbGFtYW4gezB9IGRhcmkgezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIlRpZGFrIGFkYSBoYWxhbWFuIGF0YXUgcGVydGFueWFhbiBkYWxhbSBzdXJ2ZWkuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiVGVyaW1hIGthc2loIHRlbGFoIG1lbnllbGVzYWlrYW4gc3VydmVpIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiQ2F0YXRhbiBrYW1pIG1lbnVuanVra2FuIGJhaHdhIEFuZGEgdGVsYWggbWVueWVsZXNhaWthbiBzdXJ2ZWkgaW5pLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIk1lbXVhdCBzdXJ2ZWkuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiUGlsaWguLi5cIixcbiAgdmFsdWU6IFwibmlsYWlcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJTaWxhaGthbiBqYXdhYiBwZXJ0YW55YWFuIGJlcmlrdXQuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIlNpbGFoa2FuIGphd2FiIHNldGlkYWtueWEgc2F0dSBwZXRhbnlhYW4uXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiU2lsYWhrYW4gamF3YWIgcGVydGFueWFhbiBwYWRhIHNlbXVhIGJhcmlzLlwiLFxuICBudW1lcmljRXJyb3I6IFwiTmlsYWkgaGFydXMgYmVydXBhIGFuZ2thLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlNpbGFoa2FuIG1hc3Vra2FuIHNldGlkYWtueWEgezB9IGthcmFrdGVyLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlNpbGFoa2FuIG1hc3Vra2FuIGt1cmFuZyB7MH0ga2FyYWt0ZXIuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiUFNpbGFoa2FuIG1hc3Vra2FuIGxlYmloIGRhcmkgezB9IGRhbiBrdXJhbmcgZGFyaSB7MX0ga2FyYWt0ZXIuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiU2lsYWhrYW4gaXNpIHNldGlkYWtueWEgezB9IGJhcmlzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJTaWxhaGthbiBwaWxpaCBzZXRpZGFrbnlhIHswfSB2YXJpYW4uXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlNpbGFoa2FuIHBpbGloIHRpZGFrIGxlYmloIGRhcmkgezB9IHZhcmlhbi5cIixcbiAgbnVtZXJpY01pbk1heDogXCInezB9JyBoYXJ1cyBzYW1hIGRlbmdhbiBhdGF1IGxlYmloIGRhcmkgezF9IGRhbiBoYXJ1cyBzYW1hIGRlbmdhbiBhdGF1IGt1cmFuZyBkYXJpIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGhhcnVzIHNhbWEgZGVuZ2FuIGF0YXUgbGViaWggZGFyaSB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBoYXJ1cyBzYW1hIGRlbmdhbiBhdGF1IGt1cmFuZyBkYXJpIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiU2lsYWhrYW4gbWFzdWtrYW4gZS1tYWlsIHlhbmcgYmVuYXIuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkVrc3ByZXNpOiB7MH0gaGFydXMgbWVuZ2VtYmFsaWthbiAnYmVuYXInLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiUGVybWludGFhbiBtZW5nZW1iYWxpa2FuIGtlc2FsYWhhbiAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCJQZXJtaW50YWFuIG1lbmdlbWJhbGlrYW4gZGF0YSBrb3NvbmcgYXRhdSBwcm9wZXJ0aSAncGF0aCcgc2FsYWguXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiVWt1cmFuIGJlcmthcyB0aWRhayBib2xlaCBtZWxlYmloaSB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJTaWxhaGthbiBtYXN1a2thbiBuaWxhaSBsYWlubm55YS5cIixcbiAgdXBsb2FkaW5nRmlsZTogXCJCZXJrYXMgQW5kYSBzZWRhbmcgZGl1bmdnYWguIFNpbGFoa2FuIHR1bmdndSBiZWJlcmFwYSBzYWF0IGF0YXUgY29iYSBsYWdpLlwiLFxuICBsb2FkaW5nRmlsZTogXCJNZW11YXQuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJQaWxpaCBiZXJrYXMuLi5cIixcbiAgY29uZmlybURlbGV0ZTogXCJBcGFrYWggQW5kYSBpbmdpbiBtZW5naGFwdXMgY2F0YXRhbj9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJOaWxhaSBoYXJ1cyB1bmlrLlwiLFxuICBhZGRDb2x1bW46IFwiVGFtYmFoIGtvbG9tXCIsXG4gIGFkZFJvdzogXCJUYW1iYWggYmFyaXNcIixcbiAgcmVtb3ZlUm93OiBcIkhhcHVzXCIsXG4gIGFkZFBhbmVsOiBcIlRhbWJhaCBiYXJ1XCIsXG4gIHJlbW92ZVBhbmVsOiBcIkhhcHVzXCIsXG4gIGNob2ljZXNfSXRlbTogXCJpdGVtXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiS29sb21cIixcbiAgbWF0cml4X3JvdzogXCJCYXJpc1wiLFxuICBzYXZpbmdEYXRhOiBcIkhhc2lsIHNlZGFuZyBkaXNpbXBhbiBwYWRhIHNlcnZlci4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiS2VzYWxhaGFuIHRlcmphZGkgZGFuIGthbWkgdGlkYWsgZGFwYXQgbWVueWltcGFuIGhhc2lsLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJIYXNpbCB0ZWxhaCBzdWtzZXMgZGlzaW1wYW4hXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJDb2JhIGxhZ2lcIixcbiAgdGltZXJNaW46IFwibWVuaXRcIixcbiAgdGltZXJTZWM6IFwiZGV0aWtcIixcbiAgdGltZXJTcGVudEFsbDogXCJBbmRhIHRlbGFoIG1lbmdoYWJpc2thbiB7MH0gcGFkYSBoYWxhbWFuIGluaSBkYW4gezF9IHNlY2FyYSBrZXNlbHVydWhhbi5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiWUFuZGEgdGVsYWggbWVuZ2hhYmlza2FuIHswfSBwYWRhIGhhbGFtYW4gaW5pLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIkFuZGEgdGVsYWggbWVuZ2hhYmlza2FuIHswfSBzZWNhcmEga2VzZWx1cnVoYW4uXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJBbmRhIHRlbGFoIG1lbmdoYWJpc2thbiB7MH0gZGFyaSB7MX0gcGFkYSBoYWxhbWFuIGluaSBkYW4gezJ9IGRhcmkgezN9IHNlY2FyYSBrZXNlbHVydWhhbi5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiQW5kYSB0ZWxhaCBtZW5naGFiaXNrYW4gezB9IGRhcmkgezF9IHBhZGEgaGFsYW1hbiBpbmkuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiQW5kYSB0ZWxhaCBtZW5naGFiaXNrYW4gezB9IGRhcmkgezF9IHNlY2FyYSBrZXNlbHVydWhhbi5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIkJlcnNpaGthblwiLFxuICBjbGVhckNhcHRpb246IFwiQmVyc2loa2FuXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIkhhcHVzIGJlcmthcyBpbmlcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJpZFwiXSA9IGluZG9uZXNpYW5TdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiaWRcIl0gPSBcIkJhaGFzYSBJbmRvbmVzaWFcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vaW5kb25lc2lhbi50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgaXRhbGlhblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJQcmVjZWRlbnRlXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJTdWNjZXNzaXZvXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJTYWx2YVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiSW5pemlvXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiQWx0cm8gKGRlc2NyaXZpKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUGFnaW5hIHswfSBkaSB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTm9uIGNpIHNvbm8gcGFnaW5lIG8gZG9tYW5kZSB2aXNpYmlsaSBuZWwgcXVlc3Rpb25hcmlvLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkdyYXppZSBwZXIgYXZlciBjb21wbGV0YXRvIGlsIHF1ZXN0aW9uYXJpbyFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcIkkgbm9zdHJpIHJlY29yZHMgbW9zdHJhbm8gY2hlIGhhaSBnacOgIGNvbXBsZXRhdG8gcXVlc3RvIHF1ZXN0aW9uYXJpby5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJDYXJpY2FtZW50byBkZWwgcXVlc3Rpb25hcmlvIGluIGNvcnNvLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlNjZWdsaS4uLlwiLFxuICB2YWx1ZTogXCJ2YWxvcmVcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJDYW1wbyBvYmJsaWdhdG9yaW9cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiUGVyIEZhdm9yZSwgcmlzcG9uZGkgYWQgYWxtZW5vIHVuYSBkb21hbmRhLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIkNvbXBsZXRhcmUgdHV0dGUgbGUgcmlnaGVcIixcbiAgbnVtZXJpY0Vycm9yOiBcIklsIHZhbG9yZSBkZXZlIGVzc2VyZSBudW1lcmljb1wiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIkluc2VyaXJlIGFsbWVubyB7MH0gY2FyYXR0ZXJpXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiTHVuZ2hlenphIG1hc3NpbWEgY29uc2VudGl0YSB7MH0gY2FyYXR0ZXJpXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6XG4gICAgXCJJbnNlcmlyZSB1bmEgc3RyaW5nYSBjb24gbWluaW1vIHswfSBlIG1hc3NpbW8gezF9IGNhcmF0dGVyaVwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIkNvbXBsZXRhcmUgYWxtZW5vIHswfSByaWdoZS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiU2VsZXppb25hcmUgYWxtZW5vIHswfSB2YXJpYW50aS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiU2VsZXppb25hcmUgbWFzc2ltbyB7MH0gdmFyaWFudGkuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBkZXZlIGVzc2VyZSB1Z3VhbGUgbyBzdXBlcmlvcmUgYSB7MX0gZSB1Z3VhbGUgbyBpbmZlcmlvcmUgYSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBkZXZlIGVzc2VyZSB1Z3VhbGUgbyBzdXBlcmlvcmUgYSB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBkZXZlIGVzc2VyZSB1Z3VhbGUgbyBpbmZlcmlvcmUgYSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIkluc2VyaXJlIGluZGlyaXp6byBtYWlsIHZhbGlkb1wiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiTGEgcmljaGllc3RhIGhhIHJpc3Bvc3RvIGNvbiB1biBlcnJvcmUgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJMYSByaWNoaWVzdGEgaGEgcmlzcG9zdG8gbnVsbCBvcHB1cmUgaWwgcGVyY29yc28gbm9uIMOoIGNvcnJldHRvXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiSWwgZmlsZSBub24gcHXDsiBlY2NlZGVyZSB7MH1cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIkluc2VyaXJlIGlsIHZhbG9yZSAnYWx0cm8nXCIsXG4gIHVwbG9hZGluZ0ZpbGU6IFwiRmlsZSBpbiBjYXJpY2FtZW50by4gQXR0ZW5kaSBhbGN1bmkgc2Vjb25kaSBlIHJpcHJvdmFcIixcbiAgY29uZmlybURlbGV0ZTogXCJTZWkgc2ljdXJvIGRpIHZvbGVyIGVsbWluYXJlIGlsIHJlY29yZD9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJRdWVzdG8gdmFsb3JlIGRldmUgZXNzZXJlIHVuaXZvY28uXCIsXG4gIGFkZFJvdzogXCJBZ2dpdW5naSByaWdhXCIsXG4gIHJlbW92ZVJvdzogXCJSaW11b3ZpIHJpZ2FcIixcbiAgYWRkUGFuZWw6IFwiQWdnaXVuZ2kgcmlnYVwiLFxuICByZW1vdmVQYW5lbDogXCJFbGltaW5hXCIsXG4gIGNob2ljZXNfSXRlbTogXCJFbGVtZW50b1wiLFxuICBtYXRyaXhfY29sdW1uOiBcIkNvbG9ubmFcIixcbiAgbWF0cml4X3JvdzogXCJSaWdhXCIsXG4gIHNhdmluZ0RhdGE6IFwiU2FsdmF0YWdnaW8gZGF0aSBzdWwgc2VydmVyLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJTaSDDqCB2ZXJpZmljYXRvIHVuIGVycm9yZSBlIG5vbiDDqCBzdGF0byBwb3NzaWJpbGUgc2FsdmFyZSBpIHJpc3VsdGF0aS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiSSByaXN1bHRhdGkgc29ubyBzdGF0aSBzYWx2YXRpIGNvbiBzdWNjZXNzbyFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlJpcHJvdmFcIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlY1wiLFxuICB0aW1lclNwZW50QWxsOiBcIkhhaSBpbXBpZWdhdG8gezB9IHN1IHF1ZXN0YSBwYWdpbmEgZSB7MX0gaW4gdG90YWxlLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJIYWkgaW1waWVnYXRvIHswfSBzdSBxdWVzdGEgcGFnaW5hLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIkhhaSBpbXBpZWdhdG8gezB9IGluIHRvdGFsZS5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIkhhaSBpbXBpZWdhdG8gezB9IGRpIHsxfSBzdSBxdWVzdGEgcGFnaW5hIGUgezJ9IGRpIHszfSBpbiB0b3RhbGUuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIkhhaSBpbXBpZWdhdG8gezB9IGRpIHsxfSBzdSBxdWVzdGEgcGFnaW5hLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIkhhaSBpbXBpZWdhdG8gezB9IGRpIHsxfSBpbiB0b3RhbGUuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJQdWxpc2NpXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaXRcIl0gPSBpdGFsaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcIml0XCJdID0gXCJpdGFsaWFub1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9pdGFsaWFuLnRzIiwiLy8gVW5jb21tZW50IHRoaXMgbGluZSBvbiBjcmVhdGluZyBhIHRyYW5zbGF0aW9uIGZpbGVcclxuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcclxuXHJcbmV4cG9ydCB2YXIgamFwYW5lc2VTdXJ2ZXlTdHJpbmdzID0ge1xyXG4gIHBhZ2VQcmV2VGV4dDogXCLliY3jga5cIixcclxuICBwYWdlTmV4dFRleHQ6IFwi5qyh44G4XCIsXHJcbiAgY29tcGxldGVUZXh0OiBcIuWujOS6hlwiLFxyXG4gIHN0YXJ0U3VydmV5VGV4dDogXCLjgrnjgr/jg7zjg4hcIixcclxuICBvdGhlckl0ZW1UZXh0OiBcIuOBneOBruS7lu+8iOiqrOaYju+8iVwiLFxyXG4gIG5vbmVJdGVtVGV4dDogXCLjgarjgZdcIixcclxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCLjgZnjgbnjgabpgbjmip5cIixcclxuICBwcm9ncmVzc1RleHQ6IFwiezB9L3sxfemggVwiLFxyXG4gIGVtcHR5U3VydmV5OiBcIuOBk+OBruiqv+afu+OBq+ihqOekuuOBp+OBjeOCi+ODmuODvOOCuOOChOizquWVj+OBr+OBguOCiuOBvuOBm+OCk1wiLFxyXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi6Kq/5p+744KS5a6M5LqG44GX44Gm44GP44KM44Gm44GC44KK44GM44Go44GG44GU44GW44GE44G+44GX44GfXCIsXHJcbiAgbG9hZGluZ1N1cnZleTogXCLoqr/mn7vjgpLjg4Djgqbjg7Pjg63jg7zjg4nkuK1cIixcclxuICBvcHRpb25zQ2FwdGlvbjogXCLpgbjmip5cIixcclxuICByZXF1aXJlZEVycm9yOiBcIuizquWVj+OBq+OBiuetlOOBiOS4i+OBleOBhFwiLFxyXG4gIG51bWVyaWNFcnJvcjogXCLmlbDlrZfjgafjgZToqJjlhaXkuIvjgZXjgYRcIixcclxuICB0ZXh0TWluTGVuZ3RoOiBcInswfSDmloflrZfku6XkuIrjgaflhaXlipvjgZfjgabkuIvjgZXjgYRcIixcclxuICBtaW5Sb3dDb3VudEVycm9yOiBcInswfeihjOS7peS4iuOBp+WFpeWKm+OBl+OBpuS4i+OBleOBhFwiLFxyXG4gIG1pblNlbGVjdEVycm9yOiBcInswfeeorumhnuS7peS4iuOCkumBuOaKnuOBl+OBpuS4i+OBleOBhFwiLFxyXG4gIG51bWVyaWNNaW46IFwiJ3swfScg44Gv5ZCM562J44GLezF944KI44KK5aSn44GN44GP44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KTXCIsXHJcbiAgbnVtZXJpY01heDogXCInezB9JyDjga/lkIznrYnjgYt7MX3jgojjgorlsI/jgZXjgY/jgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpNcIixcclxuICBpbnZhbGlkRW1haWw6IFwi5pyJ5Yq544Gq44Oh44O844Or44Ki44OJ44Os44K544KS44GU6KiY5YWl5LiL44GV44GEXCIsXHJcbiAgZXhjZWVkTWF4U2l6ZTogXCLjg5XjgqHjgqTjg6vjga7jgrXjgqTjgrrjga97MH3jgpLotoXjgYjjgabjga/jgYTjgZHjgb7jgZvjgpNcIixcclxuICB1cGxvYWRpbmdGaWxlOlxyXG4gICAgXCLjg5XjgqHjgqTjg6vjgpLjgqLjg4Pjg5fjg63jg7zjg4nkuK3jgafjgZnjgILjgZfjgbDjgonjgY/jgZfjgabjgYvjgonlho3luqbjgYroqabjgZfkuIvjgZXjgYRcIixcclxuICBsb2FkaW5nRmlsZTogXCLoqq3jgb/ovrzjgb/kuK1cIixcclxuICBjaG9vc2VGaWxlOiBcIuODleOCoeOCpOODq+OCkumBuOaKnlwiLFxyXG4gIGNsZWFuQ2FwdGlvbjogXCLliYrpmaRcIixcclxuICBjbGVhckNhcHRpb246IFwi56m655m9XCIsXHJcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwi44GT44Gu44OV44Kh44Kk44Or44KS5YmK6ZmkXCJcclxufTtcclxuXHJcbi8vVW5jb21tZW50IHRoZXNlIHR3byBsaW5lcyBvbiBjcmVhdGluZyBhIHRyYW5zbGF0aW9uIGZpbGUuIFlvdSBzaG91bGQgcmVwbGFjZSBcImVuXCIgYW5kIGVuU3RyaW5ncyB3aXRoIHlvdXIgbG9jYWxlIChcImZyXCIsIFwiZGVcIiBhbmQgc28gb24pIGFuZCB5b3VyIHZhcmlhYmxlLlxyXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImphXCJdID0gamFwYW5lc2VTdXJ2ZXlTdHJpbmdzO1xyXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJqYVwiXSA9IFwi5pel5pys6KqeXCI7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vamFwYW5lc2UudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGtvcmVhblN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLsnbTsoIRcIixcbiAgcGFnZU5leHRUZXh0OiBcIuuLpOydjFwiLFxuICBjb21wbGV0ZVRleHQ6IFwi7JmE66OMXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCLsi5zsnpFcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLquLDtg4Ao7ISk66qFKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwi7Y6Y7J207KeAIHsxfSDspJEgezB9XCIsXG4gIGVtcHR5U3VydmV5OiBcIuyEpOusuOyngOyXkCDrs7Tsl6zsp4DripQg7Y6Y7J207KeA64KYIOyniOusuOydtCDsl4bsirXri4jri6RcIixcbiAgY29tcGxldGluZ1N1cnZleTogXCLshKTrrLgg7KGw7IKs66W8IOyZhOujjO2VtCDso7zshZTshJwg6rCQ7IKs7ZWp64uI64ukIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOiBcIuq4sOuhneyXkCDrlLDrpbTrqbQg7J2066+4IOyEpOusuCDsobDsgqzrpbwg66eI7LmY7IWo7Iq164uI64ukLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIuyEpOusuOyhsOyCrOqwgCDroZzrk5zspJHsnoXri4jri6QuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwi7ISg7YOd7ZWY7Iut7Iuc7JikLi4uXCIsXG4gIHZhbHVlOiBcIuqwklwiLFxuICByZXF1aXJlZEVycm9yOiBcIuyniOusuOyXkCDri7XtlZjsi5zsmKQuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIu2VmOuCmCDsnbTsg4HsnZgg7KeI66y47JeQIOuLte2VmOyLreyLnOyYpC5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLrqqjrk6Ag7ZaJ7JeQIOyeiOuKlCDsp4jrrLjsl5Ag64u17ZWY7Iut7Iuc7JikLlwiLFxuICBudW1lcmljRXJyb3I6IFwi6rCS7J2AIOyIq+yekOyXrOyVvCDtlanri4jri6QuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi64u167OA7J2YIOq4uOydtOuKlCDstZzshowgezB97J6Q7Jes7JW8IOyeheuLiOuLpC5cIixcbiAgdGV4dE1heExlbmd0aDogXCLri7Xrs4DsnZgg6ri47J2064qUIHswfeyekOulvCDstIjqs7wg7ZWgIOyImCDsl4bsirXri4jri6QuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi64u167OA7J2YIOq4uOydtOuKlCB7MH0gLSB7MX3snpAg7IKs7J207Jes7JW8IO2VqeuLiOuLpC5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLstZzshowgezB96rCc7J2YIO2WieydhCDssYTsmrDsi63si5zsmKRcIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi7LWc7IaMIHswfeqwnOydmCDrs4DsiJjrpbwg7ISg7YOd7ZWY7Iut7Iuc7JikLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLstZzrjIAgezB96rCc7J2YIOuzgOyImOulvCDshKDtg53tlZjsi63si5zsmKQuXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwiJ3swfSfsnYAgezF967O064ukIO2BrOqxsOuCmCDqsJnqs6AgezJ967O064ukIOyekeqxsOuCmCDqsJnslYTslbztlanri4jri6QuXCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfSfsnYAgezF967O064ukIO2BrOqxsOuCmCDqsJnslYTslbztlanri4jri6QuXCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfSfsnYAgezF967O064ukIOyekeqxsOuCmCDqsJnslYTslbztlanri4jri6QuXCIsXG4gIGludmFsaWRFbWFpbDogXCLsmKzrsJTrpbgg7J2066mU7J28IOyjvOyGjOulvCDsnoXroKXtlZjsi63si5zsmKQuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIu2RnO2YhOyLnTogezB97J2AICfssLgn7J207Ja07JW8IO2VqeuLiOuLpC5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIid7MH0n7Jy866GcIOyemOuqu+uQnCDsmpTssq3snoXri4jri6QuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwi67mE7Ja07J6I64qUIOuNsOydtO2EsOulvCDsmpTssq3tlojqsbDrgpgg7J6Y66q765CcIOyGjeyEseydmCDqsr3roZzsnoXri4jri6QuXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi7YyM7J28IO2BrOq4sOqwgCB7MH3snYQg7LSI6rO8IO2VoCDsiJgg7JeG7Iq164uI64ukLlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi64uk66W4IOyniOusuOydhCDsnpHshLHtlZjsi63si5zsmKQuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6IFwi7YyM7J28IOyXheuhnOuTnCDspJHsnoXri4jri6QuIOyeoOyLnCDtm4Qg64uk7IucIOyLnOuPhO2VmOyLreyLnOyYpC5cIixcbiAgbG9hZGluZ0ZpbGU6IFwi66Gc65OcIOykkS4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIu2MjOydvCDshKDtg50uLi5cIixcbiAgY29uZmlybURlbGV0ZTogXCLquLDroZ3snYQg7IKt7KCc7ZWY7Iuc6rKg7Iq164uI6rmMP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIiDsnbQg6rCS7J2AIOqzoOycoO2VtOyVvO2VqeuLiOuLpC5cIixcbiAgYWRkQ29sdW1uOiBcIuyXtCDstpTqsIBcIixcbiAgYWRkUm93OiBcIu2WiSDstpTqsIBcIixcbiAgcmVtb3ZlUm93OiBcIuygnOqxsFwiLFxuICBhZGRQYW5lbDogXCLsg4jroa3qsowg7LaU6rCAXCIsXG4gIHJlbW92ZVBhbmVsOiBcIuygnOqxsFwiLFxuICBjaG9pY2VzX0l0ZW06IFwi7ZWt66qpXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi7Je0XCIsXG4gIG1hdHJpeF9yb3c6IFwi7ZaJXCIsXG4gIHNhdmluZ0RhdGE6IFwi6rKw6rO86rCAIOyEnOuyhOyXkCDsoIDsnqUg7KSR7J6F64uI64ukLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLsmKTrpZjqsIAg67Cc7IOd7ZWY7JesIOqysOqzvOulvCDsoIDsnqXtlaAg7IiYIOyXhuyKteuLiOuLpC5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi6rKw6rO86rCAIOyEseqzteyggeycvOuhnCDsoIDsnqXrkJjsl4jsirXri4jri6QhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLri6Tsi5wg7Iuc64+E7ZWY7Iut7Iuc7JikXCIsXG4gIHRpbWVyTWluOiBcIuu2hFwiLFxuICB0aW1lclNlYzogXCLstIhcIixcbiAgdGltZXJTcGVudEFsbDogXCLtmITsnqwg7Y6Y7J207KeA7JeQ7IScIHswfeydhCDshozsmpTtlbQg7LSdIHsxfeydtCDqsbjroLjsirXri4jri6QuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIu2YhOyerCDtjpjsnbTsp4Dsl5DshJwgezBd7J20IOqxuOuguOyKteuLiOuLpFwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIuy0nSB7MH3snbQg6rG466C47Iq164uI64ukLlwiLFxuICB0aW1lckxpbWl0QWxsOiBcIu2YhOyerCDtjpjsnbTsp4Dsl5DshJwgezB9L3sxfeydhCDshozsmpTtlbQg7LSdIHsyfS97M33snbQg6rG466C47Iq164uI64ukLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLtmITsnqwg7Y6Y7J207KeA7JeQ7IScIHswfS97MX3snbQg6rG466C47Iq164uI64ukLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIuy0nSB7MH0vezF97J20IOqxuOuguOyKteuLiOuLpC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIuuLpuq4sFwiLFxuICBjbGVhckNhcHRpb246IFwi7KeA7Jqw6riwXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wia29cIl0gPSBrb3JlYW5TdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wia29cIl0gPSBcIu2VnOq1reyWtFwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9rb3JlYW4udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGxhdHZpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiQXRwYWthxLxcIixcbiAgcGFnZU5leHRUZXh0OiBcIlTEgWzEgWtcIixcbiAgY29tcGxldGVUZXh0OiBcIlBhYmVpZ3RcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIkxhcHB1c2UgezB9IG5vIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJOYXYgbmV2aWVuYSBqYXV0xIFqdW1hLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlBhdGVpY2FtaWVzIEp1bXMgcGFyIGFua2V0YXMgYWl6cGlsZMSrxaFhbnUhXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiSWVsxIFkZSBubyBzZXJ2ZXJhLi4uXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiQ2l0cyAobMWrZHp1LCBhcHJha3N0aWV0ISlcIixcbiAgb3B0aW9uc0NhcHRpb246IFwiSXp2xJNsxJN0aWVzLi4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiTMWrZHp1LCBhdGJpbGRpZXQgdXogamF1dMSBanVtdSFcIixcbiAgbnVtZXJpY0Vycm9yOiBcIkF0YmlsZGVpIGlyIGrEgWLFq3Qgc2thaXRsaW0uXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiTMWrZHp1LCBpZXZhZGlldCB2aXNtYXogezB9IHNpbWJvbHVzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJMxatkenUsIGl6dsSTbGlldGllcyB2aXNtYXogezB9IHZhcmlhbnR1LlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJMxatkenUsIGl6dsSTbGlldGllcyBuZSB2YWlyYWsgcGFyIHswfSB2YXJpYW50aWVtLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgasSBYsWrdCB2aWVuxIFkYW0gdmFpIGxpZWzEgWthbSBuZWvEgSB7MX0sIHVuIHZpZW7EgWRhbSB2YWkgbWF6xIFrYW0sIG5la8SBIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGrEgWLFq3QgdmllbsSBZGFtIHZhaSBsaWVsxIFrYW0gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgasSBYsWrdCB2aWVuxIFkYW0gdmFpIGxpZWzEgWthbSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIkzFq2R6dSwgaWV2YWRpZXQgcGF0aWVzdSBlLXBhc3RhIGFkcmVzaSFcIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiAnTMWrZHp1LCBpZXZhZGlldCBkYXR1cyBsYXVrxIEgXCJDaXRzXCInXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImx2XCJdID0gbGF0dmlhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJsdlwiXSA9IFwibGF0dmllxaF1XCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2xhdHZpYW4udHMiLCIvL1VuY29tbWVudCB0aGlzIGxpbmUgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlXG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGxpdGh1YW5pYVN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJBdGdhbFwiLFxuICBwYWdlTmV4dFRleHQ6IFwiVG9saWF1XCIsXG4gIGNvbXBsZXRlVGV4dDogXCJCYWlndGlcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlByYWTEl3RpXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiS2l0YSAoxK92ZXN0aSlcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIk7El3JhXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlBhc2lyaW5rdGkgdmlzdXNcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlB1c2xhcGlzIHswfSBpxaEgezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIkFwa2xhdXNvamUgbsSXcmEgbWF0b21vIHB1c2xhcGlvIGFyIGtsYXVzaW1vLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkTEl2tvamFtZSB1xb4gZGFseXZhdmltxIUgYXBrbGF1c29qZSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIk3Fq3PFsyDEr3JhxaFhaSByb2RvLCBrYWQgamF1IGF0bGlrb3RlIMWhacSFIGFwa2xhdXPEhS5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJQcmHFoW9tZSBwYWxhdWt0aS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJQYXNpcmlua3RpLi4uXCIsXG4gIHZhbHVlOiBcInJlaWvFoW3El1wiLFxuICByZXF1aXJlZEVycm9yOiBcIkLFq3RpbmEgYXRzYWt5dGkgxK8gxaHEryBrbGF1c2ltxIUuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIkLFq3RpbmEgYXRzYWt5dGkgYmVudCDEryB2aWVuxIUga2xhdXNpbcSFLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlByYcWhb21lIGF0c2FreXRpIMSvIGtsYXVzaW11cyB2aXNvc2UgZWlsdXTEl3NlLlwiLFxuICBudW1lcmljRXJyb3I6IFwiVHVyaSBixat0aSBza2FpxI1pYWkuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiUHJhxaFvbWUgc3V2ZXN0aSBiZW50IHswfSBzaW1ib2xpdXMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUHJhxaFvbWUgc3V2ZXN0aSBtYcW+aWF1IG5laSB7MH0gc2ltYm9sacWzLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlByYcWhb21lIHN1dmVzdGkgZGF1Z2lhdSBuZWkgezB9IGlyIG1hxb5pYXUgbmVpIHsxfSBzaW1ib2xpxbMuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiUHJhxaFvbWUgc3V2ZXN0aSBuZSBtYcW+aWF1IG5laSB7MH0gZWlsdcSNacWzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJQcmHFoW9tZSBwYXNpcmlua3RpIGJlbnQgezB9IHZhcmlhbnTFsy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiUGFzaXJpbmtpdGUgbmUgZGF1Z2lhdSBrYWlwIHswfSB2YXJpYW50dXMuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyB0dXJpIGLFq3RpIGx5Z3VzIGFyYmEgZGlkZXNuaXMgbmVpIHsxfSBpciBseWd1cyBhcmJhIG1hxb5lc25pcyBuZWkgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgdHVyxJd0xbMgYsWrdGkgbHlndXMgYXJiYSBkaWRlc25pcyBuZWkgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgdHVyxJd0xbMgYsWrdGkgbHlndXMgYXIgbWHFvmVzbmlzIHXFviB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlByYcWhb21lIMSvdmVzdGkgZ2FsaW9qYW50xK8gZWxla3Ryb25pbmlvIHBhxaF0byBhZHJlc8SFLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJSZWlrxaFtxJc6IHswfSB0dXJpIGdyxIXFvmludGkgJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiVcW+a2xhdXNhIGdyxIXFvmlubyBrbGFpZMSFJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJVxb5rbGF1c2EgZ3LEhcW+aW5vIHR1xaHEjWl1cyBkdW9tZW5pcyBhcmJhICdwYXRoJyBzYXZ5YsSXIHlyYSBuZXRlaXNpbmdhXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRmFpbG8gZHlkaXMgbmV0dXJpIHZpcsWheXRpIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIsSudmVza2l0ZSBraXTEhSByZWlrxaFtxJkuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJKxatzxbMgZmFpbGFzIHlyYSBrZWxpYW1hcy4gUGFsYXVraXRlIGtlbGV0xIUgc2VrdW5kxb5pxbMgaXIgYmFuZHlraXRlIGRhciBrYXJ0xIUuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIlByYcWhb21lIHBhbGF1a3RpLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiUGFzaXJpbmt0aSBmYWlsxIUodXMpLi4uXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiQXIgbm9yaXRlIGnFoXRyaW50aSDEr3JhxaHEhT9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLFoGkgcmVpa8WhbcSXIHR1csSXdMWzIGLFq3RpIHVuaWthbGkuXCIsXG4gIGFkZENvbHVtbjogXCJQcmlkxJd0aSBzdHVscGVsxK9cIixcbiAgYWRkUm93OiBcIlByaWTEl3RpIGVpbHV0xJlcIixcbiAgcmVtb3ZlUm93OiBcIknFoXRyaW50aVwiLFxuICBhZGRQYW5lbDogXCJQcmlkxJd0aSBuYXVqxIVcIixcbiAgcmVtb3ZlUGFuZWw6IFwiScWhdHJpbnRpXCIsXG4gIGNob2ljZXNfSXRlbTogXCJlbGVtZW50YXNcIixcbiAgbWF0cml4X2NvbHVtbjogXCJTdHVscGVsaXNcIixcbiAgbWF0cml4X3JvdzogXCJFaWx1dMSXXCIsXG4gIHNhdmluZ0RhdGE6IFwiUmV6dWx0YXRhaSBzYXVnb21pIHNlcnZlcnlqZS4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwixK52eWtvIGtsYWlkYSBpciBtZXMgbmVnYWzEl2pvbWUgacWhc2F1Z290aSByZXp1bHRhdMWzLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJSZXp1bHRhdGFpIGJ1dm8gacWhc2F1Z290aSBzxJdrbWluZ2FpIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiQmFuZHl0aSBkYXIga2FydMSFXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWtcIixcbiAgdGltZXJTcGVudEFsbDogXCJQcmFsZWlkb3RlIHswfSDFoWlhbWUgcHVzbGFweWplIGlyIHsxfSBpxaEgdmlzby5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiUHJhbGVpZG90ZSB7MH0gxaFpYW1lIHB1c2xhcHlqZS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJQcmFsZWlkb3RlIHswfSBpxaEgdmlzby5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIlByYWxlaWRvdGUgezB9IGnFoSB7MX0gxaFpYW1lIHB1c2xhcHlqZSBpciB7Mn0gacWhIHszfSBpxaEgdmlzby5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiUHJhbGVpZG90ZSB7MH0gacWhIHsxfSDFoWlhbWUgcHVzbGFweWplLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIlByYWxlaWRvdGUgezB9IGnFoSB7MX0gacWhIHZpc28uXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJJxaF2YWx5dGlcIixcbiAgY2xlYXJDYXB0aW9uOiBcIlZhbHl0aVwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJJxaF0cmludGkgxaHEryBmYWlsxIVcIlxufTtcblxuLy9VbmNvbW1lbnQgdGhlc2UgdHdvIGxpbmVzIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZS4gWW91IHNob3VsZCByZXBsYWNlIFwiZW5cIiBhbmQgZW5TdHJpbmdzIHdpdGggeW91ciBsb2NhbGUgKFwiZnJcIiwgXCJkZVwiIGFuZCBzbyBvbikgYW5kIHlvdXIgdmFyaWFibGUuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImx0XCJdID0gbGl0aHVhbmlhU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImx0XCJdID0gXCJMaWV0dXZpxbNcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vbGl0aHVhbmlhbi50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgbm9yd2VnaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkZvcnJpZ2VcIixcbiAgcGFnZU5leHRUZXh0OiBcIk5lc3RlXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJGdWxsZsO4clwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiU3RhcnRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJBbm5ldCAoYmVza3JpdilcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNpZGUgezB9IGF2IHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJEZXQgZXIgaW5nZW4gc3lubGlnIHNpZGUgZWxsZXIgc3DDuHJzbcOlbCBpIHVuZGVyc8O4a2Vsc2VuLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlRha2sgZm9yIGF0IGR1IGZ1bGxmw7hydGUgdW5kZXJzw7hrZWxzZW4hXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJWw6VyZSBkYXRhIHZpc2VyIGF0IGR1IGFsbGVyZWRlIGhhciBnamVubm9tZsO4cnQgZGVubmUgdW5kZXJzw7hrZWxzZW4uXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiVW5kZXJzw7hrZWxzZW4gbGFzdGVyLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlZlbGcuLi5cIixcbiAgdmFsdWU6IFwidmVyZGlcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJWZW5ubGlnc3Qgc3ZhciBww6Ugc3DDuHJzbcOlbGV0LlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJWZW5ubGlnc3Qgc3ZhciBww6UgbWluc3QgZXR0IHNww7hyc23DpWwuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiVmVubmxpZ3N0IHN2YXIgcMOlIHNww7hyc23DpWwgaSBhbGxlIHJhZGVyLlwiLFxuICBudW1lcmljRXJyb3I6IFwiVmVyZGllbiBza2FsIHbDpnJlIG51bWVyaXNrLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlZlbm5saWdzdCBza3JpdiBpbm4gbWluc3QgezB9IHRlZ24uXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiVmVubmxpZ3N0IHNrcml2IGlubiBtaW5kcmUgZW5uIHswfSB0ZWduLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlZlbm5saWdzdCBza3JpdiBpbm4gbWVyIGVubiB7MH0gb2cgbWluZHJlIGVubiB7MX0gdGVnbi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJWZW5ubGlnc3QgZnlsbCBpbm4gbWluc3QgezB9IHJhZGVyLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJWZW5ubGlnc3QgdmVsZyBtaW5zdCB7MH0gdmFyaWFudGVyLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJWZW5ubGlnc3QgaWtrZSB2ZWxnIG1lciBlbm4gezB9IHZhcmlhbnRlci5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIGLDuHIgdsOmcmUgbGlrIGVsbGVyIG1lciBlbm4gezF9IG9nIGxpayBlbGxlciBtaW5kcmUgZW5uIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGLDuHIgdsOmcmUgbGlrIGVsbGVyIG1lciBlbm4gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgYsO4ciB2w6ZyZSBsaWsgZWxsZXIgbWluZHJlIGVubiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlZlbm5saWdzdCBza3JpdiBpbm4gZW4gZ3lsZGlnIGUtcG9zdCBhZHJlc3NlLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiRm9yZXNww7hyc2VsZW4gcmV0dXJuZXJ0ZSBmZWlsZW4gJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJGb3Jlc3DDuHJzZWxlbiByZXR1cm5lcnRlIHRvbW1lIGRhdGEsIGVsbGVyICdzdGknIC1lZ2Vuc2thcGVuIGVyIGZlaWxcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJGaWxzdMO4cnJlbHNlbiBiw7hyIGlra2Ugb3ZlcnN0aWdlIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlZlbm5saWdzdCBza3JpdiBpbm4gZGVuIGFuZHJlIHZlcmRpZW4uXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJGaWxlbiBkaW4gbGFzdGVzIG9wcC4gVmVubmxpZ3N0IHZlbnQgbm9lbiBzZWt1bmRlciBvZyBwcsO4diBpZ2plbi5cIixcbiAgY29uZmlybURlbGV0ZTogXCLDmG5za2VyIGR1IMOlIHNsZXR0ZSBwb3N0ZW4/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiRGVubmUgdmVyZGllbiBza2FsIHbDpnJlIHVuaWsuXCIsXG4gIGFkZFJvdzogXCJMZWdnIHRpbCByYWRcIixcbiAgcmVtb3ZlUm93OiBcIkZqZXJuXCIsXG4gIGFkZFBhbmVsOiBcIkxlZ2cgdGlsIG55XCIsXG4gIHJlbW92ZVBhbmVsOiBcIkZqZXJuZVwiLFxuICBjaG9pY2VzX0l0ZW06IFwiZWxlbWVudFwiLFxuICBtYXRyaXhfY29sdW1uOiBcIktvbG9ubmVcIixcbiAgbWF0cml4X3JvdzogXCJSYWRcIixcbiAgc2F2aW5nRGF0YTogXCJSZXN1bHRhdGVuZSBsYWdyZXMgcMOlIHNlcnZlcmVuIC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiRGV0IG9wcHN0byBlbiBmZWlsLCBvZyB2aSBrdW5uZSBpa2tlIGxhZ3JlIHJlc3VsdGF0ZW5lLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJSZXN1bHRhdGVuZSBibGUgbGFncmV0IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUHLDuHYgaWdqZW5cIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNla1wiLFxuICB0aW1lclNwZW50QWxsOiBcIkR1IGhhciB0aWxicmFrdCB7MH0gcMOlIGRlbm5lIHNpZGVuIG9nIHsxfSB0b3RhbHQuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIkR1IGhhciB0aWxicmFrdCB7MH0gcMOlIGRlbm5lIHNpZGVuLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIkR1IGhhciB0aWxicmFrdCB7MH0gdG90YWx0LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiRHUgaGFyIHRpbGJyYWt0IHswfSBhdiB7MX0gcMOlIGRlbm5lIHNpZGVuIG9nIHRvdGFsdCB7Mn0gYXYgezN9LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJEdSBoYXIgdGlsYnJha3QgezB9IGF2IHsxfSBww6UgZGVubmUgc2lkZW4uXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiRHUgaGFyIHRpbGJyYWt0IHswfSBhdiB7MX0gdG90YWx0LlwiLFxuICBjbGVhbkNhcHRpb246IFwiUmVuc1wiXG59O1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJub1wiXSA9IG5vcndlZ2lhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJub1wiXSA9IFwibm9yc2tcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vbm9yd2VnaWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBwZXJzaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcItmC2KjZhNuMXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLYqNi52K/bjFwiLFxuICBjb21wbGV0ZVRleHQ6IFwi2KraqdmF24zZhFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcItiv24zar9ixKNiq2YjYttuM2K0pXCIsXG4gIHByb2dyZXNzVGV4dDogXCLYtdmB2K3ZhyB7MH0g2KfYsiB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwi2LXZgdit2Ycg2KfbjCDbjNinINqv2LLbjNmG2Ycg2KfbjCDYqNix2KfbjCDYp9uM2YYg2b7Ysdiz2LTZhtin2YXZhyDZhdmI2KzZiNivINmG24zYs9iqLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcItin2LIg2LTZhdinINio2KfYqNiqINiq2qnZhduM2YQg2KfbjNmGINm+2LHYs9i02YbYp9mF2Ycg2YXYqti02qnYsduM2YVcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcItio2Ycg2YbYuNixINmF24wg2LHYs9ivINmH2YUg2YfZhSDYp9qp2YbZiNmGINm+2LHYs9i02YbYp9mF2Ycg2LHYpyDYqtqp2YXbjNmEINqp2LHYr9mHINin24zYry5cIixcbiAgbG9hZGluZ1N1cnZleTogXCLYr9ix2K3Yp9mEINin24zYrNin2K8g2b7Ysdiz2LTZhtin2YXZh1wiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLYp9mG2KrYrtin2Kgg2qnZhtuM2K8uLi5cIixcbiAgdmFsdWU6IFwi2YXZgtiv2KfYsVwiLFxuICByZXF1aXJlZEVycm9yOiBcItmE2LfZgdinINio2Ycg2LPZiNin2YQg2b7Yp9iz2K4g2K/Zh9uM2K9cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLZhNi32YHYpyDYqNmHINiq2YXYp9mFINiz2LfYsSDZh9in24wg2LPZiNin2YTYp9iqINm+2KfYs9iuINiv2YfbjNivXCIsXG4gIG51bWVyaWNFcnJvcjogXCLZhdmC2K/Yp9ixINio2KfbjNivINi52K/Yr9uMINio2KfYtNivXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi2YTYt9mB2Kcg2K3Yr9in2YLZhCAgezB9INit2LHZgSDZiNin2LHYryDaqdmG24zYr1wiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcItmE2LfZgdinINqp2YXYqtixINin2LIgIHswfSDYrdix2YEg2YjYp9ix2K8g2qnZhtuM2K8uXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi2YTYt9mB2Kcg2KjbjNi02KrYsSDYp9iyICB7MH0g2K3YsdmBINmIINqp2YXYqtixINin2LIgezF9INit2LHZgSDZiNin2LHYryDaqdmG24zYry5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLZhNi32YHYpyDYrdiv2KfZgtmEIHswfSDYs9i32LEg2YjYp9ix2K8g2qnZhtuM2K8uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcItit2K/Yp9mC2YQgezB9INin2YbYqtiu2KfYqCDaqdmG24zYry5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi2YTYt9mB2Kcg2KjbjNi02KrYsSDYp9iyICB7MH0g2KfZhtiq2K7Yp9ioINqp2YbbjNivLlwiLFxuICBudW1lcmljTWluTWF4OiBcIid7MH0nINio2KfbjNivINio24zZhiB7MX0g2YggezJ9INio2KfYtNivXCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScg2KjYstix2q/YqtixINmF2LPYp9mI24wgezF9INio2KfYtNivXCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScg2KjYp9uM2K8g2qnZiNqG2qnYqtixINuM2Kcg2YXYs9in2YjbjCB7MX0g2KjYp9i02K9cIixcbiAgaW52YWxpZEVtYWlsOiBcItmE2LfZgdinINin24zZhduM2YQg2LXYrduM2K0g2K/YsdisINqp2YbbjNivXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLYr9ix2K7ZiNin2LPYqiDYqNinINiu2LfYpyDYsdmI2KjYsdmIINi02K86ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcItiv2LHYrtmI2KfYs9iqINmF2LPbjNix24wg2K7Yp9mE24wg2KjYp9iy2q/YtNiqINiv2KfYr9mHINuM2Kcg2YXYs9uM2LEg2K/Ysdiz2Kog2KrZhti424zZhSDZhti02K/Zh1wiLFxuICBleGNlZWRNYXhTaXplOiBcItio24zYtNiq2LHbjNmGINit2KzZhSDZhdis2KfYsiDZgdin24zZhDogezB9XCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLZhdmC2K/Yp9ixICfYr9uM2q/YsScg2LHYpyDZiNin2LHYryDaqdmG24zYr1wiLFxuICB1cGxvYWRpbmdGaWxlOiBcItmB2KfbjNmEINiv2LEg2K3Yp9mEINii24zZhNmI2K8g2YXbjCDYqNin2LTYry4g2YTYt9mB2Kcg2LXYqNixINqp2YbbjNivLlwiLFxuICBjb25maXJtRGVsZXRlOiBcItii24zYpyDZhdin24zZhCDYqNmHINit2LDZgSDYp9uM2YYg2LHYr9uM2YEg2YfYs9iq24zYr9ifXCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi2KfbjNmGINmF2YLYr9in2LEg2KjYp9uM2K8g2LrbjNixINiq2qnYsdin2LHbjCDYqNin2LTYr1wiLFxuICBhZGRSb3c6IFwi2LPYt9ixINis2K/bjNivXCIsXG4gIHJlbW92ZVJvdzogXCLYrdiw2YFcIixcbiAgYWRkUGFuZWw6IFwi2KzYr9uM2K9cIixcbiAgcmVtb3ZlUGFuZWw6IFwi2K3YsNmBXCIsXG4gIGNob2ljZXNfSXRlbTogXCLYotuM2KrZhVwiLFxuICBtYXRyaXhfY29sdW1uOiBcItiz2KrZiNmGXCIsXG4gIG1hdHJpeF9yb3c6IFwi2LPYt9ixXCIsXG4gIHNhdmluZ0RhdGE6IFwi2YbYqtin24zYrCDYr9ixINit2KfZhCDYsNiu24zYsdmHINiz2KfYstuMINiv2LEg2LPYsdmI2LEg2YXbjCDYqNin2LTYr1wiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwi2K7Yt9in24zbjCDYr9ixINiw2K7bjNix2Ycg2LPYp9iy24wg2YbYqtin24zYrCDYsdiuINiv2KfYr9mHINin2LPYqlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLZhtiq2KfbjNisINio2Kcg2YXZiNmB2YLbjNiqINiw2K7bjNix2Ycg2LTYr1wiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi2YXYrNiv2K8g2KrZhNin2LQg2qnZhtuM2K9cIlxufTtcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZmFcIl0gPSBwZXJzaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImZhXCJdID0gXCLZgdin2LHZktiz2ZDZiVwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9wZXJzaWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBwb2xpc2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiV3N0ZWN6XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJEYWxlalwiLFxuICBjb21wbGV0ZVRleHQ6IFwiR290b3dlXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiSW5uYSBvZHBvd2llZMW6ICh3cGlzeilcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlN0cm9uYSB7MH0geiB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTmllIG1hIHdpZG9jem55Y2ggcHl0YcWELlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkR6acSZa3VqZW15IHphIHd5cGXFgm5pZW5pZSBhbmtpZXR5IVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIlRyd2Egd2N6eXR5d2FuaWUgYW5raWV0eS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJXeWJpZXJ6Li4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiUHJvc3rEmSBvZHBvd2llZHppZcSHIG5hIHRvIHB5dGFuaWUuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiUHJvc3rEmSBvZHBvd2llZHppZcSHIG5hIHdzenlzdGtpZSBweXRhbmlhLlwiLFxuICBudW1lcmljRXJyb3I6IFwiVyB0eW0gcG9sdSBtb8W8bmEgd3Bpc2HEhyB0eWxrbyBsaWN6YnkuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiUHJvc3rEmSB3cGlzYcSHIGNvIG5ham1uaWVqIHswfSB6bmFrw7N3LlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlByb3N6xJkgd3Bpc2HEhyBtbmllaiBuacW8IHswfSB6bmFrw7N3LlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlByb3N6xJkgd3Bpc2HEhyB3acSZY2VqIG5pxbwgezB9IGkgbW5pZWogbmnFvCB7MX0gem5ha8Ozdy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJQcm9zesSZIHV6dXBlxYJuacSHIHByenluYWptbmllaiB7MH0gd2llcnN6eS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiUHJvc3rEmSB3eWJyYcSHIGNvIG5ham1uaWVqIHswfSBwb3p5Y2ppLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJQcm9zesSZIHd5YnJhxIcgbmllIHdpxJljZWogbmnFvCB7MH0gcG96eWNqaS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIk9kcG93aWVkxbogJ3swfScgcG93aW5uYSBiecSHIHdpxJlrc3phIGx1YiByw7N3bmEgezF9IG9yYXogbW5pZWpzemEgbHViIHLDs3duYSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJPZHBvd2llZMW6ICd7MH0nIHBvd2lubmEgYnnEhyB3acSZa3N6YSBsdWIgcsOzd25hIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIk9kcG93aWVkxbogJ3swfScgcG93aW5uYSBiecSHIG1uaWVqc3phIGx1YiByw7N3bmEgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJQcm9zesSZIHBvZGHEhyBwcmF3aWTFgm93eSBhZHJlcyBlbWFpbC5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIsW7xIVkYW5pZSB6d3LDs2NpxYJvIGLFgsSFZCAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIsW7xIVkYW5pZSBuaWUgendyw7NjacWCbyBkYW55Y2ggYWxibyDFm2NpZcW8a2EgamVzdCBuaWVwcmF3aWTFgm93YVwiLFxuICBleGNlZWRNYXhTaXplOiBcIlJvem1pYXIgcHJ6ZXPFgmFuZWdvIHBsaWt1IG5pZSBtb8W8ZSBwcnpla3JhY3phxIcgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiUHJvc3rEmSBwb2RhxIcgaW5uxIUgb2Rwb3dpZWTFui5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIlRyd2EgcHJ6ZW5vc3plbmllIFR3b2plZ28gcGxpa3UsIHByb3N6xJkgc3Byw7Nib3dhxIcgcG9ub3duaWUgemEga2lsa2Egc2VrdW5kLlwiLFxuICBhZGRSb3c6IFwiRG9kYWogd2llcnN6XCIsXG4gIHJlbW92ZVJvdzogXCJVc3XFhFwiLFxuICBhZGRQYW5lbDogXCJEb2RhaiBwYW5lbFwiLFxuICByZW1vdmVQYW5lbDogXCJVc3XFhFwiLFxuICBjaG9pY2VzX0l0ZW06IFwiZWxlbWVudFwiLFxuICBtYXRyaXhfY29sdW1uOiBcIktvbHVtbmFcIixcbiAgbWF0cml4X3JvdzogXCJXaWVyc3pcIixcbiAgc2F2aW5nRGF0YTogXCJaYXBpc3VqxJkgd3luaWtpIGFua2lldHkgbmEgc2Vyd2VyemUuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIld5c3TEhXBpxYIgYsWCxIVkIGkgd3luaWtpIG5pZSBtb2fFgnkgem9zdGHEhyB6YXBpc2FuZS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiV3luaWtpIHpvc3RhxYJ5IHBvcHJhd25pZSB6YXBpc2FuZSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlNwcsOzYnVqIHBvbm93bmllXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWtcIixcbiAgdGltZXJTcGVudEFsbDogXCJTcMSZZHppxYJlxZsgezB9IG5hIHRlaiBzdHJvbmllIGEgdyBzdW1pZSB7MX0uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIlNwxJlkemnFgmXFmyB7MH0gbmEgdGVqIHN0cm9uaWUuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiU3DEmWR6acWCZcWbIHcgc211bWllIHswfS5cIixcbiAgdGltZXJMaW1pdEFsbDogXCJTcMSZZHppxYJlxZsgezB9IHogezF9IG5hIHRlaiBzdHJvbmllIGEgdyBzdW1pZSB7Mn0geiB7M30uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIlNwxJlkemnFgmXFmyB7MH0geiB7MX0gbmEgdGVqIHN0cm9uaWVcIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJTcMSZZHppxYJlxZsgezB9IHogezF9LlwiLFxuICBjbGVhbkNhcHRpb246IFwiV3ljennFm8SHXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wicGxcIl0gPSBwb2xpc2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wicGxcIl0gPSBcInBvbHNraVwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9wb2xpc2gudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHBvcnR1Z3Vlc2VTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiQW50ZXJpb3JcIixcbiAgcGFnZU5leHRUZXh0OiBcIlByw7N4aW1vXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJGaW5hbGl6YXJcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkNvbWXDp2FyXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiT3V0cm9zIChkZXNjcmV2ZXIpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJOZW5odW1cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiU2VsZWNpb25hciBUb2Rvc1wiLFxuICBwcm9ncmVzc1RleHQ6IFwiUGFnaW5hIHswfSBkZSB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTsOjbyBow6EgcMOhZ2luYSB2aXPDrXZlbCBvdSBwZXJndW50YSBuYSBwZXNxdWlzYS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJPYnJpZ2FkbyBwb3IgZmluYWxpemFyIGEgcGVzcXVpc2EhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJOb3Nzb3MgcmVnaXN0cm9zIG1vc3RyYW0gcXVlIHZvY8OqIGrDoSBmaW5hbGl6b3UgYSBwZXNxdWlzYS5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJBIHBlc3F1aXNhIGVzdMOhIGNhcnJlZ2FuZG8uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiU2VsZWNpb25lLi4uXCIsXG4gIHZhbHVlOiBcInZhbG9yXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiUG9yIGZhdm9yLCByZXNwb25kYSBhIHBlcmd1bnRhLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJQb3IgZmF2b3IsIHJlc3BvbmRhIHBlbG8gbWVub3MgdW1hIHBlcmd1bnRhLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlBvciBmYXZvciwgcmVzcG9uZGEgYXMgcGVyZ3VudGFzIGVtIHRvZGFzIGFzIGxpbmhhcy5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIk8gdmFsb3IgZGV2ZSBzZXIgbnVtw6lyaWNvLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlBvciBmYXZvciwgaW5zaXJhIHBlbG8gbWVub3MgezB9IGNhcmFjdGVyZXMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUG9yIGZhdm9yLCBpbnNpcmEgbWVub3MgZGUgezB9IGNhcmFjdGVyZXMuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiUG9yIGZhdm9yLCBpbnNpcmEgbWFpcyBkZSB7MH0gZSBtZW5vcyBkZSB7MX0gY2FyYWN0ZXJlcy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJQcmVlbmNoYSBwZWxvIG1lbm9zIHswfSBsaW5oYXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlNlbGVjaW9uZSBwZWxvIG1lbm9zIHswfSBvcMOnw7Vlcy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiUG9yIGZhdm9yLCBzZWxlY2lvbmUgbsOjbyBtYWlzIGRvIHF1ZSB7MH0gb3DDp8O1ZXMuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJPICd7MH0nIGRldmUgc2VyIGlndWFsIG91IHN1cGVyaW9yIGEgezF9IGUgaWd1YWwgb3UgbWVub3IgcXVlIHsyfVwiLFxuICBudW1lcmljTWluOiBcIk8gJ3swfScgZGV2ZSBzZXIgaWd1YWwgb3Ugc3VwZXJpb3IgYSB7MX1cIixcbiAgbnVtZXJpY01heDogXCJPICd7MH0nIGRldmUgc2VyIGlndWFsIG91IGluZmVyaW9yIGEgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJQb3IgZmF2b3IsIGluZm9ybWUgdW0gZS1tYWlsIHbDoWxpZG8uXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkEgZXhwcmVzc8OjbzogezB9IGRldmUgcmV0b3JuYXIgJ3ZlcmRhZGVpcm8nLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiQSByZXF1aXNpw6fDo28gcmV0b3Jub3UgbyBlcnJvICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiQSByZXF1aXNpw6fDo28gbsOjbyByZXRvcm5vdSBkYWRvcyBvdSBvICdjYW1pbmhvJyBkYSByZXF1aXNpw6fDo28gbsOjbyBlc3TDoSBjb3JyZXRvXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiTyB0YW1hbmhvIGRvIGFycXVpdm8gbsOjbyBkZXZlIGV4Y2VkZXIgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiUG9yIGZhdm9yLCBpbmZvcm1lIG8gb3V0cm8gdmFsb3IuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJTZXUgYXJxdWl2byBlc3TDoSBzZW5kbyBjYXJyZWdhZG8uIFBvciBmYXZvciwgYWd1YXJkZSBhbGd1bnMgc2VndW5kb3MgZSB0ZW50ZSBub3ZhbWVudGUuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkNhcnJlZ2FuZG8uLi5cIixcbiAgY2hvb3NlRmlsZTogXCJTZWxlY2lvbmUgbyhzKSBhcnF1aXZvKHMpLi4uXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVGVtIGNlcnRlemEgcXVlIGRlc2VqYSBkZWxldGFyP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkVzc2UgdmFsb3IgZGV2ZSBzZXIgw7puaWNvLlwiLFxuICBhZGRDb2x1bW46IFwiQWRpY2lvbmFyIGNvbHVuYVwiLFxuICBhZGRSb3c6IFwiQWRpY2lvbmFyIGxpbmhhXCIsXG4gIHJlbW92ZVJvdzogXCJSZW1vdmVyIGxpbmhhXCIsXG4gIGFkZFBhbmVsOiBcIkFkaWNpb25hciBub3ZvXCIsXG4gIHJlbW92ZVBhbmVsOiBcIlJlbW92ZXJcIixcbiAgY2hvaWNlc19JdGVtOiBcIml0ZW1cIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2x1bmFcIixcbiAgbWF0cml4X3JvdzogXCJMaW5oYVwiLFxuICBzYXZpbmdEYXRhOiBcIk9zIHJlc3VsdGFkb3MgZXN0byBzZW5kbyBzYWx2b3Mgbm8gc2Vydmlkb3IuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIk9jb3JyZXUgdW0gZXJybyBlIG7Do28gZm9pIHBvc3PDrXZlbCBzYWx2YXIgb3MgcmVzdWx0YWRvcy5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiT3MgcmVzdWx0YWRvcyBmb3JhbSBzYWx2b3MgY29tIHN1Y2Vzc28hXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJUZW50ZSBub3ZhbWVudGVcIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlZ1wiLFxuICB0aW1lclNwZW50QWxsOiBcIlZvY8OqIGdhc3RvdSB7MH0gbmVzdGEgcMOhZ2luYSBlIHsxfSBubyB0b3RhbC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiVm9jw6ogZ2FzdG91IHswfSBuZXN0YSBww6FnaW5hLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIlZvY8OqIGdhc3RvdSB7MH0gbm8gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJWb2PDqiBnYXN0b3UgezB9IGRlIHsxfSBuZXN0YSBww6FnaW5hIGUgezJ9IGRlIHszfSBubyB0b3RhbC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiVm9jw6ogZ2FzdG91IHswfSBkZSB7MX0gbmVzdGEgcMOhZ2luYS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJWb2PDqiBnYXN0b3UgezB9IGRlIHsxfSBubyB0b3RhbC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIkxpbXBhclwiLFxuICBjbGVhckNhcHRpb246IFwiTGltcGFyXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIlJlbW92ZXIgZXN0ZSBhcnF1aXZvXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wicHRcIl0gPSBwb3J0dWd1ZXNlU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInB0XCJdID0gXCJwb3J0dWd1w6pzXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2UudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHJvbWFuaWFuU3VydmV5U3RyaW5nczogYW55ID0ge1xuICBwYWdlUHJldlRleHQ6IFwiUHJlY2VkZW50XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJVcm3Eg3RvclwiLFxuICBjb21wbGV0ZVRleHQ6IFwiRmluYWxpemFyZVwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkFsdHVsKHByZWNpemHFo2kpXCIsXG4gIHByb2dyZXNzVGV4dDogXCJQYWdpbmEgezB9IGRpbiB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTnUgc3VudCDDrm50cmVixINyaSBwZW50cnUgYWNlc3QgY2hlc3Rpb25hclwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlbEgyBtdWzFo3VtaW0gcGVudHJ1IHRpbXB1bCBhY29yZGF0IVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkNoZXN0aW9uYXJ1bCBzZSDDrm5jYXJjxIMuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiQWxlZ2XFo2kuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCJSxINzcHVuc3VsIGxhIGFjZWFzdMSDIMOubnRyZWJhcmUgZXN0ZSBvYmxpZ2F0b3JpdS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJUb2F0ZSByxINzcHVuc3VyaWxlIHN1bnQgb2JsaWdhdG9yaWlcIixcbiAgbnVtZXJpY0Vycm9yOiBcIlLEg3NwdW5zdWwgdHJlYnVpZSBzxIMgZmllIG51bWVyaWMuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiVHJlYnVpZSBzxIMgaW50cm9kdWNlyJtpIG1pbmltIHswfSBjYXJhY3RlcmUuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlRyZWJ1aWUgc8SDIHNlbGVjdGHIm2kgbWluaW0gezB9IG9wxaNpdW5pLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJUcmVidWllIHPEgyBzZWxlY3RhyJtpIG1heGltIHswfSBvcMWjaXVuaS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIlLEg3NwdW5zdWwgJ3swfScgdHJlYnVpZSBzxIMgZmllIG1haSBtYXJlIHNhdSBlZ2FsIGNhIHsxfSDFn8OuIG1haSBtaWMgc2F1IGVnYWwgY3UgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiUsSDc3B1bnN1bCAnezB9JyB0cmVidWllIHPEgyBmaWUgbWFpIG1hcmUgc2F1IGVnYWwgY2EgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiUsSDc3B1bnN1bCAnezB9JyB0cmVidWllIHPEgyBmaWUgbWFpIG1pYyBzYXUgZWdhbCBjYSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlRyZWJ1aWUgc8SDIGludHJvZHVjZcWjaSBvIGFkcmVzYSBkZSBlbWFpbCB2YWxpZMSDLlwiLFxuICBleGNlZWRNYXhTaXplOiBcIkRpbWVuc2l1bmVhIGZpxZ9pZXJ1bHVpIG51IHRyZWJ1aWUgc8SDIGRlcMSDxZ9lYXNjxIMgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiVHJlYnVpZSBzxIMgY29tcGxldGHIm2kgY8OibXB1bCAnQWx0dWwnLlwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiRGluIMOubnJlZ2lzdHLEg3JpbGUgbm9hc3RyZSByZWllc2UgY8SDIGHIm2kgY29tcGxldGF0IGRlamEgYWNlc3QgY2hlc3Rpb25hci5cIixcbiAgdmFsdWU6IFwidmFsb2FyZVwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJWxIMgcnVnxINtIHPEgyByxINzcHVuZGXIm2kgbGEgY2VsIHB1yJtpbiBvIMOubnRyZWJhcmUuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiVHJlYnVpZSBzxIMgaW50cm9kdWNlyJtpIG1heGltIHswfSBjYXJhY3RlcmUuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6XG4gICAgXCJUcmVidWllIHPEgyBpbnRyb2R1Y2XIm2kgbWFpIG11bHQgZGUgezB9IMiZaSBtYWkgcHXIm2luIGRlIHsxfSBjYXJhY3RlcmUuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiVHJlYnVpZSBzxIMgY29tcGxldGHIm2kgbWluaW0gezB9IHLDom5kdXJpLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiUmVxdWVzdC11bCBhIHJldHVybmF0IGVyb2FyZWEgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJSZXF1ZXN0LXVsIG51IGEgcmV0dXJuYXQgZGF0ZSBzYXUgcHJvcHJpZXRhdGVhICdwYXRoJyBlc3RlIGluY29yZWN0xINcIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkZpyJlpZXJ1bCBkdW1uZWF2b2FzdHLEgyBlc3RlIMOubiBjdXJzIGRlIMOubmPEg3JjYXJlLiBWxIMgcnVnxINtIGHImXRlcHRhyJtpIGPDonRldmEgc2VjdW5kZSDImWkgcmV2ZW5pyJtpIGFwb2kuXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiU3VudGXIm2kgc2lndXIgY8SDIGRvcmnIm2kgc8SDIMiZdGVyZ2XIm2kgw65ucmVnaXN0cmFyZWE/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiVmFsb2FyZWEgdHJlYnVpZSBzxIMgZmllIHVuaWPEgy5cIixcbiAgYWRkUm93OiBcIkFkxIN1Z2FyZSByw6JuZFwiLFxuICByZW1vdmVSb3c6IFwiyJh0ZXJnZXJlXCIsXG4gIGFkZFBhbmVsOiBcIkFkxIN1Z2FyZVwiLFxuICByZW1vdmVQYW5lbDogXCLImHRlcmdlcmVcIixcbiAgY2hvaWNlc19JdGVtOiBcIm9wyJtpdW5lXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sb2FuxINcIixcbiAgbWF0cml4X3JvdzogXCJSw6JuZFwiLFxuICBzYXZpbmdEYXRhOiBcIlJlenVsdGF0ZWxlIHN1bnQgw65uIGN1cnMgZGUgc2FsdmFyZS4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiQSBpbnRlcnZlbml0IG8gZXJvYXJlLCByZXp1bHRhdGVsZSBudSBhdSBwdXR1dCBmaSBzYWx2YXRlLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJSZXp1bHRhdGVsZSBhdSBmb3N0IHNhbHZhdGUgY3Ugc3VjY2VzIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiw45uY2VyY2HIm2kgZGluIG5vdVwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VjXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiQcibaSBwZXRyZWN1dCB7MH0gcGUgYWNlYXN0xIMgcGFnaW7EgyDImWkgezF9IMOubiB0b3RhbC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiQcibaSBwZXRyZWN1dCB7MH0gcGUgYWNlYXN0xIMgcGFnaW7Egy5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJByJtpIHBldHJlY3V0IHswfSDDrm4gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJByJtpIHBldHJlY3V0IHswfSBkaW4gezF9IHBlIGFjZWFzdMSDIHBhZ2luxIMgyJlpIHsyfSBkaW4gezN9IMOubiB0b3RhbC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiQcibaSBwZXRyZWN1dCB7MH0gZGluIHsxfSBwZSBhY2Vhc3TEgyBwYWdpbsSDLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIkHIm2kgcGV0cmVjdXQgezB9IGRpbiB7MX0gw65uIHRvdGFsLlwiXG59O1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJyb1wiXSA9IHJvbWFuaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInJvXCJdID0gXCJyb23Dom7Eg1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9yb21hbmlhbi50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgcnVzc2lhblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLQndCw0LfQsNC0XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLQlNCw0LvQtdC1XCIsXG4gIGNvbXBsZXRlVGV4dDogXCLQk9C+0YLQvtCy0L5cIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcItCd0LDRh9Cw0YLRjFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcItCU0YDRg9Cz0L7QtSAo0L/QvtC20LDQu9GD0LnRgdGC0LAsINC+0L/QuNGI0LjRgtC1KVwiLFxuICBub25lSXRlbVRleHQ6IFwi0J3QtdGCXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcItCS0YvQsdGA0LDRgtGMINCy0YHRkVwiLFxuICBwcm9ncmVzc1RleHQ6IFwi0KHRgtGA0LDQvdC40YbQsCB7MH0g0LjQtyB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwi0J3QtdGCINC90Lgg0L7QtNC90L7Qs9C+INCy0L7Qv9GA0L7RgdCwLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcItCR0LvQsNCz0L7QtNCw0YDQuNC8INCS0LDRgSDQt9CwINC30LDQv9C+0LvQvdC10L3QuNC1INCw0L3QutC10YLRiyFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcItCS0Ysg0YPQttC1INC/0YDQvtGF0L7QtNC40LvQuCDRjdGC0L7RgiDQvtC/0YDQvtGBLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcItCX0LDQs9GA0YPQt9C60LAg0YEg0YHQtdGA0LLQtdGA0LAuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwi0JLRi9Cx0YDQsNGC0YwuLi5cIixcbiAgdmFsdWU6IFwi0LfQvdCw0YfQtdC90LjQtVwiLFxuICByZXF1aXJlZEVycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQvtGC0LLQtdGC0YzRgtC1INC90LAg0LLQvtC/0YDQvtGBLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0L7RgtCy0LXRgtGM0YLQtSDQv9C+INC60YDQsNC50L3QtdC5INC80LXRgNC1INC90LAg0L7QtNC40L0g0LLQvtC/0YDQvtGBLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQvtGC0LLQtdGC0YzRgtC1INC90LAg0LLQvtC/0YDQvtGB0Ysg0LIg0LrQsNC20LTQvtC5INGB0YLRgNC+0LrQtS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcItCe0YLQstC10YIg0LTQvtC70LbQtdC9INCx0YvRgtGMINGH0LjRgdC70L7QvC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLQn9C+0LbQsNC70YPQudGB0YLQsCDQstCy0LXQtNC40YLQtSDQsdC+0LvRjNGI0LUgezB9INGB0LjQvNCy0L7Qu9C+0LIuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAg0LLQstC10LTQuNGC0LUg0LzQtdC90YzRiNC1IHswfSDRgdC40LzQstC+0LvQvtCyLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcItCf0L7QttCw0LvRg9C50YHRgtCwINCy0LLQtdC00LjRgtC1INCx0L7Qu9GM0YjQtSB7MH0g0Lgg0LzQtdC90YzRiNC1IHsxfSDRgdC40LzQstC+0LvQvtCyLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQt9Cw0L/QvtC70L3QuNGC0LUg0L3QtSDQvNC10L3RjNGI0LUgezB9INGB0YLRgNC+0LouXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQstGL0LHQtdGA0LjRgtC1INGF0L7RgtGPINCx0YsgezB9INCy0LDRgNC40LDQvdGC0L7Qsi5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0YvQsdC10YDQuNGC0LUg0L3QtSDQsdC+0LvQtdC1IHswfSDQstCw0YDQuNCw0L3RgtC+0LIuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0L3QtSDQvNC10L3RjNGI0LUg0YfQtdC8IHsxfSwg0Lgg0L3QtSDQsdC+0LvRjNGI0LUg0YfQtdC8IHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nINC00L7Qu9C20L3QviDQsdGL0YLRjCDQvdC1INC80LXQvdGM0YjQtSDRh9C10LwgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScg0LTQvtC70LbQvdC+INCx0YvRgtGMINC90LUg0LHQvtC70YzRiNC1INGH0LXQvCB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQstCy0LXQtNC40YLQtSDQtNC10LnRgdGC0LLQuNGC0LXQu9GM0L3Ri9C5INCw0LTRgNC10YEg0Y3Qu9C10LrRgtGA0L7QvdC90L7QuSDQv9C+0YfRgtGLLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLQktGL0YDQsNC20LXQvdC40LUgezB9INC00L7Qu9C20L3QviDQstC+0LfQstGA0LDRidCw0YLRjCAndHJ1ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLQl9Cw0L/RgNC+0YEg0LLQtdGA0L3Rg9C7INC+0YjQuNCx0LrRgyAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcItCe0YLQstC10YIg0L3QsCDQt9Cw0L/RgNC+0YEg0L/RgNC40YjQtdC7INC/0YPRgdGC0L7QuSDQuNC70Lgg0YHQstC+0LnRgdGC0LLQviAncGF0aCcg0YPQutCw0LfQsNC90L4g0L3QtdCy0LXRgNC90L5cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLQoNCw0LfQvNC10YAg0YTQsNC50LvQsCDQvdC1INC00L7Qu9C20LXQvSDQv9GA0LXQstGL0YjQsNGC0YwgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1INC00LDQvdC90YvQtSDQsiDQv9C+0LvQtSAn0JTRgNGD0LPQvtC1J1wiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwi0JLQsNGIINGE0LDQudC7INC30LDQs9GA0YPQttCw0LXRgtGB0Y8uINCf0L7QtNC+0LbQtNC40YLQtSDQvdC10YHQutC+0LvRjNC60L4g0YHQtdC60YPQvdC0INC4INC/0L7Qv9GA0L7QsdGD0LnRgtC1INGB0L3QvtCy0LAuXCIsXG4gIGxvYWRpbmdGaWxlOiBcItCX0LDQs9GA0YPQt9C60LAuLi5cIixcbiAgY2hvb3NlRmlsZTogXCLQktGL0LHQtdGA0LjRgtC1INGE0LDQudC7KNGLKS4uLlwiLFxuICBjb25maXJtRGVsZXRlOiBcItCS0Ysg0YLQvtGH0L3QviDRhdC+0YLQuNGC0LUg0YPQtNCw0LvQuNGC0Ywg0LfQsNC/0LjRgdGMP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcItCt0YLQviDQt9C90LDRh9C10L3QuNC1INC00L7Qu9C20L3QviDQsdGL0YLRjCDRg9C90LjQutCw0LvRjNC90YvQvC5cIixcbiAgYWRkQ29sdW1uOiBcItCU0L7QsdCw0LLQuNGC0Ywg0LrQvtC70L7QvdC60YNcIixcbiAgYWRkUm93OiBcItCU0L7QsdCw0LLQuNGC0Ywg0YHRgtGA0L7QutGDXCIsXG4gIHJlbW92ZVJvdzogXCLQo9C00LDQu9C40YLRjFwiLFxuICBhZGRQYW5lbDogXCLQlNC+0LHQsNCy0LjRgtGMINC90L7QstGD0Y5cIixcbiAgcmVtb3ZlUGFuZWw6IFwi0KPQtNCw0LvQuNGC0YxcIixcbiAgY2hvaWNlc19JdGVtOiBcItCS0LDRgNC40LDQvdGCXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi0JrQvtC70L7QvdC60LBcIixcbiAgbWF0cml4X3JvdzogXCLQodGC0YDQvtC60LBcIixcbiAgc2F2aW5nRGF0YTogXCLQoNC10LfRg9C70YzRgtCw0YLRiyDRgdC+0YXRgNCw0L3Rj9GO0YLRgdGPINC90LAg0YHQtdGA0LLQtdGALi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLQn9GA0L7QuNC30L7RiNC70LAg0L7RiNC40LHQutCwLCDRgNC10LfRg9C70YzRgtCw0YIg0L3QtSDQsdGL0Lsg0YHQvtGF0YDQsNC90ZHQvS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi0KDQtdC30YPQu9GM0YLQsNGCINGD0YHQv9C10YjQvdC+INGB0L7RhdGA0LDQvdGR0L0hXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLQn9C+0L/RgNC+0LHQvtCy0LDRgtGMINGB0L3QvtCy0LBcIixcbiAgdGltZXJNaW46IFwi0LzQuNC9XCIsXG4gIHRpbWVyU2VjOiBcItGB0LXQulwiLFxuICB0aW1lclNwZW50QWxsOiBcItCS0Ysg0L/QvtGC0YDQsNGC0LjQu9C4IHswfSDQvdCwINGN0YLQvtC5INGB0YLRgNCw0L3QuNGG0LUg0LggezF9INCy0YHQtdCz0L4uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcItCS0Ysg0L/QvtGC0YDQsNGC0LjQu9C4IHswfSDQvdCwINGN0YLQvtC5INGB0YLRgNCw0L3QuNGG0LUuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwi0JLRiyDQv9C+0YLRgNCw0YLQuNC70LggezB9INCyINGC0LXRh9C10L3QuNC1INGC0LXRgdGC0LAuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLQktGLINC/0L7RgtGA0LDRgtC40LvQuCB7MH0g0LjQtyB7MX0g0L3QsCDRjdGC0L7QuSDRgdGC0YDQsNC90LjRhtC1INC4IHsyfSDQuNC3IHszfSDQtNC70Y8g0LLRgdC10LPQviDRgtC10YHRgtCwLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLQktGLINC/0L7RgtGA0LDRgtC40LvQuCB7MH0g0LjQtyB7MX0g0L3QsCDRjdGC0L7QuSDRgdGC0YDQsNC90LjRhtC1LlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcItCS0Ysg0L/QvtGC0YDQsNGC0LjQu9C4IHswfSDQuNC3IHsxfSDQtNC70Y8g0LLRgdC10LPQviDRgtC10YHRgtCwLlwiLFxuICBjbGVhbkNhcHRpb246IFwi0J7Rh9C40YHRgtC40YLRjFwiLFxuICBjbGVhckNhcHRpb246IFwi0J7Rh9C40YHRgtC40YLRjFwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLQo9C00LDQu9C40YLRjCDRhNCw0LnQu1wiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInJ1XCJdID0gcnVzc2lhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJydVwiXSA9IFwi0YDRg9GB0YHQutC40LlcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vcnVzc2lhbi50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgc2ltcGxpZmllZENoaW5lc2VTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi5LiK5LiA6aG1XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLkuIvkuIDpobVcIixcbiAgY29tcGxldGVUZXh0OiBcIuaPkOS6pOmXruWNt1wiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi5byA5aeL6Zeu5Y23XCIsXG4gIG90aGVySXRlbVRleHQ6IFwi5aGr5YaZ5YW25LuW562U5qGIXCIsXG4gIG5vbmVJdGVtVGV4dDogXCLml6BcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwi6YCJ5oup5YWo6YOoXCIsXG4gIHByb2dyZXNzVGV4dDogXCLnrKwgezB9IOmhtSwg5YWxIHsxfSDpobVcIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIuesrCB7MH0vezF9IOmimFwiLFxuICBlbXB0eVN1cnZleTogXCLpl67ljbfkuK3msqHmnInpl67popjmiJbpobXpnaJcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTogXCLkvaDlt7LlrozmiJDpl67ljbcuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi5oSf6LCi5oKo55qE5Y+C5LiOIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIumXruWNt+ato+WcqOWKoOi9veS4rS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLor7fpgInmi6kuLi5cIixcbiAgdmFsdWU6IFwi5YC8XCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi6K+35aGr5YaZ5q2k6Zeu6aKYXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIuiHs+WwkeWbnuetlOS4gOmimC5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLor7floavlhpnmiYDmnInooYzkuK3pl67pophcIixcbiAgbnVtZXJpY0Vycm9yOiBcIuetlOahiOW/hemhu+aYr+S4quaVsOWtl1wiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIuetlOahiOmVv+W6puiHs+WwkSB7MH0g5Liq5a2X56ymXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi562U5qGI6ZW/5bqm5LiN6IO96LaF6L+HIHswfSDkuKrlrZfnrKZcIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLnrZTmoYjplb/luqblv4XpobvlnKggezB9IC0gezF9IOS4quWtl+espuS5i+mXtFwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIuacgOWwkemcgOimgeWhq+WGmSB7MH0g6KGM562U5qGIXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIuacgOWwkemcgOimgemAieaLqSB7MH0g6aG5562U5qGIXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIuacgOWkmuWPquiDvemAieaLqSB7MH0g6aG5562U5qGIXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwi562U5qGIICd7MH0nIOW/hemhu+Wkp+S6juetieS6jiB7MX0g5LiU5bCP5LqO562J5LqOIHsyfVwiLFxuICBudW1lcmljTWluOiBcIuetlOahiCAnezB9JyDlv4XpobvlpKfkuo7nrYnkuo4gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwi562U5qGIICd7MH0nIOW/hemhu+Wwj+S6juetieS6jiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIuivt+i+k+WFpeacieaViOeahCBFbWFpbCDlnLDlnYBcIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi5YWs5byPOiB7MH0g5peg5pWILlwiLCBcbiAgdXJsUmVxdWVzdEVycm9yOiBcIui9veWFpemAiemhueaXtuWPkeeUn+mUmeivryAnezB9JzogezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCLmnKrog73ovb3lhaXmnInmlYjnmoTpgInpobnmiJbor7fmsYLlj4LmlbDot6/lvoTmnInor69cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLmlofku7blpKflsI/kuI3og73otoXov4cgezB9XCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLor7flrozmiJDlhbbku5bpl67pophcIixcbiAgdXBsb2FkaW5nRmlsZTogXCLmlofku7bkuIrkvKDkuK0uLi4g6K+36ICQ5b+D562J5b6F5Yeg56eS5ZCO6YeN6K+VXCIsXG4gIGxvYWRpbmdGaWxlOiBcIuWKoOi9vS4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIumAieaLqeaWh+S7ti4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwi5pyq6YCJ5oup5paH5Lu2XCIsXG4gIGNvbmZpcm1EZWxldGU6IFwi5Yig6Zmk6K6w5b2VP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIuS4u+mUruS4jeiDvemHjeWkjVwiLFxuICBhZGRDb2x1bW46IFwi5re75Yqg5YiXXCIsXG4gIGFkZFJvdzogXCLmt7vliqDooYxcIixcbiAgcmVtb3ZlUm93OiBcIuWIoOmZpOetlOahiFwiLFxuICBhZGRQYW5lbDogXCLmlrDmt7tcIixcbiAgcmVtb3ZlUGFuZWw6IFwi5Yig6ZmkXCIsXG4gIGNob2ljZXNfSXRlbTogXCLpgInpoblcIixcbiAgbWF0cml4X2NvbHVtbjogXCLliJdcIixcbiAgbWF0cml4X3JvdzogXCLooYxcIixcbiAgc2F2aW5nRGF0YTogXCLmraPlnKjlsIbnu5Pmnpzkv53lrZjliLDmnI3liqHlmaguLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIuWcqOS/neWtmOe7k+aenOi/h+eoi+S4reWPkeeUn+S6humUmeivr++8jOe7k+aenOacquiDveS/neWtmFwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLnu5Pmnpzkv53lrZjmiJDlip8hXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLor7fph43or5VcIixcbiAgdGltZXJNaW46IFwi5YiGXCIsXG4gIHRpbWVyU2VjOiBcIuenklwiLFxuICB0aW1lclNwZW50QWxsOiBcIuacrOmhteeUqOaXtiB7MH0g5oC76K6h55So5pe2ezF9IC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwi5pys6aG155So5pe2ezB9IC5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCLmgLvorqHnlKjml7YgezB9IC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIuacrOmhteeUqOaXtiB7MH0g5YWxIHsxfe+8jCDmgLvorqHnlKjml7YgezJ9IOWFsSB7M30gLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLmnKzpobXnlKjml7YgezB9IOWFsSB7MX0gLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIuaAu+iuoeeUqOaXtiB7MH0g5YWxIHsxfS5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIua4heeQhlwiLFxuICBjbGVhckNhcHRpb246IFwi5riF6ZmkXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIuenu+mZpOaWh+S7tlwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInpoLWNuXCJdID0gc2ltcGxpZmllZENoaW5lc2VTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiemgtY25cIl0gPSBcIueugOS9k+S4reaWh1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9zaW1wbGlmaWVkLWNoaW5lc2UudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHNwYW5pc2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiQW50ZXJpb3JcIixcbiAgcGFnZU5leHRUZXh0OiBcIlNpZ3VpZW50ZVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiQ29tcGxldG9cIixcbiAgb3RoZXJJdGVtVGV4dDogXCJPdHJvIChkZXNjcmliYSlcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlDDoWdpbmEgezB9IGRlIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJObyBoYXkgcMOhZ2luYSB2aXNpYmxlIG8gcHJlZ3VudGEgZW4gbGEgZW5jdWVzdGEuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiR3JhY2lhcyBwb3IgY29tcGxldGFyIGxhIGVuY3Vlc3RhIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkxhIGVuY3Vlc3RhIGVzdMOhIGNhcmdhbmRvLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlNlbGVjY2lvbmUuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCJQb3IgZmF2b3IgY29udGVzdGUgbGEgcHJlZ3VudGEuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiUG9yIGZhdm9yIGNvbnRlc3RlIGxhcyBwcmVndW50YXMgZW4gY2FkYSBoaWxlcmEuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJMYSBlc3RpbWFjacOzbiBkZWJlIHNlciBudW3DqXJpY2EuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiUG9yIGZhdm9yIGVudHJlIHBvciBsbyBtZW5vcyB7MH0gc8OtbWJvbG9zLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlBvciBmYXZvciBlbnRyZSBtZW5vcyBkZSB7MH0gc8OtbWJvbG9zLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlBvciBmYXZvciBlbnRyZSBtw6FzIGRlIHswfSB5IG1lbm9zIGRlIHsxfSBzw61tYm9sb3MuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiUG9yIGZhdm9yIGxsZW5lIHBvciBsbyBtZW5vcyB7MH0gaGlsZXJhcy5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiUG9yIGZhdm9yIHNlbGVjY2lvbmUgcG9yIGxvIG1lbm9zIHswfSB2YXJpYW50ZXMuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlBvciBmYXZvciBzZWxlY2Npb25lIG5vIG3DoXMgZGUgezB9IHZhcmlhbnRlcy5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIkVsICd7MH0nIGRlYmUgZGUgc2VyIGlndWFsIG8gbcOhcyBkZSB7MX0geSBpZ3VhbCBvIG1lbm9zIGRlIHsyfVwiLFxuICBudW1lcmljTWluOiBcIkVsICd7MH0nIGRlYmUgc2VyIGlndWFsIG8gbcOhcyBkZSB7MX1cIixcbiAgbnVtZXJpY01heDogXCJFbCAnezB9JyBkZWJlIHNlciBpZ3VhbCBvIG1lbm9zIGRlIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiUG9yIGZhdm9yIGFncmVndWUgdW4gY29ycmVvIGVsZWN0csOzbmljbyB2w6FsaWRvLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiTGEgc29saWNpdHVkIHJlZ3Jlc8OzIGVycm9yICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiTGEgc29saWNpdHVkIHJlZ3Jlc8OzIHZhY8OtbyBkZSBkYXRhIG8gbGEgcHJvcGllZGFkICd0cmF5ZWN0b3JpYScgbm8gZXMgY29ycmVjdGFcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJFbCB0YW1hw7FvIGRlbCBhcmNoaXZvIG5vIGRlYmUgZGUgZXhjZWRlciB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJQb3IgZmF2b3IgYWdyZWd1ZSBsYSBvdHJhIGVzdGltYWNpw7NuLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiU3UgYXJjaGl2byBzZSBlc3TDoSBzdWJpZW5kby4gUG9yIGZhdm9yIGVzcGVyZSB1bm9zIHNlZ3VuZG9zIGUgaW50ZW50ZSBkZSBudWV2by5cIixcbiAgYWRkUm93OiBcIkFncmVndWUgdW5hIGhpbGVyYVwiLFxuICByZW1vdmVSb3c6IFwiRWxpbWluYXIgdW5hIGhpbGVyYVwiLFxuICBjaG9pY2VzX2ZpcnN0SXRlbTogXCJwcmltZXIgYXJ0w61jdWxvXCIsXG4gIGNob2ljZXNfc2Vjb25kSXRlbTogXCJzZWd1bmRvIGFydMOtY3Vsb1wiLFxuICBjaG9pY2VzX3RoaXJkSXRlbTogXCJ0ZXJjZXJhIGFydMOtY3Vsb1wiLFxuICBtYXRyaXhfY29sdW1uOiBcIkNvbHVtbmFcIixcbiAgbWF0cml4X3JvdzogXCJIaWxlcmFcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJlc1wiXSA9IHNwYW5pc2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZXNcIl0gPSBcImVzcGHDsW9sXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3NwYW5pc2gudHMiLCIvL0NyZWF0ZSBieSBNYXR0aWFzIEFzcGx1bmRcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgc3dlZGlzaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJGw7ZyZWfDpWVuZGVcIixcbiAgcGFnZU5leHRUZXh0OiBcIk7DpHN0YVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiRsOkcmRpZ1wiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkFubmF0IChiZXNrcml2KVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU2lkYSB7MH0gYXYgezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIkRldCBmaW5ucyBpbmdlbiBzeW5saWcgc2lkYSBlbGxlciBmcsOlZ2EgaSBlbmvDpHRlbi5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJUYWNrIGbDtnIgYXR0IGR1IGdlbm9tZsO2cnQgZW5rw6R0ZW4hIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkVua8OkdGVuIGxhZGRhcy4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWw6Rsai4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIlZhciB2w6RubGlnIGJlc3ZhcmEgZnLDpWdhbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJWYXIgdsOkbmxpZyBiZXN2YXJhIGZyw6Vnb3JuYSBww6UgYWxsYSByYWRlci5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlbDpHJkZXQgc2thIHZhcmEgbnVtZXJpc2t0LlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlZhciB2w6RubGlnIGFuZ2UgbWluc3QgezB9IHRlY2tlbi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJWYXIgdsOkbmxpZyBmeWxsIGkgbWluc3QgezB9IHJhZGVyLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJWYXIgdsOkbmxpZyB2w6RsaiDDpXRtaW5zdG9uZSB7MH0gdmFyaWFudGVyLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJWYXIgdsOkbmxpZyB2w6RsaiBpbnRlIGZsZXIgw6RuIHswfSB2YXJpYW50ZXIuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBza2EgdmFyYSBsaWthIG1lZCBlbGxlciBtZXIgw6RuIHsxfSBzYW10IGxpa2EgbWVkIGVsbGVyIG1pbmRyZSDDpG4gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgc2thIHZhcmEgbGlrYSBtZWQgZWxsZXIgbWVyIMOkbiB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBza2EgdmFyYSBsaWthIG1lZCBlbGxlciBtaW5kcmUgw6RuIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiVmFyIHbDpG5saWcgYW5nZSBlbiBrb3JyZWt0IGUtcG9zdGFkcmVzcy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkbDtnJmcsOlZ2FuIHJldHVybmVyYWRlIGZlbGV0ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiQW50aW5nZW4gcmV0dXJuZXJhZGUgZsO2cmZyw6VnYW4gaW5nZW4gZGF0YSBlbGxlciBzw6Ugw6RyIGVnZW5za2FwZW4gJ3BhdGgnIGludGUga29ycmVrdFwiLFxuICBleGNlZWRNYXhTaXplOiBcIkZpbHN0b3JsZWtlbiBmw6VyIGVqIMO2dmVyc3RpZ2EgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiVmFyIHbDpG5saWcgYW5nZSBkZXQgYW5kcmEgdsOkcmRldC5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkRpbiBmaWwgbGFkZGFzIHVwcC4gVmFyIHbDpG5saWcgdsOkbnRhIG7DpWdyYSBzZWt1bmRlciBvY2ggZsO2cnPDtmsgc2VkYW4gaWdlbi5cIixcbiAgYWRkUm93OiBcIkzDpGdnIHRpbGwgcmFkXCIsXG4gIHJlbW92ZVJvdzogXCJUYSBib3J0XCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wic3ZcIl0gPSBzd2VkaXNoU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInN2XCJdID0gXCJzdmVuc2thXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3N3ZWRpc2gudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHRyYWRpdGlvbmFsQ2hpbmVzZVN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLkuIrkuIDpoIFcIixcbiAgcGFnZU5leHRUZXh0OiBcIuS4i+S4gOmggVwiLFxuICBjb21wbGV0ZVRleHQ6IFwi5o+Q5Lqk5ZWP5Y23XCIsXG4gIG90aGVySXRlbVRleHQ6IFwi5aGr5a+r5YW25LuW562U5qGIXCIsXG4gIHByb2dyZXNzVGV4dDogXCLnrKwgezB9IOmggSwg5YWxIHsxfSDpoIFcIixcbiAgZW1wdHlTdXJ2ZXk6IFwi5ZWP5Y235Lit5rKS5pyJ5ZWP6aGM5oiW6aCB6Z2iXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi5oSf6Kyd5oKo55qE5Y+D6IiHIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIuWVj+WNt+i8ieWFpeS4rS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLoq4vpgbjmk4cuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCLoq4vloavlr6vmraTllY/poYxcIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLoq4vloavlr6vmiYDmnInooYzkuK3llY/poYxcIixcbiAgbnVtZXJpY0Vycm9yOiBcIuetlOahiOW/hemgiOaYr+WAi+aVuOWtl1wiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIuetlOahiOmVt+W6puiHs+WwkSB7MH0g5YCL5a2X5YWDXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi562U5qGI6ZW35bqm5LiN6IO96LaF6YGOIHswfSDlgIvlrZflhYNcIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLnrZTmoYjplbfluqblv4XpoIjlnKggezB9IC0gezF9IOWAi+Wtl+WFg+S5i+mWk1wiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIuacgOWwkemcgOimgeWhq+WvqyB7MH0g6KGM562U5qGIXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIuacgOWwkemcgOimgemBuOaThyB7MH0g6aCF562U5qGIXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIuacgOWkmuWPquiDvemBuOaThyB7MH0g6aCF562U5qGIXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwi562U5qGIICd7MH0nIOW/hemgiOWkp+aWvOetieaWvCB7MX0g5LiU5bCP5pa8562J5pa8IHsyfVwiLFxuICBudW1lcmljTWluOiBcIuetlOahiCAnezB9JyDlv4XpoIjlpKfmlrznrYnmlrwgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwi562U5qGIICd7MH0nIOW/hemgiOWwj+aWvOetieaWvCB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIuiri+i8uOWFpeacieaViOeahCBFbWFpbCDlnLDlnYBcIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIui8ieWFpemBuOmgheaZgueZvOeUn+mMr+iqpCAnezB9JzogezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCLmnKrog73ovInlhaXmnInmlYjnmoTpgbjpoIXmiJboq4vmsYLlj4Pmlbjot6/lvpHmnInoqqRcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLmlofku7blpKflsI/kuI3og73otoXpgY4gezB9XCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLoq4vlrozmiJDlhbbku5bllY/poYxcIixcbiAgdXBsb2FkaW5nRmlsZTogXCLmlofku7bkuIrlgrPkuK0uLi4g6KuL6ICQ5b+D562J5b6F5bm+56eS5b6M6YeN6KmmXCIsXG4gIGFkZFJvdzogXCLmt7vliqDnrZTmoYhcIixcbiAgcmVtb3ZlUm93OiBcIuWIqumZpOetlOahiFwiLFxuICBjaG9pY2VzX0l0ZW06IFwi6YG46aCFXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi5YiXXCIsXG4gIG1hdHJpeF9yb3c6IFwi6KGMXCIsXG4gIHNhdmluZ0RhdGE6IFwi5q2j5Zyo5bCH57WQ5p6c5L+d5a2Y5Yiw5pyN5YuZ5ZmoLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLlnKjkv53lrZjntZDmnpzpgY7nqIvkuK3nmbznlJ/kuobpjK/oqqTvvIzntZDmnpzmnKrog73kv53lrZhcIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi57WQ5p6c5L+d5a2Y5oiQ5YqfIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi6KuL6YeN6KmmXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiemgtdHdcIl0gPSB0cmFkaXRpb25hbENoaW5lc2VTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiemgtdHdcIl0gPSBcIue5gemrlOS4reaWh1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi90cmFkaXRpb25hbC1jaGluZXNlLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciB0dXJraXNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkdlcmlcIixcbiAgcGFnZU5leHRUZXh0OiBcIsSwbGVyaVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiQW5rZXRpIFRhbWFtbGFcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJEacSfZXIgKGHDp8Sxa2xhecSxbsSxeilcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNheWZhIHswfSAvIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJBbmtldHRlIGfDtnLDvG50w7xsZW5lY2VrIHNheWZhIHlhIGRhIHNvcnUgbWV2Y3V0IGRlxJ9pbC5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJBbmtldGltaXppIHRhbWFtbGFkxLHEn8SxbsSxeiBpw6dpbiB0ZcWfZWtrw7xyIGVkZXJpei5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJBbmtldCBzdW51Y3VkYW4gecO8a2xlbml5b3IgLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlNlw6dpbml6IC4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIkzDvHRmZW4gc29ydXlhIGNldmFwIHZlcmluaXpcIixcbiAgbnVtZXJpY0Vycm9yOiBcIkdpcmlsZW4gZGXEn2VyIG51bWVyaWsgb2xtYWzEsWTEsXJcIixcbiAgdGV4dE1pbkxlbmd0aDogXCJFbiBheiB7MH0gc2VtYm9sIGdpcmluaXouXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiTMO8dGZlbiBlbiBheiB7MH0gc2F0xLFyxLEgZG9sZHVydW4uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIkzDvHRmZW4gZW4gYXogezB9IHNlw6dlbmXEn2kgc2XDp2luaXouXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIkzDvHRmZW4gezB9IGFkZXR0ZW4gZmF6bGEgc2XDp21leWluaXouXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJUaGUgJ3swfScgc2hvdWxkIGJlIGVxdWFsIG9yIG1vcmUgdGhhbiB7MX0gYW5kIGVxdWFsIG9yIGxlc3MgdGhhbiB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBkZcSfZXJpIHsxfSBkZcSfZXJpbmUgZcWfaXQgdmV5YSBiw7x5w7xrIG9sbWFsxLFkxLFyXCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgZGXEn2VyaSB7MX0gZGXEn2VyaW5lIGXFn2l0IHlhIGRhIGvDvMOnw7xrIG9sbWFsxLFkxLFyLlwiLFxuICBpbnZhbGlkRW1haWw6IFwiTMO8dGZlbiBnZcOnZXJsaSBiaXIgZXBvc3RhIGFkcmVzaSBnaXJpbml6LlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiVGFsZWJpIMWfdSBoYXRhecSxIGTDtm5kw7wgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJUYWxlcCBoZXJoYW5naSBiaXIgdmVyaSBkw7ZubWVkaSB5YSBkYSAncGF0aCcgw7Z6ZWxsacSfaSBoYXRhbMSxLlwiLFxuICBleGNlZWRNYXhTaXplOiBcIkRvc3lhIGJveXV0dSB7MH0gZGXEn2VyaW5pIGdlw6dlbWV6LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiTMO8dGZlbiBkacSfZXIgZGXEn2VybGVyaSBnaXJpbml6LlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiRG9zeWFuxLF6IHnDvGtsZW5peW9yLiBMw5x0ZmVuIGJpcmthw6cgc2FuaXllIGJla2xleWluIHZlIHRla3JhciBkZW5leWluLlwiLFxuICBhZGRSb3c6IFwiU2F0xLFyIEVrbGVcIixcbiAgcmVtb3ZlUm93OiBcIkthbGTEsXJcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJ0clwiXSA9IHR1cmtpc2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1widHJcIl0gPSBcInTDvHJrw6dlXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3R1cmtpc2gudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHVrcmFpbmlhblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLQndCw0LfQsNC0XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLQlNCw0LvRllwiLFxuICBjb21wbGV0ZVRleHQ6IFwi0JfQsNCy0LXRgNGI0LjRgtC4XCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCLQn9C+0YfQsNGC0LhcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLQhtC90YjQtSAo0LHRg9C00Ywg0LvQsNGB0LrQsCwg0L7Qv9C40YjRltGC0YwpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCLQltC+0LTQtdC9XCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcItCS0LjQsdGA0LDRgtC4INCy0YHQtVwiLFxuICBwcm9ncmVzc1RleHQ6IFwi0KHRgtC+0YDRltC90LrQsCB7MH0g0LcgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCLQktGW0LTQv9C+0LLRltC70Lgg0L3QsCB7MH0vezF9INC/0LjRgtCw0L3RjFwiLFxuICBlbXB0eVN1cnZleTogXCLQndC10LzQsNGUINC20L7QtNC90L7Qs9C+INC/0LjRgtCw0L3QvdGPLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcItCU0Y/QutGD0ZTQvNC+INCS0LDQvCDQt9CwINC30LDQv9C+0LLQvdC10L3QvdGPINCw0L3QutC10YLQuCFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcItCS0Lgg0LLQttC1INC/0YDQvtGF0L7QtNC40LvQuCDRhtC1INC+0L/QuNGC0YPQstCw0L3QvdGPLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcItCX0LDQstCw0L3RgtCw0LbQtdC90L3RjyDQvtC/0LjRgtGD0LLQsNC90L3Rjy4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLQktC40LHRgNCw0YLQuC4uLlwiLFxuICB2YWx1ZTogXCLQt9C90LDRh9C10L3QvdGPXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCwg0LTQsNC50YLQtSDQstGW0LTQv9C+0LLRltC00YwuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcItCR0YPQtNGMINC70LDRgdC60LAsINC00LDQudGC0LUg0LLRltC00L/QvtCy0ZbQtNGMINGF0L7Rh9CwINCxINC90LAg0L7QtNC90LUg0L/QuNGC0LDQvdC90Y8uXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCwg0LTQsNC50YLQtSDQstGW0LTQv9C+0LLRltC00Ywg0L3QsCDQv9C40YLQsNC90L3RjyDQsiDQutC+0LbQvdC+0LzRgyDRgNGP0LTQutGDLlwiLFxuICBudW1lcmljRXJyb3I6IFwi0JLRltC00L/QvtCy0ZbQtNGMINC/0L7QstC40L3QvdCwINCx0YPRgtC4INGH0LjRgdC70L7QvC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLQkdGD0LTRjCDQu9Cw0YHQutCwINCy0LLQtdC00ZbRgtGMINCx0ZbQu9GM0YjQtSB7MH0g0YHQuNC80LLQvtC70ZbQsi5cIixcbiAgdGV4dE1heExlbmd0aDogXCLQkdGD0LTRjCDQu9Cw0YHQutCwINCy0LLQtdC00ZbRgtGMINC80LXQvdGI0LUgezB9INGB0LjQvNCy0L7Qu9GW0LIuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCDQstCy0LXQtNGW0YLRjCDQsdGW0LvRjNGI0LUgezB9INC4INC80LXQvdGI0LUgezF9INGB0LjQvNCy0L7Qu9GW0LIuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCwg0LfQsNC/0L7QstC90ZbRgtGMINC90LUg0LzQtdC90YjQtSB7MH0g0YDRj9C00LrRltCyLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLQkdGD0LTRjCDQu9Cw0YHQutCwLCDQstC40LHQtdGA0ZbRgtGMINGF0L7Rh9CwINCxIHswfSDQstCw0YDRltCw0L3RgtGW0LIuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcItCR0YPQtNGMINC70LDRgdC60LAsINCy0LjQsdC10YDRltGC0Ywg0L3QtSDQsdGW0LvRjNGI0LUgezB9INCy0LDRgNGW0LDQvdGC0ZbQsi5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nINC/0L7QstC40L3QvdC+INCx0YPRgtC4INC90LUg0LzQtdC90YjQtSDQvdGW0LYgezF9LCDRliDQvdC1INCx0ZbQu9GM0YjQtSDQvdGW0LYgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScg0L/QvtCy0LjQvdC90L4g0LHRg9GC0Lgg0L3QtSDQvNC10L3RiNC1INC90ZbQtiB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyDQv9C+0LLQuNC90L3QviDQsdGD0YLQuCDQvdC1INCx0ZbQu9GM0YjQtSDQvdGW0LYgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCLQkdGD0LTRjCDQu9Cw0YHQutCwLCDQstCy0LXQtNGW0YLRjCDQtNGW0LnRgdC90YMg0LDQtNGA0LXRgdGDINC10LvQtdC60YLRgNC+0L3QvdC+0Zcg0L/QvtGI0YLQuC5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi0JLQuNGA0LDQtyB7MH0g0L/QvtCy0LjQvdC10L0g0L/QvtCy0LXRgNGC0LDRgtC4ICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcItCX0LDQv9C40YIg0L/QvtCy0LXRgNC90YPQsiDQv9C+0LzQuNC70LrRgyAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcItCS0ZbQtNC/0L7QstGW0LTRjCDQvdCwINC30LDQv9C40YIg0L/QvtCy0LXRgNC90YPQu9Cw0YHRjCDQv9C+0YDQvtC20L3RjNC+0Y4g0LDQsdC+INCy0LvQsNGB0YLQuNCy0ZbRgtGMICdwYXRoJyDQstC60LDQt9Cw0L3QviDQvdC10LLRltGA0L3QvlwiLFxuICBleGNlZWRNYXhTaXplOiBcItCg0L7Qt9C80ZbRgCDRhNCw0LnQu9GDINC90LUg0L/QvtCy0LjQvdC10L0g0L/QtdGA0LXQstC40YnRg9Cy0LDRgtC4IHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcItCR0YPQtNGMINC70LDRgdC60LAsINCy0LLQtdC00ZbRgtGMINC00LDQvdGWINCyINC/0L7Qu9C1ICfQhtC90YjQtSdcIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcItCS0LDRiCDRhNCw0LnQuyDQt9Cw0LLQsNC90YLQsNC20YPRlNGC0YzRgdGPLiDQl9Cw0YfQtdC60LDQudGC0LUg0LTQtdC60ZbQu9GM0LrQsCDRgdC10LrRg9C90LQg0ZYg0YHQv9GA0L7QsdGD0LnRgtC1INC30L3QvtCy0YMuXCIsXG4gIGxvYWRpbmdGaWxlOiBcItCX0LDQstCw0L3RgtCw0LbQtdC90L3Rjy4uLlwiLFxuICBjaG9vc2VGaWxlOiBcItCS0LjQsdC10YDRltGC0Ywg0YTQsNC50Lso0LgpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCLQpNCw0LnQuyDQvdC1INCy0LjQsdGA0LDQvdC+XCIsXG4gIGNvbmZpcm1EZWxldGU6IFwi0JLQuCDRhdC+0YfQtdGC0LUg0LLQuNC00LDQu9C40YLQuCDQt9Cw0L/QuNGBP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcItCm0LUg0LfQvdCw0YfQtdC90L3RjyDQv9C+0LLQuNC90L3QviDQsdGD0YLQuCDRg9C90ZbQutCw0LvRjNC90LjQvC5cIixcbiAgYWRkQ29sdW1uOiBcItCU0L7QtNCw0YLQuCDQutC+0LvQvtC90LrRg1wiLFxuICBhZGRSb3c6IFwi0JTQvtC00LDRgtC4INGA0Y/QtNC+0LpcIixcbiAgcmVtb3ZlUm93OiBcItCS0LjQtNCw0LvQuNGC0LhcIixcbiAgYWRkUGFuZWw6IFwi0JTQvtC00LDRgtC4INC90L7QstGDXCIsXG4gIHJlbW92ZVBhbmVsOiBcItCS0LjQtNCw0LvQuNGC0LhcIixcbiAgY2hvaWNlc19JdGVtOiBcItCS0LDRgNGW0LDQvdGCXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi0JrQvtC70L7QvdC60LBcIixcbiAgbWF0cml4X3JvdzogXCLQoNGP0LTQvtC6XCIsXG4gIHNhdmluZ0RhdGE6IFwi0KDQtdC30YPQu9GM0YLQsNGC0Lgg0LfQsdC10YDRltCz0LDRjtGC0YzRgdGPINC90LAg0YHQtdGA0LLQtdGALi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLQktGW0LTQsdGD0LvQsNGB0Y8g0L/QvtC80LjQu9C60LAsINGA0LXQt9GD0LvRjNGC0LDRgiDQvdC1INCx0YPQsiDQt9Cx0LXRgNC10LbQtdC90LjQuS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi0KDQtdC30LLRg9C70YzRgtCw0YIg0YPRgdC/0ZbRiNC90L4g0LfQsdC10YDQtdC20LXQvdC40LkhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLQodC/0YDQvtCx0YPQstCw0YLQuCDQt9C90L7QstGDXCIsXG4gIHRpbWVyTWluOiBcItGF0LJcIixcbiAgdGltZXJTZWM6IFwi0YHQtdC6XCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwi0JLQuCDQstC40YLRgNCw0YLQuNC70LggezB9INC90LAg0YbRltC5INGB0YLQvtGA0ZbQvdGG0ZYg0ZYgezF9INC30LDQs9Cw0LvQvtC8LlwiLFxuICB0aW1lclNwZW50UGFnZTogXCLQktC4INCy0LjRgtGA0LDRgtC40LvQuCB7MH0g0L3QsCDRhtGW0Lkg0YHRgtC+0YDRltC90YbRli5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCLQktC4INCy0LjRgtGA0LDRgtC40LvQuCB7MH0g0L/RgNC+0YLRj9Cz0L7QvCDRgtC10YHRgtGDLlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwi0JLQuCDQstC40YLRgNCw0YLQuNC70LggezB9INC3IHsxfSDQvdCwINGG0ZbQuSDRgdGC0L7RgNGW0L3RhtGWINGWIHsyfSDQtyB7M30g0LTQu9GPINCy0YHRjNC+0LPQviDRgtC10YHRgtGDLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLQktC4INCy0LjRgtGA0LDRgtC40LvQuCB7MH0g0LcgezF9INC90LAg0YbRltC5INGB0YLQvtGA0ZbQvdGG0ZYuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi0JLQuCDQstC40YLRgNCw0YLQuNC70LggezB9INC3IHsxfSDQtNC70Y8g0LLRgdGM0L7Qs9C+INGC0LXRgdGC0YMuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCLQntGH0LjRgdGC0LjRgtC4XCIsXG4gIGNsZWFyQ2FwdGlvbjogXCLQntGH0LjRgdGC0LjRgtC4XCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcItCS0LjQtNCw0LvQuNGC0Lgg0YTQsNC50LtcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJ1YVwiXSA9IHVrcmFpbmlhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJ1YVwiXSA9IFwi0YPQutGA0LDRl9C90YHRjNC60LBcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vdWtyYWluaWFuLnRzIiwiaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIsIEV4cHJlc3Npb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBPcGVyYW5kTWFrZXIgfSBmcm9tIFwiLi9leHByZXNzaW9ucy9leHByZXNzaW9uc1wiO1xuaW1wb3J0IHsgUHJvY2Vzc1ZhbHVlIH0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIGZvciBhbGwgdHJpZ2dlcnMuXG4gKiBBIHRyaWdnZXIgY2FsbHMgYSBtZXRob2Qgd2hlbiB0aGUgZXhwcmVzc2lvbiBjaGFuZ2UgdGhlIHJlc3VsdDogZnJvbSBmYWxzZSB0byB0cnVlIG9yIGZyb20gdHJ1ZSB0byBmYWxzZS5cbiAqIFBsZWFzZSBub3RlLCBpdCBydW5zIG9ubHkgb25lIGNoYW5naW5nIHRoZSBleHByZXNzaW9uIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyaWdnZXIgZXh0ZW5kcyBCYXNlIHtcbiAgc3RhdGljIG9wZXJhdG9yc1ZhbHVlOiBIYXNoVGFibGU8RnVuY3Rpb24+ID0gbnVsbDtcbiAgc3RhdGljIGdldCBvcGVyYXRvcnMoKSB7XG4gICAgaWYgKFRyaWdnZXIub3BlcmF0b3JzVmFsdWUgIT0gbnVsbCkgcmV0dXJuIFRyaWdnZXIub3BlcmF0b3JzVmFsdWU7XG4gICAgVHJpZ2dlci5vcGVyYXRvcnNWYWx1ZSA9IHtcbiAgICAgIGVtcHR5OiBmdW5jdGlvbih2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZTtcbiAgICAgIH0sXG4gICAgICBub3RlbXB0eTogZnVuY3Rpb24odmFsdWU6IGFueSwgZXhwZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiAhIXZhbHVlO1xuICAgICAgfSxcbiAgICAgIGVxdWFsOiBmdW5jdGlvbih2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09IGV4cGVjdGVkVmFsdWU7XG4gICAgICB9LFxuICAgICAgbm90ZXF1YWw6IGZ1bmN0aW9uKHZhbHVlOiBhbnksIGV4cGVjdGVkVmFsdWU6IGFueSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgIT0gZXhwZWN0ZWRWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBjb250YWluczogZnVuY3Rpb24odmFsdWU6IGFueSwgZXhwZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAmJiB2YWx1ZVtcImluZGV4T2ZcIl0gJiYgdmFsdWUuaW5kZXhPZihleHBlY3RlZFZhbHVlKSA+IC0xO1xuICAgICAgfSxcbiAgICAgIG5vdGNvbnRhaW5zOiBmdW5jdGlvbih2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAhdmFsdWUgfHwgIXZhbHVlW1wiaW5kZXhPZlwiXSB8fCB2YWx1ZS5pbmRleE9mKGV4cGVjdGVkVmFsdWUpID09IC0xXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgZ3JlYXRlcjogZnVuY3Rpb24odmFsdWU6IGFueSwgZXhwZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA+IGV4cGVjdGVkVmFsdWU7XG4gICAgICB9LFxuICAgICAgbGVzczogZnVuY3Rpb24odmFsdWU6IGFueSwgZXhwZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA8IGV4cGVjdGVkVmFsdWU7XG4gICAgICB9LFxuICAgICAgZ3JlYXRlcm9yZXF1YWw6IGZ1bmN0aW9uKHZhbHVlOiBhbnksIGV4cGVjdGVkVmFsdWU6IGFueSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPj0gZXhwZWN0ZWRWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBsZXNzb3JlcXVhbDogZnVuY3Rpb24odmFsdWU6IGFueSwgZXhwZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA8PSBleHBlY3RlZFZhbHVlO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFRyaWdnZXIub3BlcmF0b3JzVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBjb25kaXRpb25SdW5uZXI6IENvbmRpdGlvblJ1bm5lcjtcbiAgcHJpdmF0ZSB1c2VkTmFtZXM6IEFycmF5PHN0cmluZz47XG4gIHByaXZhdGUgaGFzRnVuY3Rpb246IGJvb2xlYW47XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy51c2VkTmFtZXMgPSBbXTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wib3BlcmF0b3JcIiwgXCJ2YWx1ZVwiLCBcIm5hbWVcIl0sXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5vbGRQcm9wZXJ0aWVzQ2hhbmdlZCgpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImV4cHJlc3Npb25cIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uRXhwcmVzc2lvbkNoYW5nZWQoKTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInRyaWdnZXJiYXNlXCI7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IHRoaXMuZ2V0VHlwZSgpLnJlcGxhY2UoXCJ0cmlnZ2VyXCIsIFwiXCIpO1xuICAgIHZhciBleHAgPSAhIXRoaXMuZXhwcmVzc2lvbiA/IHRoaXMuZXhwcmVzc2lvbiA6IHRoaXMuYnVpbGRFeHByZXNzaW9uKCk7XG4gICAgaWYgKGV4cCkge1xuICAgICAgcmVzICs9IFwiLCBcIiArIGV4cDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0IG9wZXJhdG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm9wZXJhdG9yXCIsIFwiZXF1YWxcIik7XG4gIH1cbiAgcHVibGljIHNldCBvcGVyYXRvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIVRyaWdnZXIub3BlcmF0b3JzW3ZhbHVlXSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm9wZXJhdG9yXCIsIHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbHVlXCIsIG51bGwpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJuYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5hbWVcIiwgdmFsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJleHByZXNzaW9uXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXhwcmVzc2lvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgY2hlY2tFeHByZXNzaW9uKFxuICAgIGtleXM6IGFueSxcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbFxuICApIHtcbiAgICBpZiAoIXRoaXMuaXNDaGVja1JlcXVpcmVkKGtleXMpKSByZXR1cm47XG4gICAgaWYgKCEhdGhpcy5jb25kaXRpb25SdW5uZXIpIHtcbiAgICAgIHRoaXMucGVyZm9ybSh2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY2hlY2sodmFsdWU6IGFueSkge1xuICAgIHZhciB0cmlnZ2VyUmVzdWx0ID0gVHJpZ2dlci5vcGVyYXRvcnNbdGhpcy5vcGVyYXRvcl0odmFsdWUsIHRoaXMudmFsdWUpO1xuICAgIGlmICh0cmlnZ2VyUmVzdWx0KSB7XG4gICAgICB0aGlzLm9uU3VjY2Vzcyh7fSwgbnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25GYWlsdXJlKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcGVyZm9ybSh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHZhciB0cmlnZ2VyUmVzdWx0ID0gdGhpcy5jb25kaXRpb25SdW5uZXIucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgaWYgKHRyaWdnZXJSZXN1bHQpIHtcbiAgICAgIHRoaXMub25TdWNjZXNzKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25GYWlsdXJlKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvblN1Y2Nlc3ModmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHt9XG4gIHByb3RlY3RlZCBvbkZhaWx1cmUoKSB7fVxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgdGhpcy5vbGRQcm9wZXJ0aWVzQ2hhbmdlZCgpO1xuICB9XG4gIHByaXZhdGUgb2xkUHJvcGVydGllc0NoYW5nZWQoKSB7XG4gICAgdGhpcy5vbkV4cHJlc3Npb25DaGFuZ2VkKCk7XG4gIH1cbiAgcHJpdmF0ZSBvbkV4cHJlc3Npb25DaGFuZ2VkKCkge1xuICAgIHRoaXMudXNlZE5hbWVzID0gW107XG4gICAgdGhpcy5oYXNGdW5jdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuY29uZGl0aW9uUnVubmVyID0gbnVsbDtcbiAgfVxuICBwdWJsaWMgYnVpbGRFeHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLm5hbWUpIHJldHVybiBcIlwiO1xuICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eSh0aGlzLnZhbHVlKSAmJiB0aGlzLmlzUmVxdWlyZVZhbHVlKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gKFxuICAgICAgXCJ7XCIgK1xuICAgICAgdGhpcy5uYW1lICtcbiAgICAgIFwifSBcIiArXG4gICAgICB0aGlzLm9wZXJhdG9yICtcbiAgICAgIFwiIFwiICtcbiAgICAgIE9wZXJhbmRNYWtlci50b09wZXJhbmRTdHJpbmcodGhpcy52YWx1ZSlcbiAgICApO1xuICB9XG4gIHByaXZhdGUgaXNDaGVja1JlcXVpcmVkKGtleXM6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICgha2V5cykgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMuYnVpbGRVc2VkTmFtZXMoKTtcbiAgICBpZiAodGhpcy5oYXNGdW5jdGlvbiA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnVzZWROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGtleXMuaGFzT3duUHJvcGVydHkodGhpcy51c2VkTmFtZXNbaV0pKSByZXR1cm4gdHJ1ZTtcbiAgICAgIC8vaWYgKGtleXNbdGhpcy51c2VkTmFtZXNbaV1dICE9IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGJ1aWxkVXNlZE5hbWVzKCkge1xuICAgIGlmICghIXRoaXMuY29uZGl0aW9uUnVubmVyKSByZXR1cm47XG4gICAgdmFyIGV4cHJlc3Npb24gPSB0aGlzLmV4cHJlc3Npb247XG4gICAgaWYgKCFleHByZXNzaW9uKSB7XG4gICAgICBleHByZXNzaW9uID0gdGhpcy5idWlsZEV4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgaWYgKCFleHByZXNzaW9uKSByZXR1cm47XG4gICAgdGhpcy5jb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKGV4cHJlc3Npb24pO1xuICAgIHRoaXMuaGFzRnVuY3Rpb24gPSB0aGlzLmNvbmRpdGlvblJ1bm5lci5oYXNGdW5jdGlvbigpO1xuICAgIHRoaXMudXNlZE5hbWVzID0gdGhpcy5jb25kaXRpb25SdW5uZXIuZ2V0VmFyaWFibGVzKCk7XG4gICAgdmFyIHByb2Nlc3NWYWx1ZSA9IG5ldyBQcm9jZXNzVmFsdWUoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudXNlZE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnVzZWROYW1lc1tpXSA9IHByb2Nlc3NWYWx1ZS5nZXRGaXJzdE5hbWUodGhpcy51c2VkTmFtZXNbaV0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldCBpc1JlcXVpcmVWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvciAhPT0gXCJlbXB0eVwiICYmIHRoaXMub3BlcmF0b3IgIT0gXCJub3RlbXB0eVwiO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cnZleVRyaWdnZXJPd25lciB7XG4gIGdldE9iamVjdHMocGFnZXM6IHN0cmluZ1tdLCBxdWVzdGlvbnM6IHN0cmluZ1tdKTogYW55W107XG4gIHNldENvbXBsZXRlZCgpOiBhbnk7XG4gIHNldFRyaWdnZXJWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGlzVmFyaWFibGU6IGJvb2xlYW4pOiBhbnk7XG4gIGNvcHlUcmlnZ2VyVmFsdWUobmFtZTogc3RyaW5nLCBmcm9tTmFtZTogc3RyaW5nKTogYW55O1xufVxuXG4vKipcbiAqIEl0IGV4dGVuZHMgdGhlIFRyaWdnZXIgYmFzZSBjbGFzcyBhbmQgYWRkIHByb3BlcnRpZXMgcmVxdWlyZWQgZm9yIFN1cnZleUpTIGNsYXNzZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyIGV4dGVuZHMgVHJpZ2dlciB7XG4gIHByb3RlY3RlZCBvd25lcjogSVN1cnZleVRyaWdnZXJPd25lciA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIHNldE93bmVyKG93bmVyOiBJU3VydmV5VHJpZ2dlck93bmVyKSB7XG4gICAgdGhpcy5vd25lciA9IG93bmVyO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNPbk5leHRQYWdlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBJZiBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgaXQgbWFrZXMgcXVlc3Rpb25zL3BhZ2VzIHZpc2libGUuXG4gKiBPaHRlcndpc2UgaXQgbWFrZXMgdGhlbSBpbnZpc2libGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyVmlzaWJsZSBleHRlbmRzIFN1cnZleVRyaWdnZXIge1xuICBwdWJsaWMgcGFnZXM6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBxdWVzdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ2aXNpYmxldHJpZ2dlclwiO1xuICB9XG4gIHByb3RlY3RlZCBvblN1Y2Nlc3ModmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICB0aGlzLm9uVHJpZ2dlcih0aGlzLm9uSXRlbVN1Y2Nlc3MpO1xuICB9XG4gIHByb3RlY3RlZCBvbkZhaWx1cmUoKSB7XG4gICAgdGhpcy5vblRyaWdnZXIodGhpcy5vbkl0ZW1GYWlsdXJlKTtcbiAgfVxuICBwcml2YXRlIG9uVHJpZ2dlcihmdW5jOiBGdW5jdGlvbikge1xuICAgIGlmICghdGhpcy5vd25lcikgcmV0dXJuO1xuICAgIHZhciBvYmplY3RzID0gdGhpcy5vd25lci5nZXRPYmplY3RzKHRoaXMucGFnZXMsIHRoaXMucXVlc3Rpb25zKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZ1bmMob2JqZWN0c1tpXSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvbkl0ZW1TdWNjZXNzKGl0ZW06IGFueSkge1xuICAgIGl0ZW0udmlzaWJsZSA9IHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIG9uSXRlbUZhaWx1cmUoaXRlbTogYW55KSB7XG4gICAgaXRlbS52aXNpYmxlID0gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogSWYgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUsIGl0IGNvbXBsZXRlcyB0aGUgc3VydmV5LlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5VHJpZ2dlckNvbXBsZXRlIGV4dGVuZHMgU3VydmV5VHJpZ2dlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjb21wbGV0ZXRyaWdnZXJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzT25OZXh0UGFnZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdWNjZXNzKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKHRoaXMub3duZXIpIHRoaXMub3duZXIuc2V0Q29tcGxldGVkKCk7XG4gIH1cbn1cbi8qKlxuICogSWYgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUsIHRoZSB2YWx1ZSBmcm9tIHByb3BlcnR5ICoqc2V0VmFsdWUqKiB3aWxsIGJlIHNldCB0byAqKnNldFRvTmFtZSoqXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyU2V0VmFsdWUgZXh0ZW5kcyBTdXJ2ZXlUcmlnZ2VyIHtcbiAgcHVibGljIHNldFRvTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgc2V0VmFsdWU6IGFueTtcbiAgcHVibGljIGlzVmFyaWFibGU6IGJvb2xlYW47XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzZXR2YWx1ZXRyaWdnZXJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdWNjZXNzKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKCF0aGlzLnNldFRvTmFtZSB8fCAhdGhpcy5vd25lcikgcmV0dXJuO1xuICAgIHRoaXMub3duZXIuc2V0VHJpZ2dlclZhbHVlKHRoaXMuc2V0VG9OYW1lLCB0aGlzLnNldFZhbHVlLCB0aGlzLmlzVmFyaWFibGUpO1xuICB9XG59XG4vKipcbiAqIElmIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLCB0aGUgKipydW5FeHByZXNzaW9uKiogd2lsbCBiZSBydW4uIElmICoqc2V0VG9OYW1lKiogcHJvcGVydHkgaXMgbm90IGVtcHR5IHRoZW4gdGhlIHJlc3VsdCBvZiAqKnJ1bkV4cHJlc3Npb24qKiB3aWxsIGJlIHNldCB0byBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVRyaWdnZXJSdW5FeHByZXNzaW9uIGV4dGVuZHMgU3VydmV5VHJpZ2dlciB7XG4gIHB1YmxpYyBzZXRUb05hbWU6IHN0cmluZztcbiAgcHVibGljIHJ1bkV4cHJlc3Npb246IGFueTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJ1bmV4cHJlc3Npb250cmlnZ2VyXCI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU3VjY2Vzcyh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIGlmICghdGhpcy5vd25lciB8fCAhdGhpcy5ydW5FeHByZXNzaW9uKSByZXR1cm47XG4gICAgdmFyIG5ld1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHZhciBleHByZXNzaW9uID0gbmV3IEV4cHJlc3Npb25SdW5uZXIodGhpcy5ydW5FeHByZXNzaW9uKTtcbiAgICBpZiAoZXhwcmVzc2lvbi5jYW5SdW4pIHtcbiAgICAgIG5ld1ZhbHVlID0gZXhwcmVzc2lvbi5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNldFRvTmFtZSB8fCBuZXdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm93bmVyLnNldFRyaWdnZXJWYWx1ZSh0aGlzLnNldFRvTmFtZSwgbmV3VmFsdWUsIGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBJZiBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgdGhlIHZhbHVlIGZyb20gcXVlc3Rpb24gKipmcm9tTmFtZSoqIHdpbGwgYmUgc2V0IGludG8gKipzZXRUb05hbWUqKi5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVRyaWdnZXJDb3B5VmFsdWUgZXh0ZW5kcyBTdXJ2ZXlUcmlnZ2VyIHtcbiAgcHVibGljIHNldFRvTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgZnJvbU5hbWU6IGFueTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNvcHl2YWx1ZXRyaWdnZXJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdWNjZXNzKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKCF0aGlzLnNldFRvTmFtZSB8fCAhdGhpcy5vd25lcikgcmV0dXJuO1xuICAgIHRoaXMub3duZXIuY29weVRyaWdnZXJWYWx1ZSh0aGlzLnNldFRvTmFtZSwgdGhpcy5mcm9tTmFtZSk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcInRyaWdnZXJcIiwgW1xuICB7IG5hbWU6IFwib3BlcmF0b3JcIiwgZGVmYXVsdDogXCJlcXVhbFwiIH0sXG4gIFwidmFsdWVcIixcbiAgXCJleHByZXNzaW9uOmNvbmRpdGlvblwiXG5dKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXCJzdXJ2ZXl0cmlnZ2VyXCIsIFtcIm5hbWVcIl0sIG51bGwsIFwidHJpZ2dlclwiKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwidmlzaWJsZXRyaWdnZXJcIixcbiAgW1wicGFnZXNcIiwgXCJxdWVzdGlvbnNcIl0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgU3VydmV5VHJpZ2dlclZpc2libGUoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl0cmlnZ2VyXCJcbik7XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImNvbXBsZXRldHJpZ2dlclwiLFxuICBbXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlUcmlnZ2VyQ29tcGxldGUoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl0cmlnZ2VyXCJcbik7XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInNldHZhbHVldHJpZ2dlclwiLFxuICBbXCIhc2V0VG9OYW1lXCIsIFwic2V0VmFsdWVcIiwgXCJpc1ZhcmlhYmxlOmJvb2xlYW5cIl0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgU3VydmV5VHJpZ2dlclNldFZhbHVlKCk7XG4gIH0sXG4gIFwic3VydmV5dHJpZ2dlclwiXG4pO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImNvcHl2YWx1ZXRyaWdnZXJcIixcbiAgW1wiIXNldFRvTmFtZVwiLCBcIiFmcm9tTmFtZVwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlUcmlnZ2VyQ29weVZhbHVlKCk7XG4gIH0sXG4gIFwic3VydmV5dHJpZ2dlclwiXG4pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJydW5FeHByZXNzaW9udHJpZ2dlclwiLFxuICBbXCJzZXRUb05hbWVcIiwgXCJydW5FeHByZXNzaW9uXCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVRyaWdnZXJSdW5FeHByZXNzaW9uKCk7XG4gIH0sXG4gIFwic3VydmV5dHJpZ2dlclwiXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3RyaWdnZXIudHMiLCIvLyBtb2RlbFxuZXhwb3J0ICogZnJvbSBcIi4vY2h1bmtzL21vZGVsXCI7XG5cbi8vIGxvY2FsaXphdGlvblxuaW1wb3J0IFwiLi9jaHVua3MvbG9jYWxpemF0aW9uXCI7XG5cbi8vIGhlbHBlcnNcbmV4cG9ydCAqIGZyb20gXCIuL2NodW5rcy9oZWxwZXJzXCI7XG5cbi8vIGNzcyBzdGFuZGFyZFxuZXhwb3J0IHsgZGVmYXVsdFN0YW5kYXJkQ3NzIH0gZnJvbSBcIi4uL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmRcIjtcbi8vIGNzcyBib290c3RyYXBcbmV4cG9ydCB7IGRlZmF1bHRCb290c3RyYXBDc3MgfSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3Nib290c3RyYXBcIjtcbi8vIGNzcyBib290c3RyYXAgKyBtYXRlcmlhbFxuZXhwb3J0IHtcbiAgZGVmYXVsdEJvb3RzdHJhcE1hdGVyaWFsQ3NzXG59IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc2Jvb3RzdHJhcG1hdGVyaWFsXCI7XG4vLyBzdHlsZXNcbmltcG9ydCBcIi4uL21haW4uc2Nzc1wiO1xuXG4vLyBrbm9ja291dFxuZXhwb3J0IHsgU3VydmV5IH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvc3VydmV5XCI7XG5leHBvcnQgeyBTdXJ2ZXkgYXMgTW9kZWwgfSBmcm9tIFwiLi4va25vY2tvdXQva29zdXJ2ZXlcIjtcbmV4cG9ydCB7IEltcGxlbWVudG9yQmFzZSB9IGZyb20gXCIuLi9rbm9ja291dC9rb2Jhc2VcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUm93LCBQYWdlLCBQYW5lbCB9IGZyb20gXCIuLi9rbm9ja291dC9rb3BhZ2VcIjtcbmV4cG9ydCB7IEZsb3dQYW5lbCB9IGZyb20gXCIuLi9rbm9ja291dC9rb2Zsb3dwYW5lbFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uXCI7XG5leHBvcnQge1xuICBRdWVzdGlvblNlbGVjdEJhc2VJbXBsZW1lbnRvclxufSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5leHBvcnQge1xuICBRdWVzdGlvbkNoZWNrYm94QmFzZUltcGxlbWVudG9yXG59IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3ggfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9jaGVja2JveFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25Db21tZW50IH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fY29tbWVudFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25Ecm9wZG93biB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2Ryb3Bkb3duXCI7XG5leHBvcnQgeyBRdWVzdGlvbkZpbGUgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9maWxlXCI7XG5leHBvcnQgeyBRdWVzdGlvbkh0bWwgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9odG1sXCI7XG5leHBvcnQgeyBNYXRyaXhSb3csIFF1ZXN0aW9uTWF0cml4IH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fbWF0cml4XCI7XG5leHBvcnQgeyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25cIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uTWF0cml4RHluYW1pY0ltcGxlbWVudG9yLFxuICBRdWVzdGlvbk1hdHJpeER5bmFtaWNcbn0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fbWF0cml4ZHluYW1pY1wiO1xuZXhwb3J0IHsgUXVlc3Rpb25QYW5lbER5bmFtaWMgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9wYW5lbGR5bmFtaWNcIjtcbmV4cG9ydCB7XG4gIE11bHRpcGxlVGV4dEl0ZW0sXG4gIFF1ZXN0aW9uTXVsdGlwbGVUZXh0SW1wbGVtZW50b3IsXG4gIFF1ZXN0aW9uTXVsdGlwbGVUZXh0XG59IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX211bHRpcGxldGV4dFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25SYWRpb2dyb3VwIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fcmFkaW9ncm91cFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25SYXRpbmcgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9yYXRpbmdcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uVGV4dCB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX3RleHRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQm9vbGVhbiB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2Jvb2xlYW5cIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRW1wdHkgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9lbXB0eVwiO1xuZXhwb3J0IHsgUXVlc3Rpb25FeHByZXNzaW9uIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fZXhwcmVzc2lvblwiO1xuZXhwb3J0IHsgUXVlc3Rpb25JbWFnZVBpY2tlciB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2ltYWdlcGlja2VyXCI7XG5leHBvcnQgeyBTdXJ2ZXlXaW5kb3cgfSBmcm9tIFwiLi4va25vY2tvdXQva29TdXJ2ZXlXaW5kb3dcIjtcbmV4cG9ydCB7IFN1cnZleVRlbXBsYXRlVGV4dCB9IGZyb20gXCIuLi9rbm9ja291dC90ZW1wbGF0ZVRleHRcIjtcblxuLy9VbmNvbW1lbnQgdG8gaW5jbHVkZSB0aGUgXCJkYXRlXCIgcXVlc3Rpb24gdHlwZS5cbi8vZXhwb3J0IHtRdWVzdGlvbkRhdGV9IGZyb20gXCIuLi9wbHVnaW5zL2tub2Nrb3V0L2tvcXVlc3Rpb25fZGF0ZVwiO1xuXG5pbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcIi4uL3N1cnZleVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJUZW1wbGF0ZUVuZ2luZSB9IGZyb20gXCIuLi9rbm9ja291dC9rb3N1cnZleVwiO1xucmVnaXN0ZXJUZW1wbGF0ZUVuZ2luZShrbywgU3VydmV5TW9kZWwucGxhdGZvcm0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2VudHJpZXMva25vY2tvdXQudHMiXSwic291cmNlUm9vdCI6IiJ9
| ver. 1.4 |
Github
|
.
| PHP 7.2.34 | Generation time: 1.23 |
proxy
|
phpinfo
|
Settings