PageSourceSearch

https://siwidata.com/vendors~8da00323.5fc13bafa969d3aaf660.chunk.js

js siwidata.com collected 2026-09-25 03:47:17 UTC 468,138 bytes, 110 lines download raw bytes

1(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["vendors~8da00323"],{
2
3/***/ "/97J":
4/*!****************************************************************!*\
5  !*** ./node_modules/@siwidata/siwiui/dist/grouprole-filter.js ***!
6  \****************************************************************/
7/*! exports provided: GrouproleFilterValueConverter */
8/***/ (function(module, __webpack_exports__, __webpack_require__) {
9
10"use strict";
11eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"GrouproleFilterValueConverter\", function() { return GrouproleFilterValueConverter; });\n/* harmony import */ var aurelia_framework__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! aurelia-framework */ \"aurelia-framework\");\n/* harmony import */ var _siwidata_auth__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @siwidata/auth */ \"8Wdz\");\n/* harmony import */ var _siwidata_auth__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_siwidata_auth__WEBPACK_IMPORTED_MODULE_1__);\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    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;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (undefined && undefined.__metadata) || function (k, v) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\n\r\n\r\nvar GrouproleFilterValueConverter = /** @class */ (function () {\r\n    function GrouproleFilterValueConverter(auth) {\r\n        this.auth = auth;\r\n        this.signals = ['auth'];\r\n    }\r\n    GrouproleFilterValueConverter.prototype.toView = function (array) {\r\n        var _this = this;\r\n        if (!array)\r\n            return [];\r\n        var ret = array;\r\n        return ret.filter(function (c) {\r\n            var hasWidgetsInRole = false;\r\n            c.Items.forEach(function (ci) {\r\n                if (!ci.RequiresRole || ci.RequiresRole.length == 0) {\r\n                    hasWidgetsInRole = true;\r\n                }\r\n                else {\r\n                    if (_this.auth.auth) {\r\n                        ci.RequiresRole.forEach(function (f) {\r\n                            if (_this.auth.IsInRole(f))\r\n                                hasWidgetsInRole = true;\r\n                        });\r\n                    }\r\n                }\r\n            });\r\n            return hasWidgetsInRole;\r\n        });\r\n    };\r\n    GrouproleFilterValueConverter = __decorate([\r\n        Object(aurelia_framework__WEBPACK_IMPORTED_MODULE_0__[\"inject\"])(_siwidata_auth__WEBPACK_IMPORTED_MODULE_1__[\"Auth\"]),\r\n        __metadata(\"design:paramtypes\", [_siwidata_auth__WEBPACK_IMPORTED_MODULE_1__[\"Auth\"]])\r\n    ], GrouproleFilterValueConverter);\r\n    return GrouproleFilterValueConverter;\r\n}());\r\n\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLzk3Si5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2l3aWRhdGEvc2l3aXVpL2Rpc3QvZ3JvdXByb2xlLWZpbHRlci5qcz9mZmRlIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBfX2RlY29yYXRlID0gKHRoaXMgJiYgdGhpcy5fX2RlY29yYXRlKSB8fCBmdW5jdGlvbiAoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybi
11BjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn07XHJcbnZhciBfX21ldGFkYXRhID0gKHRoaXMgJiYgdGhpcy5fX21ldGFkYXRhKSB8fCBmdW5jdGlvbiAoaywgdikge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKGssIHYpO1xyXG59O1xyXG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICdhdXJlbGlhLWZyYW1ld29yayc7XHJcbmltcG9ydCB7IEF1dGggfSBmcm9tICdAc2l3aWRhdGEvYXV0aCc7XHJcbnZhciBHcm91cHJvbGVGaWx0ZXJWYWx1ZUNvbnZlcnRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEdyb3Vwcm9sZUZpbHRlclZhbHVlQ29udmVydGVyKGF1dGgpIHtcclxuICAgICAgICB0aGlzLmF1dGggPSBhdXRoO1xyXG4gICAgICAgIHRoaXMuc2lnbmFscyA9IFsnYXV0aCddO1xyXG4gICAgfVxyXG4gICAgR3JvdXByb2xlRmlsdGVyVmFsdWVDb252ZXJ0ZXIucHJvdG90eXBlLnRvVmlldyA9IGZ1bmN0aW9uIChhcnJheSkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgaWYgKCFhcnJheSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHZhciByZXQgPSBhcnJheTtcclxuICAgICAgICByZXR1cm4gcmV0LmZpbHRlcihmdW5jdGlvbiAoYykge1xyXG4gICAgICAgICAgICB2Y
11XIgaGFzV2lkZ2V0c0luUm9sZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjLkl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGNpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNpLlJlcXVpcmVzUm9sZSB8fCBjaS5SZXF1aXJlc1JvbGUubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBoYXNXaWRnZXRzSW5Sb2xlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5hdXRoLmF1dGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2kuUmVxdWlyZXNSb2xlLmZvckVhY2goZnVuY3Rpb24gKGYpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5hdXRoLklzSW5Sb2xlKGYpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1dpZGdldHNJblJvbGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gaGFzV2lkZ2V0c0luUm9sZTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICBHcm91cHJvbGVGaWx0ZXJWYWx1ZUNvbnZlcnRlciA9IF9fZGVjb3JhdGUoW1xyXG4gICAgICAgIGluamVjdChBdXRoKSxcclxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW0F1dGhdKVxyXG4gICAgXSwgR3JvdXByb2xlRmlsdGVyVmFsdWVDb252ZXJ0ZXIpO1xyXG4gICAgcmV0dXJuIEdyb3Vwcm9sZUZpbHRlclZhbHVlQ29udmVydGVyO1xyXG59KCkpO1xyXG5leHBvcnQgeyBHcm91cHJvbGVGaWx0ZXJWYWx1ZUNvbnZlcnRlciB9O1xyXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:////97J\n");
12
13/***/ }),
14
15/***/ "1Uh/":
16/*!**********************************************************!*\
17  !*** ./node_modules/@siwidata/siwiui/dist/gridmodels.js ***!
18  \**********************************************************/
19/*! exports provided: GridModel, GridColumn, GridColumnType, GridColumnAlignment, MaxLenValidation, MinLenValidation, RequiredValidation, RegularExpressionValidation, LatinValidation, EmailAddressValidation, PhoneNumberValidation, MultipleEmailAddressesValidation, NumericValidation, NumericRangeValidation, DateRangeValidation, ResponsiveTitlePosition, ResponsiveRemarkPosition */
20/***/ (function(module, __webpack_exports__, __webpack_require__) {
21
22"use strict";
23eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"GridModel\", function() { return GridModel; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"GridColumn\", function() { return GridColumn; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"GridColumnType\", function() { return GridColumnType; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"GridColumnAlignment\", function() { return GridColumnAlignment; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MaxLenValidation\", function() { return MaxLenValidation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MinLenValidation\", function() { return MinLenValidation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"RequiredValidation\", function() { return RequiredValidation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"RegularExpressionValidation\", function() { return RegularExpressionValidation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LatinValidation\", function() { return LatinValidation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"EmailAddressValidation\", function() { return EmailAddressValidation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"PhoneNumberValidation\", function() { return PhoneNumberValidation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MultipleEmailAddressesValidation\", function() { return MultipleEmailAddressesValidation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"NumericValidation\", function() { return NumericValidation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"NumericRangeValidation\", function() { return NumericRangeValidation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"DateRangeValidation\", function() { return DateRangeValidation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ResponsiveTitlePosition\", function() { return ResponsiveTitlePosition; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ResponsiveRemarkPosition\", function() { return ResponsiveRemarkPosition; });\n/* harmony import */ var aurelia_logging__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! aurelia-logging */ \"MP1E\");\n/* harmony import */ var aurelia_framework__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! aurelia-framework */ \"aurelia-framework\");\n/* harmony import */ var aurelia_event_aggregator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! aurelia-event-aggregator */ \"aurelia-event-aggregator\");\n/* harmony import */ var _siwikeyboard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./siwikeyboard */ \"GL6p\");\n/* harmony import */ var _siwidata_componentframework__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @siwidata/componentframework */ \"oXXJ\");\n/* harmony import */ var _siwidata_config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @siwidata/config */ \"4fGU\");\n/* harmony import */ var _siwidata_config__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_siwidata_config__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _siwidata_converters__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @siwidata/converters */ \"W5Bm\");\n/* harmony import */ var _siwidata_converters__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_siwidata_converters__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var css_vars_ponyfill__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! css-vars-ponyfill */ \"vjCF\");\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c >
23 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (undefined && undefined.__metadata) || function (k, v) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nObject(css_vars_ponyfill__WEBPACK_IMPORTED_MODULE_7__[\"default\"])({});\r\nvar GridModel = /** @class */ (function () {\r\n    function GridModel() {\r\n        this.gridKey = \"siwigrid_\" + new Date().getTime().toString();\r\n        this.FilterDebounceInMs = 50;\r\n        this.IsIE = false;\r\n        this.Columns = new Array();\r\n        this.ActiveColumns = new Array();\r\n        this.FormColumns = [];\r\n        this.ShowRemarks = true;\r\n        this.NoDataMessage = \"--- NO DATA AVAILABLE ---\";\r\n        this.Width = \"100%\";\r\n        this.Height = \"\";\r\n        this.ScrollLeft = 0;\r\n        this.ScrollTop = 0;\r\n        this.RowHeight = 20;\r\n        this.VisibleRows = 10;\r\n        this.ShowRowsBeforeScrolling = 3;\r\n        this.mCurrentRowIndex = 0;\r\n        this.CurrentColIndex = 0;\r\n        this.CanAddNew = false;\r\n        this.CanDelete = false;\r\n        this.CanEdit = false;\r\n        this.NewRow = {};\r\n        this.AddNewColIndex = -1;\r\n        this.IsResponsiveForm = false;\r\n        this.EditRowIndex = -1;\r\n        this.EditColIndex = -1;\r\n        this.EditFilterColIndex = -1;\r\n        this.FilteredData = null;\r\n        this.FilterOnServer = false;\r\n        this.SortOnServer = false;\r\n        this.EditValueDateString = \"\";\r\n        this.EditValueTimeString = \"\";\r\n        this.EditValidationError = \"\";\r\n        this.ShowHeaders = true;\r\n        this.ShowFilters = true;\r\n        this.AllowSorting = true;\r\n        this.RowSelectionMode = false;\r\n        this.AllowHorizontalScrolling = false;\r\n        this.UseRowDividers = false;\r\n        this.CurrentColEditFieldIndex = 0;\r\n        this.scrollBarWidth = 30;\r\n        this.containerRatioWidth = 100;\r\n        this.lastContainerWidth = -1;\r\n        this.IsAdjustVisibleRowsToContainer = false;\r\n        this.HeightAdjustmentValue = 0;\r\n        this.containerHeight = 0;\r\n        this.ValidationErrors = [];\r\n        this.HasValidationErrors = false;\r\n        this.ValidationSummary = \"\";\r\n        // siwi-virtual-grid sets this to true\r\n        this.IsVirtual = false;\r\n        //Events\r\n        this.SelectedItemChanged = new _siwidata_componentframework__WEBPACK_IMPORTED_MODULE_4__[\"TypedEvent\"]();\r\n        this.SelectedRowColChanged = new _siwidata_componentframework__WEBPACK_IMPORTED_MODULE_4__[\"TypedEvent\"]();\r\n        this.NewRowDataChanged = new _siwidata_componentframework__WEBPACK_IMPORTED_MODULE_4__[\"TypedEvent\"]();\r\n        this.AfterExitEditMode = new _siwidata_componentframework__WEBPACK_IMPORTED_MODULE_4__[\"TypedEvent\"]();\r\n        this.FilterChanged = new _siwidata_componentframework__WEBPACK_IMPORTED_MODULE_4__[\"TypedEvent\"]();\r\n        this.SortChanged = new _siwidata_componentframework__WEBPACK_IMPORTED_MODULE_4__[\"TypedEvent\"]();\r\n        this.boundContainerId = \"\";\r\n        this.allowReSorting = false;\r\n        this.BrowserSupportsPlaceHolders = false;\r\n        this.ResponsiveTitlePosition = ResponsiveTitlePosition.TOP;\r\n        this.ResponsiveRemarkPosition = ResponsiveRemarkPosition.BOTTOM;\r\n        this.Config = aurelia_framework__WEBPACK_IMPORTED_MODULE_1__[\"Container\"].instance.get(_siwidata_config__WEBPACK_IMPORTED_MODULE_5__[\"Config\"]);\r\n        this.EventAggregator = aurelia_framework__WEBPACK_IMPORTED_MODULE_1__[\"Container\"].instance.get(aurelia_event_aggregator__WEBPACK_IMPORTED_MODULE_2__[\"EventAggregator\"]);\r\n        this.logger = aurelia_logging__WEBPACK_IMPORTED_MODULE_0__[\"getLogger\"](\"siwigrid\");\r\n        this.taskQueue = new aurelia_framework__WEBPACK_IMPORTED_MODULE_1__[\"TaskQueue\"]();\r\n        this.nonEditingShortcuts = new Map();\r\n        this.FormColumns.push(new GridColumn(\"\").SetHeader(\"DESCRIPTION\").SetWidth(\"150px\"));\r\n        this.FormColumns.push(new GridColumn(\"\").SetHeader(\"VALUE\").SetWidth(\"100px\"));\r\n        this.FormColumns.push(new GridColumn(\"\").SetHeader(\"REMARKS\").SetWidth(\"100px\"));\r\n        this.ResponsiveFormEdits = {};\r\n        if (this.EventAggregator) {\r\n            this.EventAggregator.subscribe(\"container_resized\", this.OnContainerResize.bind(this));\r\n        }\r\n        var isIE = parseInt((/msie (\\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);\r\n        if (isNaN(isIE)) {\r\n            isIE = parseInt((/trident\\/.*; rv:(\\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);\r\n        }\r\n        if (isIE && !isNaN(isIE)) {\r\n            this.IsIE = true;\r\n        }\r\n        this.BrowserSupportsPlaceHolders = !this.IsIE && document.createElement(\"input\").placeholder !== undefined;\r\n    }\r\n    GridModel.prototype.OnContainerResize = function (n) {\r\n        var _this = this;\r\n        if (this.boundContainerId && n.Id.toLowerCase() == this.boundContainerId.toLowerCase()) {\r\n            if (n.Blade) {\r\n                this.ContainingBlade = n.Blade;\r\n                this.containerHeight = n.Height;\r\n                var containerWidth = parseInt(n.Width);\r\n                if (!Number.isNaN(containerWidth))\r\n                    this.AdjustWidthToBlade(containerWidth);\r\n                if (this.IsAdjustVisibleRowsToContainer) {\r\n                    this.taskQueue.queueTask(function () {\r\n                        _this.adjustToContainer();\r\n                    });\r\n                }\r\n            }\r\n            else {\r\n                return;\r\n            }\r\n        }\r\n    };\r\n    GridModel.prototype.AdjustWidthToBlade = function (containerWidth) {\r\n        if (this.ContainingBlade && this.ContainingBlade.BladeSystem && this.ContainingBlade.BladeSystem.RenderMode &&\r\n            this.ContainingBlade.BladeSystem.RenderMode == \"DESKTOP\" && this.ContainingBlade.HTMLContentElement) {\r\n            if (this.ContainingBlade.HTMLContentElement.scrollHeight > this.ContainingBlade.HTMLContentElement.clientHeight) {\r\n                containerWidth = Math.max(containerWidth - this.scrollBarWidth, 0);\r\n            }\r\n        }\r\n        //TODO: Christian Graffer: wenn die containerRatioWidth != 100 ist dann funktioniert das nicht mit unterschiedlichen Browser Zoomstufen\r\n        this.SetWidth((containerWidth * (this.containerRatioWidth / 100)).toString() + \"px\");\r\n    };\r\n    GridModel.prototype.setResponsiveFormDataSource = function () {\r\n        var _this = this;\r\n        this.Columns.forEach(function (col) {\r\n            if (!_this.ResponsiveFormEdits.hasOwnProperty(col.DataField) || !_this.ResponsiveFormEdits[col.DataField]) {\r\n                _this.ResponsiveFormEdits[col.DataField] = {\r\n                    EditValue: null,\r\n                    EditValueDateString: null,\r\n                    EditValueTimeString: null,\r\n                    IsChecked: null,\r\n                    EditUnsupportedBrowserDateTime: {\r\n                        Year: null,\r\n                        Month: null,\r\n                        DayOfMonth: null\r\n                    }\r\n                };\r\n            }\r\n            if (_this.DataSource && _this.DataSource.length > 0) {\r\n                var colField = _this.ResponsiveFormEdits[col.DataField];\r\n                var colVal_1 = null;\r\n                if (col.d5) {\r\n                    colVal_1 = _this.DataSource[0][col.d1][col.d2][col.d3][col.d4][col.d5];\r\n                }\r\n                else if (col.d4) {\r\n                    colVal_1 = _this.DataSource[0][col.d1][col.d2][col.d3][col.d4];\r\n                }\r\n                else if (col.d3) {\r\n                    colVal_1 = _this.DataSource[0][col.d1][col.d2][col.d3];\r\n                }\r\n                else if (col.d2) {\r\n                    colVal_1 = _this.DataSource[0][col.d1][col.d2];\r\n                }\r\n                else {\r\n                    colVal_1 = _this.DataSource[0][col.d1];\r\n                }\r\n                if (colVal_1) {\r\n                    if (col.ColumnType == GridColumnType.DATE || col.ColumnType == GridColumnType.SIWIDATETIME || col.ColumnType == GridColumnType.SIWINETTIME) {\r\n                        var colDate = void 0;\r\n                        if (col.ColumnType == GridColumnType.SIWIDATETIME || col.ColumnType == GridColumnType.SIWINETTIME) {\r\n                            colDate = _siwidata_converters__WEBPACK_IMPORTED_MODULE_6__[\"DateTimeFormatters\"].SiwiDateTimeToDate(colVal_1);\r\n                        }\r\n                        else {\r\n                            colDate = new Date(colVal_1);\r\n                        }\r\n                        colField.EditValueDateString = colDate.getFullYear() + '-' + ('0' + (colDate.getMonth() + 1)).slice(-2) + '-' + ('0' + colDate.getDate()).slice(-2);\r\n                        colField.EditValueTimeString = _siwidata_converters__WEBPACK_IMPORTED_MODULE_6__[\"DateTimeFormatters\"].FormatDate(colDate, \"HH:mm\");\r\n                        colField.EditUnsupportedBrowserDateTime.Year = colDate.getFullYear();\r\n                        colField.EditUnsupportedBrowserDateTime.Month = colDate.getMonth() + 1;\r\n                        colField.EditUnsupportedBrowserDateTime.DayOfMonth = colDate.getDate();\r\n                    }\r\n                    else if (col.ColumnType == GridColumnType.CHECKBOX) {\r\n                        colField.IsChecked = colVal_1;\r\n                    }\r\n                    else if (col.ColumnType == GridColumnType.SIWINETPOINTS) {\r\n                        colField.EditValue = colVal_1 / 1000000;\r\n                    }\r\n                    else if (col.ColumnType == GridColumnType.FOREIGNKEY) {\r\n                        var found_1 = false;
23\r\n                        col.ForeignItems.forEach(function (item) {\r\n                            if (found_1)\r\n                                return;\r\n                            if (colVal_1.hasOwnProperty(col.ForeignKeyField) && colVal_1[col.ForeignKeyField] == item[col.ForeignKeyField] &&\r\n                                colVal_1.hasOwnProperty(col.ForeignDescriptionField) && colVal_1[col.ForeignDescriptionField] == item[col.ForeignDescriptionField]) {\r\n                                colVal_1 = item;\r\n                                found_1 = true;\r\n                            }\r\n                        });\r\n                        if (!found_1) {\r\n                            if (col.ForeignAllowNull) {\r\n                                colVal_1 = null;\r\n                            }\r\n                            else {\r\n                                colVal_1 = col.ForeignItems[0];\r\n                            }\r\n                        }\r\n                        colField.EditValue = colVal_1;\r\n                    }\r\n                    else {\r\n                        colField.EditValue = colVal_1;\r\n                    }\r\n                }\r\n            }\r\n        });\r\n    };\r\n    GridModel.prototype.SetDataSource = function (dataSource) {\r\n        if (this.IsEditing)\r\n            this.exitEditMode(true, true);\r\n        this.DataSource = dataSource;\r\n        this.FilteredData = this.DataSource;\r\n        this.SelectedItem = null;\r\n        if (this.IsResponsiveForm) {\r\n            this.setResponsiveFormDataSource();\r\n        }\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetEmptyResponsiveFormDataSource = function () {\r\n        var ds = {};\r\n        this.Columns.forEach(function (col) {\r\n            ds[col.d1] = col.d2 ? {} : null;\r\n            if (col.d2)\r\n                ds[col.d1][col.d2] = col.d3 ? {} : null;\r\n            if (col.d3)\r\n                ds[col.d1][col.d2][col.d3] = col.d4 ? {} : null;\r\n            if (col.d4)\r\n                ds[col.d1][col.d2][col.d3][col.d4] = col.d5 ? {} : null;\r\n            if (col.d5)\r\n                ds[col.d1][col.d2][col.d3][col.d4][col.d5] = null;\r\n        });\r\n        this.SetDataSource([ds]);\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetIsLocked = function (isLocked) {\r\n        this.IsLocked = isLocked;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetContainerElement = function (container) {\r\n        var _this = this;\r\n        this.containerElement = container;\r\n        //vom BladeSystem anfordern\r\n        this.EventAggregator.publish(\"get_container_size\", { Id: this.boundContainerId });\r\n        this.taskQueue.queueTask(function () {\r\n            _this.adjustToContainer();\r\n        });\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetKeyHandler = function (keyCombo, keyFunc, keyPreventDefault) {\r\n        if (keyPreventDefault === void 0) { keyPreventDefault = true; }\r\n        this.nonEditingShortcuts.set(keyCombo, { combo: keyCombo, func: keyFunc, preventDefault: keyPreventDefault });\r\n        return this;\r\n    };\r\n    GridModel.prototype.CurrentColIndexChanged = function () {\r\n        if (this.CurrentColIndex >= 0 && this.CurrentColIndex < this.Columns.length) {\r\n            this.SelectedRowColChanged.trigger(this.FilteredData[this.CurrentRowIndex], this.ActiveColumns[this.CurrentColIndex]);\r\n        }\r\n    };\r\n    GridModel.prototype.HeightAdjustmentValueChanged = function (newValue, oldValue) {\r\n        this.adjustToContainer();\r\n    };\r\n    GridModel.prototype.adjustToContainer = function () {\r\n        if (this.containerElement) {\r\n            var rect = this.containerElement.getBoundingClientRect();\r\n            //console.log(this.gridKey+\",width:\" + rect.width.toString());\r\n            //console.log(this.gridKey + \",top:\" + rect.top.toString());\r\n            //console.log(this.gridKey + \",bottom:\" + rect.bottom.toString());\r\n            //console.log(this.gridKey + \",height:\" + rect.height.toString());\r\n            if (rect.height > 0 && this.containerHeight > 0) {\r\n                if (this.IsAdjustVisibleRowsToContainer) {\r\n                    var vr = Math.floor((this.containerHeight + this.HeightAdjustmentValue - rect.top) / (this.RowHeight * 1.0)); // do we need window.devicePixelRatio?\r\n                    //vr -= 3;\r\n                    if (vr < 3)\r\n                        vr = 3;\r\n                    this.SetVisibleRows(Math.floor(vr));\r\n                }\r\n            }\r\n        }\r\n    };\r\n    GridModel.prototype.ClearFilters = function () {\r\n        var _this = this;\r\n        var shouldClear = false;\r\n        if (this.IsEditing) {\r\n            if (this.canExitEditMode()) {\r\n                this.exitEditMode();\r\n                shouldClear = true;\r\n            }\r\n        }\r\n        else {\r\n            shouldClear = true;\r\n        }\r\n        if (shouldClear) {\r\n            this.Columns.forEach(function (c) {\r\n                if (c.ColumnType == GridColumnType.CHECKBOX) {\r\n                    c.FilterExpression = null;\r\n                    _this.taskQueue.queueTask(function () {\r\n                        //var cb1 = document.getElementById(this.gridKey + \"_\" + c.DataField+\"_filter1\");\r\n                        //if (cb1) (<any>
23cb1).indeterminate = true;\r\n                        //\r\n                        //var cb2 = document.getElementById(this.gridKey + \"_\" + c.DataField + \"_filter2\");\r\n                        //if (cb2) (<any>cb2).indeterminate = true;\r\n                    });\r\n                }\r\n                else {\r\n                    c.FilterExpression = \"\";\r\n                }\r\n            });\r\n        }\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetVisibleRows = function (rows) {\r\n        if (rows == 0) {\r\n            this.VisibleRows = rows;\r\n            this.Height = \"\";\r\n        }\r\n        else {\r\n            this.VisibleRows = rows;\r\n            var horizontalScrollbarHeight = 0;\r\n            if (this.AllowHorizontalScrolling)\r\n                horizontalScrollbarHeight = 32;\r\n            this.Height = horizontalScrollbarHeight + (this.VisibleRows * this.RowHeight).toString();\r\n        }\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetAllowHorizontalScrolling = function (set) {\r\n        this.AllowHorizontalScrolling = set;\r\n        this.SetVisibleRows(this.VisibleRows);\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetUseRowDividers = function (set) {\r\n        this.UseRowDividers = set;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SendSignal = function () {\r\n        if (this.Signaler)\r\n            this.Signaler.signal(this.gridKey);\r\n    };\r\n    GridModel.prototype.SetNoSelection = function () {\r\n        this.CurrentRowIndex = -1;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetNoDataMessage = function (msg) {\r\n        this.NoDataMessage = msg;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetFilterOnServer = function (filterOnServer) {\r\n        this.FilterOnServer = filterOnServer;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetSortOnServer = function (sortOnServer) {\r\n        this.SortOnServer = sortOnServer;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetMobileRendering = function (isMobile) {\r\n        if (isMobile) {\r\n            this.scrollBarWidth = 0;\r\n        }\r\n        else {\r\n            this.scrollBarWidth = 30;\r\n        }\r\n        return this;\r\n    };\r\n    GridModel.prototype.StartEditing = function (datafield) {\r\n        this.CanEdit = true;\r\n        var found = false;\r\n        for (var i = 0; i < this.ActiveColumns.length; i++) {\r\n            if (this.ActiveColumns[i].DataField == datafield) {\r\n                this.CurrentColIndex = i;\r\n                found = true;\r\n                break;\r\n            }\r\n        }\r\n        if (found) {\r\n            this.enterEditMode();\r\n        }\r\n    };\r\n    GridModel.prototype.Column = function (id) {\r\n        return this.Columns.find(function (f) { return f.DataField == id; });\r\n    };\r\n    GridModel.prototype.SetFormLabelsWidth = function (width) {\r\n        this.FormColumns[0].Width = width.toString() + \"px\";\r\n        this.FormColumns[0].useWidth = this.FormColumns[0].Width;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetFormRemarksWidth = function (width) {\r\n        this.FormColumns[2].Width = width.toString() + \"px\";\r\n        this.FormColumns[2].useWidth = this.FormColumns[2].Width;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetWidth = function (width) {\r\n        if (width.indexOf(\"px\") >= 0) {\r\n            this.AssignedWidth = width;\r\n            var pixelWidth_1 = parseInt(width.replace(\"px\", \"\"));\r\n            var usedWidth_1 = 0;\r\n            this.Columns.forEach(function (c) {\r\n                if (c.IsVisible) {\r\n                    if (c.MaxWidthToShow && c.MinWidthToShow) {\r\n                        c.IsHidden = !((pixelWidth_1 >= c.MinWidthToShow) && (pixelWidth_1 < c.MaxWidthToShow));\r\n                    }\r\n                    else {\r\n                        c.IsHidden = false;\r\n                    }
23\r\n                    if (c.Width != \"\" && !c.IsHidden) {\r\n                        usedWidth_1 += parseInt(c.Width.replace(\"px\", \"\"));\r\n                    }\r\n                }\r\n            });\r\n            //Scrollbar\r\n            usedWidth_1 += this.scrollBarWidth;\r\n            if (usedWidth_1 < pixelWidth_1) {\r\n                this.Columns.forEach(function (c) {\r\n                    if (c.Width == \"\" && !c.IsHidden) {\r\n                        c.useWidth = (pixelWidth_1 - usedWidth_1).toString() + \"px\";\r\n                    }\r\n                });\r\n            }\r\n            //Neu: 11. NOV 2017: So ist bei leeren Grids schon die Breite sinnvoller\r\n            var ww = 0;\r\n            var starColumn = null;\r\n            this.ActiveColumns.forEach(function (c) {\r\n                if (!c.IsHidden) {\r\n                    if (!c.actualWidth) {\r\n                        if (c.Width && c.Width != \"\") {\r\n                            c.actualWidth = parseInt(c.Width.replace(\"px\", \"\"));\r\n                            ww += c.actualWidth;\r\n                        }\r\n                        else {\r\n                            if (!starColumn)\r\n                                starColumn = c;\r\n                        }\r\n                    }\r\n                }\r\n            });\r\n            if (starColumn)\r\n                starColumn.actualWidth = pixelWidth_1 - ww;\r\n            //Ende Neu\r\n            //Form\r\n            if (this.ShowRemarks) {\r\n                var formDataWidth = pixelWidth_1 - this.scrollBarWidth - parseInt(this.FormColumns[0].Width.replace(\"px\", \"\")) - parseInt(this.FormColumns[2].Width.replace(\"px\", \"\"));\r\n                this.FormColumns[1].SetWidth(formDataWidth.toString() + \"px\");\r\n            }\r\n            else {\r\n                var formDataWidth = pixelWidth_1 - this.scrollBarWidth - parseInt(this.FormColumns[0].Width.replace(\"px\", \"\"));\r\n                this.FormColumns[1].SetWidth(formDataWidth.toString() + \"px\");\r\n            }\r\n            this.AlignHeaders();\r\n        }\r\n        this.SetActiveColumns();\r\n        this.Width = width;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetId = function (id) {\r\n        this.gridKey = this.gridKey + \"_\" + id;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetCaption = function (caption) {\r\n        this.Caption = caption;\r\n        this.gridKey = this.gridKey + \"_\" + caption.toLowerCase().replace(/ /g, \"_\");\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetShowRemarks = function (showRemarks) {\r\n        this.ShowRemarks = showRemarks;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetShowHeaders = function (showHeaders) {\r\n        this.ShowHeaders = showHeaders;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetAllowSorting = function (allowSorting) {\r\n        this.AllowSorting = allowSorting;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetAddNew = function (canAddNew) {\r\n        this.CanAddNew = canAddNew;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetDelete = function (canDelete) {\r\n        this.CanDelete = canDelete;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetEditing = function (canEdit) {\r\n        this.CanEdit = canEdit;\r\n        if (!canEdit)\r\n            this.EditColIndex = -1;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetShowFilters = function (showFilters) {\r\n        this.ShowFilters = showFilters;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetRowSelectionMode = function () {\r\n        this.RowSelectionMode = true;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetSizeToContainerId = function (containerId, percent, adjustVisibleRows, heightAdjustment) {\r\n        if (percent === void 0) { percent = 100; }\r\n        if (adjustVisibleRows === void 0) { adjustVisibleRows = false; }\r\n        if (heightAdjustment === void 0) { heightAdjustment = 0; }\r\n        this.SetWidth(\"100%\");\r\n        this.containerRatioWidth = percent;\r\n        this.boundContainerId = containerId;\r\n        this.IsAdjustVisibleRowsToContainer = adjustVisibleRows;\r\n        this.HeightAdjustmentValue = heightAdjustment;\r\n        //this.EventAggregator.publish(\"get_container_size\", { Id: containerId });\r\n        //this.adjustToContainer(); // should be triggered automatically once HeightAdjustmentValue is set\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetWidthToContainerId = function (containerId, percent, adjustVisibleRows, heightAdjustment) {\r\n        if (percent === void 0) { percent = 100; }\r\n        if (adjustVisibleRows === void 0) { adjustVisibleRows = false; }\r\n        if (heightAdjustment === void 0) { heightAdjustment = 0; }\r\n        return this.SetSizeToContainerId(containerId, percent, adjustVisibleRows, heightAdjustment);\r\n    };\r\n    Object.defineProperty(GridModel.prototype, \"FirstVisibleRow\", {\r\n        get: function () {\r\n            return Math.floor(this.ScrollTop / this.RowHeight);\r\n        },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    GridModel.prototype.GenerateColumnsFromObject = function (obj, deepness) {\r\n    };\r\n    GridModel.prototype.AddColumn = function (column) {\r\n        column.owningGrid = this;\r\n        this.Columns.push(column);\r\n        return this;\r\n    };\r\n    GridModel.prototype.InsertColumn = function (column, position) {\r\n        if (position >= this.Columns.length)\r\n            return this.AddColumn(column);\r\n        if (position < 0) {\r\n            position = 0;\r\n        }\r\n        column.owningGrid = this;\r\n        this.Columns.splice(position, 0, column);\r\n        return this;\r\n    };\r\n    GridModel.prototype.RemoveColumn = function (column) {\r\n        var position = this.Columns.indexOf(column);\r\n        if (position >= 0) {\r\n            this.Columns.splice(position, 1);\r\n        }\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetResponsiveFormMode = function () {\r\n        this.IsResponsiveForm = true;\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetResponsiveTitlePosition = function (position) {\r\n        if (position == ResponsiveTitlePosition.INLINE || position == ResponsiveTitlePosition.TOP) {\r\n            this.ResponsiveTitlePosition = position;\r\n        }\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetResponsiveRemarkPosition = function (position) {\r\n        if (position == ResponsiveRemarkPosition.INLINE || position == ResponsiveRemarkPosition.BOTTOM) {\r\n            this.ResponsiveRemarkPosition = position;\r\n        }\r\n        return this;\r\n    };\r\n    GridModel.prototype.Build = function () {\r\n        this.AssignedWidth = this.Width;\r\n        if (this.VisibleRows > 0) {\r\n            this.Height = (this.VisibleRows * this.RowHeight).toString();\r\n        }\r\n        else {\r\n            this.Height = \"\";\r\n        }\r\n        if (this.VisibleRows < 5)\r\n            this.ShowRowsBeforeScrolling = 1;
23\r\n        this.SetActiveColumns();\r\n        this.ClearFilters();\r\n        if (this.IsResponsiveForm) {\r\n            this.setResponsiveFormDataSource();\r\n        }\r\n        return this;\r\n    };\r\n    GridModel.prototype.SetActiveColumns = function () {\r\n        var _this = this;\r\n        this.ActiveColumns = [];\r\n        this.Columns.forEach(function (c) {\r\n            if (!c.IsHidden && c.IsVisible)\r\n                _this.ActiveColumns.push(c);\r\n        });\r\n    };\r\n    GridModel.prototype.SetAllowReSorting = function (set, sortingPropertyName) {\r\n        if (!sortingPropertyName) {\r\n            sortingPropertyName = \"SortOrder\";\r\n        }\r\n        this.allowReSorting = set;\r\n        if (this.allowReSorting) {\r\n            this.reSortingPropertyName = sortingPropertyName;\r\n            this.SetShowFilters(false);\r\n            this.SetAllowSorting(false);\r\n            try {\r\n                var col = this.Column(sortingPropertyName);\r\n                col.SetColumnType(GridColumnType.SORTORDER);\r\n                col.SetWidth(\"38px\");\r\n                this.Sort(col, true);\r\n            }\r\n            catch (e) {\r\n                console.log(e);\r\n            }\r\n        }\r\n        return this;\r\n    };\r\n    GridModel.prototype.ReSortUp = function (row) {\r\n        var col = this.Column(this.reSortingPropertyName);\r\n        try {\r\n            var that_1 = this;\r\n            var currentIdx_1 = row[this.reSortingPropertyName];\r\n            if (currentIdx_1 !== null && currentIdx_1 !== undefined) {\r\n                var prevElem = this.DataSource.find(function (f) {\r\n                    return f[that_1.reSortingPropertyName] == currentIdx_1 - 1;\r\n                });\r\n                if (prevElem) {\r\n                    row[this.reSortingPropertyName] = currentIdx_1 - 1;\r\n                    prevElem[this.reSortingPropertyName] = currentIdx_1;\r\n                }\r\n                if (col) {\r\n                    this.EventAggregator.publish(\"invalidate-sort-cache\", col);\r\n                    this.Sort(col, true, true);\r\n                    this.AfterExitEditMode.trigger(row, this.Column(this.reSortingPropertyName), row[this.reSortingPropertyName]);\r\n                }\r\n            }\r\n        }\r\n        catch (e) {\r\n            console.log(e);\r\n        }\r\n    };\r\n    GridModel.prototype.ReSortDown = function (row) {\r\n        var col = this.Column(this.reSortingPropertyName);\r\n        try {\r\n            var that_2 = this;\r\n            var currentIdx_2 = row[this.reSortingPropertyName];\r\n            if (currentIdx_2 !== null && currentIdx_2 !== undefined) {\r\n                var nextElem = this.DataSource.find(function (f) {\r\n                    return f[that_2.reSortingPropertyName] == currentIdx_2 + 1;\r\n                });\r\n                if (nextElem) {\r\n                    row[this.reSortingPropertyName] = currentIdx_2 + 1;\r\n                    nextElem[this.reSortingPropertyName] = currentIdx_2;\r\n                }\r\n                if (col) {\r\n                    this.EventAggregator.publish(\"invalidate-sort-cache\", col);\r\n                    this.Sort(col, true, true);\r\n                    this.AfterExitEditMode.trigger(row, this.Column(this.reSortingPropertyName), row[this.reSortingPropertyName]);\r\n                }\r\n            }\r\n        }\r\n        catch (e) {\r\n            console.log(e);\r\n        }\r\n    };\r\n    GridModel.prototype.SortClick = function (col) {\r\n        if (this.AllowSorting) {\r\n            if (this.SortOnServer) {\r\n                this.SortChanged.trigger(col);\r\n            }\r\n            else {\r\n                this.Sort(col);\r\n            }\r\n        }\r\n    };\r\n    GridModel.prototype.Sort = function (col, forceDirection, reSort) {\r\n        var _this = this;\r\n        if (forceDirection === void 0) { forceDirection = undefined; }\r\n        if (reSort === void 0) { reSort = false; }\r\n        var shouldSort = false;\r\n        if (this.IsEditing) {\r\n            if (this.canExitEditMode()) {\r\n                this.exitEditMode();\r\n                shouldSort = true;\r\n            }\r\n        }\r\n        else {\r\n            shouldSort = true;\r\n        }\r\n        if (shouldSort) {\r\n            this.logger.info(\"sorting to \" + col.DataField);\r\n            if ((!this.SortColumn || this.SortColumn !== col) || reSort) {\r\n                if (reSort) {\r\n                    this.SortColumn = null;\r\n                }\r\n                this.SortColumn = col;\r\n                if (forceDirection == undefined) {\r\n                    this.SortDirection = true;\r\n                }\r\n                else {\r\n                    this.SortDirection = forceDirection;\r\n                }\r\n            }\r\n            else {\r\n                if (forceDirection == undefined) {\r\n                    this.SortDirection = !this.SortDirection;\r\n                }\r\n                else {\r\n                    this.SortDirection = forceDirection;\r\n                }\r\n            }\r\n            if (this.IsVirtual) {\r\n                this.taskQueue.queueMicroTask(function () {\r\n                    _this.ScrollTop = 0;\r\n                });\r\n            }\r\n            else {\r\n                this.taskQueue.queueMicroTask(function () {\r\n                    _this.MoveRowToView(0);\r\n                });\r\n            }\r\n        }\r\n    };\r\n    GridModel.prototype.MouseWheel = function (evt) {\r\n        if (this.IsEditing || !this.IsVirtual || !evt.deltaY) {\r\n            return;\r\n        }\r\n        if (evt.deltaY < 0) {\r\n            this.ScrollTop = Math.max(this.ScrollTop - (this.RowHeight * 5), 0);\r\n        }\r\n        else {\r\n            this.ScrollTop = Math.min(this.ScrollTop + (this.RowHeight * 5), (this.DataSource.length * this.RowHeight));\r\n        }\r\n        evt.preventDefault();\r\n        evt.stopImmediatePropagation();\r\n        evt.stopPropagation();\r\n    };\r\n    GridModel.prototype.Keyup = function (event) {\r\n        return true;\r\n    };\r\n    GridModel.prototype.Keydown = function (event, fromForm) {\r\n        var _this = this;\r\n        if (this.IsResponsiveForm) {\r\n            return true;\r\n        }\r\n        if (this.IsLocked)\r\n            return true;\r\n        var nativeKeyProcessing = true;\r\n        var key = this.KeyboardHandler.KeyDown(event);\r\n        //Send key to editor\r\n        if (this.IsEditing || this.EditFilterColIndex != -1 || this.AddNewColIndex != -1) {\r\n            if (this.CurrentEditor) {\r\n                this.CurrentEditor.ProcessKey(key, event);\r\n            }\r\n            this.EditKey = key;\r\n        }\r\n        else {\r\n            if (!fromForm && key.ControlKey == _siwikeyboard__WEBPACK_IMPORTED_MODULE_3__[\"ControlKeys\"].ArrowDown) {\r\n                nativeKeyProcessing = false;\r\n                this.RowDown();\r\n            }\r\n            if (fromForm && key.ControlKey == _siwikeyboard__WEBPACK_IMPORTED_MODULE_3__[\"ControlKeys\"].ArrowDown) {\r\n                this.ColRight();\r\n            }\r\n            if (key.ControlKey == _siwikeyboard__WEBPACK_IMPORTED_MODULE_3__[\"ControlKeys\"].PageDown && this.CurrentRowIndex < (this.DataSource.length - 1)) {\r\n                nativeKeyProcessing = false;\r\n                var nri = this.CurrentRowIndex += this.VisibleRows;\r\n                if (nri >= this.DataSource.length)\r\n                    nri = this.DataSource.length - 1;\r\n                this.CurrentRowIndex = nri;\r\n                if (this.IsVirtual) {\r\n                    if (this.FilteredData) {\r\n                        this.ScrollTop = Math.max(0, Math.min((this.FilteredData.length - this.VisibleRows) * this.RowHeight, this.ScrollTop + this.VisibleRows * this.RowHeight));\r\n                    }\r\n                    else {\r\n                        this.ScrollTop = Math.max(0, Math.min((this.DataSource.length - this.VisibleRows) * this.RowHeight, this.ScrollTop + this.VisibleRows * this.RowHeight));\r\n                    }\r\n                }\r\n                else {\r\n                    this.ScrollTop += (this.VisibleRows * this.RowHeight);\r\n                }\r\n                if (this.EditRowIndex != -1)\r\n                    this.EditRowIndex = -1;\r\n            }\r\n            if (!fromForm && key.ControlKey == _siwikeyboard__WEBPACK_IMPORTED_MODULE_3__[\"ControlKeys\"].ArrowUp) {\r\n                nativeKeyProcessing = false;\r\n                this.RowUp();\r\n            }\r\n            if (fromForm && key.ControlKey == _siwikeyboard__WEBPACK_IMPORTED_MODULE_3__[\"ControlKeys\"].ArrowUp) {\r\n                this.ColLeft();\r\n            }\r\n            if (key.ControlKey == _siwikeyboard__WEBPACK_IMPORTED_MODULE_3__[\"ControlKeys\"].PageUp && this.CurrentRowIndex > 0) {\r\n                nativeKeyProcessing = false;\r\n                var nri = this.CurrentRowIndex -= this.VisibleRows;\r\n                if (nri < 0)\r\n                    nri = 0;\r\n                this.CurrentRowIndex = nri;\r\n                this.ScrollTop -= (this.VisibleRows * this.RowHeight);\r\n                if (this.EditRowIndex != -1)\r\n                    this.EditRowIndex = -1;\r\n            }\r\n            if (key.ControlKey == _siwikeyboard__WEBPACK_IMPORTED_MODULE_3__[\"ControlKeys\"].ArrowRight) {\r\n                nativeKeyProcessing = false;\r\n                this.ColRight();\r\n            }\r\n            if (key.ControlKey == _siwikeyboard__WEBPACK_IMPORTED_MODULE_3__[\"ControlKeys\"].ArrowLeft) {\r\n                nativeKeyProcessing = false;\r\n                this.ColLeft();\r\n            }\r\n            if (key.ControlKey == _siwikeyboard__WEBPACK_IMPORTED_MODULE_3__[\"ControlKeys\"].Tab) {\r\n                this.moveToNext
23Column(fromForm, false);\r\n                nativeKeyProcessing = false;\r\n            }\r\n        }\r\n        if (key.ControlKey == _siwikeyboard__WEBPACK_IMPORTED_MODULE_3__[\"ControlKeys\"].F2) {\r\n            if (this.CanEdit) {\r\n                if (!this.IsEditing && this.AddNewColIndex == -1) {\r\n                    if (this.Columns[this.CurrentColIndex].Editable) {\r\n                        this.enterEditMode(fromForm);\r\n                    }\r\n                }\r\n                else {\r\n                    if (this.canExitEditMode()) {\r\n                        if (this.AddNewColIndex >= 0)\r\n                            this.raiseNewRowDataChanged();\r\n                        this.exitEditMode();\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        if (key.ControlKey == _siwikeyboard__WEBPACK_IMPORTED_MODULE_3__[\"ControlKeys\"].Enter) {\r\n            if (nativeKeyProcessing && this.IsEditing && this.Columns[this.CurrentColIndex].ColumnType == GridColumnType.TEXT) {\r\n            }\r\n            else {\r\n                if (this.EditFilterColIndex >= 0) {\r\n                    if (this.CurrentEditor)\r\n                        this.CurrentEditor.ExitEditMode(false);\r\n                    (this.EditFilterColIndex < (this.Columns.length - 1)) ? this.EditFilterColIndex++ : this.EditFilterColIndex = 0;\r\n                }\r\n                if (!this.IsEditing && this.AddNewColIndex == -1) {\r\n                    if (this.CanEdit && this.Columns[this.CurrentColIndex].Editable) {\r\n                        this.enterEditMode(fromForm);\r\n                    }\r\n                }\r\n                else {\r\n                    if (this.canExitEditMode()) {\r\n                        if (this.AddNewColIndex >= 0)\r\n                            this.raiseNewRowDataChanged();\r\n                        if (this.IsEditing) {\r\n                            this.exitEditMode();\r\n                            this.moveToNextColumn(fromForm, true);\r\n                            this.taskQueue.queueMicroTask(function () {\r\n                                _this.enterEditMode(fromForm);\r\n                            });\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        if (key.ControlKey == _siwikeyboard__WEBPACK_IMPORTED_MODULE_3__[\"ControlKeys\"].Esc) {\r\n            this.EditFilterColIndex = -1;\r\n            this.AddNewColIndex = -1;\r\n            this.exitEditMode(true, true);\r\n        }\r\n        if (key.ControlKey == _siwikeyboard__WEBPACK_IMPORTED_MODULE_3__[\"ControlKeys\"].Tab) {\r\n            nativeKeyProcessing = false;\r\n            if (this.AddNewColIndex >= 0) {\r\n                (this.AddNewColIndex < (this.Columns.length - 1)) ? this.AddNewColIndex++ : this.AddNewColIndex = 0;\r\n                this.raiseNewRowDataChanged();\r\n            }\r\n            if (this.EditFilterColIndex >= 0) {\r\n                if (this.CurrentEditor)\r\n                    this.CurrentEditor.ExitEditMode(false);\r\n                (this.EditFilterColIndex < (this.Columns.length - 1)) ? this.EditFilterColIndex++ : this.EditFilterColIndex = 0;\r\n                this.Columns[this.EditFilterColIndex].HasNativeFilterFocus = true;\r\n                if (this.Columns[this.EditFilterColIndex].FilterElement) {\r\n                    //                    (<HTMLInputElement>this.Columns[this.EditFilterColIndex].FilterElement.firstChild).select();\r\n                }\r\n            }\r\n            if (this.IsEditing) {\r\n                var currentCol = this.Columns[this.EditColIndex];\r\n                if (this.CurrentColEditFieldIndex < currentCol.EditableFieldCount) {\r\n                    this.CurrentColEditFieldIndex++;\r\n                    return true;\r\n                }\r\n                if (this.canExitEditMode()) {\r\n                    this.exitEditMode();\r\n                    this.moveToNextColumn(fromForm, true);\r\n                    this.taskQueue.queueMicroTask(function () {\r\n                        _this.enterEditMode(fromForm);\r\n                    });\r\n                }\r\n            }\r\n        }\r\n        if (!this.IsEditing && this.nonEditingShortcuts.has(key.Character) && !key.ControlKey) {\r\n            nativeKeyProcessing = false;\r\n            var evtDefinition = this.nonEditingShortcuts.get(key.Character);\r\n            evtDefinition.func(evtDefinition.combo, evtDefinition.preventDefault, event);\r\n            if (evtDefinition.preventDefault) {\r\n                event.stopImmediatePropagation();\r\n                event.preventDefault();\r\n                event.stopPropagation();\r\n            }\r\n        }\r\n        return nativeKeyProcessing;\r\n    };
23\r\n    GridModel.prototype.moveToNextColumn = function (fromForm, wasEditing) {\r\n        if (fromForm) {\r\n            var cnr = this.CurrentColIndex;\r\n            var ncnr = -1;\r\n            while (ncnr == -1) {\r\n                cnr++;\r\n                if (cnr == this.ActiveColumns.length) {\r\n                    cnr = 0;\r\n                }\r\n                if (this.IsEditing || wasEditing) {\r\n                    if (this.ActiveColumns[cnr].IsVisible && this.ActiveColumns[cnr].Editable) {\r\n                        ncnr = cnr;\r\n                    }\r\n                }\r\n                else if (this.ActiveColumns[cnr].IsVisible) {\r\n                    ncnr = cnr;\r\n                }\r\n            }\r\n            this.CurrentColIndex = ncnr;\r\n        }\r\n        else {\r\n            if (this.IsEditing || wasEditing) {\r\n                var cnr = this.CurrentColIndex;\r\n                var ncnr = -1;\r\n                while (ncnr == -1) {\r\n                    cnr++;\r\n                    if (cnr == this.ActiveColumns.length) {\r\n                        if (this.CurrentRowIndex < this.FilteredData.length - 1) {\r\n                            this.RowDown();\r\n                        }\r\n                        cnr = 0;\r\n                    }\r\n                    if (this.ActiveColumns[cnr].IsVisible && this.ActiveColumns[cnr].Editable)\r\n                        ncnr = cnr;\r\n                }\r\n                this.CurrentColIndex = ncnr;\r\n            }\r\n            else {\r\n                if (this.CurrentColIndex < this.ActiveColumns.length - 1) {\r\n                    this.CurrentColIndex += 1;\r\n                }\r\n                else if (this.CurrentRowIndex < this.FilteredData.length - 1) {\r\n                    this.RowDown();\r\n                    this.CurrentColIndex = 0;\r\n                }\r\n            }\r\n        }\r\n    };\r\n    GridModel.prototype.RowDown = function () {\r\n        if (this.CurrentRowIndex < (this.FilteredData.length - 1)) {\r\n            this.CurrentRowIndex += 1;\r\n            //Scrollen?\r\n            if ((this.CurrentRowIndex - this.FirstVisibleRow) > this.VisibleRows - (this.ShowRowsBeforeScrolling + 1)) {\r\n                if (this.IsVirtual) {\r\n                    if (this.CurrentRowIndex + this.ShowRowsBeforeScrolling < this.FilteredData.length) {\r\n                        this.ScrollTop += this.RowHeight;\r\n                    }\r\n                }\r\n                else {\r\n                    this.ScrollTop += this.RowHeight;\r\n                }\r\n            }\r\n            if (this.EditRowIndex != -1)\r\n                this.EditRowIndex = this.CurrentRowIndex;\r\n        }\r\n    };\r\n    GridModel.prototype.RowUp = function () {\r\n        if (this.CurrentRowIndex > 0) {\r\n            this.CurrentRowIndex -= 1;\r\n            //Scrollen?\r\n            if (this.ScrollTop > 0) {\r\n                if ((this.CurrentRowIndex - this.FirstVisibleRow) < (this.ShowRowsBeforeScrolling)) {\r\n                    this.ScrollTop -= this.RowHeight;\r\n                }\r\n            }\r\n            if (this.EditRowIndex != -1)\r\n                this.EditRowIndex = this.CurrentRowIndex;\r\n        }\r\n    };\r\n    GridModel.prototype.ColLeft = function () {\r\n        if (this.CurrentColIndex > 0) {\r\n            var ci = this.CurrentColIndex;\r\n            var nci = -1;\r\n            while (nci == -1) {\r\n                ci -= 1;\r\n                if (ci == -1) {\r\n                    nci = this.CurrentColIndex;\r\n                }\r\n                else {\r\n                    if (this.Columns[ci].IsVisible)\r\n                        nci = ci;\r\n                }\r\n            }\r\n            this.CurrentColIndex = nci;\r\n            if (this.EditColIndex != -1)\r\n                this.EditColIndex = this.CurrentColIndex;\r\n        }\r\n        if (this.IsVirtual) {\r\n            this.MoveColToView(this.CurrentColIndex);\r\n        }\r\n    };\r\n    GridModel.prototype.ColRight = function () {\r\n        if (this.CurrentColIndex < (this.Columns.length - 1)) {\r\n            var ci = this.CurrentColIndex;\r\n            var nci = -1;\r\n            while (nci == -1) {\r\n                ci += 1;\r\n                if (ci >= this.Columns.length) {\r\n                    nci = this.CurrentColIndex;\r\n                }\r\n                else {\r\n                    if (this.Columns[ci].IsVisible)\r\n                        nci = ci;\r\n                }\r\n            }\r\n            this.CurrentColIndex = nci;\r\n            if (this.EditColIndex != -1)\r\n                this.EditColIndex = this.CurrentColIndex;\r\n            if (this.IsVirtual) {\r\n                this.MoveColToView(this.CurrentColIndex);\r\n            }\r\n        }\r\n    };\r\n    GridModel.prototype.enterEditMode = function (fromForm) {\r\n        if (fromForm === void 0) { fromForm = false; }\r\n        this.CurrentColEditFieldIndex = 1;\r\n        var column;\r\n        var row;\r\n        if (this.ActiveColumns.length < this.Columns.length) {\r\n            column = this.ActiveColumns[this.CurrentColIndex];\r\n        }\r\n        else {\r\n            column = this.Columns[this.CurrentColIndex];\r\n        }\r\n        if (fromForm && column) {\r\n            if (column.InputElement1) {\r\n                column.InputElement1.focus();\r\n            }\r\n            else {\r\n                this.taskQueue.queueTask(function () {\r\n                    if (column.InputElement1) {\r\n                        column.InputElement1.focus();\r\n                    }\r\n                });\r\n            }\r\n            //this.NativeFocus = true;\r\n        }\r\n        if (this.FilteredData) {\r\n            row = this.FilteredData[this.CurrentRowIndex];\r\n        }\r\n        else if (this.DataSource && this.DataSource.length == 1) {\r\n            row = this.DataSource[0];\r\n        }\r\n        else if (this.DataSource) {\r\n            row = this.DataSource[this.CurrentRowIndex];\r\n        }\r\n        else {\r\n            return;\r\n        }\r\n        if (column.SelectionGrid) {\r\n            this.SelectedEditValue = row[column.SelectionTarget];\r\n        }\r\n        var setValue;\r\n        if (column.d5) {\r\n            setValue = row[column.d1][column.d2][column.d3][column.d4][column.d5];\r\n        }\r\n        else if (column.d4) {\r\n            setValue = row[column.d1][column.d2][column.d3][column.d4];\r\n        }\r\n        else if (column.d3) {\r\n            setValue = row[column.d1][column.d2][column.d3];\r\n        }\r\n        else if (column.d2) {\r\n            setValue = row[column.d1][column.d2];\r\n        }\r\n        else {\r\n            setValue = row[column.d1];\r\n        }\r\n        if (column.ColumnType == GridColumnType.DATE) {\r\n            if (!setValue || setValue == undefined) {\r\n                this.EditValueDateString = undefined;\r\n                this.EditValueTimeString = undefined;\r\n            }\r\n            else {\r\n                if (!(setValue instanceof Date)) {\r\n                    try {\r\n                        setValue = new Date(setValue);\r\n                    }\r\n                    catch (err) {\r\n                    }\r\n                }\r\n                this.EditValueDateString = setValue.getFullYear() + '-' + ('0' + (setValue.getMonth() + 1)).slice(-2) + '-' + ('0' + setValue.getDate()).slice(-2);\r\n                this.EditValueTimeString = _siwidata_converters__WEBPACK_IMPORTED_MODULE_6__[\"DateTimeFormatters\"].FormatDate(setValue, \"HH:mm\");\r\n            }\r\n        }\r\n        if (column.ColumnType == GridColumnType.SIWIDATETIME) {\r\n            if (!setValue || setValue == undefined) {\r\n                this.EditValueDateString = undefined;\r\n                this.EditValueTimeString = undefined;\r\n            }\r\n            else {\r\n                if (!column.EditorTemplate) {\r\n                    setValue = _siwidata_converters__WEBPACK_IMPORTED_MODULE_6__[\"DateTimeFormatters\"].SiwiDateTimeToDate(setValue);\r\n                    this.EditValueDateString = setValue.getFullYear() + '-' + ('0' + (setValue.getMonth() + 1)).slice(-2) + '-' + ('0' + setValue.getDate()).slice(-2);\r\n                    this.EditValueTimeString = _siwidata_converters__WEBPACK_IMPORTED_MODULE_6__[\"DateTimeFormatters\"].FormatDate(setValue, \"HH:mm\");\r\n                }\r\n            }\r\n        }\r\n        if (setValue && (column.ColumnType == GridColumnType.NUMBER || column.ColumnType == GridColumnType.DECIMAL)) {\r\n            if (setValue != undefined) {\r\n                setValue = setValue.toString();\r\n            }\r\n            else {\r\n                setValue = \"\";\r\n            }\r\n        }\r\n        if (column.ColumnType == GridColumnType.FOREIGNKEY) {\r\n            if (column.ForeignKeyField) {\r\n                if (setValue !== undefined && setValue !== null && setValue !== \"\") {\r\n                    var item = column.ForeignItems.find(function (f) {\r\n                        return f[column.ForeignKeyField] == setValue;\r\n                    });\r\n                    setValue = item;\r\n                }\r\n            }\r\n        }\r\n        if (column.ColumnType == GridColumnType.CHECKBOX) {\r\n            this.CurrentEditor = null;\r\n        }\r\n        this.EditValue = setValue;\r\n        this.EditColIndex = this.CurrentColIndex;\r\n        this.EditRowIndex = this.CurrentRowIndex;\r\n        this.IsEditing = true;\r\n        this.NativeFocus = true;\r\n    };\r\n    GridModel.prototype.LostFocus = function () {\r\n    };\r\n    GridModel.prototype.ExitEditMode = function () {\r\n        this.exitEditMode(false, true);\r\n    };\r\n    GridModel.prototype.canExitEditMode = function () {\r\n        var ret = true;\r\n        if (this.IsResponsiveForm || this.EditRowIndex == undefined || this.EditRowIndex < 0) {\r\n            return true;\r\n        }\r\n        var checkRow;\r\n        checkRow = this.FilteredData[this.EditRowIndex];\r\n        if (this.IsEditing && this.EditFilterColIndex == -1) {\r\n            if (this.ActiveColumns && this.CurrentColIndex >= 0 && this.CurrentColIndex < this.ActiveColumns.length && this.ActiveColumns[this.CurrentColIndex]) {\r\n                if (this.ActiveColumns[this.CurrentColIndex].ColumnType == GridColumnType.DATE || this.ActiveColumns[this.CurrentColIndex].ColumnType == GridColumnType.SIWIDATETIME) {\r\n                    this.ValidateValue(this.ActiveColumns[this.CurrentColIndex], this.EditValueDateString, checkRow);\r\n                    ret = !this.ActiveColumns[this.CurrentColIndex].ValidationErrors || this.ActiveColumns[this.CurrentColIndex].ValidationErrors.length == 0;\r\n                }\r\n                else {\r\n                    this.ValidateValue(this.ActiveColumns[this.CurrentColIndex], this.EditValue, checkRow);\r\n                    ret = !this.ActiveColumns[this.CurrentColIndex].ValidationErrors || this.ActiveColumns[this.CurrentColIndex].ValidationErrors.length == 0;\r\n                }\r\n            }\r\n        }\r\n        return ret;\r\n    };\r\n    GridModel.prototype.GetSerializedResponsiveFormData = function () {\r\n        var _this = this;\r\n        if (!this.DataSource || !Array.isArray(this.DataSource) || this.DataSource.length <= 0) {\r\n            return null;\r\n        }\r\n        var record = this.DataSource[0];\r\n        var fields = [];\r\n        this.ActiveColumns.forEach(function (col) {\r\n            var editValue = _this.getResponsiveEditValue(col);\r\n            var field = { Name: col.DataField, Value: null };\r\n            if (record && _this.ValidateValue(col, editValue, record)) {\r\n                field.Value = editValue;\r\n                try {\r\n                    if (col.d5) {\r\n                        record[col.d1][col.d2][col.d3][col.d4][col.d5] = field.Value;\r\n                    }\r\n                    else if (col.d4 && !col.d5) {\r\n                        record[col.d1][col.d2][col.d3][col.d4] = field.Value;\r\n                    }\r\n                    else if (col.d3 && !col.d4) {\r\n                        record[col.d1][col.d2][col.d3] = field.Value;\r\n                    }\r\n                    else if (col.d2 && !col.d3) {\r\n                        record[col.d1][col.d2] = field.Value;\r\n                    }\r\n                    else if (!col.d2) {\r\n                        record[col.d1] = field.Value;\r\n                    }\r\n                }\r\n                catch (e) {\r\n                    // do nothing\r\n                }\r\n            }\r\n            fields.push(field);\r\n        });\r\n        return fields;\r\n    };\r\n    GridModel.prototype.exitEditMode = function (cancel, forgetFocus) {\r\n        if (!cancel && !this.canExitEditMode()) {\r\n            return;\r\n        }\r\n        var column;\r\n        if (this.ActiveColumns.length < this.Columns.length) {\r\n            column = this.ActiveColumns[this.EditColIndex];\r\n        }\r\n        else {\r\n            column = this.Columns[this.EditColIndex];\r\n        }\r\n        if (!column)\r\n            return;\r\n        this.CurrentColEditFieldIndex = 0;\r\n        var row;\r\n        if (this.EditRowIndex >= this.FilteredData.length) {\r\n            return;\r\n        }\r\n        row = this.FilteredData[this.EditRowIndex];\r\n        var setValue;\r\n        if (this.IsResponsiveForm) {\r\n            try {\r\n                setValue = this.getResponsiveEditValue(column);\r\n            }\r\n            catch (e) {\r\n                return;\r\n            }\r\n            if (this.ValidateValue(column, setValue, row)) {\r\n                if (column.d5) {\r\n                    if (this.isUntypedSessionObjectOrDict(row[column.d1][column.d2][column.d3][column.d4], column.d5)) {\r\n                        row[column.d1][column.d2][column.d3][column.d4].Set(column.d5, setValue);\r\n                    }\r\n                    else {\r\n                        row[column.d1][column.d2][column.d3][column.d4][column.d5] = setValue;\r\n                    }\r\n                }\r\n                else if (column.d4) {\r\n                    if (this.isUntypedSessionObjectOrDict(row[column.d1][column.d2][column.d3], column.d4)) {\r\n                        row[column.d1][column.d2][column.d3].Set(column.d4, setValue);\r\n                    }\r\n                    else {\r\n                        row[column.d1][column.d2][column.d3][column.d4] = setValue;\r\n                    }\r\n                }\r\n                else if (column.d3) {\r\n                    if (this.isUntypedSessionObjectOrDict(row[column.d1][column.d2], c
23olumn.d3)) {\r\n                        row[column.d1][column.d2].Set(column.d3, setValue);\r\n                    }\r\n                    else {\r\n                        row[column.d1][column.d2][column.d3] = setValue;\r\n                    }\r\n                }\r\n                else if (column.d2) {\r\n                    if (this.isUntypedSessionObjectOrDict(row[column.d1], column.d2)) {\r\n                        row[column.d1].Set(column.d2, setValue);\r\n                    }\r\n                    else {\r\n                        row[column.d1][column.d2] = setValue;\r\n                    }\r\n                }\r\n                else {\r\n                    if (this.isUntypedSessionObjectOrDict(row, column.d1)) {\r\n                        row.Set(column.d1, setValue);\r\n                    }\r\n                    else {\r\n                        row[column.d1] = setValue;\r\n                    }\r\n                }\r\n            }\r\n            this.AfterExitEditMode.trigger(row, column, setValue);\r\n        }\r\n        else {\r\n            setValue = this.EditValue;\r\n            var valueChanged = void 0;\r\n            if (column.ColumnType == GridColumnType.SORTORDER)\r\n                return;\r\n            if (!cancel) {\r\n                if (column.SelectionGrid) {\r\n                    row[column.SelectionTarget] = this.SelectedEditValue;\r\n                }\r\n                else {\r\n                    if (column.ColumnType == GridColumnType.FOREIGNKEY) {\r\n                        if (column.ForeignKeyField) {\r\n                            if (setValue)\r\n                                setValue = setValue[column.ForeignKeyField];\r\n                        }\r\n                        else {\r\n                            var item = column.ForeignItems.find(function (f) {\r\n                                return f == setValue;\r\n                            });\r\n                            setValue = item;\r\n                        }\r\n                    }\r\n                    if (column.ColumnType == GridColumnType.TEMPLATE) {\r\n                        // always run afterExitEditMode for custom templates\r\n                        valueChanged = true;\r\n                    }\r\n                    if (column.ColumnType == GridColumnType.CHECKBOX) {\r\n                        //direkt gebunden\r\n                    }\r\n                    if (column.ColumnType == GridColumnType.NUMBER) {\r\n                        if (setValue !== undefined && setValue !== null && setValue !== \"\") {\r\n                            setValue = parseInt(setValue);\r\n                        }\r\n                        else {\r\n                            setValue = null;\r\n                        }\r\n                    }\r\n                    if (column.ColumnType == GridColumnType.DECIMAL) {\r\n                        if (setValue !== undefined && setValue !== null && setValue !== \"\") {\r\n                            setValue = parseFloat(setValue.replace(\",\", \".\"));\r\n                        }\r\n                        else {\r\n                            setValue = null;\r\n                        }\r\n                    }\r\n                    if (column.ColumnType == GridColumnType.SIWIDATETIME) {\r\n                        if (!column.EditorTemplate) {\r\n                            if (this.EditValueDateString && this.EditValueDateString != \"\") {\r\n                                var dateParts = this.EditValueDateString.split(\"-\");\r\n                                var edDate;\r\n                                if (column.EditTime) {\r\n                                    if (this.EditValueTimeString) {\r\n                                        var timeParts = this.EditValueTimeString.split(\":\");\r\n                                        edDate = new Date(parseInt(dateParts[0]), parseInt(dateParts[1]) - 1, parseInt(dateParts[2]), parseInt(timeParts[0]), parseInt(timeParts[1]), 0, 0);\r\n                                    }\r\n                                    else {\r\n                                        edDate = new Date(parseInt(dateParts[0]), parseInt(dateParts[1]) - 1, parseInt(dateParts[2]), 0, 0, 0, 0);\r\n                                    }\r\n                                }\r\n                                else {\r\n                                    //TODO: Sind dieser 12 Stunden die beste Option oder sollte es das UTC Offset der UI sein?\r\n                                    edDate = new Date(parseInt(dateParts[0]), parseInt(dateParts[1]) - 1, parseInt(dateParts[2]), 12, 0, 0);\r\n                                }\r\n                                setValue = _siwidata_converters__WEBPACK_IMPORTED_MODULE_6__[\"DateTimeFormatters\"].DateToSiwiDateTime(edDate);\r\n                            }\r\n                            else {\r\n                                setValue = null;\r\n                            }\r\n                        }\r\n                    }\r\n                    if (column.ColumnType == GridColumnType.DATE) {\r\n                        if (this.EditValueDateString && this.EditValueDateString != \"\") {\r\n                            var dateParts = this.EditValueDateString.split(\"-\");\r\n                            if (column.EditTime) {\r\n                                if (this.EditValueTimeString) {\r\n                                    var timeParts = this.EditValueTimeString.split(\":\");\r\n                                    setValue = new Date(parseInt(dateParts[0]), parseInt(dateParts[1]) - 1, parseInt(dateParts[2]), parseInt(timeParts[0]), parseInt(timeParts[1]), 0, 0);\r\n                                }\r\n                                else {\r\n                                    setValue = new Date(parseInt(dateParts[0]), parseInt(dateParts[1]) - 1, parseInt(dateParts[2]), 0, 0, 0, 0);\r\n                                }\r\n                            }\r\n                            else {\r\n                                setValue = new Date(parseInt(dateParts[0]), parseInt(dateParts[1]) - 1, parseInt(dateParts[2]), 12, 0, 0);\r\n                            }\r\n                        }\r\n                        else {\r\n                            setValue = null;\r\n                        }\r\n                    }\r\n                    if (this.CurrentEditor || (column.ColumnType != GridColumnType.CHECKBOX && column.ColumnType != GridColumnType.OPTIONSLIST)) {\r\n                        if (this.ValidateValue(column, setValue, row)) {\r\n                            if (column.d5) {\r\n                                if (this.isUntypedSessionObjectOrDict(row[column.d1][column.d2][column.d3][column.d4], column.d5)) {\r\n                                    if (setValue != row[column.d1][column.d2][column.d3][column.d4].Get(column.d5)) {\r\n                                        row[column.d1][column.d2][column.d3][column.d4].Set(column.d5, setValue);\r\n                                        valueChanged = true;\r\n                                    }\r\n                                }\r\n                                else {\r\n                                    if (setValue != row[column.d1][column.d2][column.d3][column.d4][column.d5]) {\r\n                                        valueChanged = true;\r\n                                        row[column.d1][column.d2][column.d3][column.d4][column.d5] = setValue;\r\n                                    }\r\n                                }\r\n                            }\r\n                            else if (column.d4) {\r\n                                if (this.isUntypedSessionObjectOrDict(row[column.d1][column.d2][column.d3], column.d4)) {\r\n                                    if (setValue != row[column.d1][column.d2][column.d3].Get(column.d4)) {\r\n                                        row[column.d1][column.d2][column.d3].Set(column.d4, setValue);\r\n                                        valueChanged = true;\r\n                                    }\r\n                                }\r\n                                else {\r\n                                    if (setValue != row[column.d1][column.d2][column.d3][column.d4]) {\r\n                                        valueChanged = true;\r\n                                        row[column.d1][column.d2][column.d3][column.d4] = setValue;\r\n                                    }\r\n                                }\r\n                            }\r\n                            else if (column.d3) {\r\n                                if (this.isUntypedSessionObjectOrDict(row[column.d1][column.d2], c
23olumn.d3)) {\r\n                                    if (setValue != row[column.d1][column.d2].Get(column.d3)) {\r\n                                        row[column.d1][column.d2].Set(column.d3, setValue);\r\n                                        valueChanged = true;\r\n                                    }\r\n                                }\r\n                                else {\r\n                                    if (setValue != row[column.d1][column.d2][column.d3]) {\r\n                                        valueChanged = true;\r\n                                        row[column.d1][column.d2][column.d3] = setValue;\r\n                                    }\r\n                                }\r\n                            }\r\n                            else if (column.d2) {\r\n                                if (this.isUntypedSessionObjectOrDict(row[column.d1], column.d2)) {\r\n                                    if (setValue != row[column.d1].Get(column.d2)) {\r\n                                        row[column.d1].Set(column.d2, setValue);\r\n                                        valueChanged = true;\r\n                                    }\r\n                                }\r\n                                else {\r\n                                    if (setValue != row[column.d1][column.d2]) {\r\n                                        valueChanged = true;\r\n                                        row[column.d1][column.d2] = setValue;\r\n                                    }\r\n                                }\r\n                            }\r\n                            else {\r\n                                if (this.isUntypedSessionObjectOrDict(row, column.d1)) {\r\n                                    if (setValue != row.Get(column.d1)) {\r\n                                        row.Set(column.d1, setValue);\r\n                                        valueChanged = true;\r\n                                    }\r\n                                }\r\n                                else {\r\n                                    if (setValue != row[column.d1]) {\r\n                                        valueChanged = true;\r\n                                        row[column.d1] = setValue;\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            this.AlignHeaders();\r\n            if (valueChanged) {\r\n                this.AfterExitEditMode.trigger(row, column, setValue);\r\n            }\r\n            if (column.ValidationErrors && column.ValidationErrors.length > 0) {\r\n                if (!cancel && valueChanged) {\r\n                    column.ValidationErrors = [];\r\n                }\r\n            }\r\n        }\r\n        this.EditColIndex = -1;\r\n        this.EditRowIndex = -1;\r\n        this.IsEditing = false;\r\n        this.ValidationErrors = [];\r\n        this.HasValidationErrors = false;\r\n        this.EditValidationError = \"\";\r\n        this.ValidationSummary = \"\";\r\n    };\r\n    GridModel.prototype.getResponsiveEditValue = function (column) {\r\n        var setValue;\r\n        var data;\r\n        if (this.ResponsiveFormEdits.hasOwnProperty(column.DataField)) {\r\n            data = this.ResponsiveFormEdits[column.DataField];\r\n        }\r\n        else {\r\n            throw new Error(\"Editing field for column \" + column.DataField + \" is missing.\");\r\n        }\r\n        switch (column.ColumnType) {\r\n            case GridColumnType.DATE:\r\n            case GridColumnType.SIWIDATETIME:\r\n            case GridColumnType.SIWINETTIME:\r\n                if (!this.BrowserSupportsPlaceHolders) {\r\n                    if (!data.EditUnsupportedBrowserDateTime.Year || !data.EditUnsupportedBrowserDateTime.Month || !data.EditUnsupportedBrowserDateTime.DayOfMonth) {\r\n                        data.EditValueDateString = \"\";\r\n                    }\r\n                    else {\r\n                        data.EditValueDateString = data.EditUnsupportedBrowserDateTime.Year + \"-\" + data.EditUnsupportedBrowserDateTime.Month + \"-\" + data.EditUnsupportedBrowserDateTime.DayOfMonth;\r\n                    }\r\n                }\r\n                if (data.EditValueDateString && data.EditValueDateString != \"\") {\r\n                    var dateParts = data.EditValueDateString.split(\"-\");\r\n                    var edDate;\r\n                    if (column.EditTime) {\r\n                        if (data.EditValueTimeString) {\r\n                            var timeParts = data.EditValueTimeString.split(\":\");\r\n                            edDate = new Date(parseInt(dateParts[0]), parseInt(dateParts[1]) - 1, parseInt(dateParts[2]), parseInt(timeParts[0]), parseInt(timeParts[1]), 0, 0);\r\n                        }\r\n                        else {\r\n                            edDate = new Date(parseInt(dateParts[0]), parseInt(dateParts[1]) - 1, parseInt(dateParts[2]), 0, 0, 0, 0);\r\n                        }\r\n                    }\r\n                    else {\r\n                        //TODO: Sind dieser 12 Stunden die beste Option oder sollte es das UTC Offset der UI sein?\r\n                        if (column.ColumnType == GridColumnType.DATE) {\r\n                            edDate = new Date(parseInt(dateParts[0]), parseInt(dateParts[1]) - 1, parseInt(dateParts[2]), 12, 0, 0);\r\n                        }\r\n                        else {\r\n                            edDate = new Date(parseInt(dateParts[0]), parseInt(dateParts[1]) - 1, parseInt(dateParts[2]), 12, 0, 0);\r\n                        }\r\n                    }\r\n                    if (edDate) {\r\n                        if (column.ColumnType == GridColumnType.DATE) {\r\n                            setValue = edDate;\r\n                        }\r\n                        else {\r\n                            setValue = _siwidata_converters__WEBPACK_IMPORTED_MODULE_6__[\"DateTimeFormatters\"].DateToSiwiDateTime(edDate);\r\n                        }\r\n                    }\r\n                    else {\r\n                        setValue = null;\r\n                    }\r\n                }\r\n                else {\r\n                    setValue = null;\r\n                }\r\n                break;\r\n            case GridColumnType.CHECKBOX:\r\n                setValue = data.IsChecked;\r\n                break;\r\n            case GridColumnType.SIWINETPOINTS:\r\n                setValue = Math.floor(1000000 * parseFloat(data.EditValue));\r\n            default:\r\n                setValue = data.EditValue;\r\n        }\r\n        return setValue;\r\n    };\r\n    GridModel.prototype.ResponsiveFormIsValid = function () {\r\n        var _this = this;\r\n        if (!this.IsResponsiveForm)\r\n            return false;\r\n        var isValid = true;\r\n        this.ActiveColumns.forEach(function (col) {\r\n            var setValue;\r\n            try {\r\n                setValue = _this.getResponsiveEditValue(col);\r\n            }\r\n            catch (e) {\r\n                isValid = false;\r\n                return;\r\n            }\r\n            if (!_this.ValidateValue(col, setValue, _this.DataSource[0])) {\r\n                isValid = false;\r\n            }\r\n        });\r\n        return isValid;\r\n    };\r\n    GridModel.prototype.ValidateValue = function (column, proposedValue, row) {\r\n        var isValid = true;
23\r\n        var validationErrors = [];\r\n        if (column.Validations) {\r\n            column.Validations.forEach(function (v) {\r\n                if (!v.CheckValue(proposedValue, row)) {\r\n                    isValid = false;\r\n                    validationErrors.push(v.ErrorMessage);\r\n                }\r\n            });\r\n        }\r\n        if (validationErrors.length > 0) {\r\n            this.EditValidationError = validationErrors[0];\r\n        }\r\n        else {\r\n            this.EditValidationError = \"\";\r\n        }\r\n        column.ValidationErrors = validationErrors;\r\n        return isValid;\r\n    };\r\n    GridModel.prototype.isUntypedSessionObjectOrDict = function (row, propertyName) {\r\n        var isSessionObject = row\r\n            && row.SyncId\r\n            && row.Context\r\n            && row.Set\r\n            && typeof row.Set === \"function\";\r\n        var isDynamicRealTimeEntity = row\r\n            && typeof row.GetObjectType === \"function\"\r\n            && row.GetObjectType() === 1;\r\n        var hasProperty = row && propertyName && propertyName in row;\r\n        return isSessionObject && (!isDynamicRealTimeEntity || !hasProperty);\r\n    };\r\n    GridModel.prototype.raiseNewRowDataChanged = function () {\r\n        this.NewRowDataChanged.trigger(this.NewRow);\r\n    };\r\n    GridModel.prototype.ClearNewRow = function () {\r\n        this.NewRow = {};\r\n        this.AddNewColIndex = -1;\r\n    };\r\n    GridModel.prototype.CellClicked = function (evt, row, col, formMode) {\r\n        if (this.IsLocked)\r\n            return true;\r\n        this.EditFilterColIndex = -1;\r\n        this.AddNewColIndex = -1;\r\n        var realCol = col;\r\n        if (this.Columns.length > this.ActiveColumns.length) {\r\n            for (var i = 0; i < this.Columns.length; i++) {\r\n                if (this.Columns[i] == this.ActiveColumns[col]) {\r\n                    realCol = i;\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        //Falls schon editiert wird hier, ab\r\n        if (this.IsEditing && formMode && col == this.EditColIndex) {\r\n            this.logger.info(\"ignoring cell click, already in edit mode\");\r\n            return true;\r\n        }\r\n        //TODO: GRIDMODE\r\n        if (this.IsEditing) {\r\n            if (this.canExitEditMode()) {\r\n                this.exitEditMode();\r\n                this.CurrentColIndex = col;\r\n                if (!formMode)\r\n                    this.CurrentRowIndex = row;\r\n                if (this.Columns[realCol].Editable && this.Columns[realCol].ColumnType != GridColumnType.CHECKBOX)\r\n                    this.enterEditMode(formMode);\r\n            }\r\n        }\r\n        else {\r\n            this.CurrentColIndex = col;\r\n            if (!formMode)\r\n                this.CurrentRowIndex = row;\r\n            if (this.CanEdit && this.Columns[realCol].Editable && this.Columns[realCol].ColumnType != GridColumnType.CHECKBOX) {\r\n                this.enterEditMode(formMode);\r\n            }\r\n        }\r\n        if (this.Columns[realCol].ColumnType == GridColumnType.CHECKBOX || this.Columns[realCol].ColumnType == GridColumnType.TEMPLATE) {\r\n            return true;\r\n        }\r\n        if (this.IsResponsiveForm) {\r\n            if (this.Columns[realCol].Editable && this.Columns[realCol].ColumnType != GridColumnType.CHECKBOX)\r\n                this.enterEditMode(formMode);\r\n        }\r\n        evt.cancelBubble = true;\r\n        evt.stopPropagation();\r\n        return false;\r\n    };\r\n    GridModel.prototype.ResponsiveCellClicked = function (evt, row, col) {\r\n        var realCol = col;\r\n        if (this.Columns.length > this.ActiveColumns.length) {\r\n            for (var i = 0; i <= col; i++) {\r\n                if (this.ActiveColumns.indexOf(this.Columns[i]) < 0) {\r\n                    realCol++;\r\n                }\r\n            }\r\n        }\r\n        if (this.IsEditing && realCol == this.EditColIndex) {\r\n            this.logger.info(\"ignoring responsive cell click, already in edit mode\");\r\n            return true;\r\n        }\r\n        else {\r\n            if (this.IsEditing) {\r\n                this.exitEditMode();\r\n            }\r\n            if (this.CanEdit && this.Columns[realCol].Editable && [GridColumnType.CHECKBOX, GridColumnType.TEMPLATE].indexOf((this.Columns[realCol].ColumnType)) < 0) {\r\n                this.CurrentColIndex = col;\r\n                this.enterEditMode();\r\n                evt.cancelBubble = true;\r\n                evt.stopPropagation();\r\n                evt.stopImmediatePropagation();\r\n                evt.preventDefault();\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    };\r\n    GridModel.prototype.FilterClicked = function (col) {\r\n        var shouldFilter = false;\r\n        if (this.IsEditing) {\r\n            if (this.canExitEditMode()) {\r\n                this.exitEditMode();\r\n                shouldFilter = true;\r\n            }\r\n        }\r\n        else {\r\n            shouldFilter = true;\r\n        }\r\n        if (shouldFilter) {\r\n            this.EditFilterColIndex = col;\r\n            this.AddNewColIndex = -1;\r\n            this.Columns[col].HasNativeFilterFocus = true;\r\n        }\r\n    };\r\n    GridModel.prototype.AddNewClicked = function (col) {\r\n        if (this.canExitEditMode()) {\r\n            this.exitEditMode();\r\n            this.AddNewColIndex = col;\r\n            this.EditFilterColIndex = -1;\r\n        }\r\n    };\r\n    GridModel.prototype.AlignHeaders = function () {\r\n        if (this.tableBody) {\r\n            var gridWidth = 0;\r\n            var iCol = 0;\r\n            // brauchen wir momentan nicht\r\n            //let browserZoomLevel = window.devicePixelRatio;\r\n            var firstRow = this.tableBody.children[0];\r\n            if (firstRow && firstRow.cells) {\r\n                for (iCol = 0; iCol < firstRow.cells.length; iCol++) {\r\n                    if (this.ActiveColumns && this.ActiveColumns[iCol]) {\r\n                        // offsetWidth scheint auch bei O
23S und Browserzoom konsistent zu bleiben - clientWidth hingegen nicht\r\n                        this.ActiveColumns[iCol].actualWidth = firstRow.cells[iCol].offsetWidth;\r\n                        gridWidth += firstRow.cells[iCol].offsetWidth;\r\n                    }\r\n                }\r\n                //Scrollbar\r\n                gridWidth += this.scrollBarWidth;\r\n                if (this.Width.indexOf(\"%\") == -1) {\r\n                    this.AssignedWidth = gridWidth.toString() + \"px\";\r\n                }\r\n            }\r\n        }\r\n    };\r\n    GridModel.prototype.MoveRowToView = function (rowIndex) {\r\n        var t = (rowIndex - Math.floor(this.VisibleRows / 2)) * this.RowHeight;\r\n        if (t < 0)\r\n            t = 0;\r\n        this.ScrollTop = t;\r\n    };\r\n    GridModel.prototype.MoveColToView = function (colIndex) {\r\n        var width = 0;\r\n        var currentCol = this.ActiveColumns[colIndex];\r\n        for (var i = 0; i <= colIndex; i++) {\r\n            var col = this.ActiveColumns[i];\r\n            width += col.actualWidth;\r\n        }\r\n        if (this.containerElement && ((this.containerElement.clientWidth + this.ScrollLeft < width) ||\r\n            (this.ScrollLeft > width - currentCol.actualWidth))) {\r\n            this.ScrollLeft = Math.max(width - (this.containerElement.clientWidth / 2), 0);\r\n        }\r\n    };\r\n    GridModel.prototype.CheckBoxClicked = function () {\r\n        var _this = this;\r\n        this.taskQueue.queueTask(function () {\r\n            _this.AfterExitEditMode.trigger(_this.FilteredData[_this.CurrentRowIndex], _this.ActiveColumns[_this.CurrentColIndex], _this.FilteredData[_this.CurrentRowIndex][_this.ActiveColumns[_this.CurrentColIndex].DataField]);\r\n        });\r\n        return true;\r\n    };\r\n    GridModel.prototype.EditCheckBox = function (row, col, currentValue) {\r\n        var _this = this;\r\n        if (col.Editable) {\r\n            this.taskQueue.queueTask(function () {\r\n                if (col.d5) {\r\n                    if (_this.isUntypedSessionObjectOrDict(row[col.d1][col.d2][col.d3][col.d4], col.d5)) {\r\n                        row[col.d1][col.d2][col.d3][col.d4].Set(col.d5, !currentValue);\r\n                    }\r\n                    else {\r\n                        row[col.d1][col.d2][col.d3][col.d4][col.d5] = !currentValue;\r\n                    }\r\n                }\r\n                else if (col.d4) {\r\n                    if (_this.isUntypedSessionObjectOrDict(row[col.d1][col.d2][col.d3], col.d4)) {\r\n                        row[col.d1][col.d2][col.d3].Set(col.d4, !currentValue);\r\n                    }\r\n                    else {\r\n                        row[col.d1][col.d2][col.d3][col.d4] = !currentValue;\r\n                    }\r\n                }\r\n                else if (col.d3) {\r\n                    if (_this.isUntypedSessionObjectOrDict(row[col.d1][col.d2], col.d3)) {\r\n                        row[col.d1][col.d2].Set(col.d3, !currentValue);\r\n                    }\r\n                    else {\r\n                        row[col.d1][col.d2][col.d3] = !currentValue;\r\n                    }\r\n                }\r\n                else if (col.d2) {\r\n                    if (_this.isUntypedSessionObjectOrDict(row[col.d1], col.d2)) {\r\n                        row[col.d1].Set(col.d2, !currentValue);\r\n                    }\r\n                    else {\r\n                        row[col.d1][col.d2] = !currentValue;\r\n                    }\r\n                }\r\n                else {\r\n                    if (_this.isUntypedSessionObjectOrDict(row, col.d1)) {\r\n                        row.Set(col.d1, !currentValue);\r\n                    }\r\n                    else {\r\n                        row[col.d1] = !currentValue;\r\n                    }\r\n                }\r\n            });\r\n            //TODO: Mal wenn viel Zeit ist noch den richtigen Wert der Checkbox im Event hier mitgeben\r\n            setTimeout(function () {\r\n                _this.AfterExitEditMode.trigger(_this.FilteredData[_this.CurrentRowIndex], col, null);\r\n            }, 100);\r\n            return true;\r\n        }\r\n        else {\r\n            return false;\r\n        }\r\n    };\r\n    Object.defineProperty(GridModel.prototype, \"CurrentRowIndex\", {\r\n        get: function () {\r\n            return this.mCurrentRowIndex;\r\n        },\r\n        set: function (rowIndex) {\r\n            this.mCurrentRowIndex = rowIndex;\r\n            if (this.FilteredData && this.CurrentRowIndex >= 0 && this.CurrentRowIndex < this.FilteredData.length) {\r\n                this.SelectedItem = this.FilteredData[this.CurrentRowIndex];\r\n                return;\r\n            }\r\n            this.SelectedItem = null;\r\n        },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridModel.prototype, \"SelectedItem\", {\r\n        get: function () {\r\n            return this.mSelectedItem;\r\n        }
23,\r\n        set: function (rec) {\r\n            if (rec == null && this.mSelectedItem != null) {\r\n                this.mSelectedItem = null;\r\n                this.SelectedItemChanged.trigger(null);\r\n                this.SelectedRowColChanged.trigger(null, null);\r\n                return;\r\n            }\r\n            if (!rec && this.RowSelectionMode)\r\n                return;\r\n            if (!rec && this.FilteredData && this.FilteredData.length > 0) {\r\n                rec = this.FilteredData[0];\r\n            }\r\n            if (rec !== this.mSelectedItem) {\r\n                this.mSelectedItem = rec;\r\n                var found = -1;\r\n                var idx = -1;\r\n                if (this.FilteredData) {\r\n                    for (idx = 0; idx < this.FilteredData.length; idx++) {\r\n                        if (rec === this.FilteredData[idx]) {\r\n                            found = idx;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n                else if (this.DataSource) {\r\n                    for (idx = 0; idx < this.DataSource.length; idx++) {\r\n                        if (rec === this.DataSource[idx]) {\r\n                            found = idx;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n                if (found != this.CurrentRowIndex) {\r\n                    this.CurrentRowIndex = found;\r\n                    this.MoveRowToView(found);\r\n                }
23\r\n                this.SelectedItemChanged.trigger(rec);\r\n                if (this.CurrentColIndex >= 0) {\r\n                    this.SelectedRowColChanged.trigger(rec, this.ActiveColumns[this.CurrentColIndex]);\r\n                }\r\n            }\r\n        },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    GridModel.prototype.CollectValidationErrors = function () {\r\n        var errs = [];\r\n        this.Columns.forEach(function (f) {\r\n            f.ValidationErrors.forEach(function (e) {\r\n                errs.push(e);\r\n            });\r\n        });\r\n        if (this.ValidationErrors.length == 0 && errs.length == 0) {\r\n            this.HasValidationErrors = false;\r\n            this.ValidationSummary = \"\";\r\n        }\r\n        else {\r\n            this.ValidationErrors = errs;\r\n            this.HasValidationErrors = true;\r\n            this.ValidationSummary = errs[0];\r\n        }\r\n    };\r\n    Object.defineProperty(GridModel.prototype, \"BodyCSS\", {\r\n        get: function () {\r\n            var s = \"\";\r\n            var ox = \"hidden\";\r\n            var oy = \"auto\";\r\n            if (this.AllowHorizontalScrolling) {\r\n                ox = \"auto\";\r\n                oy = \"hidden\";\r\n            }\r\n            if (this.Height != \"\") {\r\n                s = s + \"height: \" + this.Height + \"px;\";\r\n                s = s + \"overflow-x:\" + ox + \";overflow-y:\" + oy + \";-webkit-overflow-scrolling: touch;\";\r\n            }\r\n            else {\r\n                s = s + \"overflow-x:\" + ox + \";overflow-y:hidden;\";\r\n            }\r\n            return s;\r\n        },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    GridModel.prototype.dispose = function () {\r\n        this.SelectedItemChanged.remove(null);\r\n        this.SelectedRowColChanged.remove(null);\r\n        this.NewRowDataChanged.remove(null);\r\n        this.AfterExitEditMode.remove(null);\r\n        this.FilterChanged.remove(null);\r\n        this.SortChanged.remove(null);\r\n        this.Columns.forEach(function (c) {\r\n            c.dispose();\r\n        });\r\n    };\r\n    __decorate([\r\n        aurelia_framework__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\r\n        __metadata(\"design:type\", Object)\r\n    ], GridModel.prototype, \"CurrentColIndex\", void 0);\r\n    __decorate([\r\n        aurelia_framework__WEBPACK_IMPORTED_MODULE_1__[\"bindable\"],\r\n        __metadata(\"design:type\", Number)\r\n    ], GridModel.prototype, \"HeightAdjustmentValue\", void 0);\r\n    __decorate([\r\n        Object(aurelia_framework__WEBPACK_IMPORTED_MODULE_1__[\"computedFrom\"])(\"ScrollTop\", \"RowHeight\"),\r\n        __metadata(\"design:type\", Number),\r\n        __metadata(\"design:paramtypes\", [])\r\n    ], GridModel.prototype, \"FirstVisibleRow\", null);\r\n    __decorate([\r\n        Object(aurelia_framework__WEBPACK_IMPORTED_MODULE_1__[\"computedFrom\"])(\"Height\", \"AllowHorizontalScrolling\"),\r\n        __metadata(\"design:type\", Object),\r\n        __metadata(\"design:paramtypes\", [])\r\n    ], GridModel.prototype, \"BodyCSS\", null);\r\n    return GridModel;\r\n}());\r\n\r\nvar GridColumn = /** @class */ (function () {\r\n    function GridColumn(dataField) {\r\n        this.Width = \"\";\r\n        this.HeaderText = \"\";\r\n        this.HeaderTooltip = undefined;\r\n        this.minHeaderWidth = null;\r\n        this.Editable = true;\r\n        this.Filterable = false;\r\n        this.ExternalFilterExpression = \"\";\r\n        this.FilterExpression = \"\";\r\n        this.ColumnType = GridColumnType.STRING;\r\n        this.ColumnAlignment = GridColumnAlignment.LEFT;\r\n        this.Validations = [];\r\n        this.mValidationErrors = [];\r\n        this.DecimalPrecision = 1;\r\n        this.AllowNegativeValues = false;\r\n        this.IsRequired = false;\r\n        this.IsVisible = true;\r\n        this.IsHidden = false;\r\n        this.UseColDividers = false;\r\n        this.HasNativeFilterFocus = false;\r\n        //public ForeignComboMode: boolean = false;\r\n        this.ForeignAllowNull = false;\r\n        this.ForeignKeyFilterComboMode = false;\r\n        this.OptionsListUseDescriptions = false;\r\n        this.EditTime = false;\r\n        this.TimePrecision = 1;\r\n        this.YearSelectionArray = [];\r\n        this.ResponsiveColumnsXsNr = 12;\r\n        this.ResponsiveColumnsLgNr = 12;\r\n        this.FormFieldTypes = GridColumnType.ResponsiveColumnTypes;\r\n        this.DataField = dataField;\r\n        this.HeaderText = dataField;\r\n        var fields;\r\n        //alternativer Pfad Trenner falls ein \".\" in einem Feld (Key wäre)\r\n        if (dataField && dataField.indexOf(\"|\") > 0) {\r\n            fields = dataField.split(\"|\");\r\n        }\r\n        else {\r\n            fields = dataField.split(\".\");\r\n        }\r\n        this.d1 = fields[0];\r\n        if (fields.length > 1)\r\n            this.d2 = fields[1];\r\n        if (fields.length > 2)\r\n            this.d3 = fields[2];\r\n        if (fields.length > 3)\r\n            this.d4 = fields[3];\r\n        if (fields.length > 4)\r\n            this.d5 = fields[4];\r\n        return this;\r\n    }\r\n    GridColumn.prototype.InjectBindingMechanism = function (engine, signaler) {\r\n        var _this = this;\r\n        this.BindingEngine = engine;\r\n        this.Signaler = signaler;\r\n        this.filterSubscription = this.BindingEngine.propertyObserver(this, 'FilterExpression')\r\n            .subscribe(function (newValue, oldValue) {\r\n            _this.Signaler.signal(_this.owningGrid.gridKey);\r\n            _this.owningGrid.FilterChanged.trigger();\r\n            if (_this.owningGrid.IsVirtual) {\r\n                _this.owningGrid.taskQueue.queueMicroTask(function () {\r\n                    _this.owningGrid.ScrollTop = 0;\r\n                });\r\n            }\r\n            else {\r\n                _this.owningGrid.taskQueue.queueMicroTask(function () {\r\n                    _this.owningGrid.MoveRowToView(0);\r\n                });\r\n            }\r\n        });\r\n        this.externalFilterSubscription = this.BindingEngine.propertyObserver(this, 'ExternalFilterExpression')\r\n            .subscribe(function (newValue, oldValue) {\r\n            _this.Signaler.signal(_this.owningGrid.gridKey);\r\n        });\r\n    };\r\n    GridColumn.prototype.SetHeader = function (headerText) {\r\n        this.HeaderText = headerText;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetHeaderTooltip = function (tooltipText) {\r\n        this.HeaderTooltip = tooltipText;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetUseColDividers = function (set) {\r\n        this.UseColDividers = set;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetRemark = function (remark) {\r\n        this.Remark = remark;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetTimePrecision = function (precision) {\r\n        this.TimePrecision = precision;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetEditableFieldCount = function (value) {\r\n        this.EditableFieldCount = value;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetAllowBooleanNull = function (value) {\r\n        this.AllowBooleanNull = value;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetColumnType = function (columnType) {\r\n        this.ColumnType = columnType;\r\n        if (columnType == GridColumnType.CHECKBOX)\r\n            this.ColumnAlignment = GridColumnAlignment.CENTER;\r\n        if (columnType == GridColumnType.NUMBER)\r\n            this.ColumnAlignment = GridColumnAlignment.RIGHT;\r\n        if (columnType == GridColumnType.DATE && !this.Format) {\r\n            this.SetFormat(\"DD MMM YYYY\");\r\n        }\r\n        else if (columnType != GridColumnType.DATE && !this.EditableFieldCount) {\r\n            this.SetEditableFieldCount(1);\r\n        }\r\n        if (columnType == GridColumnType.DATE || columnType == GridColumnType.SIWIDATETIME) {\r\n            var tempYear = new Date().getFullYear() + 5;\r\n            if (this.YearSelectionArray.length == 0) {\r\n                for (var i = tempYear; i > tempYear - 100; i--) {\r\n                    this.YearSelectionArray.push(i);\r\n                }\r\n            }\r\n        }\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetFormat = function (format) {\r\n        this.Format = format;\r\n        this.EditTime = (format.toLocaleLowerCase().indexOf(\"hh:mm\") >= 0);\r\n        if (format.endsWith(\".fff\"))\r\n            this.SetTimePrecision(3);\r\n        if (format.endsWith(\".ff\"))\r\n            this.SetTimePrecision(2);\r\n        if (format.endsWith(\".f\"))\r\n            this.SetTimePrecision(1);\r\n        if (format.endsWith(\":ss\"))\r\n            this.SetTimePrecision(0);\r\n        if (this.EditTime) {\r\n            this.SetEditableFieldCount(2);\r\n        }\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetDecimalPrecision = function (prec) {\r\n        this.DecimalPrecision = Math.max(Math.round(prec), 0);\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetAllowNegativeValues = function (yesno) {\r\n        this.AllowNegativeValues = yesno;\r\n        return this;\r\n    };\r\n    Object.defineProperty(GridColumn.prototype, \"HasDateEditingFormat\", {\r\n        get: function () {\r\n            if (this.Format && this.Format.toLowerCase().startsWith(\"hh\")) {\r\n                return false;\r\n            }\r\n            else {\r\n                return true;\r\n            }\r\n        },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    GridColumn.prototype.SetSortAttribute = function (att) {\r\n        this.SortByAttribute = att;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetViewTemplate = function (template) {\r\n        this.ViewTemplate = template;\r\n        this.ColumnType = GridColumnType.TEMPLATE;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetForeignKeyTemplate = function (template) {\r\n        this.ForeignKeyTemplate = template;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetEditorTemplate = function (template) {\r\n        this.EditorTemplate = template;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetEditorTemplateOptions = function (templateOptions) {\r\n        this.EditorTemplateOptions = templateOptions;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetAdaptiveWidth = function (showFromWidth, toWidth) {\r\n        this.MinWidthToShow = showFromWidth;\r\n        this.MaxWidthToShow = toWidth;\r\n        if (!this.MinWidthToShow || this.MinWidthToShow == 0)\r\n            this.MinWidthToShow = 1;\r\n        if (!this.MaxWidthToShow)\r\n            this.MaxWidthToShow = 10000;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetColumnAlignment = function (columnAlignment) {\r\n        this.ColumnAlignment = columnAlignment;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetEditable = function (editable) {\r\n        this.Editable = editable;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetResponsiveColumns = function (cols) {\r\n        if ([3, 4, 6, 12].indexOf(cols) >= 0) {\r\n            this.ResponsiveColumnsXsNr = cols;\r\n            this.ResponsiveColumnsLgNr = cols;\r\n        }\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetIsRequired = function (req) {\r\n        this.IsRequired = req;\r\n        if (req) {\r\n            this.AddValidation(new RequiredValidation());\r\n        }\r\n        return this;\r\n    };\r\n    Object.defineProperty(GridColumn.prototype, \"ResponsiveXsColumnsInput\", {\r\n        get: function () {\r\n            var responsiveColumns = this.ResponsiveColumnsXsNr;\r\n            if (this.owningGrid.ResponsiveTitlePosition == ResponsiveTitlePosition.INLINE) {\r\n                if ((this.owningGrid.ShowRemarks && this.owningGrid.ResponsiveRemarkPosition == ResponsiveRemarkPosition.BOTTOM) ||\r\n                    !this.owningGrid.ShowRemarks) {\r\n                    responsiveColumns = 8;\r\n                }\r\n                else {\r\n                    responsiveColumns = 4;\r\n                }\r\n            }\r\n            else {\r\n                if ((this.owningGrid.ShowRemarks && this.owningGrid.ResponsiveRemarkPosition == ResponsiveRemarkPosition.BOTTOM) ||\r\n                    !this.owningGrid.ShowRemarks) {\r\n                    responsiveColumns = 12;\r\n                }\r\n                else {\r\n                    responsiveColumns = this.ResponsiveColumnsXsNr >= 6 ? 8 : 6;\r\n                }\r\n            }\r\n            return responsiveColumns;\r\n        },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumn.prototype, \"ResponsiveLgColumnsInput\", {\r\n        get: function () {\r\n            var responsiveColumns = this.ResponsiveColumnsLgNr;\r\n            if (this.owningGrid.ResponsiveTitlePosition == ResponsiveTitlePosition.INLINE) {\r\n                if ((this.owningGrid.ShowRemarks && this.owningGrid.ResponsiveRemarkPosition == ResponsiveRemarkPosition.BOTTOM) ||\r\n                    !this.owningGrid.ShowRemarks) {\r\n                    responsiveColumns = 8;\r\n                }\r\n                else {\r\n                    responsiveColumns = 4;\r\n                }\r\n            }\r\n            else {\r\n                if ((this.owningGrid.ShowRemarks && this.owningGrid.ResponsiveRemarkPosition == ResponsiveRemarkPosition.BOTTOM) ||\r\n                    !this.owningGrid.ShowRemarks) {\r\n                    responsiveColumns = 12;\r\n                }\r\n                else {\r\n                    responsiveColumns = this.ResponsiveColumnsXsNr >= 6 ? 8 : 6;\r\n                }\r\n            }\r\n            return responsiveColumns;\r\n        },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumn.prototype, \"ResponsiveXsColumnsTitle\", {\r\n        get: function () {\r\n            if (this.owningGrid.ResponsiveTitlePosition == ResponsiveTitlePosition.TOP)\r\n                return 12;\r\n            var cols = this.owningGrid.ShowRemarks && this.owningGrid.ResponsiveRemarkPosition == ResponsiveRemarkPosition.INLINE ? 4 : 6;\r\n            return cols;\r\n        },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumn.prototype, \"ResponsiveLgColumnsTitle\", {\r\n        get: function () {\r\n            if (this.owningGrid.ResponsiveTitlePosition == ResponsiveTitlePosition.TOP)\r\n                return 12;\r\n            var cols = 4;\r\n            return cols;\r\n        },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumn.prototype, \"ResponsiveXsColumnsRemarks\", {\r\n        get: function () {\r\n            if (!this.owningGrid.ShowRemarks)\r\n                return 0;\r\n            if (this.owningGrid.ShowRemarks && this.owningGrid.ResponsiveRemarkPosition == ResponsiveRemarkPosition.BOTTOM)\r\n                return 12;\r\n            if (this.ResponsiveColumnsXsNr >= 6)\r\n                return 4;\r\n            return this.owningGrid.ResponsiveTitlePosition == ResponsiveTitlePosition.INLINE ? 4 : 6;\r\n        },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumn.prototype, \"ResponsiveLgColumnsRemarks\", {\r\n        get: function () {\r\n            if (!this.owningGrid.ShowRemarks)\r\n                return 0;\r\n            if (this.owningGrid.ShowRemarks && this.owningGrid.ResponsiveRemarkPosition == ResponsiveRemarkPosition.BOTTOM)\r\n                return 12;\r\n            if (this.ResponsiveColumnsLgNr >= 6)\r\n                return 4;\r\n            return this.owningGrid.ResponsiveTitlePosition == ResponsiveTitlePosition.INLINE ? 4 : 6;\r\n        },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    GridColumn.prototype.ResizeResponsiveFormColumn = function () {\r\n 
23       switch (this.ResponsiveColumnsXsNr) {\r\n            case 3:\r\n                this.SetResponsiveColumns(4);\r\n                break;\r\n            case 4:\r\n                this.SetResponsiveColumns(6);\r\n                break;\r\n                break;\r\n            case 12:\r\n                this.SetResponsiveColumns(3);\r\n                break;\r\n            case 6:\r\n            default:\r\n                this.SetResponsiveColumns(12);\r\n        }\r\n        return this;\r\n    };\r\n    GridColumn.prototype.HasNativeFilterFocusChanged = function (newVal) {\r\n        var _this = this;\r\n        if (this.owningGrid) {\r\n            this.owningGrid.taskQueue.queueMicroTask(function () {\r\n                if (newVal && _this.FilterElement) {\r\n                    if (_this.FilterElement.children[0].select)\r\n                        _this.FilterElement.children[0].select();\r\n                }\r\n            });\r\n        }\r\n    };\r\n    GridColumn.prototype.IsHiddenChanged = function (newVal, oldVal) {\r\n        if (this.owningGrid) {\r\n            this.owningGrid.SetActiveColumns();\r\n        }\r\n    };\r\n    GridColumn.prototype.IsVisibleChanged = function (newVal, oldVal) {\r\n        if (this.owningGrid) {\r\n            this.owningGrid.SetActiveColumns();\r\n        }\r\n    };\r\n    GridColumn.prototype.SetVisible = function (visible) {\r\n        this.IsVisible = visible;\r\n        if (this.owningGrid)\r\n            this.owningGrid.SendSignal();\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetForeignKey = function (items, keyField, descriptionField, comboMode, allowNull, filterComboMode) {\r\n        this.ColumnType = GridColumnType.FOREIGNKEY;\r\n        this.ForeignItems = items;\r\n        this.ForeignKeyField = keyField;\r\n        this.ForeignDescriptionField = descriptionField;\r\n        var fields = descriptionField.split(\".\");\r\n        this.ForeignDescriptionField_d1 = fields[0];\r\n        this.ForeignDescriptionField = fields[0];\r\n        if (fields.length > 1)\r\n            this.ForeignDescriptionField_d2 = fields[1];\r\n        if (fields.length > 2)\r\n            this.ForeignDescriptionField_d3 = fields[2];\r\n        if (fields.length > 3)\r\n            this.ForeignDescriptionField_d4 = fields[3];\r\n        if (fields.length > 4)\r\n            this.ForeignDescriptionField_d5 = fields[4];\r\n        //this.ForeignComboMode = comboMode;\r\n        this.ForeignAllowNull = allowNull;\r\n        this.ForeignKeyFilterComboMode = filterComboMode;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetOptionsList = function (dataRow, items, keyField, descriptionField, useDescriptions) {\r\n        this.ColumnType = GridColumnType.OPTIONSLIST;\r\n        var currentItems = dataRow[this.DataField];\r\n        if (currentItems) {\r\n            var checkedItems = currentItems.split(\",\");\r\n            items.forEach(function (it) {\r\n                it.Checked = checkedItems.filter(function (f) { return f == it[keyField]; }).length > 0;\r\n            });\r\n        }\r\n        else {\r\n            items.forEach(function (it) { return it.Checked = false; });\r\n        }\r\n        this.ForeignItems = items;\r\n        this.ForeignKeyField = keyField;\r\n        this.ForeignDescriptionField = descriptionField;\r\n        this.OptionsListUseDescriptions = useDescriptions;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetSelectionGrid = function (model, target) {\r\n        this.SelectionGrid = model;\r\n        this.SelectionTarget = target;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetFilter = function (value) {\r\n        if (value != null && this.ColumnType == GridColumnType.CHECKBOX) {\r\n            var nrClicks = 0;\r\n            if (this.FilterExpression == null && value == false)\r\n                nrClicks = 2;\r\n            if (this.FilterExpression == null && value == true)\r\n                nrClicks = 1;\r\n            var event1;\r\n            var event2;\r\n            try {\r\n                event1 = new MouseEvent('click', {\r\n                    view: window,\r\n                    bubbles: false,\r\n                    cancelable: false\r\n                });\r\n                event2 = new MouseEvent('click', {\r\n                    view: window,\r\n                    bubbles: false,\r\n                    cancelable: true\r\n                });\r\n            }\r\n            catch (err) {\r\n                event1 = document.createEvent(\"MouseEvent\");\r\n                event1.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\r\n                event2 = document.createEvent(\"MouseEvent\");\r\n                event2.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\r\n            }\r\n            var elementId1 = this.owningGrid.gridKey + \"_filter_\" + this.DataField + \"_1\";\r\n            var cb1 = document.getElementById(elementId1);\r\n            var elementId2 = this.owningGrid.gridKey + \"_filter_\" + this.DataField + \"_2\";\r\n            var cb2 = document.getElementById(elementId2);\r\n            if (cb1)\r\n                cb1.dispatchEvent(event1);\r\n            if (cb2)\r\n                cb2.dispatchEvent(event1);\r\n            if (nrClicks > 1) {\r\n                this.owningGrid.taskQueue.queueTask(function () {\r\n                    if (cb1)\r\n                        cb1.dispatchEvent(event2);\r\n                    if (cb2)\r\n                        cb2.dispatchEvent(event2);\r\n                });\r\n            }\r\n        }\r\n        else {\r\n            this.FilterExpression = value;\r\n        }\r\n    };\r\n    GridColumn.prototype.SetHighlightFunction = function (fn) {\r\n        this.HighlightFunction = fn;\r\n        return this;\r\n    };\r\n    GridColumn.prototype.ToggleOption = function (dataRow, item) {\r\n        var _this = this;\r\n        if (this.ForeignItems && this.Editable && this.owningGrid.CanEdit) {\r\n            var s = \"\";\r\n            var tog = this.ForeignItems.find(function (f) { return f == item; });\r\n            if (tog) {\r\n                if (tog.Checked && tog.Checked == true) {\r\n                    tog.Checked = false;\r\n                }\r\n                else {\r\n                    tog.Checked = true;\r\n                }\r\n            }
23\r\n            this.ForeignItems.forEach(function (opt) {\r\n                if (opt.Checked) {\r\n                    if (s.length > 0)\r\n                        s = s + \",\";\r\n                    s = s + opt[_this.ForeignKeyField];\r\n                }\r\n            });\r\n            //console.log(s);\r\n            dataRow[this.DataField] = s;\r\n            this.owningGrid.AfterExitEditMode.trigger(dataRow, this, s);\r\n        }\r\n    };\r\n    GridColumn.prototype.AddValidation = function (validation) {\r\n        this.Validations.push(validation);\r\n        if (validation instanceof DateRangeValidation) {\r\n            this.YearSelectionArray = [];\r\n            var v = validation;\r\n            var lastYear = v.MaxDate.getFullYear();\r\n            var firstYear = v.MinDate.getFullYear();\r\n            for (var i = lastYear; i >= firstYear; i--) {\r\n                this.YearSelectionArray.push(i);\r\n            }\r\n        }\r\n        return this;\r\n    };\r\n    GridColumn.prototype.SetWidth = function (width) {\r\n        this.Width = width;\r\n        this.useWidth = width;\r\n        return this;\r\n    };\r\n    Object.defineProperty(GridColumn.prototype, \"ValidationErrors\", {\r\n        get: function () {\r\n            return this.mValidationErrors;\r\n        },\r\n        set: function (errs) {\r\n            this.mValidationErrors = errs;\r\n            if (this.owningGrid)\r\n                this.owningGrid.CollectValidationErrors();\r\n        },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    GridColumn.prototype.dispose = function () {\r\n        if (this.filterSubscription)\r\n            this.filterSubscription.dispose();\r\n        if (this.externalFilterSubscription)\r\n            this.externalFilterSubscription.dispose();\r\n    };\r\n    __decorate([\r\n        aurelia_framework__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\r\n        __metadata(\"design:type\", Boolean)\r\n    ], GridColumn.prototype, \"IsVisible\", void 0);\r\n    __decorate([\r\n        aurelia_framework__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\r\n        __metadata(\"design:type\", Boolean)\r\n    ], GridColumn.prototype, \"IsHidden\", void 0);\r\n    __decorate([\r\n        aurelia_framework__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\r\n        __metadata(\"design:type\", Boolean)\r\n    ], GridColumn.prototype, \"HasNativeFilterFocus\", void 0);\r\n    __decorate([\r\n        Object(aurelia_framework__WEBPACK_IMPORTED_MODULE_1__[\"computedFrom\"])(\"Format\"),\r\n        __metadata(\"design:type\", Boolean),\r\n        __metadata(\"design:paramtypes\", [])\r\n    ], GridColumn.prototype, \"HasDateEditingFormat\", null);\r\n    __decorate([\r\n        Object(aurelia_framework__WEBPACK_IMPORTED_MODULE_1__[\"computedFrom\"])(\"ResponsiveColumnsXsNr\"),\r\n        __metadata(\"design:type\", Number),\r\n        __metadata(\"design:paramtypes\", [])\r\n    ], GridColumn.prototype, \"ResponsiveXsColumnsInput\", null);\r\n    __decorate([\r\n        Object(aurelia_framework__WEBPACK_IMPORTED_MODULE_1__[\"computedFrom\"])(\"ResponsiveColumnsLgNr\"),\r\n        __metadata(\"design:type\", Number),\r\n        __metadata(\"design:paramtypes\", [])\r\n    ], GridColumn.prototype, \"ResponsiveLgColumnsInput\", null);\r\n    __decorate([\r\n        Object(aurelia_framework__WEBPACK_IMPORTED_MODULE_1__[\"computedFrom\"])(\"ResponsiveColumnsXsNr\"),\r\n        __metadata(\"design:type\", Number),\r\n        __metadata(\"design:paramtypes\", [])\r\n    ], GridColumn.prototype, \"ResponsiveXsColumnsTitle\", null);\r\n    __decorate([\r\n        Object(aurelia_framework__WEBPACK_IMPORTED_MODULE_1__[\"computedFrom\"])(\"ResponsiveColumnsLgNr\"),\r\n        __metadata(\"design:type\", Number),\r\n        __metadata(\"design:paramtypes\", [])\r\n    ], GridColumn.prototype, \"ResponsiveLgColumnsTitle\", null);\r\n    __decorate([\r\n        Object(aurelia_framework__WEBPACK_IMPORTED_MODULE_1__[\"computedFrom\"])(\"ResponsiveColumnsXsNr\"),\r\n        __metadata(\"design:type\", Number),\r\n        __metadata(\"design:paramtypes\", [])\r\n    ], GridColumn.prototype, \"ResponsiveXsColumnsRemarks\", null);\r\n    __decorate([\r\n        Object(aurelia_framework__WEBPACK_IMPORTED_MODULE_1__[\"computedFrom\"])(\"ResponsiveColumnsLgNr\"),\r\n        __metadata(\"design:type\", Number),\r\n        __metadata(\"design:paramtypes\", [])\r\n    ], GridColumn.prototype, \"ResponsiveLgColumnsRemarks\", null);\r\n    return GridColumn;\r\n}());\r\n\r\nvar GridColumnType = /** @class */ (function () {\r\n    function GridColumnType() {\r\n    }\r\n    Object.defineProperty(GridColumnType, \"STRING\", {\r\n        get: function () { return \"STRING\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumnType, \"PASSWORD\", {\r\n        get: function () { return \"PASSWORD\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumnType, \"CHECKBOX\", {\r\n        get: function () { return \"CHECKBOX\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumnType, \"DATE\", {\r\n        get: function () { return \"DATE\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumnType, \"SIWIDATETIME\", {\r\n        get: function () { return \"SIWIDATETIME\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumnType, \"SIWINETTIME\", {\r\n        get: function () { return \"SIWINETTIME\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumnType, \"SIWINETPOINTS\", {\r\n        get: function () { return \"SIWINETPOINTS\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumnType, \"TEXT\", {\r\n        get: function () { return \"TEXT\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumnType, \"FOREIGNKEY\", {\r\n        get: function () { return \"FOREIGNKEY\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumnType, \"NUMBER\", {\r\n        get: function () { return \"NUMBER\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });
23\r\n    Object.defineProperty(GridColumnType, \"DECIMAL\", {\r\n        get: function () { return \"DECIMAL\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumnType, \"OPTIONSLIST\", {\r\n        get: function () { return \"OPTIONSLIST\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumnType, \"TEMPLATE\", {\r\n        get: function () { return \"TEMPLATE\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumnType, \"SORTORDER\", {\r\n        get: function () { return \"SORTORDER\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumnType, \"ResponsiveColumnTypes\", {\r\n        get: function () {\r\n            var list = [];\r\n            list.push({ Code: \"STRING\", Description: \"String\" });\r\n            list.push({ Code: \"TEXT\", Description: \"Text\" });\r\n            list.push({ Code: \"NUMBER\", Description: \"Number\" });\r\n            list.push({ Code: \"DECIMAL\", Description: \"Decimal\" });\r\n            list.push({ Code: \"DATE\", Description: \"Date\" });\r\n            //list.push({Code: \"SIWIDATETIME\", Description: \"Date and Time\"});\r\n            list.push({ Code: \"CHECKBOX\", Description: \"Checkbox\" });\r\n            list.push({ Code: \"PASSWORD\", Description: \"Password\" });\r\n            list.push({ Code: \"FOREIGNKEY\", Description: \"Custom Options\" });\r\n            return list;\r\n        },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    return GridColumnType;\r\n}());\r\n\r\nvar GridColumnAlignment = /** @class */ (function () {\r\n    function GridColumnAlignment() {\r\n    }\r\n    Object.defineProperty(GridColumnAlignment, \"LEFT\", {\r\n        get: function () { return \"LEFT\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumnAlignment, \"CENTER\", {\r\n        get: function () { return \"CENTER\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(GridColumnAlignment, \"RIGHT\", {\r\n        get: function () { return \"RIGHT\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    return GridColumnAlignment;\r\n}());\r\n\r\nvar MaxLenValidation = /** @class */ (function () {\r\n    function MaxLenValidation(maxLen, errorMessage) {\r\n        this.maxLen = maxLen;\r\n        this.msg = \"\";\r\n        (errorMessage) ? this.msg = errorMessage : this.msg = \"Maximum length is \" + maxLen.toString();\r\n    }\r\n    MaxLenValidation.prototype.CheckValue = function (value) {\r\n        if (!value) {\r\n            this.ErrorMessage = \"\";\r\n            return true;\r\n        }\r\n        if (value.length > this.maxLen) {\r\n            this.ErrorMessage = this.msg;\r\n            return false;\r\n        }\r\n        else {\r\n            this.ErrorMessage = \"\";\r\n            return true;\r\n        }\r\n    };\r\n    return MaxLenValidation;\r\n}());\r\n\r\nvar MinLenValidation = /** @class */ (function () {\r\n    function MinLenValidation(minLen, errorMessage) {\r\n        this.minLen = minLen;\r\n        this.msg = \"\";\r\n        (errorMessage) ? this.msg = errorMessage : this.msg = \"Minimum length is \" + minLen.toString();\r\n    }\r\n    MinLenValidation.prototype.CheckValue = function (value) {\r\n        if (!value) {\r\n            this.ErrorMessage = \"\";\r\n            return true;\r\n        }\r\n        if (value.length < this.minLen) {\r\n            this.ErrorMessage = this.msg;\r\n            return false;\r\n        }\r\n        else {\r\n            this.ErrorMessage = \"\";\r\n            return true;\r\n        }\r\n    };\r\n    return MinLenValidation;\r\n}());\r\n\r\nvar RequiredValidation = /** @class */ (function () {\r\n    function RequiredValidation(errorMessage) {\r\n        this.msg = \"Required field\";\r\n        if (errorMessage)\r\n            this.msg = errorMessage;\r\n    }\r\n    RequiredValidation.prototype.CheckValue = function (value) {\r\n        if (value === undefined || value === null || value === \"\") {\r\n            this.ErrorMessage = this.msg;\r\n            return false;\r\n        }\r\n        else {\r\n            this.ErrorMessage = \"\";\r\n            return true;\r\n        }\r\n    };\r\n    return RequiredValidation;\r\n}());\r\n\r\nvar RegularExpressionValidation = /** @class */ (function () {\r\n    function RegularExpressionValidation(regularExpression, errorMessage) {\r\n        this.msg = \"value does not match\";\r\n        if (errorMessage)\r\n            this.msg = errorMessage;\r\n        this.re = new RegExp(regularExpression, \"g\");\r\n    }\r\n    RegularExpressionValidation.prototype.CheckValue = function (value) {\r\n        if (!value) {\r\n            this.ErrorMessage = \"\";\r\n            return true;\r\n        }\r\n        if (this.re.test(value)) {\r\n            this.ErrorMessage = \"\";\r\n            return true;\r\n        }\r\n        else {\r\n            this.ErrorMessage = this.msg;\r\n            return false;\r\n        }\r\n    };\r\n    return RegularExpressionValidation;\r\n}());\r\n\r\nvar LatinValidation = /** @class */ (function () {\r\n    function LatinValidation(errorMessage, allowCRLF) {\r\n        this.allowCRLF = allowCRLF;\r\n        this.msg = \"use english alphabet only!\";\r\n        if (errorMessage)\r\n            this.msg = errorMessage;\r\n    }\r\n    //nur 7 bit ASCII!!!\r\n    LatinValidation.prototype.CheckValue = function (value) {\r\n        if (!value) {\r\n            this.ErrorMessage = \"\";\r\n            return true;\r\n        }\r\n        for (var i = 0; i < value.length; i++) {\r\n            var char = value.charCodeAt(i);\r\n            if (this.allowCRLF && (char == 10 || char == 13)) {\r\n            }\r\n            else {\r\n                if (char < 32 || char > 127) {\r\n                    this.ErrorMessage = this.msg;\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n        return true;\r\n    };\r\n    return LatinValidation;\r\n}());\r\n\r\nvar EmailAddressValidation = /** @class */ (function () {\r\n    function EmailAddressValidation(errorMessage) {\r\n        this.msg = \"no valid Email\";\r\n        if (errorMessage)\r\n            this.msg = errorMessage;\r\n    }\r\n    EmailAddressValidation.prototype.CheckValue = function (value) {\r\n        if (!value) {\r\n            this.ErrorMessage = \"\";\r\n            return true;\r\n        }\r\n        if (/^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,})+\\W?$/.test(value)) {\r\n            this.ErrorMessage = \"\";\r\n            return true;\r\n        }\r\n        else {\r\n            this.ErrorMessage = this.msg;\r\n            return false;\r\n        }\r\n    };\r\n    return EmailAddressValidation;\r\n}());\r\n\r\nvar PhoneNumberValidation = /** @class */ (function () {\r\n    function PhoneNumberValidation(errorMessage) {\r\n        this.msg = \"no valid international phone number\";\r\n        if (errorMessage)\r\n            this.msg = errorMessage;\r\n    }\r\n    PhoneNumberValidation.prototype.CheckValue = function (value) {\r\n        if (!value) {\r\n            this.ErrorMessage = \"\";\r\n            return true;\r\n        }\r\n        value = value.replace(/\\s/g, '').replace(\"(\", \"\").replace(\")\", \"\").replace(\"-\", \"\");\r\n        if (/^(\\+|00)\\d{5,50}$/.test(value)) {\r\n            this.ErrorMessage = \"\";\r\n            return true;\r\n        }\r\n        else {\r\n            this.ErrorMessage = this.msg;\r\n            return false;\r\n        }\r\n    };\r\n    return PhoneNumberValidation;\r\n}());\r\n\r\nvar MultipleEmailAddressesValidation = /** @class */ (function () {\r\n    function MultipleEmailAddressesValidation(errorMessage, separator) {\r\n        this.msg = \"Invalid Email\";\r\n        if (errorMessage)\r\n            this.msg = errorMessage;\r\n        if (separator)\r\n            this.separator = separator;\r\n    }\r\n    MultipleEmailAddressesValidation.prototype.CheckValue = function (value) {\r\n        var _this = this;\r\n        if (!value) {\r\n            this.ErrorMessage = \"\";\r\n            return true;\r\n        }\r\n        if (!this.separator) {\r\n            if (value.indexOf(\",\") >= 0) {\r\n                this.separator = \",\";\r\n            }\r\n            else if (value.indexOf(\";\") >= 0) {\r\n                this.separator = \";\";\r\n            }\r\n            else if (value.indexOf(\"\\r\\n\") >= 0) {\r\n                this.separator = \"\\r\\n\";\r\n            }\r\n            else if (value.indexOf(\"\\n\") >= 0) {\r\n                this.separator = \"\\n\";\r\n            }\r\n            else if (value.indexOf(\"\\t\") >= 0) {\r\n                this.separator = \"\\t\";\r\n            }\r\n        }\r\n        var emails;\r\n        if (this.separator) {\r\n            emails = value.split(this.separator);\r\n        }\r\n        else {\r\n            emails = [value];\r\n        }
23\r\n        var validator = new EmailAddressValidation();\r\n        var success = true;\r\n        this.ErrorMessage = \"\";\r\n        emails.forEach(function (email) {\r\n            if (email.trim().length > 0 && !validator.CheckValue(email.trim())) {\r\n                success = false;\r\n                _this.ErrorMessage = _this.msg;\r\n            }\r\n        });\r\n        if (success) {\r\n            return true;\r\n        }\r\n        return false;\r\n    };\r\n    return MultipleEmailAddressesValidation;\r\n}());\r\n\r\nvar NumericValidation = /** @class */ (function () {\r\n    function NumericValidation(errorMessage) {\r\n        this.msg = \"Must be a number\";\r\n        if (errorMessage)\r\n            this.msg = errorMessage;\r\n    }\r\n    NumericValidation.prototype.CheckValue = function (value) {\r\n        if (!value || value == \"\") {\r\n            this.ErrorMessage = \"\";\r\n            return true;\r\n        }\r\n        else if (/^\\d+$/.test(value)) {\r\n            this.ErrorMessage = \"\";\r\n            return true;\r\n        }\r\n        else {\r\n            this.ErrorMessage = this.msg;\r\n            return false;\r\n        }\r\n    };\r\n    return NumericValidation;\r\n}());\r\n\r\nvar NumericRangeValidation = /** @class */ (function () {\r\n    function NumericRangeValidation(minValue, maxValue) {\r\n        this.minValue = minValue;\r\n        this.maxValue = maxValue;\r\n        this.msg = \"Number must be in range\";\r\n        this.msg = \"Number must be between \" + minValue.toString() + \" and \" + maxValue.toString();\r\n    }\r\n    NumericRangeValidation.prototype.CheckValue = function (value) {\r\n        if (!value || value == \"\") {\r\n            this.ErrorMessage = \"\";\r\n            return true;\r\n        }\r\n        else if (parseInt(value) >= this.minValue && parseInt(value) <= this.maxValue) {\r\n            this.ErrorMessage = \"\";\r\n            return true;\r\n        }\r\n        else {\r\n            this.ErrorMessage = this.msg;\r\n            return false;\r\n        }\r\n    };\r\n    return NumericRangeValidation;\r\n}());\r\n\r\nvar DateRangeValidation = /** @class */ (function () {\r\n    function DateRangeValidation(MinDate, MaxDate) {\r\n        this.MinDate = MinDate;\r\n        this.MaxDate = MaxDate;\r\n    }\r\n    DateRangeValidation.prototype.CheckValue = function (value) {\r\n        var cd;\r\n        if (value instanceof Date) {\r\n            cd = value;\r\n        }\r\n        else {\r\n            cd = new Date(value);\r\n        }\r\n        if (cd && cd instanceof Date) {\r\n            if (cd.getTime() >= this.MinDate.getTime() && cd.getTime() <= this.MaxDate.getTime()) {\r\n                this.ErrorMessage = \"\";\r\n                return true;\r\n            }\r\n            else {\r\n                if (cd.getTime() < this.MinDate.getTime()) {\r\n                    this.ErrorMessage = \"Date must be after \" + this.MinDate.toLocaleDateString();\r\n                    return false;\r\n                }\r\n                if (cd.getTime() > this.MaxDate.getTime()) {\r\n                    this.ErrorMessage = \"Date must be before \" + this.MaxDate.toLocaleDateString();\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            this.ErrorMessage = \"Not a valid Date\";\r\n            return false;\r\n        }\r\n    };\r\n    return DateRangeValidation;\r\n}());\r\n\r\nvar ResponsiveTitlePosition = /** @class */ (function () {\r\n    function ResponsiveTitlePosition() {\r\n    }\r\n    Object.defineProperty(ResponsiveTitlePosition, \"TOP\", {\r\n        get: function () { return \"TOP\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    ;\r\n    Object.defineProperty(ResponsiveTitlePosition, \"INLINE\", {\r\n        get: function () { return \"INLINE\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    ;\r\n    return ResponsiveTitlePosition;\r\n}());\r\n\r\nvar ResponsiveRemarkPosition = /** @class */ (function () {\r\n    function ResponsiveRemarkPosition() {\r\n    }\r\n    Object.defineProperty(ResponsiveRemarkPosition, \"BOTTOM\", {\r\n        get: function () { return \"BOTTOM\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    ;\r\n    Object.defineProperty(ResponsiveRemarkPosition, \"INLINE\", {\r\n        get: function () { return \"INLINE\"; },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    ;\r\n    return ResponsiveRemarkPosition;\r\n}());\r\n\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMVVoLy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2l3aWRhdGEvc2l3aXVpL2Rpc3QvZ3JpZG1vZGVscy5qcz9kNTQ4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBfX2RlY29yYXRlID0gKHRoaXMgJiYgdGhpcy5fX2RlY29yYXRlKSB8fCBmdW5jdGlvbiAoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ
237XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn07XHJcbnZhciBfX21ldGFkYXRhID0gKHRoaXMgJiYgdGhpcy5fX21ldGFkYXRhKSB8fCBmdW5jdGlvbiAoaywgdikge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKGssIHYpO1xyXG59O1xyXG5pbXBvcnQgKiBhcyBMb2dNYW5hZ2VyIGZyb20gJ2F1cmVsaWEtbG9nZ2luZyc7XHJcbmltcG9ydCB7IFRhc2tRdWV1ZSwgQ29udGFpbmVyLCBjb21wdXRlZEZyb20sIG9ic2VydmFibGUsIGJpbmRhYmxlIH0gZnJvbSAnYXVyZWxpYS1mcmFtZXdvcmsnO1xyXG5pbXBvcnQgeyBFdmVudEFnZ3JlZ2F0b3IgfSBmcm9tICdhdXJlbGlhLWV2ZW50LWFnZ3JlZ2F0b3InO1xyXG5pbXBvcnQgeyBDb250cm9sS2V5cyB9IGZyb20gJy4vc2l3aWtleWJvYXJkJztcclxuaW1wb3J0IHsgVHlwZWRFdmVudCB9IGZyb20gJ0BzaXdpZGF0YS9jb21wb25lbnRmcmFtZXdvcmsnO1xyXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICdAc2l3aWRhdGEvY29uZmlnJztcclxuaW1wb3J0IHsgRGF0ZVRpbWVGb3JtYXR0ZXJzIH0gZnJvbSAnQHNpd2lkYXRhL2NvbnZlcnRlcnMnO1xyXG5pbXBvcnQgJ2Nzcy12YXJzLXBvbnlmaWxsJztcclxuaW1wb3J0IGNzc1ZhcnMgZnJvbSAnY3NzLXZhcnMtcG9ueWZpbGwnO1xyXG5jc3NWYXJzKHt9KTtcclxudmFyIEdyaWRNb2RlbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEdyaWRNb2RlbCgpIHtcclxuICAgICAgICB0aGlzLmdyaWRLZXkgPSBcInNpd2lncmlkX1wiICsgbmV3IERhdGUoKS5nZXRUaW1lKCkudG9TdHJpbmcoKTtcclxuICAgICAgICB0aGlzLkZpbHRlckRlYm91bmNlSW5NcyA9IDUwO1xyXG4gICAgICAgIHRoaXMuSXNJRSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuQ29sdW1ucyA9IG5ldyBBcnJheSgpO1xyXG4gICAgICAgIHRoaXMuQWN0aXZlQ29sdW1ucyA9IG5ldyBBcnJheSgpO1xyXG4gICAgICAgIHRoaXMuRm9ybUNvbHVtbnMgPSBbXTtcclxuICAgICAgICB0aGlzLlNob3dSZW1hcmtzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLk5vRGF0YU1lc3NhZ2UgPSBcIi0tLSBOTyBEQVRBIEFWQUlMQUJMRSAtLS1cIjtcclxuICAgICAgICB0aGlzLldpZHRoID0gXCIxMDAlXCI7XHJcbiAgICAgICAgdGhpcy5IZWlnaHQgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuU2Nyb2xsTGVmdCA9IDA7XHJcbiAgICAgICAgdGhpcy5TY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgIHRoaXMuUm93SGVpZ2h0ID0gMjA7XHJcbiAgICAgICAgdGhpcy5WaXNpYmxlUm93cyA9IDEwO1xyXG4gICAgICAgIHRoaXMuU2hvd1Jvd3NCZWZvcmVTY3JvbGxpbmcgPSAzO1xyXG4gICAgICAgIHRoaXMubUN1cnJlbnRSb3dJbmRleCA9IDA7XHJcbiAgICAgICAgdGhpcy5DdXJyZW50Q29sSW5kZXggPSAwO1xyXG4gICAgICAgIHRoaXMuQ2FuQWRkTmV3ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5DYW5EZWxldGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLkNhbkVkaXQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLk5ld1JvdyA9IHt9O1xyXG4gICAgICAgIHRoaXMuQWRkTmV3Q29sSW5kZXggPSAtMTtcclxuICAgICAgICB0aGlzLklzUmVzcG9uc2l2ZUZvcm0gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLkVkaXRSb3dJbmRleCA9IC0xO1xyXG4gICAgICAgIHRoaXMuRWRpdENvbEluZGV4ID0gLTE7XHJcbiAgICAgICAgdGhpcy5FZGl0RmlsdGVyQ29sSW5kZXggPSAtMTtcclxuICAgICAgICB0aGlzLkZpbHRlcmVkRGF0YSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5GaWx0ZXJPblNlcnZlciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuU29ydE9uU2VydmVyID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5FZGl0VmFsdWVEYXRlU3RyaW5nID0gXCJcIjtcclxuICAgICAgICB0aGlzLkVkaXRWYWx1ZVRpbWVTdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuRWRpdFZhbGlkYXRpb25FcnJvciA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5TaG93SGVhZGVycyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5TaG93RmlsdGVycyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5BbGxvd1NvcnRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuUm93U2VsZWN0aW9uTW9kZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuQWxsb3dIb3Jpem9udGFsU2Nyb2xsaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5Vc2VSb3dEaXZpZGVycyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuQ3VycmVudENvbEVkaXRGaWVsZEluZGV4ID0gMDtcclxuICAgICAgICB0aGlzLnNjcm9sbEJhcldpZHRoID0gMzA7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJSYXRpb1dpZHRoID0gMTAwO1xyXG4gICAgICAgIHRoaXMubGFzdENvbnRhaW5lcldpZHRoID0gLTE7XHJcbiAgICAgICAgdGhpcy5Jc0FkanVzdFZpc2libGVSb3dzVG9Db250YWluZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLkhlaWdodEFkanVzdG1lbnRWYWx1ZSA9IDA7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSAwO1xyXG4gICAgICAgIHRoaXMuVmFsaWRhdGlvbkVycm9ycyA9IFtdO1xyXG4gICAgICAgIHRoaXMuSGFzVmFsaWRhdGlvbkVycm9ycyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuVmFsaWRhdGlvblN1bW1hcnkgPSBcIlwiO
231xyXG4gICAgICAgIC8vIHNpd2ktdmlydHVhbC1ncmlkIHNldHMgdGhpcyB0byB0cnVlXHJcbiAgICAgICAgdGhpcy5Jc1ZpcnR1YWwgPSBmYWxzZTtcclxuICAgICAgICAvL0V2ZW50c1xyXG4gICAgICAgIHRoaXMuU2VsZWN0ZWRJdGVtQ2hhbmdlZCA9IG5ldyBUeXBlZEV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5TZWxlY3RlZFJvd0NvbENoYW5nZWQgPSBuZXcgVHlwZWRFdmVudCgpO1xyXG4gICAgICAgIHRoaXMuTmV3Um93RGF0YUNoYW5nZWQgPSBuZXcgVHlwZWRFdmVudCgpO1xyXG4gICAgICAgIHRoaXMuQWZ0ZXJFeGl0RWRpdE1vZGUgPSBuZXcgVHlwZWRFdmVudCgpO1xyXG4gICAgICAgIHRoaXMuRmlsdGVyQ2hhbmdlZCA9IG5ldyBUeXBlZEV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5Tb3J0Q2hhbmdlZCA9IG5ldyBUeXBlZEV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5ib3VuZENvbnRhaW5lcklkID0gXCJcIjtcclxuICAgICAgICB0aGlzLmFsbG93UmVTb3J0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5Ccm93c2VyU3VwcG9ydHNQbGFjZUhvbGRlcnMgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLlJlc3BvbnNpdmVUaXRsZVBvc2l0aW9uID0gUmVzcG9uc2l2ZVRpdGxlUG9zaXRpb24uVE9QO1xyXG4gICAgICAgIHRoaXMuUmVzcG9uc2l2ZVJlbWFya1Bvc2l0aW9uID0gUmVzcG9uc2l2ZVJlbWFya1Bvc2l0aW9uLkJPVFRPTTtcclxuICAgICAgICB0aGlzLkNvbmZpZyA9IENvbnRhaW5lci5pbnN0YW5jZS5nZXQoQ29uZmlnKTtcclxuICAgICAgICB0aGlzLkV2ZW50QWdncmVnYXRvciA9IENvbnRhaW5lci5pbnN0YW5jZS5nZXQoRXZlbnRBZ2dyZWdhdG9yKTtcclxuICAgICAgICB0aGlzLmxvZ2dlciA9IExvZ01hbmFnZXIuZ2V0TG9nZ2VyKFwic2l3aWdyaWRcIik7XHJcbiAgICAgICAgdGhpcy50YXNrUXVldWUgPSBuZXcgVGFza1F1ZXVlKCk7XHJcbiAgICAgICAgdGhpcy5ub25FZGl0aW5nU2hvcnRjdXRzID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuRm9ybUNvbHVtbnMucHVzaChuZXcgR3JpZENvbHVtbihcIlwiKS5TZXRIZWFkZXIoXCJERVNDUklQVElPTlwiKS5TZXRXaWR0aChcIjE1MHB4XCIpKTtcclxuICAgICAgICB0aGlzLkZvcm1Db2x1bW5zLnB1c2gobmV3IEdyaWRDb2x1bW4oXCJcIikuU2V0SGVhZGVyKFwiVkFMVUVcIikuU2V0V2lkdGgoXCIxMDBweFwiKSk7XHJcbiAgICAgICAgdGhpcy5Gb3JtQ29sdW1ucy5wdXNoKG5ldyBHcmlkQ29sdW1uKFwiXCIpLlNldEhlYWRlcihcIlJFTUFSS1NcIikuU2V0V2lkdGgoXCIxMDBweFwiKSk7XHJcbiAgICAgICAgdGhpcy5SZXNwb25zaXZlRm9ybUVkaXRzID0ge307XHJcbiAgICAgICAgaWYgKHRoaXMuRXZlbnRBZ2dyZWdhdG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuRXZlbnRBZ2dyZWdhdG9yLnN1YnNjcmliZShcImNvbnRhaW5lcl9yZXNpemVkXCIsIHRoaXMuT25Db250YWluZXJSZXNpemUuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBpc0lFID0gcGFyc2VJbnQoKC9tc2llIChcXGQrKS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkpIHx8IFtdKVsxXSk7XHJcbiAgICAgICAgaWYgKGlzTmFOKGlzSUUpKSB7XHJcbiAgICAgICAgICAgIGlzSUUgPSBwYXJzZUludCgoL3RyaWRlbnRcXC8uKjsgcnY6KFxcZCspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSkgfHwgW10pWzFdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzSUUgJiYgIWlzTmFOKGlzSUUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuSXNJRSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuQnJvd3NlclN1cHBvcnRzUGxhY2VIb2xkZXJzID0gIXRoaXMuSXNJRSAmJiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIikucGxhY2Vob2xkZXIgIT09IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuT25Db250YWluZXJSZXNpemUgPSBmdW5jdGlvbiAobikge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHRoaXMuYm91bmRDb250YWluZXJJZCAmJiBuLklkLnRvTG93ZXJDYXNlKCkgPT0gdGhpcy5ib3VuZENvbnRhaW5lcklkLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgaWYgKG4uQmxhZGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ29udGFpbmluZ0JsYWRlID0gbi5CbGFkZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gbi5IZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICB2Y
23XIgY29udGFpbmVyV2lkdGggPSBwYXJzZUludChuLldpZHRoKTtcclxuICAgICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNvbnRhaW5lcldpZHRoKSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkFkanVzdFdpZHRoVG9CbGFkZShjb250YWluZXJXaWR0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5Jc0FkanVzdFZpc2libGVSb3dzVG9Db250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhc2tRdWV1ZS5xdWV1ZVRhc2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGp1c3RUb0NvbnRhaW5lcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuQWRqdXN0V2lkdGhUb0JsYWRlID0gZnVuY3Rpb24gKGNvbnRhaW5lcldpZHRoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuQ29udGFpbmluZ0JsYWRlICYmIHRoaXMuQ29udGFpbmluZ0JsYWRlLkJsYWRlU3lzdGVtICYmIHRoaXMuQ29udGFpbmluZ0JsYWRlLkJsYWRlU3lzdGVtLlJlbmRlck1vZGUgJiZcclxuICAgICAgICAgICAgdGhpcy5Db250YWluaW5nQmxhZGUuQmxhZGVTeXN0ZW0uUmVuZGVyTW9kZSA9PSBcIkRFU0tUT1BcIiAmJiB0aGlzLkNvbnRhaW5pbmdCbGFkZS5IVE1MQ29udGVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuQ29udGFpbmluZ0JsYWRlLkhUTUxDb250ZW50RWxlbWVudC5zY3JvbGxIZWlnaHQgPiB0aGlzLkNvbnRhaW5pbmdCbGFkZS5IVE1MQ29udGVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJXaWR0aCA9IE1hdGgubWF4KGNvbnRhaW5lcldpZHRoIC0gdGhpcy5zY3JvbGxCYXJXaWR0aCwgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy9UT0RPOiBDaHJpc3RpYW4gR3JhZmZlcjogd2VubiBkaWUgY29udGFpbmVyUmF0aW9XaWR0aCAhPSAxMDAgaXN0IGRhbm4gZnVua3Rpb25pZXJ0IGRhcyBuaWNodCBtaXQgdW50ZXJzY2hpZWRsaWNoZW4gQnJvd3NlciBab29tc3R1ZmVuXHJcbiAgICAgICAgdGhpcy5TZXRXaWR0aCgoY29udGFpbmVyV2lkdGggKiAodGhpcy5jb250YWluZXJSYXRpb1dpZHRoIC8gMTAwKSkudG9TdHJpbmcoKSArIFwicHhcIik7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5zZXRSZXNwb25zaXZlRm9ybURhdGFTb3VyY2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLkNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sKSB7XHJcbiAgICAgICAgICAgIGlmICghX3RoaXMuUmVzcG9uc2l2ZUZvcm1FZGl0cy5oYXNPd25Qcm9wZXJ0eShjb2wuRGF0YUZpZWxkKSB8fCAhX3RoaXMuUmVzcG9uc2l2ZUZvcm1FZGl0c1tjb2wuRGF0YUZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuUmVzcG9uc2l2ZUZvcm1FZGl0c1tjb2wuRGF0YUZpZWxkXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBFZGl0VmFsdWU6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgRWRpdFZhbHVlRGF0ZVN0cmluZzogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBFZGl0VmFsdWVUaW1lU3RyaW5nOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIElzQ2hlY2tlZDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBFZGl0VW5zdXBwb3J0ZWRCcm93c2VyRGF0ZVRpbWU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgWWVhcjogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgTW9udGg6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERheU9mTW9udGg6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5EYXRhU291cmNlICYmIF90aGlzLkRhdGFTb3VyY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbEZpZWxkID0gX3RoaXMuUmVzcG9uc2l2ZUZvcm1FZGl0c1tjb2wuRGF0YUZpZWxkXTtcclxuICAgICAgICAgICAgICAgIHZhciBjb2xWYWxfMSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sLmQ1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sVmFsXzEgPSBfdGhpcy5EYXRhU291cmNlWzBdW2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdW2NvbC5kNF1bY29sLmQ1XTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5kNCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbFZhbF8xID0gX3RoaXMuRGF0YVNvdXJjZVswXVtjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVtjb2wuZDRdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmQzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sVmFsXzEgPSBfdGhpcy5EYXRhU291cmNlWzBdW2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmQyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sVmFsXzEgPSBfdGhpcy5EYXRhU291cmNlWzBdW2NvbC5kMV1bY29sLmQyXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbFZhbF8xID0gX3RoaXMuRGF0YVNvdXJjZVswXVtjb2wuZDFdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbFZhbF8xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbC5Db2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLkRBVEUgfHwgY29sLkNvbHVtblR5cGUgPT0gR3JpZENvbHVtblR5cGUuU0lXSURBVEVUSU1FIHx8IGNvbC5Db2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLlNJV0lORVRUSU1FKSB7X
23HJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xEYXRlID0gdm9pZCAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sLkNvbHVtblR5cGUgPT0gR3JpZENvbHVtblR5cGUuU0lXSURBVEVUSU1FIHx8IGNvbC5Db2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLlNJV0lORVRUSU1FKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xEYXRlID0gRGF0ZVRpbWVGb3JtYXR0ZXJzLlNpd2lEYXRlVGltZVRvRGF0ZShjb2xWYWxfMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xEYXRlID0gbmV3IERhdGUoY29sVmFsXzEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbEZpZWxkLkVkaXRWYWx1ZURhdGVTdHJpbmcgPSBjb2xEYXRlLmdldEZ1bGxZZWFyKCkgKyAnLScgKyAoJzAnICsgKGNvbERhdGUuZ2V0TW9udGgoKSArIDEpKS5zbGljZSgtMikgKyAnLScgKyAoJzAnICsgY29sRGF0ZS5nZXREYXRlKCkpLnNsaWNlKC0yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sRmllbGQuRWRpdFZhbHVlVGltZVN0cmluZyA9IERhdGVUaW1lRm9ybWF0dGVycy5Gb3JtYXREYXRlKGNvbERhdGUsIFwiSEg6bW1cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbEZpZWxkLkVkaXRVbnN1cHBvcnRlZEJyb3dzZXJEYXRlVGltZS5ZZWFyID0gY29sRGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xGaWVsZC5FZGl0VW5zdXBwb3J0ZWRCcm93c2VyRGF0ZVRpbWUuTW9udGggPSBjb2xEYXRlLmdldE1vbnRoKCkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xGaWVsZC5FZGl0VW5zdXBwb3J0ZWRCcm93c2VyRGF0ZVRpbWUuRGF5T2ZNb250aCA9IGNvbERhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wuQ29sdW1uVHlwZSA9PSBHcmlkQ29sdW1uVHlwZS5DSEVDS0JPWCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xGaWVsZC5Jc0NoZWNrZWQgPSBjb2xWYWxfMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLkNvbHVtblR5cGUgPT0gR3JpZENvbHVtblR5cGUuU0lXSU5FVFBPSU5UUykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xGaWVsZC5FZGl0VmFsdWUgPSBjb2xWYWxfMSAvIDEwMDAwMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5Db2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLkZPUkVJR05LRVkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZvdW5kXzEgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLkZvcmVpZ25JdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRfMSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sVmFsXzEuaGFzT3duUHJvcGVydHkoY29sLkZvcmVpZ25LZXlGaWVsZCkgJiYgY29sVmFsXzFbY29sLkZvcmVpZ25LZXlGaWVsZF0gPT0gaXRlbVtjb2wuRm9yZWlnbktleUZpZWxkXSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbFZhbF8xLmhhc093blByb3BlcnR5KGNvbC5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZCkgJiYgY29sVmFsXzFbY29sLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkXSA9PSBpdGVtW2NvbC5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xWYWxfMSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfMSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kXzEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2wuRm9yZWlnbkFsbG93TnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbFZhbF8xID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbFZhbF8xID0gY29sLkZvcmVpZ25JdGVtc1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xGaWVsZC5FZGl0VmFsdWUgPSBjb2xWYWxfMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbEZpZWxkLkVkaXRWYWx1ZSA9IGNvbFZhbF8xO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuU2V0RGF0YVNvdXJjZSA9IGZ1bmN0aW9uIChkYXRhU291cmNlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuSXNFZGl0aW5nKVxyXG4gICAgICAgICAgICB0aGlzLmV4aXRFZGl0TW9kZSh0cnVlLCB0cnVlKTtcclxuICAgICAgICB0aGlzLkRhdGFTb3VyY2UgPSBkYXRhU291cmNlO1xyXG4gICAgICAgIHRoaXMuRmlsdGVyZWREYXRhID0gdGhpcy5EYXRhU291cmNlO1xyXG4gICAgICAgIHRoaXMuU2VsZWN0ZWRJdGVtID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5Jc1Jlc3BvbnNpdmVGb3JtKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0UmVzcG9uc2l2ZUZvcm1EYXRhU291cmNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgI
23HJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuU2V0RW1wdHlSZXNwb25zaXZlRm9ybURhdGFTb3VyY2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGRzID0ge307XHJcbiAgICAgICAgdGhpcy5Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbCkge1xyXG4gICAgICAgICAgICBkc1tjb2wuZDFdID0gY29sLmQyID8ge30gOiBudWxsO1xyXG4gICAgICAgICAgICBpZiAoY29sLmQyKVxyXG4gICAgICAgICAgICAgICAgZHNbY29sLmQxXVtjb2wuZDJdID0gY29sLmQzID8ge30gOiBudWxsO1xyXG4gICAgICAgICAgICBpZiAoY29sLmQzKVxyXG4gICAgICAgICAgICAgICAgZHNbY29sLmQxXVtjb2wuZDJdW2NvbC5kM10gPSBjb2wuZDQgPyB7fSA6IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChjb2wuZDQpXHJcbiAgICAgICAgICAgICAgICBkc1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVtjb2wuZDRdID0gY29sLmQ1ID8ge30gOiBudWxsO1xyXG4gICAgICAgICAgICBpZiAoY29sLmQ1KVxyXG4gICAgICAgICAgICAgICAgZHNbY29sLmQxXVtjb2wuZDJdW2NvbC5kM11bY29sLmQ0XVtjb2wuZDVdID0gbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLlNldERhdGFTb3VyY2UoW2RzXSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5TZXRJc0xvY2tlZCA9IGZ1bmN0aW9uIChpc0xvY2tlZCkge1xyXG4gICAgICAgIHRoaXMuSXNMb2NrZWQgPSBpc0xvY2tlZDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLlNldENvbnRhaW5lckVsZW1lbnQgPSBmdW5jdGlvbiAoY29udGFpbmVyKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXI7XHJcbiAgICAgICAgLy92b20gQmxhZGVTeXN0ZW0gYW5mb3JkZXJuXHJcbiAgICAgICAgdGhpcy5FdmVudEFnZ3JlZ2F0b3IucHVibGlzaChcImdldF9jb250YWluZXJfc2l6ZVwiLCB7IElkOiB0aGlzLmJvdW5kQ29udGFpbmVySWQgfSk7XHJcbiAgICAgICAgdGhpcy50YXNrUXVldWUucXVldWVUYXNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgX3RoaXMuYWRqdXN0VG9Db250YWluZXIoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLlNldEtleUhhbmRsZXIgPSBmdW5jdGlvbiAoa2V5Q29tYm8sIGtleUZ1bmMsIGtleVByZXZlbnREZWZhdWx0KSB7XHJcbiAgICAgICAgaWYgKGtleVByZXZlbnREZWZhdWx0ID09PSB2b2lkIDApIHsga2V5UHJldmVudERlZmF1bHQgPSB0cnVlOyB9XHJcbiAgICAgICAgdGhpcy5ub25FZGl0aW5nU2hvcnRjdXRzLnNldChrZXlDb21ibywgeyBjb21ibzoga2V5Q29tYm8sIGZ1bmM6IGtleUZ1bmMsIHByZXZlbnREZWZhdWx0OiBrZXlQcmV2ZW50RGVmYXVsdCB9KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLkN1cnJlbnRDb2xJbmRleENoYW5nZWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuQ3VycmVudENvbEluZGV4ID49IDAgJiYgdGhpcy5DdXJyZW50Q29sSW5kZXggPCB0aGlzLkNvbHVtbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuU2VsZWN0ZWRSb3dDb2xDaGFuZ2VkLnRyaWdnZXIodGhpcy5GaWx0ZXJlZERhdGFbdGhpcy5DdXJyZW50Um93SW5kZXhdLCB0aGlzLkFjdGl2ZUNvbHVtbnNbdGhpcy5DdXJyZW50Q29sSW5kZXhdKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5IZWlnaHRBZGp1c3RtZW50VmFsdWVDaGFuZ2VkID0gZnVuY3Rpb24gKG5ld1ZhbHVlLCBvbGRWYWx1ZSkge1xyXG4gICAgICAgIHRoaXMuYWRqdXN0VG9Db250YWluZXIoKTtcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLmFkanVzdFRvQ29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lckVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdmFyIHJlY3QgPSB0aGlzLmNvbnRhaW5lckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2codGhpcy5ncmlkS2V5K1wiLHdpZHRoOlwiICsgcmVjdC53aWR0aC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLmdyaWRLZXkgKyBcIix0b3A6XCIgKyByZWN0LnRvcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLmdyaWRLZXkgKyBcIixib3R0b206XCIgKyByZWN0LmJvdHRvbS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLmdyaWRLZXkgKyBcIixoZWlnaHQ6XCIgKyByZWN0LmhlaWdodC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgaWYgKHJlY3QuaGVpZ2h0ID4gMCAmJiB0aGlzLmNvbnRhaW5lckhlaWdodCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLklzQWRqdXN0VmlzaWJsZVJvd3NUb0NvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2ciA9IE1hdGguZmxvb3IoKHRoaXMuY29udGFpbmVySGVpZ2h0ICsgdGh
23pcy5IZWlnaHRBZGp1c3RtZW50VmFsdWUgLSByZWN0LnRvcCkgLyAodGhpcy5Sb3dIZWlnaHQgKiAxLjApKTsgLy8gZG8gd2UgbmVlZCB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbz9cclxuICAgICAgICAgICAgICAgICAgICAvL3ZyIC09IDM7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZyIDwgMylcclxuICAgICAgICAgICAgICAgICAgICAgICAgdnIgPSAzO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuU2V0VmlzaWJsZVJvd3MoTWF0aC5mbG9vcih2cikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuQ2xlYXJGaWx0ZXJzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdmFyIHNob3VsZENsZWFyID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuSXNFZGl0aW5nKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbkV4aXRFZGl0TW9kZSgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV4aXRFZGl0TW9kZSgpO1xyXG4gICAgICAgICAgICAgICAgc2hvdWxkQ2xlYXIgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBzaG91bGRDbGVhciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzaG91bGRDbGVhcikge1xyXG4gICAgICAgICAgICB0aGlzLkNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGMuQ29sdW1uVHlwZSA9PSBHcmlkQ29sdW1uVHlwZS5DSEVDS0JPWCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGMuRmlsdGVyRXhwcmVzc2lvbiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMudGFza1F1ZXVlLnF1ZXVlVGFzayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyIGNiMSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ3JpZEtleSArIFwiX1wiICsgYy5EYXRhRmllbGQrXCJfZmlsdGVyMVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoY2IxKSAoPGFueT5jYjEpLmluZGV0ZXJtaW5hdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3ZhciBjYjIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdyaWRLZXkgKyBcIl9cIiArIGMuRGF0YUZpZWxkICsgXCJfZmlsdGVyMlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoY2IyKSAoPGFueT5jYjIpLmluZGV0ZXJtaW5hdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYy5GaWx0ZXJFeHByZXNzaW9uID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuU2V0VmlzaWJsZVJvd3MgPSBmdW5jdGlvbiAocm93cykge1xyXG4gICAgICAgIGlmIChyb3dzID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5WaXNpYmxlUm93cyA9IHJvd3M7XHJcbiAgICAgICAgICAgIHRoaXMuSGVpZ2h0ID0gXCJcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuVmlzaWJsZVJvd3MgPSByb3dzO1xyXG4gICAgICAgICAgICB2Y
23XIgaG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodCA9IDA7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkFsbG93SG9yaXpvbnRhbFNjcm9sbGluZylcclxuICAgICAgICAgICAgICAgIGhvcml6b250YWxTY3JvbGxiYXJIZWlnaHQgPSAzMjtcclxuICAgICAgICAgICAgdGhpcy5IZWlnaHQgPSBob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0ICsgKHRoaXMuVmlzaWJsZVJvd3MgKiB0aGlzLlJvd0hlaWdodCkudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5TZXRBbGxvd0hvcml6b250YWxTY3JvbGxpbmcgPSBmdW5jdGlvbiAoc2V0KSB7XHJcbiAgICAgICAgdGhpcy5BbGxvd0hvcml6b250YWxTY3JvbGxpbmcgPSBzZXQ7XHJcbiAgICAgICAgdGhpcy5TZXRWaXNpYmxlUm93cyh0aGlzLlZpc2libGVSb3dzKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLlNldFVzZVJvd0RpdmlkZXJzID0gZnVuY3Rpb24gKHNldCkge1xyXG4gICAgICAgIHRoaXMuVXNlUm93RGl2aWRlcnMgPSBzZXQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5TZW5kU2lnbmFsID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLlNpZ25hbGVyKVxyXG4gICAgICAgICAgICB0aGlzLlNpZ25hbGVyLnNpZ25hbCh0aGlzLmdyaWRLZXkpO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuU2V0Tm9TZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5DdXJyZW50Um93SW5kZXggPSAtMTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLlNldE5vRGF0YU1lc3NhZ2UgPSBmdW5jdGlvbiAobXNnKSB7XHJcbiAgICAgICAgdGhpcy5Ob0RhdGFNZXNzYWdlID0gbXNnO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuU2V0RmlsdGVyT25TZXJ2ZXIgPSBmdW5jdGlvbiAoZmlsdGVyT25TZXJ2ZXIpIHtcclxuICAgICAgICB0aGlzLkZpbHRlck9uU2VydmVyID0gZmlsdGVyT25TZXJ2ZXI7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5TZXRTb3J0T25TZXJ2ZXIgPSBmdW5jdGlvbiAoc29ydE9uU2VydmVyKSB7XHJcbiAgICAgICAgdGhpcy5Tb3J0T25TZXJ2ZXIgPSBzb3J0T25TZXJ2ZXI7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5TZXRNb2JpbGVSZW5kZXJpbmcgPSBmdW5jdGlvbiAoaXNNb2JpbGUpIHtcclxuICAgICAgICBpZiAoaXNNb2JpbGUpIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxCYXJXaWR0aCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEJhcldpZHRoID0gMzA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuU3RhcnRFZGl0aW5nID0gZnVuY3Rpb24gKGRhdGFmaWVsZCkge1xyXG4gICAgICAgIHRoaXMuQ2FuRWRpdCA9IHRydWU7XHJcbiAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLkFjdGl2ZUNvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuQWN0aXZlQ29sdW1uc1tpXS5EYXRhRmllbGQgPT0gZGF0YWZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkN1cnJlbnRDb2xJbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZm91bmQpIHtcclxuICAgICAgICAgICAgdGhpcy5lbnRlckVkaXRNb2RlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuQ29sdW1uID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChmKSB7IHJldHVybiBmLkRhdGFGaWVsZCA9PSBpZDsgfSk7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5TZXRGb3JtTGFiZWxzV2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcclxuICAgICAgICB0aGlzLkZvcm1Db2x1bW5zWzBdLldpZHRoID0gd2lkdGgudG9TdHJpbmcoKSArIFwicHhcIjtcclxuICAgICAgICB0aGlzLkZvcm1Db2x1bW5zWzBdLnVzZVdpZHRoID0gdGhpcy5Gb3JtQ29sdW1uc1swXS5XaWR0aDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLlNldEZvcm1SZW1hcmtzV2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcclxuICAgICAgICB0aGlzLkZvcm1Db2x1bW5zWzJdLldpZHRoID0gd2lkdGgudG9TdHJpbmcoKSArIFwicHhcIjtcclxuICAgICAgICB0aGlzLkZvcm1Db2x1bW5zWzJdLnVzZVdpZHRoID0gdGhpcy5Gb3JtQ29sdW1uc1syXS5XaWR0aDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLlNldFdpZHRoID0gZnVuY3Rpb24gKHdpZHRoKSB7X
23HJcbiAgICAgICAgaWYgKHdpZHRoLmluZGV4T2YoXCJweFwiKSA+PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQXNzaWduZWRXaWR0aCA9IHdpZHRoO1xyXG4gICAgICAgICAgICB2YXIgcGl4ZWxXaWR0aF8xID0gcGFyc2VJbnQod2lkdGgucmVwbGFjZShcInB4XCIsIFwiXCIpKTtcclxuICAgICAgICAgICAgdmFyIHVzZWRXaWR0aF8xID0gMDtcclxuICAgICAgICAgICAgdGhpcy5Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjLklzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjLk1heFdpZHRoVG9TaG93ICYmIGMuTWluV2lkdGhUb1Nob3cpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYy5Jc0hpZGRlbiA9ICEoKHBpeGVsV2lkdGhfMSA+PSBjLk1pbldpZHRoVG9TaG93KSAmJiAocGl4ZWxXaWR0aF8xIDwgYy5NYXhXaWR0aFRvU2hvdykpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYy5Jc0hpZGRlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYy5XaWR0aCAhPSBcIlwiICYmICFjLklzSGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRXaWR0aF8xICs9IHBhcnNlSW50KGMuV2lkdGgucmVwbGFjZShcInB4XCIsIFwiXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvL1Njcm9sbGJhclxyXG4gICAgICAgICAgICB1c2VkV2lkdGhfMSArPSB0aGlzLnNjcm9sbEJhcldpZHRoO1xyXG4gICAgICAgICAgICBpZiAodXNlZFdpZHRoXzEgPCBwaXhlbFdpZHRoXzEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMuV2lkdGggPT0gXCJcIiAmJiAhYy5Jc0hpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjLnVzZVdpZHRoID0gKHBpeGVsV2lkdGhfMSAtIHVzZWRXaWR0aF8xKS50b1N0cmluZygpICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vTmV1OiAxMS4gTk9WIDIwMTc6IFNvIGlzdCBiZWkgbGVlcmVuIEdyaWRzIHNjaG9uIGRpZSBCcmVpdGUgc2lubnZvbGxlclxyXG4gICAgICAgICAgICB2Y
23XIgd3cgPSAwO1xyXG4gICAgICAgICAgICB2YXIgc3RhckNvbHVtbiA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuQWN0aXZlQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWMuSXNIaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWMuYWN0dWFsV2lkdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMuV2lkdGggJiYgYy5XaWR0aCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmFjdHVhbFdpZHRoID0gcGFyc2VJbnQoYy5XaWR0aC5yZXBsYWNlKFwicHhcIiwgXCJcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3cgKz0gYy5hY3R1YWxXaWR0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhckNvbHVtbilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFyQ29sdW1uID0gYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChzdGFyQ29sdW1uKVxyXG4gICAgICAgICAgICAgICAgc3RhckNvbHVtbi5hY3R1YWxXaWR0aCA9IHBpeGVsV2lkdGhfMSAtIHd3O1xyXG4gICAgICAgICAgICAvL0VuZGUgTmV1XHJcbiAgICAgICAgICAgIC8vRm9ybVxyXG4gICAgICAgICAgICBpZiAodGhpcy5TaG93UmVtYXJrcykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZvcm1EYXRhV2lkdGggPSBwaXhlbFdpZHRoXzEgLSB0aGlzLnNjcm9sbEJhcldpZHRoIC0gcGFyc2VJbnQodGhpcy5Gb3JtQ29sdW1uc1swXS5XaWR0aC5yZXBsYWNlKFwicHhcIiwgXCJcIikpIC0gcGFyc2VJbnQodGhpcy5Gb3JtQ29sdW1uc1syXS5XaWR0aC5yZXBsYWNlKFwicHhcIiwgXCJcIikpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Gb3JtQ29sdW1uc1sxXS5TZXRXaWR0aChmb3JtRGF0YVdpZHRoLnRvU3RyaW5nKCkgKyBcInB4XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZvcm1EYXRhV2lkdGggPSBwaXhlbFdpZHRoXzEgLSB0aGlzLnNjcm9sbEJhcldpZHRoIC0gcGFyc2VJbnQodGhpcy5Gb3JtQ29sdW1uc1swXS5XaWR0aC5yZXBsYWNlKFwicHhcIiwgXCJcIikpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Gb3JtQ29sdW1uc1sxXS5TZXRXaWR0aChmb3JtRGF0YVdpZHRoLnRvU3RyaW5nKCkgKyBcInB4XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuQWxpZ25IZWFkZXJzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuU2V0QWN0aXZlQ29sdW1ucygpO1xyXG4gICAgICAgIHRoaXMuV2lkdGggPSB3aWR0aDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLlNldElkID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkS2V5ID0gdGhpcy5ncmlkS2V5ICsgXCJfXCIgKyBpZDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLlNldENhcHRpb24gPSBmdW5jdGlvbiAoY2FwdGlvbikge1xyXG4gICAgICAgIHRoaXMuQ2FwdGlvbiA9IGNhcHRpb247XHJcbiAgICAgICAgdGhpcy5ncmlkS2V5ID0gdGhpcy5ncmlkS2V5ICsgXCJfXCIgKyBjYXB0aW9uLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCBcIl9cIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5TZXRTaG93UmVtYXJrcyA9IGZ1bmN0aW9uIChzaG93UmVtYXJrcykge1xyXG4gICAgICAgIHRoaXMuU2hvd1JlbWFya3MgPSBzaG93UmVtYXJrcztcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLlNldFNob3dIZWFkZXJzID0gZnVuY3Rpb24gKHNob3dIZWFkZXJzKSB7XHJcbiAgICAgICAgdGhpcy5TaG93SGVhZGVycyA9IHNob3dIZWFkZXJzO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuU2V0QWxsb3dTb3J0aW5nID0gZnVuY3Rpb24gKGFsbG93U29ydGluZykge1xyXG4gICAgICAgIHRoaXMuQWxsb3dTb3J0aW5nID0gYWxsb3dTb3J0aW5nO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuU2V0QWRkTmV3ID0gZnVuY3Rpb24gKGNhbkFkZE5ldykge1xyXG4gICAgICAgIHRoaXMuQ2FuQWRkTmV3ID0gY2FuQWRkTmV3O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuU2V0RGVsZXRlID0gZnVuY3Rpb24gKGNhbkRlbGV0ZSkge1xyXG4gICAgICAgIHRoaXMuQ2FuRGVsZXRlID0gY2FuRGVsZXRlO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuU2V0RWRpdGluZyA9IGZ1bmN0aW9uIChjYW5FZGl0KSB7XHJcbiAgICAgICAgdGhpcy5DYW5FZGl0ID0gY2FuRWRpdDtcclxuICAgICAgICBpZiAoIWNhbkVkaXQpXHJcbiAgICAgICAgICAgIHRoaXMuRWRpdENvbEluZGV4ID0gLTE7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5TZXRTaG93RmlsdGVycyA9IGZ1bmN0aW9uIChzaG93RmlsdGVycykge1xyXG4gICAgICAgIHRoaXMuU2hvd0ZpbHRlcnMgPSBzaG93RmlsdGVycztcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLlNldFJvd1NlbGVjdGlvbk1vZGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5Sb3dTZWxlY3Rpb25Nb2RlID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLlNldFNpemVUb0NvbnRhaW5lcklkID0gZnVuY3Rpb24gKGNvbnRhaW5lcklkLCBwZXJjZW50LCBhZGp1c3RWaXNpYmxlUm93cywgaGVpZ2h0QWRqdXN0bWVudCkge1xyXG4gICAgICAgIGlmIChwZXJjZW50ID09PSB2b2lkIDApIHsgcGVyY2VudCA9IDEwMDsgfVxyXG4gICAgICAgIGlmIChhZGp1c3RWaXNpYmxlUm93cyA9PT0gdm9pZCAwKSB7IGFkanVzdFZpc2libGVSb3dzID0gZmFsc2U7IH1cclxuICAgICAgICBpZiAoaGVpZ2h0QWRqdXN0bWVudCA9PT0gdm9pZCAwKSB7IGhlaWdodEFkanVzdG1lbnQgPSAwOyB9XHJcbiAgICAgICAgdGhpcy5TZXRXaWR0aChcIjEwMCVcIik7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJSYXRpb
231dpZHRoID0gcGVyY2VudDtcclxuICAgICAgICB0aGlzLmJvdW5kQ29udGFpbmVySWQgPSBjb250YWluZXJJZDtcclxuICAgICAgICB0aGlzLklzQWRqdXN0VmlzaWJsZVJvd3NUb0NvbnRhaW5lciA9IGFkanVzdFZpc2libGVSb3dzO1xyXG4gICAgICAgIHRoaXMuSGVpZ2h0QWRqdXN0bWVudFZhbHVlID0gaGVpZ2h0QWRqdXN0bWVudDtcclxuICAgICAgICAvL3RoaXMuRXZlbnRBZ2dyZWdhdG9yLnB1Ymxpc2goXCJnZXRfY29udGFpbmVyX3NpemVcIiwgeyBJZDogY29udGFpbmVySWQgfSk7XHJcbiAgICAgICAgLy90aGlzLmFkanVzdFRvQ29udGFpbmVyKCk7IC8vIHNob3VsZCBiZSB0cmlnZ2VyZWQgYXV0b21hdGljYWxseSBvbmNlIEhlaWdodEFkanVzdG1lbnRWYWx1ZSBpcyBzZXRcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLlNldFdpZHRoVG9Db250YWluZXJJZCA9IGZ1bmN0aW9uIChjb250YWluZXJJZCwgcGVyY2VudCwgYWRqdXN0VmlzaWJsZVJvd3MsIGhlaWdodEFkanVzdG1lbnQpIHtcclxuICAgICAgICBpZiAocGVyY2VudCA9PT0gdm9pZCAwKSB7IHBlcmNlbnQgPSAxMDA7IH1cclxuICAgICAgICBpZiAoYWRqdXN0VmlzaWJsZVJvd3MgPT09IHZvaWQgMCkgeyBhZGp1c3RWaXNpYmxlUm93cyA9IGZhbHNlOyB9XHJcbiAgICAgICAgaWYgKGhlaWdodEFkanVzdG1lbnQgPT09IHZvaWQgMCkgeyBoZWlnaHRBZGp1c3RtZW50ID0gMDsgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLlNldFNpemVUb0NvbnRhaW5lcklkKGNvbnRhaW5lcklkLCBwZXJjZW50LCBhZGp1c3RWaXNpYmxlUm93cywgaGVpZ2h0QWRqdXN0bWVudCk7XHJcbiAgICB9O1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEdyaWRNb2RlbC5wcm90b3R5cGUsIFwiRmlyc3RWaXNpYmxlUm93XCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5TY3JvbGxUb3AgLyB0aGlzLlJvd0hlaWdodCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLkdlbmVyYXRlQ29sdW1uc0Zyb21PYmplY3QgPSBmdW5jdGlvbiAob2JqLCBkZWVwbmVzcykge1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuQWRkQ29sdW1uID0gZnVuY3Rpb24gKGNvbHVtbikge1xyXG4gICAgICAgIGNvbHVtbi5vd25pbmdHcmlkID0gdGhpcztcclxuICAgICAgICB0aGlzLkNvbHVtbnMucHVzaChjb2x1bW4pO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuSW5zZXJ0Q29sdW1uID0gZnVuY3Rpb24gKGNvbHVtbiwgcG9zaXRpb24pIHtcclxuICAgICAgICBpZiAocG9zaXRpb24gPj0gdGhpcy5Db2x1bW5zLmxlbmd0aClcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQWRkQ29sdW1uKGNvbHVtbik7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkge1xyXG4gICAgICAgICAgICBwb3NpdGlvbiA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbHVtbi5vd25pbmdHcmlkID0gdGhpcztcclxuICAgICAgICB0aGlzLkNvbHVtbnMuc3BsaWNlKHBvc2l0aW9uLCAwLCBjb2x1bW4pO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuUmVtb3ZlQ29sdW1uID0gZnVuY3Rpb24gKGNvbHVtbikge1xyXG4gICAgICAgIHZhciBwb3NpdGlvbiA9IHRoaXMuQ29sdW1ucy5pbmRleE9mKGNvbHVtbik7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uID49IDApIHtcclxuICAgICAgICAgICAgdGhpcy5Db2x1bW5zLnNwbGljZShwb3NpdGlvbiwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuU2V0UmVzcG9uc2l2ZUZvcm1Nb2RlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuSXNSZXNwb25zaXZlRm9ybSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5TZXRSZXNwb25zaXZlVGl0bGVQb3NpdGlvbiA9IGZ1bmN0aW9uIChwb3NpdGlvbikge1xyXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PSBSZXNwb25zaXZlVGl0bGVQb3NpdGlvbi5JTkxJTkUgfHwgcG9zaXRpb24gPT0gUmVzcG9uc2l2ZVRpdGxlUG9zaXRpb24uVE9QKSB7XHJcbiAgICAgICAgICAgIHRoaXMuUmVzcG9uc2l2ZVRpdGxlUG9zaXRpb24gPSBwb3NpdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5TZXRSZXNwb25zaXZlUmVtYXJrUG9zaXRpb24gPSBmdW5jdGlvbiAocG9zaXRpb24pIHtcclxuICAgICAgICBpZiAocG9zaXRpb24gPT0gUmVzcG9uc2l2ZVJlbWFya1Bvc2l0aW9uLklOTElORSB8fCBwb3NpdGlvbiA9PSBSZXNwb25zaXZlUmVtYXJrUG9zaXRpb24uQk9UVE9NKSB7XHJcbiAgICAgICAgICAgIHRoaXMuUmVzcG9uc2l2ZVJlbWFya1Bvc2l0aW9uID0gcG9zaXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuQnVpbGQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5Bc3NpZ25lZFdpZHRoID0gdGhpcy5XaWR0aDtcclxuICAgICAgICBpZiAodGhpcy5WaXNpYmxlUm93cyA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5IZWlnaHQgPSAodGhpcy5WaXNpYmxlUm93cyAqIHRoaXMuUm93SGVpZ2h0KS50b1N0cmluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5IZWlnaHQgPSBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5WaXNpYmxlUm93cyA8IDUpXHJcbiAgICAgICAgICAgIHRoaXMuU2hvd1Jvd3NCZWZvcmVTY3JvbGxpbmcgPSAxO1xyXG4gICAgICAgI
23HRoaXMuU2V0QWN0aXZlQ29sdW1ucygpO1xyXG4gICAgICAgIHRoaXMuQ2xlYXJGaWx0ZXJzKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuSXNSZXNwb25zaXZlRm9ybSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldFJlc3BvbnNpdmVGb3JtRGF0YVNvdXJjZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLlNldEFjdGl2ZUNvbHVtbnMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLkFjdGl2ZUNvbHVtbnMgPSBbXTtcclxuICAgICAgICB0aGlzLkNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xyXG4gICAgICAgICAgICBpZiAoIWMuSXNIaWRkZW4gJiYgYy5Jc1Zpc2libGUpXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5BY3RpdmVDb2x1bW5zLnB1c2goYyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5TZXRBbGxvd1JlU29ydGluZyA9IGZ1bmN0aW9uIChzZXQsIHNvcnRpbmdQcm9wZXJ0eU5hbWUpIHtcclxuICAgICAgICBpZiAoIXNvcnRpbmdQcm9wZXJ0eU5hbWUpIHtcclxuICAgICAgICAgICAgc29ydGluZ1Byb3BlcnR5TmFtZSA9IFwiU29ydE9yZGVyXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWxsb3dSZVNvcnRpbmcgPSBzZXQ7XHJcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dSZVNvcnRpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5yZVNvcnRpbmdQcm9wZXJ0eU5hbWUgPSBzb3J0aW5nUHJvcGVydHlOYW1lO1xyXG4gICAgICAgICAgICB0aGlzLlNldFNob3dGaWx0ZXJzKGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5TZXRBbGxvd1NvcnRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbCA9IHRoaXMuQ29sdW1uKHNvcnRpbmdQcm9wZXJ0eU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgY29sLlNldENvbHVtblR5cGUoR3JpZENvbHVtblR5cGUuU09SVE9SREVSKTtcclxuICAgICAgICAgICAgICAgIGNvbC5TZXRXaWR0aChcIjM4cHhcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNvcnQoY29sLCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5SZVNvcnRVcCA9IGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICB2Y
23XIgY29sID0gdGhpcy5Db2x1bW4odGhpcy5yZVNvcnRpbmdQcm9wZXJ0eU5hbWUpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB0aGF0XzEgPSB0aGlzO1xyXG4gICAgICAgICAgICB2YXIgY3VycmVudElkeF8xID0gcm93W3RoaXMucmVTb3J0aW5nUHJvcGVydHlOYW1lXTtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRJZHhfMSAhPT0gbnVsbCAmJiBjdXJyZW50SWR4XzEgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHByZXZFbGVtID0gdGhpcy5EYXRhU291cmNlLmZpbmQoZnVuY3Rpb24gKGYpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZlt0aGF0XzEucmVTb3J0aW5nUHJvcGVydHlOYW1lXSA9PSBjdXJyZW50SWR4XzEgLSAxO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldkVsZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICByb3dbdGhpcy5yZVNvcnRpbmdQcm9wZXJ0eU5hbWVdID0gY3VycmVudElkeF8xIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICBwcmV2RWxlbVt0aGlzLnJlU29ydGluZ1Byb3BlcnR5TmFtZV0gPSBjdXJyZW50SWR4XzE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5FdmVudEFnZ3JlZ2F0b3IucHVibGlzaChcImludmFsaWRhdGUtc29ydC1jYWNoZVwiLCBjb2wpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuU29ydChjb2wsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQWZ0ZXJFeGl0RWRpdE1vZGUudHJpZ2dlcihyb3csIHRoaXMuQ29sdW1uKHRoaXMucmVTb3J0aW5nUHJvcGVydHlOYW1lKSwgcm93W3RoaXMucmVTb3J0aW5nUHJvcGVydHlOYW1lXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuUmVTb3J0RG93biA9IGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICB2Y
23XIgY29sID0gdGhpcy5Db2x1bW4odGhpcy5yZVNvcnRpbmdQcm9wZXJ0eU5hbWUpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB0aGF0XzIgPSB0aGlzO1xyXG4gICAgICAgICAgICB2YXIgY3VycmVudElkeF8yID0gcm93W3RoaXMucmVTb3J0aW5nUHJvcGVydHlOYW1lXTtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRJZHhfMiAhPT0gbnVsbCAmJiBjdXJyZW50SWR4XzIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG5leHRFbGVtID0gdGhpcy5EYXRhU291cmNlLmZpbmQoZnVuY3Rpb24gKGYpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZlt0aGF0XzIucmVTb3J0aW5nUHJvcGVydHlOYW1lXSA9PSBjdXJyZW50SWR4XzIgKyAxO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV4dEVsZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICByb3dbdGhpcy5yZVNvcnRpbmdQcm9wZXJ0eU5hbWVdID0gY3VycmVudElkeF8yICsgMTtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0RWxlbVt0aGlzLnJlU29ydGluZ1Byb3BlcnR5TmFtZV0gPSBjdXJyZW50SWR4XzI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5FdmVudEFnZ3JlZ2F0b3IucHVibGlzaChcImludmFsaWRhdGUtc29ydC1jYWNoZVwiLCBjb2wpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuU29ydChjb2wsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQWZ0ZXJFeGl0RWRpdE1vZGUudHJpZ2dlcihyb3csIHRoaXMuQ29sdW1uKHRoaXMucmVTb3J0aW5nUHJvcGVydHlOYW1lKSwgcm93W3RoaXMucmVTb3J0aW5nUHJvcGVydHlOYW1lXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuU29ydENsaWNrID0gZnVuY3Rpb24gKGNvbCkge1xyXG4gICAgICAgIGlmICh0aGlzLkFsbG93U29ydGluZykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5Tb3J0T25TZXJ2ZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuU29ydENoYW5nZWQudHJpZ2dlcihjb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Tb3J0KGNvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5Tb3J0ID0gZnVuY3Rpb24gKGNvbCwgZm9yY2VEaXJlY3Rpb24sIHJlU29ydCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgaWYgKGZvcmNlRGlyZWN0aW9uID09PSB2b2lkIDApIHsgZm9yY2VEaXJlY3Rpb24gPSB1bmRlZmluZWQ7IH1cclxuICAgICAgICBpZiAocmVTb3J0ID09PSB2b2lkIDApIHsgcmVTb3J0ID0gZmFsc2U7IH1cclxuICAgICAgICB2Y
23XIgc2hvdWxkU29ydCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLklzRWRpdGluZykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jYW5FeGl0RWRpdE1vZGUoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5leGl0RWRpdE1vZGUoKTtcclxuICAgICAgICAgICAgICAgIHNob3VsZFNvcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBzaG91bGRTb3J0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNob3VsZFNvcnQpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcInNvcnRpbmcgdG8gXCIgKyBjb2wuRGF0YUZpZWxkKTtcclxuICAgICAgICAgICAgaWYgKCghdGhpcy5Tb3J0Q29sdW1uIHx8IHRoaXMuU29ydENvbHVtbiAhPT0gY29sKSB8fCByZVNvcnQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZVNvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlNvcnRDb2x1bW4gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5Tb3J0Q29sdW1uID0gY29sO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcmNlRGlyZWN0aW9uID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuU29ydERpcmVjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlNvcnREaXJlY3Rpb24gPSBmb3JjZURpcmVjdGlvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChmb3JjZURpcmVjdGlvbiA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlNvcnREaXJlY3Rpb24gPSAhdGhpcy5Tb3J0RGlyZWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Tb3J0RGlyZWN0aW9uID0gZm9yY2VEaXJlY3Rpb247XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuSXNWaXJ0dWFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhc2tRdWV1ZS5xdWV1ZU1pY3JvVGFzayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuU2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50YXNrUXVldWUucXVldWVNaWNyb1Rhc2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLk1vdmVSb3dUb1ZpZXcoMCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLk1vdXNlV2hlZWwgPSBmdW5jdGlvbiAoZXZ0KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuSXNFZGl0aW5nIHx8ICF0aGlzLklzVmlydHVhbCB8fCAhZXZ0LmRlbHRhWSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChldnQuZGVsdGFZIDwgMCkge1xyXG4gICAgICAgICAgICB0aGlzLlNjcm9sbFRvcCA9IE1hdGgubWF4KHRoaXMuU2Nyb2xsVG9wIC0gKHRoaXMuUm93SGVpZ2h0ICogNSksIDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5TY3JvbGxUb3AgPSBNYXRoLm1pbih0aGlzLlNjcm9sbFRvcCArICh0aGlzLlJvd0hlaWdodCAqIDUpLCAodGhpcy5EYXRhU291cmNlLmxlbmd0aCAqIHRoaXMuUm93SGVpZ2h0KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5LZXl1cCA9IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuS2V5ZG93biA9IGZ1bmN0aW9uIChldmVudCwgZnJvbUZvcm0pIHtcclxuICAgICAgICB2Y
23XIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGlmICh0aGlzLklzUmVzcG9uc2l2ZUZvcm0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLklzTG9ja2VkKVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB2YXIgbmF0aXZlS2V5UHJvY2Vzc2luZyA9IHRydWU7XHJcbiAgICAgICAgdmFyIGtleSA9IHRoaXMuS2V5Ym9hcmRIYW5kbGVyLktleURvd24oZXZlbnQpO1xyXG4gICAgICAgIC8vU2VuZCBrZXkgdG8gZWRpdG9yXHJcbiAgICAgICAgaWYgKHRoaXMuSXNFZGl0aW5nIHx8IHRoaXMuRWRpdEZpbHRlckNvbEluZGV4ICE9IC0xIHx8IHRoaXMuQWRkTmV3Q29sSW5kZXggIT0gLTEpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuQ3VycmVudEVkaXRvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DdXJyZW50RWRpdG9yLlByb2Nlc3NLZXkoa2V5LCBldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5FZGl0S2V5ID0ga2V5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCFmcm9tRm9ybSAmJiBrZXkuQ29udHJvbEtleSA9PSBDb250cm9sS2V5cy5BcnJvd0Rvd24pIHtcclxuICAgICAgICAgICAgICAgIG5hdGl2ZUtleVByb2Nlc3NpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUm93RG93bigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChmcm9tRm9ybSAmJiBrZXkuQ29udHJvbEtleSA9PSBDb250cm9sS2V5cy5BcnJvd0Rvd24pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ29sUmlnaHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoa2V5LkNvbnRyb2xLZXkgPT0gQ29udHJvbEtleXMuUGFnZURvd24gJiYgdGhpcy5DdXJyZW50Um93SW5kZXggPCAodGhpcy5EYXRhU291cmNlLmxlbmd0aCAtIDEpKSB7XHJcbiAgICAgICAgICAgICAgICBuYXRpdmVLZXlQcm9jZXNzaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB2Y
23XIgbnJpID0gdGhpcy5DdXJyZW50Um93SW5kZXggKz0gdGhpcy5WaXNpYmxlUm93cztcclxuICAgICAgICAgICAgICAgIGlmIChucmkgPj0gdGhpcy5EYXRhU291cmNlLmxlbmd0aClcclxuICAgICAgICAgICAgICAgICAgICBucmkgPSB0aGlzLkRhdGFTb3VyY2UubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VycmVudFJvd0luZGV4ID0gbnJpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuSXNWaXJ0dWFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuRmlsdGVyZWREYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU2Nyb2xsVG9wID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oKHRoaXMuRmlsdGVyZWREYXRhLmxlbmd0aCAtIHRoaXMuVmlzaWJsZVJvd3MpICogdGhpcy5Sb3dIZWlnaHQsIHRoaXMuU2Nyb2xsVG9wICsgdGhpcy5WaXNpYmxlUm93cyAqIHRoaXMuUm93SGVpZ2h0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNjcm9sbFRvcCA9IE1hdGgubWF4KDAsIE1hdGgubWluKCh0aGlzLkRhdGFTb3VyY2UubGVuZ3RoIC0gdGhpcy5WaXNpYmxlUm93cykgKiB0aGlzLlJvd0hlaWdodCwgdGhpcy5TY3JvbGxUb3AgKyB0aGlzLlZpc2libGVSb3dzICogdGhpcy5Sb3dIZWlnaHQpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlNjcm9sbFRvcCArPSAodGhpcy5WaXNpYmxlUm93cyAqIHRoaXMuUm93SGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkVkaXRSb3dJbmRleCAhPSAtMSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkVkaXRSb3dJbmRleCA9IC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghZnJvbUZvcm0gJiYga2V5LkNvbnRyb2xLZXkgPT0gQ29udHJvbEtleXMuQXJyb3dVcCkge1xyXG4gICAgICAgICAgICAgICAgbmF0aXZlS2V5UHJvY2Vzc2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Sb3dVcCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChmcm9tRm9ybSAmJiBrZXkuQ29udHJvbEtleSA9PSBDb250cm9sS2V5cy5BcnJvd1VwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkNvbExlZnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoa2V5LkNvbnRyb2xLZXkgPT0gQ29udHJvbEtleXMuUGFnZVVwICYmIHRoaXMuQ3VycmVudFJvd0luZGV4ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgbmF0aXZlS2V5UHJvY2Vzc2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdmFyIG5yaSA9IHRoaXMuQ3VycmVudFJvd0luZGV4IC09IHRoaXMuVmlzaWJsZVJvd3M7XHJcbiAgICAgICAgICAgICAgICBpZiAobnJpIDwgMClcclxuICAgICAgICAgICAgICAgICAgICBucmkgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DdXJyZW50Um93SW5kZXggPSBucmk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNjcm9sbFRvcCAtPSAodGhpcy5WaXNpYmxlUm93cyAqIHRoaXMuUm93SGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkVkaXRSb3dJbmRleCAhPSAtMSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkVkaXRSb3dJbmRleCA9IC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChrZXkuQ29udHJvbEtleSA9PSBDb250cm9sS2V5cy5BcnJvd1JpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICBuYXRpdmVLZXlQcm9jZXNzaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkNvbFJpZ2h0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGtleS5Db250cm9sS2V5ID09IENvbnRyb2xLZXlzLkFycm93TGVmdCkge1xyXG4gICAgICAgICAgICAgICAgbmF0aXZlS2V5UHJvY2Vzc2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Db2xMZWZ0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGtleS5Db250cm9sS2V5ID09IENvbnRyb2xLZXlzLlRhYikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9OZXh0Q29sdW1uKGZyb21Gb3JtLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBuYXRpdmVLZXlQcm9jZXNzaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGtleS5Db250cm9sS2V5ID09IENvbnRyb2xLZXlzLkYyKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkNhbkVkaXQpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5Jc0VkaXRpbmcgJiYgdGhpcy5BZGROZXdDb2xJbmRleCA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkNvbHVtbnNbdGhpcy5DdXJyZW50Q29sSW5kZXhdLkVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW50ZXJFZGl0TW9kZShmcm9tRm9ybSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuRXhpdEVkaXRNb2RlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuQWRkTmV3Q29sSW5kZXggPj0gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmFpc2VOZXdSb3dEYXRhQ2hhbmdlZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4aXRFZGl0TW9kZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoa2V5LkNvbnRyb2xLZXkgPT0gQ29udHJvbEtleXMuRW50ZXIpIHtcclxuICAgICAgICAgICAgaWYgKG5hdGl2ZUtleVByb2Nlc3NpbmcgJiYgdGhpcy5Jc0VkaXRpbmcgJiYgdGhpcy5Db2x1bW5zW3RoaXMuQ3VycmVudENvbEluZGV4XS5Db2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLlRFWFQpIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkVkaXRGaWx0ZXJDb2xJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuQ3VycmVudEVkaXRvcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DdXJyZW50RWRpdG9yLkV4aXRFZGl0TW9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuRWRpdEZpbHRlckNvbEluZGV4IDwgKHRoaXMuQ29sdW1ucy5sZW5ndGggLSAxKSkgPyB0aGlzLkVkaXRGaWx0ZXJDb2xJbmRleCsrIDogdGhpcy5FZGl0RmlsdGVyQ29sSW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLklzRWRpdGluZyAmJiB0aGlzLkFkZE5ld0NvbEluZGV4ID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuQ2FuRWRpdCAmJiB0aGlzLkNvbHVtbnNbdGhpcy5DdXJyZW50Q29sSW5kZXhdLkVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgI
23HRoaXMuZW50ZXJFZGl0TW9kZShmcm9tRm9ybSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuRXhpdEVkaXRNb2RlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuQWRkTmV3Q29sSW5kZXggPj0gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmFpc2VOZXdSb3dEYXRhQ2hhbmdlZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5Jc0VkaXRpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhpdEVkaXRNb2RlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb05leHRDb2x1bW4oZnJvbUZvcm0sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YXNrUXVldWUucXVldWVNaWNyb1Rhc2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmVudGVyRWRpdE1vZGUoZnJvbUZvcm0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGtleS5Db250cm9sS2V5ID09IENvbnRyb2xLZXlzLkVzYykge1xyXG4gICAgICAgICAgICB0aGlzLkVkaXRGaWx0ZXJDb2xJbmRleCA9IC0xO1xyXG4gICAgICAgICAgICB0aGlzLkFkZE5ld0NvbEluZGV4ID0gLTE7XHJcbiAgICAgICAgICAgIHRoaXMuZXhpdEVkaXRNb2RlKHRydWUsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoa2V5LkNvbnRyb2xLZXkgPT0gQ29udHJvbEtleXMuVGFiKSB7XHJcbiAgICAgICAgICAgIG5hdGl2ZUtleVByb2Nlc3NpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuQWRkTmV3Q29sSW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgKHRoaXMuQWRkTmV3Q29sSW5kZXggPCAodGhpcy5Db2x1bW5zLmxlbmd0aCAtIDEpKSA/IHRoaXMuQWRkTmV3Q29sSW5kZXgrKyA6IHRoaXMuQWRkTmV3Q29sSW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yYWlzZU5ld1Jvd0RhdGFDaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuRWRpdEZpbHRlckNvbEluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkN1cnJlbnRFZGl0b3IpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5DdXJyZW50RWRpdG9yLkV4aXRFZGl0TW9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAodGhpcy5FZGl0RmlsdGVyQ29sSW5kZXggPCAodGhpcy5Db2x1bW5zLmxlbmd0aCAtIDEpKSA/IHRoaXMuRWRpdEZpbHRlckNvbEluZGV4KysgOiB0aGlzLkVkaXRGaWx0ZXJDb2xJbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkNvbHVtbnNbdGhpcy5FZGl0RmlsdGVyQ29sSW5kZXhdLkhhc05hdGl2ZUZpbHRlckZvY3VzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkNvbHVtbnNbdGhpcy5FZGl0RmlsdGVyQ29sSW5kZXhdLkZpbHRlckVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgKDxIVE1MSW5wdXRFbGVtZW50PnRoaXMuQ29sdW1uc1t0aGlzLkVkaXRGaWx0ZXJDb2xJbmRleF0uRmlsdGVyRWxlbWVudC5maXJzdENoaWxkKS5zZWxlY3QoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5Jc0VkaXRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50Q29sID0gdGhpcy5Db2x1bW5zW3RoaXMuRWRpdENvbEluZGV4XTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkN1cnJlbnRDb2xFZGl0RmllbGRJbmRleCA8IGN1cnJlbnRDb2wuRWRpdGFibGVGaWVsZENvdW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5DdXJyZW50Q29sRWRpdEZpZWxkSW5kZXgrKztcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkV4aXRFZGl0TW9kZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGl0RWRpdE1vZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb05leHRDb2x1bW4oZnJvbUZvcm0sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFza1F1ZXVlLnF1ZXVlTWljcm9UYXNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZW50ZXJFZGl0TW9kZShmcm9tRm9ybSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLklzRWRpdGluZyAmJiB0aGlzLm5vbkVkaXRpbmdTaG9ydGN1dHMuaGFzKGtleS5DaGFyYWN0ZXIpICYmICFrZXkuQ29udHJvbEtleSkge1xyXG4gICAgICAgICAgICBuYXRpdmVLZXlQcm9jZXNzaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHZhciBldnREZWZpbml0aW9uID0gdGhpcy5ub25FZGl0aW5nU2hvcnRjdXRzLmdldChrZXkuQ2hhcmFjdGVyKTtcclxuICAgICAgICAgICAgZXZ0RGVmaW5pdGlvbi5mdW5jKGV2dERlZmluaXRpb24uY29tYm8sIGV2dERlZmluaXRpb24ucHJldmVudERlZmF1bHQsIGV2ZW50KTtcclxuICAgICAgICAgICAgaWYgKGV2dERlZmluaXRpb24ucHJldmVudERlZmF1bHQpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgI
23HJldHVybiBuYXRpdmVLZXlQcm9jZXNzaW5nO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUubW92ZVRvTmV4dENvbHVtbiA9IGZ1bmN0aW9uIChmcm9tRm9ybSwgd2FzRWRpdGluZykge1xyXG4gICAgICAgIGlmIChmcm9tRm9ybSkge1xyXG4gICAgICAgICAgICB2YXIgY25yID0gdGhpcy5DdXJyZW50Q29sSW5kZXg7XHJcbiAgICAgICAgICAgIHZhciBuY25yID0gLTE7XHJcbiAgICAgICAgICAgIHdoaWxlIChuY25yID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBjbnIrKztcclxuICAgICAgICAgICAgICAgIGlmIChjbnIgPT0gdGhpcy5BY3RpdmVDb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNuciA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5Jc0VkaXRpbmcgfHwgd2FzRWRpdGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkFjdGl2ZUNvbHVtbnNbY25yXS5Jc1Zpc2libGUgJiYgdGhpcy5BY3RpdmVDb2x1bW5zW2Nucl0uRWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmNuciA9IGNucjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLkFjdGl2ZUNvbHVtbnNbY25yXS5Jc1Zpc2libGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBuY25yID0gY25yO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuQ3VycmVudENvbEluZGV4ID0gbmNucjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLklzRWRpdGluZyB8fCB3YXNFZGl0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICB2Y
23XIgY25yID0gdGhpcy5DdXJyZW50Q29sSW5kZXg7XHJcbiAgICAgICAgICAgICAgICB2YXIgbmNuciA9IC0xO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKG5jbnIgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbnIrKztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY25yID09IHRoaXMuQWN0aXZlQ29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuQ3VycmVudFJvd0luZGV4IDwgdGhpcy5GaWx0ZXJlZERhdGEubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Sb3dEb3duKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY25yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuQWN0aXZlQ29sdW1uc1tjbnJdLklzVmlzaWJsZSAmJiB0aGlzLkFjdGl2ZUNvbHVtbnNbY25yXS5FZGl0YWJsZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmNuciA9IGNucjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VycmVudENvbEluZGV4ID0gbmNucjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkN1cnJlbnRDb2xJbmRleCA8IHRoaXMuQWN0aXZlQ29sdW1ucy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5DdXJyZW50Q29sSW5kZXggKz0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuQ3VycmVudFJvd0luZGV4IDwgdGhpcy5GaWx0ZXJlZERhdGEubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUm93RG93bigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQ3VycmVudENvbEluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLlJvd0Rvd24gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuQ3VycmVudFJvd0luZGV4IDwgKHRoaXMuRmlsdGVyZWREYXRhLmxlbmd0aCAtIDEpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3VycmVudFJvd0luZGV4ICs9IDE7XHJcbiAgICAgICAgICAgIC8vU2Nyb2xsZW4/XHJcbiAgICAgICAgICAgIGlmICgodGhpcy5DdXJyZW50Um93SW5kZXggLSB0aGlzLkZpcnN0VmlzaWJsZVJvdykgPiB0aGlzLlZpc2libGVSb3dzIC0gKHRoaXMuU2hvd1Jvd3NCZWZvcmVTY3JvbGxpbmcgKyAxKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuSXNWaXJ0dWFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuQ3VycmVudFJvd0luZGV4ICsgdGhpcy5TaG93Um93c0JlZm9yZVNjcm9sbGluZyA8IHRoaXMuRmlsdGVyZWREYXRhLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNjcm9sbFRvcCArPSB0aGlzLlJvd0hlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlNjcm9sbFRvcCArPSB0aGlzLlJvd0hlaWdodDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5FZGl0Um93SW5kZXggIT0gLTEpXHJcbiAgICAgICAgICAgICAgICB0aGlzLkVkaXRSb3dJbmRleCA9IHRoaXMuQ3VycmVudFJvd0luZGV4O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLlJvd1VwID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLkN1cnJlbnRSb3dJbmRleCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5DdXJyZW50Um93SW5kZXggLT0gMTtcclxuICAgICAgICAgICAgLy9TY3JvbGxlbj9cclxuICAgICAgICAgICAgaWYgKHRoaXMuU2Nyb2xsVG9wID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzLkN1cnJlbnRSb3dJbmRleCAtIHRoaXMuRmlyc3RWaXNpYmxlUm93KSA8ICh0aGlzLlNob3dSb3dzQmVmb3JlU2Nyb2xsaW5nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuU2Nyb2xsVG9wIC09IHRoaXMuUm93SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkVkaXRSb3dJbmRleCAhPSAtMSlcclxuICAgICAgICAgICAgICAgIHRoaXMuRWRpdFJvd0luZGV4ID0gdGhpcy5DdXJyZW50Um93SW5kZXg7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuQ29sTGVmdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy5DdXJyZW50Q29sSW5kZXggPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBjaSA9IHRoaXMuQ3VycmVudENvbEluZGV4O1xyXG4gICAgICAgICAgICB2Y
23XIgbmNpID0gLTE7XHJcbiAgICAgICAgICAgIHdoaWxlIChuY2kgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGNpIC09IDE7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2kgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBuY2kgPSB0aGlzLkN1cnJlbnRDb2xJbmRleDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkNvbHVtbnNbY2ldLklzVmlzaWJsZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmNpID0gY2k7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5DdXJyZW50Q29sSW5kZXggPSBuY2k7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkVkaXRDb2xJbmRleCAhPSAtMSlcclxuICAgICAgICAgICAgICAgIHRoaXMuRWRpdENvbEluZGV4ID0gdGhpcy5DdXJyZW50Q29sSW5kZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLklzVmlydHVhbCkge1xyXG4gICAgICAgICAgICB0aGlzLk1vdmVDb2xUb1ZpZXcodGhpcy5DdXJyZW50Q29sSW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLkNvbFJpZ2h0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLkN1cnJlbnRDb2xJbmRleCA8ICh0aGlzLkNvbHVtbnMubGVuZ3RoIC0gMSkpIHtcclxuICAgICAgICAgICAgdmFyIGNpID0gdGhpcy5DdXJyZW50Q29sSW5kZXg7XHJcbiAgICAgICAgICAgIHZhciBuY2kgPSAtMTtcclxuICAgICAgICAgICAgd2hpbGUgKG5jaSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgY2kgKz0gMTtcclxuICAgICAgICAgICAgICAgIGlmIChjaSA+PSB0aGlzLkNvbHVtbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmNpID0gdGhpcy5DdXJyZW50Q29sSW5kZXg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5Db2x1bW5zW2NpXS5Jc1Zpc2libGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5jaSA9IGNpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuQ3VycmVudENvbEluZGV4ID0gbmNpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5FZGl0Q29sSW5kZXggIT0gLTEpXHJcbiAgICAgICAgICAgICAgICB0aGlzLkVkaXRDb2xJbmRleCA9IHRoaXMuQ3VycmVudENvbEluZGV4O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5Jc1ZpcnR1YWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuTW92ZUNvbFRvVmlldyh0aGlzLkN1cnJlbnRDb2xJbmRleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5lbnRlckVkaXRNb2RlID0gZnVuY3Rpb24gKGZyb21Gb3JtKSB7XHJcbiAgICAgICAgaWYgKGZyb21Gb3JtID09PSB2b2lkIDApIHsgZnJvbUZvcm0gPSBmYWxzZTsgfVxyXG4gICAgICAgIHRoaXMuQ3VycmVudENvbEVkaXRGaWVsZEluZGV4ID0gMTtcclxuICAgICAgICB2Y
23XIgY29sdW1uO1xyXG4gICAgICAgIHZhciByb3c7XHJcbiAgICAgICAgaWYgKHRoaXMuQWN0aXZlQ29sdW1ucy5sZW5ndGggPCB0aGlzLkNvbHVtbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbHVtbiA9IHRoaXMuQWN0aXZlQ29sdW1uc1t0aGlzLkN1cnJlbnRDb2xJbmRleF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb2x1bW4gPSB0aGlzLkNvbHVtbnNbdGhpcy5DdXJyZW50Q29sSW5kZXhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZnJvbUZvcm0gJiYgY29sdW1uKSB7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4uSW5wdXRFbGVtZW50MSkge1xyXG4gICAgICAgICAgICAgICAgY29sdW1uLklucHV0RWxlbWVudDEuZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGFza1F1ZXVlLnF1ZXVlVGFzayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5JbnB1dEVsZW1lbnQxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5JbnB1dEVsZW1lbnQxLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy90aGlzLk5hdGl2ZUZvY3VzID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuRmlsdGVyZWREYXRhKSB7XHJcbiAgICAgICAgICAgIHJvdyA9IHRoaXMuRmlsdGVyZWREYXRhW3RoaXMuQ3VycmVudFJvd0luZGV4XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5EYXRhU291cmNlICYmIHRoaXMuRGF0YVNvdXJjZS5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICByb3cgPSB0aGlzLkRhdGFTb3VyY2VbMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuRGF0YVNvdXJjZSkge1xyXG4gICAgICAgICAgICByb3cgPSB0aGlzLkRhdGFTb3VyY2VbdGhpcy5DdXJyZW50Um93SW5kZXhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29sdW1uLlNlbGVjdGlvbkdyaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5TZWxlY3RlZEVkaXRWYWx1ZSA9IHJvd1tjb2x1bW4uU2VsZWN0aW9uVGFyZ2V0XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHNldFZhbHVlO1xyXG4gICAgICAgIGlmIChjb2x1bW4uZDUpIHtcclxuICAgICAgICAgICAgc2V0VmFsdWUgPSByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM11bY29sdW1uLmQ0XVtjb2x1bW4uZDVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjb2x1bW4uZDQpIHtcclxuICAgICAgICAgICAgc2V0VmFsdWUgPSByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM11bY29sdW1uLmQ0XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29sdW1uLmQzKSB7XHJcbiAgICAgICAgICAgIHNldFZhbHVlID0gcm93W2NvbHVtbi5kMV1bY29sdW1uLmQyXVtjb2x1bW4uZDNdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjb2x1bW4uZDIpIHtcclxuICAgICAgICAgICAgc2V0VmFsdWUgPSByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc2V0VmFsdWUgPSByb3dbY29sdW1uLmQxXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbHVtbi5Db2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLkRBVEUpIHtcclxuICAgICAgICAgICAgaWYgKCFzZXRWYWx1ZSB8fCBzZXRWYWx1ZSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuRWRpdFZhbHVlRGF0ZVN0cmluZyA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuRWRpdFZhbHVlVGltZVN0cmluZyA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghKHNldFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSA9IG5ldyBEYXRlKHNldFZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuRWRpdFZhbHVlRGF0ZVN0cmluZyA9IHNldFZhbHVlLmdldEZ1bGxZZWFyKCkgKyAnLScgKyAoJzAnICsgKHNldFZhbHVlLmdldE1vbnRoKCkgKyAxKSkuc2xpY2UoLTIpICsgJy0nICsgKCcwJyArIHNldFZhbHVlLmdldERhdGUoKSkuc2xpY2UoLTIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5FZGl0VmFsdWVUaW1lU3RyaW5nID0gRGF0ZVRpbWVGb3JtYXR0ZXJzLkZvcm1hdERhdGUoc2V0VmFsdWUsIFwiSEg6bW1cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbHVtbi5Db2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLlNJV0lEQVRFVElNRSkge1xyXG4gICAgICAgICAgICBpZiAoIXNldFZhbHVlIHx8IHNldFZhbHVlID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5FZGl0VmFsdWVEYXRlU3RyaW5nID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5FZGl0VmFsdWVUaW1lU3RyaW5nID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjb2x1bW4uRWRpdG9yVGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSA9IERhdGVUaW1lRm9ybWF0dGVycy5TaXdpRGF0ZVRpbWVUb0RhdGUoc2V0VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRWRpdFZhbHVlRGF0ZVN0cmluZyA9IHNldFZhbHVlLmdldEZ1bGxZZWFyKCkgKyAnLScgKyAoJzAnICsgKHNldFZhbHVlLmdldE1vbnRoKCkgKyAxKSkuc2xpY2UoLTIpICsgJy0nICsgKCcwJyArIHNldFZhbHVlLmdldERhdGUoKSkuc2xpY2UoLTIpO1xyXG4gICAgICAgICAgICAgICAgICAgI
23HRoaXMuRWRpdFZhbHVlVGltZVN0cmluZyA9IERhdGVUaW1lRm9ybWF0dGVycy5Gb3JtYXREYXRlKHNldFZhbHVlLCBcIkhIOm1tXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzZXRWYWx1ZSAmJiAoY29sdW1uLkNvbHVtblR5cGUgPT0gR3JpZENvbHVtblR5cGUuTlVNQkVSIHx8IGNvbHVtbi5Db2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLkRFQ0lNQUwpKSB7XHJcbiAgICAgICAgICAgIGlmIChzZXRWYWx1ZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHNldFZhbHVlID0gc2V0VmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldFZhbHVlID0gXCJcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29sdW1uLkNvbHVtblR5cGUgPT0gR3JpZENvbHVtblR5cGUuRk9SRUlHTktFWSkge1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uLkZvcmVpZ25LZXlGaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNldFZhbHVlICE9PSB1bmRlZmluZWQgJiYgc2V0VmFsdWUgIT09IG51bGwgJiYgc2V0VmFsdWUgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGNvbHVtbi5Gb3JlaWduSXRlbXMuZmluZChmdW5jdGlvbiAoZikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZltjb2x1bW4uRm9yZWlnbktleUZpZWxkXSA9PSBzZXRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbHVtbi5Db2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLkNIRUNLQk9YKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3VycmVudEVkaXRvciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuRWRpdFZhbHVlID0gc2V0VmFsdWU7XHJcbiAgICAgICAgdGhpcy5FZGl0Q29sSW5kZXggPSB0aGlzLkN1cnJlbnRDb2xJbmRleDtcclxuICAgICAgICB0aGlzLkVkaXRSb3dJbmRleCA9IHRoaXMuQ3VycmVudFJvd0luZGV4O1xyXG4gICAgICAgIHRoaXMuSXNFZGl0aW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLk5hdGl2ZUZvY3VzID0gdHJ1ZTtcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLkxvc3RGb2N1cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLkV4aXRFZGl0TW9kZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmV4aXRFZGl0TW9kZShmYWxzZSwgdHJ1ZSk7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5jYW5FeGl0RWRpdE1vZGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHJldCA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMuSXNSZXNwb25zaXZlRm9ybSB8fCB0aGlzLkVkaXRSb3dJbmRleCA9PSB1bmRlZmluZWQgfHwgdGhpcy5FZGl0Um93SW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2Y
23XIgY2hlY2tSb3c7XHJcbiAgICAgICAgY2hlY2tSb3cgPSB0aGlzLkZpbHRlcmVkRGF0YVt0aGlzLkVkaXRSb3dJbmRleF07XHJcbiAgICAgICAgaWYgKHRoaXMuSXNFZGl0aW5nICYmIHRoaXMuRWRpdEZpbHRlckNvbEluZGV4ID09IC0xKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkFjdGl2ZUNvbHVtbnMgJiYgdGhpcy5DdXJyZW50Q29sSW5kZXggPj0gMCAmJiB0aGlzLkN1cnJlbnRDb2xJbmRleCA8IHRoaXMuQWN0aXZlQ29sdW1ucy5sZW5ndGggJiYgdGhpcy5BY3RpdmVDb2x1bW5zW3RoaXMuQ3VycmVudENvbEluZGV4XSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuQWN0aXZlQ29sdW1uc1t0aGlzLkN1cnJlbnRDb2xJbmRleF0uQ29sdW1uVHlwZSA9PSBHcmlkQ29sdW1uVHlwZS5EQVRFIHx8IHRoaXMuQWN0aXZlQ29sdW1uc1t0aGlzLkN1cnJlbnRDb2xJbmRleF0uQ29sdW1uVHlwZSA9PSBHcmlkQ29sdW1uVHlwZS5TSVdJREFURVRJTUUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlZhbGlkYXRlVmFsdWUodGhpcy5BY3RpdmVDb2x1bW5zW3RoaXMuQ3VycmVudENvbEluZGV4XSwgdGhpcy5FZGl0VmFsdWVEYXRlU3RyaW5nLCBjaGVja1Jvdyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0ID0gIXRoaXMuQWN0aXZlQ29sdW1uc1t0aGlzLkN1cnJlbnRDb2xJbmRleF0uVmFsaWRhdGlvbkVycm9ycyB8fCB0aGlzLkFjdGl2ZUNvbHVtbnNbdGhpcy5DdXJyZW50Q29sSW5kZXhdLlZhbGlkYXRpb25FcnJvcnMubGVuZ3RoID09IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlZhbGlkYXRlVmFsdWUodGhpcy5BY3RpdmVDb2x1bW5zW3RoaXMuQ3VycmVudENvbEluZGV4XSwgdGhpcy5FZGl0VmFsdWUsIGNoZWNrUm93KTtcclxuICAgICAgICAgICAgICAgICAgICByZXQgPSAhdGhpcy5BY3RpdmVDb2x1bW5zW3RoaXMuQ3VycmVudENvbEluZGV4XS5WYWxpZGF0aW9uRXJyb3JzIHx8IHRoaXMuQWN0aXZlQ29sdW1uc1t0aGlzLkN1cnJlbnRDb2xJbmRleF0uVmFsaWRhdGlvbkVycm9ycy5sZW5ndGggPT0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuR2V0U2VyaWFsaXplZFJlc3BvbnNpdmVGb3JtRGF0YSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2Y
23XIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGlmICghdGhpcy5EYXRhU291cmNlIHx8ICFBcnJheS5pc0FycmF5KHRoaXMuRGF0YVNvdXJjZSkgfHwgdGhpcy5EYXRhU291cmNlLmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcmVjb3JkID0gdGhpcy5EYXRhU291cmNlWzBdO1xyXG4gICAgICAgIHZhciBmaWVsZHMgPSBbXTtcclxuICAgICAgICB0aGlzLkFjdGl2ZUNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sKSB7XHJcbiAgICAgICAgICAgIHZhciBlZGl0VmFsdWUgPSBfdGhpcy5nZXRSZXNwb25zaXZlRWRpdFZhbHVlKGNvbCk7XHJcbiAgICAgICAgICAgIHZhciBmaWVsZCA9IHsgTmFtZTogY29sLkRhdGFGaWVsZCwgVmFsdWU6IG51bGwgfTtcclxuICAgICAgICAgICAgaWYgKHJlY29yZCAmJiBfdGhpcy5WYWxpZGF0ZVZhbHVlKGNvbCwgZWRpdFZhbHVlLCByZWNvcmQpKSB7XHJcbiAgICAgICAgICAgICAgICBmaWVsZC5WYWx1ZSA9IGVkaXRWYWx1ZTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbC5kNSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRbY29sLmQxXVtjb2wuZDJdW2NvbC5kM11bY29sLmQ0XVtjb2wuZDVdID0gZmllbGQuVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5kNCAmJiAhY29sLmQ1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFtjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVtjb2wuZDRdID0gZmllbGQuVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5kMyAmJiAhY29sLmQ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFtjb2wuZDFdW2NvbC5kMl1bY29sLmQzXSA9IGZpZWxkLlZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wuZDIgJiYgIWNvbC5kMykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRbY29sLmQxXVtjb2wuZDJdID0gZmllbGQuVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFjb2wuZDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2NvbC5kMV0gPSBmaWVsZC5WYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGZpZWxkcztcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLmV4aXRFZGl0TW9kZSA9IGZ1bmN0aW9uIChjYW5jZWwsIGZvcmdldEZvY3VzKSB7XHJcbiAgICAgICAgaWYgKCFjYW5jZWwgJiYgIXRoaXMuY2FuRXhpdEVkaXRNb2RlKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2Y
23XIgY29sdW1uO1xyXG4gICAgICAgIGlmICh0aGlzLkFjdGl2ZUNvbHVtbnMubGVuZ3RoIDwgdGhpcy5Db2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjb2x1bW4gPSB0aGlzLkFjdGl2ZUNvbHVtbnNbdGhpcy5FZGl0Q29sSW5kZXhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29sdW1uID0gdGhpcy5Db2x1bW5zW3RoaXMuRWRpdENvbEluZGV4XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjb2x1bW4pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB0aGlzLkN1cnJlbnRDb2xFZGl0RmllbGRJbmRleCA9IDA7XHJcbiAgICAgICAgdmFyIHJvdztcclxuICAgICAgICBpZiAodGhpcy5FZGl0Um93SW5kZXggPj0gdGhpcy5GaWx0ZXJlZERhdGEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcm93ID0gdGhpcy5GaWx0ZXJlZERhdGFbdGhpcy5FZGl0Um93SW5kZXhdO1xyXG4gICAgICAgIHZhciBzZXRWYWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5Jc1Jlc3BvbnNpdmVGb3JtKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBzZXRWYWx1ZSA9IHRoaXMuZ2V0UmVzcG9uc2l2ZUVkaXRWYWx1ZShjb2x1bW4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuVmFsaWRhdGVWYWx1ZShjb2x1bW4sIHNldFZhbHVlLCByb3cpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmQ1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNVbnR5cGVkU2Vzc2lvbk9iamVjdE9yRGljdChyb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM11bY29sdW1uLmQ0XSwgY29sdW1uLmQ1KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM11bY29sdW1uLmQ0XS5TZXQoY29sdW1uLmQ1LCBzZXRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM11bY29sdW1uLmQ0XVtjb2x1bW4uZDVdID0gc2V0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sdW1uLmQ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNVbnR5cGVkU2Vzc2lvbk9iamVjdE9yRGljdChyb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM10sIGNvbHVtbi5kNCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5kMV1bY29sdW1uLmQyXVtjb2x1bW4uZDNdLlNldChjb2x1bW4uZDQsIHNldFZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZDFdW2NvbHVtbi5kMl1bY29sdW1uLmQzXVtjb2x1bW4uZDRdID0gc2V0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sdW1uLmQzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNVbnR5cGVkU2Vzc2lvbk9iamVjdE9yRGljdChyb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdLCBjb2x1bW4uZDMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZDFdW2NvbHVtbi5kMl0uU2V0KGNvbHVtbi5kMywgc2V0VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbi5kMV1bY29sdW1uLmQyXVtjb2x1bW4uZDNdID0gc2V0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sdW1uLmQyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNVbnR5cGVkU2Vzc2lvbk9iamVjdE9yRGljdChyb3dbY29sdW1uLmQxXSwgY29sdW1uLmQyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmQxXS5TZXQoY29sdW1uLmQyLCBzZXRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdID0gc2V0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNVbnR5cGVkU2Vzc2lvbk9iamVjdE9yRGljdChyb3csIGNvbHVtbi5kMSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93LlNldChjb2x1bW4uZDEsIHNldFZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZDFdID0gc2V0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuQWZ0ZXJFeGl0RWRpdE1vZGUudHJpZ2dlcihyb3csIGNvbHVtbiwgc2V0VmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc2V0VmFsdWUgPSB0aGlzLkVkaXRWYWx1ZTtcclxuICAgICAgICAgICAgdmFyIHZhbHVlQ2hhbmdlZCA9IHZvaWQgMDtcclxuICAgICAgICAgICAgaWYgKGNvbHVtbi5Db2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLlNPUlRPUkRFUilcclxuICAgICAgICAgICAgICAgI
23HJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFjYW5jZWwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uU2VsZWN0aW9uR3JpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uU2VsZWN0aW9uVGFyZ2V0XSA9IHRoaXMuU2VsZWN0ZWRFZGl0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLkNvbHVtblR5cGUgPT0gR3JpZENvbHVtblR5cGUuRk9SRUlHTktFWSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLkZvcmVpZ25LZXlGaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldFZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlID0gc2V0VmFsdWVbY29sdW1uLkZvcmVpZ25LZXlGaWVsZF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGNvbHVtbi5Gb3JlaWduSXRlbXMuZmluZChmdW5jdGlvbiAoZikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmID09IHNldFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5Db2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLlRFTVBMQVRFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBydW4gYWZ0ZXJFeGl0RWRpdE1vZGUgZm9yIGN1c3RvbSB0ZW1wbGF0ZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5Db2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLkNIRUNLQk9YKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vZGlyZWt0IGdlYnVuZGVuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uQ29sdW1uVHlwZSA9PSBHcmlkQ29sdW1uVHlwZS5OVU1CRVIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldFZhbHVlICE9PSB1bmRlZmluZWQgJiYgc2V0VmFsdWUgIT09IG51bGwgJiYgc2V0VmFsdWUgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlID0gcGFyc2VJbnQoc2V0VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uQ29sdW1uVHlwZSA9PSBHcmlkQ29sdW1uVHlwZS5ERUNJTUFMKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHNldFZhbHVlICE9PSBudWxsICYmIHNldFZhbHVlICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSA9IHBhcnNlRmxvYXQoc2V0VmFsdWUucmVwbGFjZShcIixcIiwgXCIuXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLkNvbHVtblR5cGUgPT0gR3JpZENvbHVtblR5cGUuU0lXSURBVEVUSU1FKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29sdW1uLkVkaXRvclRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5FZGl0VmFsdWVEYXRlU3RyaW5nICYmIHRoaXMuRWRpdFZhbHVlRGF0ZVN0cmluZyAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVQYXJ0cyA9IHRoaXMuRWRpdFZhbHVlRGF0ZVN0cmluZy5zcGxpdChcIi1cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVkRGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLkVkaXRUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkVkaXRWYWx1ZVRpbWVTdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aW1lUGFydHMgPSB0aGlzLkVkaXRWYWx1ZVRpbWVTdHJpbmcuc3BsaXQoXCI6XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWREYXRlID0gbmV3IERhdGUocGFyc2VJbnQoZGF0ZVBhcnRzWzBdKSwgcGFyc2VJbnQoZGF0ZVBhcnRzWzFdKSAtIDEsIHBhcnNlSW50KGRhdGVQYXJ0c1syXSksIHBhcnNlSW50KHRpbWVQYXJ0c1swXSksIHBhcnNlSW50KHRpbWVQYXJ0c1sxXSksIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWREYXRlID0gbmV3IERhdGUocGFyc2VJbnQoZGF0ZVBhcnRzWzBdKSwgcGFyc2VJbnQoZGF0ZVBhcnRzWzFdKSAtIDEsIHBhcnNlSW50KGRhdGVQYXJ0c1syXSksIDAsIDAsIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86IFNpbmQgZGllc2VyIDEyIFN0dW5kZW4gZGllIGJlc3RlIE9wdGlvbiBvZGVyIHNvbGx0ZSBlcyBkYXMgVVRDIE9mZnNldCBkZXIgVUkgc2Vpbj9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWREYXRlID0gbmV3IERhdGUocGFyc2VJbnQoZGF0ZVBhcnRzWzBdKSwgcGFyc2VJbnQoZGF0ZVBhcnRzWzFdKSAtIDEsIHBhcnNlSW50KGRhdGVQYXJ0c1syXSksIDEyLCAwLCAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWUgPSBEYXRlVGltZUZvcm1hdHRlcnMuRGF0ZVRvU2l3aURhdGVUaW1lKGVkRGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgI
23H1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5Db2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLkRBVEUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuRWRpdFZhbHVlRGF0ZVN0cmluZyAmJiB0aGlzLkVkaXRWYWx1ZURhdGVTdHJpbmcgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVQYXJ0cyA9IHRoaXMuRWRpdFZhbHVlRGF0ZVN0cmluZy5zcGxpdChcIi1cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLkVkaXRUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuRWRpdFZhbHVlVGltZVN0cmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGltZVBhcnRzID0gdGhpcy5FZGl0VmFsdWVUaW1lU3RyaW5nLnNwbGl0KFwiOlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWUgPSBuZXcgRGF0ZShwYXJzZUludChkYXRlUGFydHNbMF0pLCBwYXJzZUludChkYXRlUGFydHNbMV0pIC0gMSwgcGFyc2VJbnQoZGF0ZVBhcnRzWzJdKSwgcGFyc2VJbnQodGltZVBhcnRzWzBdKSwgcGFyc2VJbnQodGltZVBhcnRzWzFdKSwgMCwgMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSA9IG5ldyBEYXRlKHBhcnNlSW50KGRhdGVQYXJ0c1swXSksIHBhcnNlSW50KGRhdGVQYXJ0c1sxXSkgLSAxLCBwYXJzZUludChkYXRlUGFydHNbMl0pLCAwLCAwLCAwLCAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSA9IG5ldyBEYXRlKHBhcnNlSW50KGRhdGVQYXJ0c1swXSksIHBhcnNlSW50KGRhdGVQYXJ0c1sxXSkgLSAxLCBwYXJzZUludChkYXRlUGFydHNbMl0pLCAxMiwgMCwgMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuQ3VycmVudEVkaXRvciB8fCAoY29sdW1uLkNvbHVtblR5cGUgIT0gR3JpZENvbHVtblR5cGUuQ0hFQ0tCT1ggJiYgY29sdW1uLkNvbHVtblR5cGUgIT0gR3JpZENvbHVtblR5cGUuT1BUSU9OU0xJU1QpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlZhbGlkYXRlVmFsdWUoY29sdW1uLCBzZXRWYWx1ZSwgcm93KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5kNSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVW50eXBlZFNlc3Npb25PYmplY3RPckRpY3Qocm93W2NvbHVtbi5kMV1bY29sdW1uLmQyXVtjb2x1bW4uZDNdW2NvbHVtbi5kNF0sIGNvbHVtbi5kNSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldFZhbHVlICE9IHJvd1tjb2x1bW4uZDFdW2NvbHVtbi5kMl1bY29sdW1uLmQzXVtjb2x1bW4uZDRdLkdldChjb2x1bW4uZDUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM11bY29sdW1uLmQ0XS5TZXQoY29sdW1uLmQ1LCBzZXRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0VmFsdWUgIT0gcm93W2NvbHVtbi5kMV1bY29sdW1uLmQyXVtjb2x1bW4uZDNdW2NvbHVtbi5kNF1bY29sdW1uLmQ1XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZDFdW2NvbHVtbi5kMl1bY29sdW1uLmQzXVtjb2x1bW4uZDRdW2NvbHVtbi5kNV0gPSBzZXRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbHVtbi5kNCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVW50eXBlZFNlc3Npb25PYmplY3RPckRpY3Qocm93W2NvbHVtbi5kMV1bY29sdW1uLmQyXVtjb2x1bW4uZDNdLCBjb2x1bW4uZDQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXRWYWx1ZSAhPSByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM10uR2V0KGNvbHVtbi5kNCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZDFdW2NvbHVtbi5kMl1bY29sdW1uLmQzXS5TZXQoY29sdW1uLmQ0LCBzZXRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0VmFsdWUgIT0gcm93W2NvbHVtbi5kMV1bY29sdW1uLmQyXVtjb2x1bW4uZDNdW2NvbHVtbi5kNF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
23HZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM11bY29sdW1uLmQ0XSA9IHNldFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sdW1uLmQzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNVbnR5cGVkU2Vzc2lvbk9iamVjdE9yRGljdChyb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdLCBjb2x1bW4uZDMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXRWYWx1ZSAhPSByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdLkdldChjb2x1bW4uZDMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdLlNldChjb2x1bW4uZDMsIHNldFZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXRWYWx1ZSAhPSByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM10gPSBzZXRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbHVtbi5kMikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVW50eXBlZFNlc3Npb25PYmplY3RPckRpY3Qocm93W2NvbHVtbi5kMV0sIGNvbHVtbi5kMikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldFZhbHVlICE9IHJvd1tjb2x1bW4uZDFdLkdldChjb2x1bW4uZDIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmQxXS5TZXQoY29sdW1uLmQyLCBzZXRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0VmFsdWUgIT0gcm93W2NvbHVtbi5kMV1bY29sdW1uLmQyXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1tjb2x1bW4uZDFdW2NvbHVtbi5kMl0gPSBzZXRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVW50eXBlZFNlc3Npb25PYmplY3RPckRpY3Qocm93LCBjb2x1bW4uZDEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXRWYWx1ZSAhPSByb3cuR2V0KGNvbHVtbi5kMSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5TZXQoY29sdW1uLmQxLCBzZXRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0VmFsdWUgIT0gcm93W2NvbHVtbi5kMV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dbY29sdW1uLmQxXSA9IHNldFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuQWxpZ25IZWFkZXJzKCk7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQWZ0ZXJFeGl0RWRpdE1vZGUudHJpZ2dlcihyb3csIGNvbHVtbiwgc2V0VmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4uVmFsaWRhdGlvbkVycm9ycyAmJiBjb2x1bW4uVmFsaWRhdGlvbkVycm9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbCAmJiB2YWx1ZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2x1bW4uVmFsaWRhdGlvbkVycm9ycyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgI
23HRoaXMuRWRpdENvbEluZGV4ID0gLTE7XHJcbiAgICAgICAgdGhpcy5FZGl0Um93SW5kZXggPSAtMTtcclxuICAgICAgICB0aGlzLklzRWRpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuVmFsaWRhdGlvbkVycm9ycyA9IFtdO1xyXG4gICAgICAgIHRoaXMuSGFzVmFsaWRhdGlvbkVycm9ycyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuRWRpdFZhbGlkYXRpb25FcnJvciA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5WYWxpZGF0aW9uU3VtbWFyeSA9IFwiXCI7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5nZXRSZXNwb25zaXZlRWRpdFZhbHVlID0gZnVuY3Rpb24gKGNvbHVtbikge1xyXG4gICAgICAgIHZhciBzZXRWYWx1ZTtcclxuICAgICAgICB2YXIgZGF0YTtcclxuICAgICAgICBpZiAodGhpcy5SZXNwb25zaXZlRm9ybUVkaXRzLmhhc093blByb3BlcnR5KGNvbHVtbi5EYXRhRmllbGQpKSB7XHJcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLlJlc3BvbnNpdmVGb3JtRWRpdHNbY29sdW1uLkRhdGFGaWVsZF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFZGl0aW5nIGZpZWxkIGZvciBjb2x1bW4gXCIgKyBjb2x1bW4uRGF0YUZpZWxkICsgXCIgaXMgbWlzc2luZy5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaCAoY29sdW1uLkNvbHVtblR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uVHlwZS5EQVRFOlxyXG4gICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5UeXBlLlNJV0lEQVRFVElNRTpcclxuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uVHlwZS5TSVdJTkVUVElNRTpcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5Ccm93c2VyU3VwcG9ydHNQbGFjZUhvbGRlcnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEuRWRpdFVuc3VwcG9ydGVkQnJvd3NlckRhdGVUaW1lLlllYXIgfHwgIWRhdGEuRWRpdFVuc3VwcG9ydGVkQnJvd3NlckRhdGVUaW1lLk1vbnRoIHx8ICFkYXRhLkVkaXRVbnN1cHBvcnRlZEJyb3dzZXJEYXRlVGltZS5EYXlPZk1vbnRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuRWRpdFZhbHVlRGF0ZVN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLkVkaXRWYWx1ZURhdGVTdHJpbmcgPSBkYXRhLkVkaXRVbnN1cHBvcnRlZEJyb3dzZXJEYXRlVGltZS5ZZWFyICsgXCItXCIgKyBkYXRhLkVkaXRVbnN1cHBvcnRlZEJyb3dzZXJEYXRlVGltZS5Nb250aCArIFwiLVwiICsgZGF0YS5FZGl0VW5zdXBwb3J0ZWRCcm93c2VyRGF0ZVRpbWUuRGF5T2ZNb250aDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5FZGl0VmFsdWVEYXRlU3RyaW5nICYmIGRhdGEuRWRpdFZhbHVlRGF0ZVN0cmluZyAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVQYXJ0cyA9IGRhdGEuRWRpdFZhbHVlRGF0ZVN0cmluZy5zcGxpdChcIi1cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVkRGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLkVkaXRUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLkVkaXRWYWx1ZVRpbWVTdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aW1lUGFydHMgPSBkYXRhLkVkaXRWYWx1ZVRpbWVTdHJpbmcuc3BsaXQoXCI6XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWREYXRlID0gbmV3IERhdGUocGFyc2VJbnQoZGF0ZVBhcnRzWzBdKSwgcGFyc2VJbnQoZGF0ZVBhcnRzWzFdKSAtIDEsIHBhcnNlSW50KGRhdGVQYXJ0c1syXSksIHBhcnNlSW50KHRpbWVQYXJ0c1swXSksIHBhcnNlSW50KHRpbWVQYXJ0c1sxXSksIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWREYXRlID0gbmV3IERhdGUocGFyc2VJbnQoZGF0ZVBhcnRzWzBdKSwgcGFyc2VJbnQoZGF0ZVBhcnRzWzFdKSAtIDEsIHBhcnNlSW50KGRhdGVQYXJ0c1syXSksIDAsIDAsIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86IFNpbmQgZGllc2VyIDEyIFN0dW5kZW4gZGllIGJlc3RlIE9wdGlvbiBvZGVyIHNvbGx0ZSBlcyBkYXMgVVRDIE9mZnNldCBkZXIgVUkgc2Vpbj9cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5Db2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLkRBVEUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkRGF0ZSA9IG5ldyBEYXRlKHBhcnNlSW50KGRhdGVQYXJ0c1swXSksIHBhcnNlSW50KGRhdGVQYXJ0c1sxXSkgLSAxLCBwYXJzZUludChkYXRlUGFydHNbMl0pLCAxMiwgMCwgMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZERhdGUgPSBuZXcgRGF0ZShwYXJzZUludChkYXRlUGFydHNbMF0pLCBwYXJzZUludChkYXRlUGFydHNbMV0pIC0gMSwgcGFyc2VJbnQoZGF0ZVBhcnRzWzJdKSwgMTIsIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlZERhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5Db2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLkRBVEUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlID0gZWREYXRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWUgPSBEYXRlVGltZUZvcm1hdHRlcnMuRGF0ZVRvU2l3aURhdGVUaW1lKGVkRGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgI
23H1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uVHlwZS5DSEVDS0JPWDpcclxuICAgICAgICAgICAgICAgIHNldFZhbHVlID0gZGF0YS5Jc0NoZWNrZWQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uVHlwZS5TSVdJTkVUUE9JTlRTOlxyXG4gICAgICAgICAgICAgICAgc2V0VmFsdWUgPSBNYXRoLmZsb29yKDEwMDAwMDAgKiBwYXJzZUZsb2F0KGRhdGEuRWRpdFZhbHVlKSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBzZXRWYWx1ZSA9IGRhdGEuRWRpdFZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2V0VmFsdWU7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5SZXNwb25zaXZlRm9ybUlzVmFsaWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICBpZiAoIXRoaXMuSXNSZXNwb25zaXZlRm9ybSlcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHZhciBpc1ZhbGlkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLkFjdGl2ZUNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sKSB7XHJcbiAgICAgICAgICAgIHZhciBzZXRWYWx1ZTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHNldFZhbHVlID0gX3RoaXMuZ2V0UmVzcG9uc2l2ZUVkaXRWYWx1ZShjb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFfdGhpcy5WYWxpZGF0ZVZhbHVlKGNvbCwgc2V0VmFsdWUsIF90aGlzLkRhdGFTb3VyY2VbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gaXNWYWxpZDtcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLlZhbGlkYXRlVmFsdWUgPSBmdW5jdGlvbiAoY29sdW1uLCBwcm9wb3NlZFZhbHVlLCByb3cpIHtcclxuICAgICAgICB2Y
23XIgaXNWYWxpZCA9IHRydWU7XHJcbiAgICAgICAgdmFyIHZhbGlkYXRpb25FcnJvcnMgPSBbXTtcclxuICAgICAgICBpZiAoY29sdW1uLlZhbGlkYXRpb25zKSB7XHJcbiAgICAgICAgICAgIGNvbHVtbi5WYWxpZGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXYuQ2hlY2tWYWx1ZShwcm9wb3NlZFZhbHVlLCByb3cpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnMucHVzaCh2LkVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsaWRhdGlvbkVycm9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuRWRpdFZhbGlkYXRpb25FcnJvciA9IHZhbGlkYXRpb25FcnJvcnNbMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLkVkaXRWYWxpZGF0aW9uRXJyb3IgPSBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb2x1bW4uVmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25FcnJvcnM7XHJcbiAgICAgICAgcmV0dXJuIGlzVmFsaWQ7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5pc1VudHlwZWRTZXNzaW9uT2JqZWN0T3JEaWN0ID0gZnVuY3Rpb24gKHJvdywgcHJvcGVydHlOYW1lKSB7XHJcbiAgICAgICAgdmFyIGlzU2Vzc2lvbk9iamVjdCA9IHJvd1xyXG4gICAgICAgICAgICAmJiByb3cuU3luY0lkXHJcbiAgICAgICAgICAgICYmIHJvdy5Db250ZXh0XHJcbiAgICAgICAgICAgICYmIHJvdy5TZXRcclxuICAgICAgICAgICAgJiYgdHlwZW9mIHJvdy5TZXQgPT09IFwiZnVuY3Rpb25cIjtcclxuICAgICAgICB2Y
23XIgaXNEeW5hbWljUmVhbFRpbWVFbnRpdHkgPSByb3dcclxuICAgICAgICAgICAgJiYgdHlwZW9mIHJvdy5HZXRPYmplY3RUeXBlID09PSBcImZ1bmN0aW9uXCJcclxuICAgICAgICAgICAgJiYgcm93LkdldE9iamVjdFR5cGUoKSA9PT0gMTtcclxuICAgICAgICB2YXIgaGFzUHJvcGVydHkgPSByb3cgJiYgcHJvcGVydHlOYW1lICYmIHByb3BlcnR5TmFtZSBpbiByb3c7XHJcbiAgICAgICAgcmV0dXJuIGlzU2Vzc2lvbk9iamVjdCAmJiAoIWlzRHluYW1pY1JlYWxUaW1lRW50aXR5IHx8ICFoYXNQcm9wZXJ0eSk7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5yYWlzZU5ld1Jvd0RhdGFDaGFuZ2VkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuTmV3Um93RGF0YUNoYW5nZWQudHJpZ2dlcih0aGlzLk5ld1Jvdyk7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5DbGVhck5ld1JvdyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLk5ld1JvdyA9IHt9O1xyXG4gICAgICAgIHRoaXMuQWRkTmV3Q29sSW5kZXggPSAtMTtcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLkNlbGxDbGlja2VkID0gZnVuY3Rpb24gKGV2dCwgcm93LCBjb2wsIGZvcm1Nb2RlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuSXNMb2NrZWQpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHRoaXMuRWRpdEZpbHRlckNvbEluZGV4ID0gLTE7XHJcbiAgICAgICAgdGhpcy5BZGROZXdDb2xJbmRleCA9IC0xO1xyXG4gICAgICAgIHZhciByZWFsQ29sID0gY29sO1xyXG4gICAgICAgIGlmICh0aGlzLkNvbHVtbnMubGVuZ3RoID4gdGhpcy5BY3RpdmVDb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuQ29sdW1ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuQ29sdW1uc1tpXSA9PSB0aGlzLkFjdGl2ZUNvbHVtbnNbY29sXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlYWxDb2wgPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vRmFsbHMgc2Nob24gZWRpdGllcnQgd2lyZCBoaWVyLCBhYlxyXG4gICAgICAgIGlmICh0aGlzLklzRWRpdGluZyAmJiBmb3JtTW9kZSAmJiBjb2wgPT0gdGhpcy5FZGl0Q29sSW5kZXgpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcImlnbm9yaW5nIGNlbGwgY2xpY2ssIGFscmVhZHkgaW4gZWRpdCBtb2RlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9UT0RPOiBHUklETU9ERVxyXG4gICAgICAgIGlmICh0aGlzLklzRWRpdGluZykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jYW5FeGl0RWRpdE1vZGUoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5leGl0RWRpdE1vZGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VycmVudENvbEluZGV4ID0gY29sO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmb3JtTW9kZSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkN1cnJlbnRSb3dJbmRleCA9IHJvdztcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkNvbHVtbnNbcmVhbENvbF0uRWRpdGFibGUgJiYgdGhpcy5Db2x1bW5zW3JlYWxDb2xdLkNvbHVtblR5cGUgIT0gR3JpZENvbHVtblR5cGUuQ0hFQ0tCT1gpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbnRlckVkaXRNb2RlKGZvcm1Nb2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5DdXJyZW50Q29sSW5kZXggPSBjb2w7XHJcbiAgICAgICAgICAgIGlmICghZm9ybU1vZGUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLkN1cnJlbnRSb3dJbmRleCA9IHJvdztcclxuICAgICAgICAgICAgaWYgKHRoaXMuQ2FuRWRpdCAmJiB0aGlzLkNvbHVtbnNbcmVhbENvbF0uRWRpdGFibGUgJiYgdGhpcy5Db2x1bW5zW3JlYWxDb2xdLkNvbHVtblR5cGUgIT0gR3JpZENvbHVtblR5cGUuQ0hFQ0tCT1gpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW50ZXJFZGl0TW9kZShmb3JtTW9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuQ29sdW1uc1tyZWFsQ29sXS5Db2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLkNIRUNLQk9YIHx8IHRoaXMuQ29sdW1uc1tyZWFsQ29sXS5Db2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLlRFTVBMQVRFKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5Jc1Jlc3BvbnNpdmVGb3JtKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkNvbHVtbnNbcmVhbENvbF0uRWRpdGFibGUgJiYgdGhpcy5Db2x1bW5zW3JlYWxDb2xdLkNvbHVtblR5cGUgIT0gR3JpZENvbHVtblR5cGUuQ0hFQ0tCT1gpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmVudGVyRWRpdE1vZGUoZm9ybU1vZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBldnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcclxuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuUmVzcG9uc2l2ZUNlbGxDbGlja2VkID0gZnVuY3Rpb24gKGV2dCwgcm93LCBjb2wpIHtcclxuICAgICAgICB2Y
23XIgcmVhbENvbCA9IGNvbDtcclxuICAgICAgICBpZiAodGhpcy5Db2x1bW5zLmxlbmd0aCA+IHRoaXMuQWN0aXZlQ29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gY29sOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkFjdGl2ZUNvbHVtbnMuaW5kZXhPZih0aGlzLkNvbHVtbnNbaV0pIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlYWxDb2wrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5Jc0VkaXRpbmcgJiYgcmVhbENvbCA9PSB0aGlzLkVkaXRDb2xJbmRleCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFwiaWdub3JpbmcgcmVzcG9uc2l2ZSBjZWxsIGNsaWNrLCBhbHJlYWR5IGluIGVkaXQgbW9kZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5Jc0VkaXRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXhpdEVkaXRNb2RlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuQ2FuRWRpdCAmJiB0aGlzLkNvbHVtbnNbcmVhbENvbF0uRWRpdGFibGUgJiYgW0dyaWRDb2x1bW5UeXBlLkNIRUNLQk9YLCBHcmlkQ29sdW1uVHlwZS5URU1QTEFURV0uaW5kZXhPZigodGhpcy5Db2x1bW5zW3JlYWxDb2xdLkNvbHVtblR5cGUpKSA8IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VycmVudENvbEluZGV4ID0gY29sO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbnRlckVkaXRNb2RlKCk7XHJcbiAgICAgICAgICAgICAgICBldnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuRmlsdGVyQ2xpY2tlZCA9IGZ1bmN0aW9uIChjb2wpIHtcclxuICAgICAgICB2Y
23XIgc2hvdWxkRmlsdGVyID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuSXNFZGl0aW5nKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbkV4aXRFZGl0TW9kZSgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV4aXRFZGl0TW9kZSgpO1xyXG4gICAgICAgICAgICAgICAgc2hvdWxkRmlsdGVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc2hvdWxkRmlsdGVyID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNob3VsZEZpbHRlcikge1xyXG4gICAgICAgICAgICB0aGlzLkVkaXRGaWx0ZXJDb2xJbmRleCA9IGNvbDtcclxuICAgICAgICAgICAgdGhpcy5BZGROZXdDb2xJbmRleCA9IC0xO1xyXG4gICAgICAgICAgICB0aGlzLkNvbHVtbnNbY29sXS5IYXNOYXRpdmVGaWx0ZXJGb2N1cyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuQWRkTmV3Q2xpY2tlZCA9IGZ1bmN0aW9uIChjb2wpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5FeGl0RWRpdE1vZGUoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmV4aXRFZGl0TW9kZSgpO1xyXG4gICAgICAgICAgICB0aGlzLkFkZE5ld0NvbEluZGV4ID0gY29sO1xyXG4gICAgICAgICAgICB0aGlzLkVkaXRGaWx0ZXJDb2xJbmRleCA9IC0xO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLkFsaWduSGVhZGVycyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy50YWJsZUJvZHkpIHtcclxuICAgICAgICAgICAgdmFyIGdyaWRXaWR0aCA9IDA7XHJcbiAgICAgICAgICAgIHZhciBpQ29sID0gMDtcclxuICAgICAgICAgICAgLy8gYnJhdWNoZW4gd2lyIG1vbWVudGFuIG5pY2h0XHJcbiAgICAgICAgICAgIC8vbGV0IGJyb3dzZXJab29tTGV2ZWwgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcclxuICAgICAgICAgICAgdmFyIGZpcnN0Um93ID0gdGhpcy50YWJsZUJvZHkuY2hpbGRyZW5bMF07XHJcbiAgICAgICAgICAgIGlmIChmaXJzdFJvdyAmJiBmaXJzdFJvdy5jZWxscykge1xyXG4gICAgICAgICAgICAgICAgZm9yIChpQ29sID0gMDsgaUNvbCA8IGZpcnN0Um93LmNlbGxzLmxlbmd0aDsgaUNvbCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuQWN0aXZlQ29sdW1ucyAmJiB0aGlzLkFjdGl2ZUNvbHVtbnNbaUNvbF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0V2lkdGggc2NoZWludCBhdWNoIGJlaSBPUyB1bmQgQnJvd3Nlcnpvb20ga29uc2lzdGVudCB6dSBibGVpYmVuIC0gY2xpZW50V2lkdGggaGluZ2VnZW4gbmljaHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5BY3RpdmVDb2x1bW5zW2lDb2xdLmFjdHVhbFdpZHRoID0gZmlyc3RSb3cuY2VsbHNbaUNvbF0ub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRXaWR0aCArPSBmaXJzdFJvdy5jZWxsc1tpQ29sXS5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL1Njcm9sbGJhclxyXG4gICAgICAgICAgICAgICAgZ3JpZFdpZHRoICs9IHRoaXMuc2Nyb2xsQmFyV2lkdGg7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5XaWR0aC5pbmRleE9mKFwiJVwiKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQXNzaWduZWRXaWR0aCA9IGdyaWRXaWR0aC50b1N0cmluZygpICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuTW92ZVJvd1RvVmlldyA9IGZ1bmN0aW9uIChyb3dJbmRleCkge1xyXG4gICAgICAgIHZhciB0ID0gKHJvd0luZGV4IC0gTWF0aC5mbG9vcih0aGlzLlZpc2libGVSb3dzIC8gMikpICogdGhpcy5Sb3dIZWlnaHQ7XHJcbiAgICAgICAgaWYgKHQgPCAwKVxyXG4gICAgICAgICAgICB0ID0gMDtcclxuICAgICAgICB0aGlzLlNjcm9sbFRvcCA9IHQ7XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5Nb3ZlQ29sVG9WaWV3ID0gZnVuY3Rpb24gKGNvbEluZGV4KSB7XHJcbiAgICAgICAgdmFyIHdpZHRoID0gMDtcclxuICAgICAgICB2Y
23XIgY3VycmVudENvbCA9IHRoaXMuQWN0aXZlQ29sdW1uc1tjb2xJbmRleF07XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gY29sSW5kZXg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgY29sID0gdGhpcy5BY3RpdmVDb2x1bW5zW2ldO1xyXG4gICAgICAgICAgICB3aWR0aCArPSBjb2wuYWN0dWFsV2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lckVsZW1lbnQgJiYgKCh0aGlzLmNvbnRhaW5lckVsZW1lbnQuY2xpZW50V2lkdGggKyB0aGlzLlNjcm9sbExlZnQgPCB3aWR0aCkgfHxcclxuICAgICAgICAgICAgKHRoaXMuU2Nyb2xsTGVmdCA+IHdpZHRoIC0gY3VycmVudENvbC5hY3R1YWxXaWR0aCkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuU2Nyb2xsTGVmdCA9IE1hdGgubWF4KHdpZHRoIC0gKHRoaXMuY29udGFpbmVyRWxlbWVudC5jbGllbnRXaWR0aCAvIDIpLCAwKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgR3JpZE1vZGVsLnByb3RvdHlwZS5DaGVja0JveENsaWNrZWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLnRhc2tRdWV1ZS5xdWV1ZVRhc2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBfdGhpcy5BZnRlckV4aXRFZGl0TW9kZS50cmlnZ2VyKF90aGlzLkZpbHRlcmVkRGF0YVtfdGhpcy5DdXJyZW50Um93SW5kZXhdLCBfdGhpcy5BY3RpdmVDb2x1bW5zW190aGlzLkN1cnJlbnRDb2xJbmRleF0sIF90aGlzLkZpbHRlcmVkRGF0YVtfdGhpcy5DdXJyZW50Um93SW5kZXhdW190aGlzLkFjdGl2ZUNvbHVtbnNbX3RoaXMuQ3VycmVudENvbEluZGV4XS5EYXRhRmllbGRdKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH07XHJcbiAgICBHcmlkTW9kZWwucHJvdG90eXBlLkVkaXRDaGVja0JveCA9IGZ1bmN0aW9uIChyb3csIGNvbCwgY3VycmVudFZhbHVlKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICBpZiAoY29sLkVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFza1F1ZXVlLnF1ZXVlVGFzayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sLmQ1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLmlzVW50eXBlZFNlc3Npb25PYmplY3RPckRpY3Qocm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdW2NvbC5kNF0sIGNvbC5kNSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdW2NvbC5kNF0uU2V0KGNvbC5kNSwgIWN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dbY29sLmQxXVtjb2wuZDJdW2NvbC5kM11bY29sLmQ0XVtjb2wuZDVdID0gIWN1cnJlbnRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wuZDQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuaXNVbnR5cGVkU2Vzc2lvbk9iamVjdE9yRGljdChyb3dbY29sLmQxXVtjb2wuZDJdW2NvbC5kM10sIGNvbC5kNCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdLlNldChjb2wuZDQsICFjdXJyZW50VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdW2NvbC5kNF0gPSAhY3VycmVudFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5kMykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5pc1VudHlwZWRTZXNzaW9uT2JqZWN0T3JEaWN0KHJvd1tjb2wuZDFdW2NvbC5kMl0sIGNvbC5kMykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93W2NvbC5kMV1bY29sLmQyXS5TZXQoY29sLmQzLCAhY3VycmVudFZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXSA9ICFjdXJyZW50VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmQyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLmlzVW50eXBlZFNlc3Npb25PYmplY3RPckRpY3Qocm93W2NvbC5kMV0sIGNvbC5kMikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93W2NvbC5kMV0uU2V0KGNvbC5kMiwgIWN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dbY29sLmQxXVtjb2wuZDJdID0gIWN1cnJlbnRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuaXNVbnR5cGVkU2Vzc2lvbk9iamVjdE9yRGljdChyb3csIGNvbC5kMSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93LlNldChjb2wuZDEsICFjdXJyZW50VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93W2NvbC5kMV0gPSAhY3VycmVudFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vVE9ETzogTWFsIHdlbm4gdmllbCBaZWl0IGlzdCBub2NoIGRlbiByaWNodGlnZW4gV2VydCBkZXIgQ2hlY2tib3ggaW0gRXZlbnQgaGllciBtaXRnZWJlblxyXG4gICAgICAgICAgICBzZXRUaW
231lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLkFmdGVyRXhpdEVkaXRNb2RlLnRyaWdnZXIoX3RoaXMuRmlsdGVyZWREYXRhW190aGlzLkN1cnJlbnRSb3dJbmRleF0sIGNvbCwgbnVsbCk7XHJcbiAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoR3JpZE1vZGVsLnByb3RvdHlwZSwgXCJDdXJyZW50Um93SW5kZXhcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tQ3VycmVudFJvd0luZGV4O1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAocm93SW5kZXgpIHtcclxuICAgICAgICAgICAgdGhpcy5tQ3VycmVudFJvd0luZGV4ID0gcm93SW5kZXg7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkZpbHRlcmVkRGF0YSAmJiB0aGlzLkN1cnJlbnRSb3dJbmRleCA+PSAwICYmIHRoaXMuQ3VycmVudFJvd0luZGV4IDwgdGhpcy5GaWx0ZXJlZERhdGEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNlbGVjdGVkSXRlbSA9IHRoaXMuRmlsdGVyZWREYXRhW3RoaXMuQ3VycmVudFJvd0luZGV4XTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLlNlbGVjdGVkSXRlbSA9IG51bGw7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoR3JpZE1vZGVsLnByb3RvdHlwZSwgXCJTZWxlY3RlZEl0ZW1cIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tU2VsZWN0ZWRJdGVtO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAocmVjKSB7XHJcbiAgICAgICAgICAgIGlmIChyZWMgPT0gbnVsbCAmJiB0aGlzLm1TZWxlY3RlZEl0ZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tU2VsZWN0ZWRJdGVtID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2VsZWN0ZWRJdGVtQ2hhbmdlZC50cmlnZ2VyKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TZWxlY3RlZFJvd0NvbENoYW5nZWQudHJpZ2dlcihudWxsLCBudWxsKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXJlYyAmJiB0aGlzLlJvd1NlbGVjdGlvbk1vZGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICghcmVjICYmIHRoaXMuRmlsdGVyZWREYXRhICYmIHRoaXMuRmlsdGVyZWREYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHJlYyA9IHRoaXMuRmlsdGVyZWREYXRhWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyZWMgIT09IHRoaXMubVNlbGVjdGVkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tU2VsZWN0ZWRJdGVtID0gcmVjO1xyXG4gICAgICAgICAgICAgICAgdmFyIGZvdW5kID0gLTE7XHJcbiAgICAgICAgICAgICAgICB2Y
23XIgaWR4ID0gLTE7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5GaWx0ZXJlZERhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHRoaXMuRmlsdGVyZWREYXRhLmxlbmd0aDsgaWR4KyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYyA9PT0gdGhpcy5GaWx0ZXJlZERhdGFbaWR4XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBpZHg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuRGF0YVNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgdGhpcy5EYXRhU291cmNlLmxlbmd0aDsgaWR4KyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYyA9PT0gdGhpcy5EYXRhU291cmNlW2lkeF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gaWR4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZm91bmQgIT0gdGhpcy5DdXJyZW50Um93SW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkN1cnJlbnRSb3dJbmRleCA9IGZvdW5kO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuTW92ZVJvd1RvVmlldyhmb3VuZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNlbGVjdGVkSXRlbUNoYW5nZWQudHJpZ2dlcihyZWMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuQ3VycmVudENvbEluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlNlbGVjdGVkUm93Q29sQ2hhbmdlZC50cmlnZ2VyKHJlYywgdGhpcy5BY3RpdmVDb2x1bW5zW3RoaXMuQ3VycmVudENvbEluZGV4XSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuQ29sbGVjdFZhbGlkYXRpb25FcnJvcnMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGVycnMgPSBbXTtcclxuICAgICAgICB0aGlzLkNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoZikge1xyXG4gICAgICAgICAgICBmLlZhbGlkYXRpb25FcnJvcnMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgZXJycy5wdXNoKGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAodGhpcy5WYWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA9PSAwICYmIGVycnMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5IYXNWYWxpZGF0aW9uRXJyb3JzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuVmFsaWRhdGlvblN1bW1hcnkgPSBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5WYWxpZGF0aW9uRXJyb3JzID0gZXJycztcclxuICAgICAgICAgICAgdGhpcy5IYXNWYWxpZGF0aW9uRXJyb3JzID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5WYWxpZGF0aW9uU3VtbWFyeSA9IGVycnNbMF07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShHcmlkTW9kZWwucHJvdG90eXBlLCBcIkJvZHlDU1NcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2Y
23XIgcyA9IFwiXCI7XHJcbiAgICAgICAgICAgIHZhciBveCA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgICAgIHZhciBveSA9IFwiYXV0b1wiO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5BbGxvd0hvcml6b250YWxTY3JvbGxpbmcpIHtcclxuICAgICAgICAgICAgICAgIG94ID0gXCJhdXRvXCI7XHJcbiAgICAgICAgICAgICAgICBveSA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuSGVpZ2h0ICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIHMgPSBzICsgXCJoZWlnaHQ6IFwiICsgdGhpcy5IZWlnaHQgKyBcInB4O1wiO1xyXG4gICAgICAgICAgICAgICAgcyA9IHMgKyBcIm92ZXJmbG93LXg6XCIgKyBveCArIFwiO292ZXJmbG93LXk6XCIgKyBveSArIFwiOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDtcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHMgPSBzICsgXCJvdmVyZmxvdy14OlwiICsgb3ggKyBcIjtvdmVyZmxvdy15OmhpZGRlbjtcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIEdyaWRNb2RlbC5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLlNlbGVjdGVkSXRlbUNoYW5nZWQucmVtb3ZlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuU2VsZWN0ZWRSb3dDb2xDaGFuZ2VkLnJlbW92ZShudWxsKTtcclxuICAgICAgICB0aGlzLk5ld1Jvd0RhdGFDaGFuZ2VkLnJlbW92ZShudWxsKTtcclxuICAgICAgICB0aGlzLkFmdGVyRXhpdEVkaXRNb2RlLnJlbW92ZShudWxsKTtcclxuICAgICAgICB0aGlzLkZpbHRlckNoYW5nZWQucmVtb3ZlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuU29ydENoYW5nZWQucmVtb3ZlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XHJcbiAgICAgICAgICAgIGMuZGlzcG9zZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIF9fZGVjb3JhdGUoW1xyXG4gICAgICAgIG9ic2VydmFibGUsXHJcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdClcclxuICAgIF0sIEdyaWRNb2RlbC5wcm90b3R5cGUsIFwiQ3VycmVudENvbEluZGV4XCIsIHZvaWQgMCk7XHJcbiAgICBfX2RlY29yYXRlKFtcclxuICAgICAgICBiaW5kYWJsZSxcclxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgTnVtYmVyKVxyXG4gICAgXSwgR3JpZE1vZGVsLnByb3RvdHlwZSwgXCJIZWlnaHRBZGp1c3RtZW50VmFsdWVcIiwgdm9pZCAwKTtcclxuICAgIF9fZGVjb3JhdGUoW1xyXG4gICAgICAgIGNvbXB1dGVkRnJvbShcIlNjcm9sbFRvcFwiLCBcIlJvd0hlaWdodFwiKSxcclxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgTnVtYmVyKSxcclxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW10pXHJcbiAgICBdLCBHcmlkTW9kZWwucHJvdG90eXBlLCBcIkZpcnN0VmlzaWJsZVJvd1wiLCBudWxsKTtcclxuICAgIF9fZGVjb3JhdGUoW1xyXG4gICAgICAgIGNvbXB1dGVkRnJvbShcIkhlaWdodFwiLCBcIkFsbG93SG9yaXpvbnRhbFNjcm9sbGluZ1wiKSxcclxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgT2JqZWN0KSxcclxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW10pXHJcbiAgICBdLCBHcmlkTW9kZWwucHJvdG90eXBlLCBcIkJvZHlDU1NcIiwgbnVsbCk7XHJcbiAgICByZXR1cm4gR3JpZE1vZGVsO1xyXG59KCkpO1xyXG5leHBvcnQgeyBHcmlkTW9kZWwgfTtcclxudmFyIEdyaWRDb2x1bW4gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBHcmlkQ29sdW1uKGRhdGFGaWVsZCkge1xyXG4gICAgICAgIHRoaXMuV2lkdGggPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuSGVhZG
23VyVGV4dCA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5IZWFkZXJUb29sdGlwID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMubWluSGVhZGVyV2lkdGggPSBudWxsO1xyXG4gICAgICAgIHRoaXMuRWRpdGFibGUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuRmlsdGVyYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuRXh0ZXJuYWxGaWx0ZXJFeHByZXNzaW9uID0gXCJcIjtcclxuICAgICAgICB0aGlzLkZpbHRlckV4cHJlc3Npb24gPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuQ29sdW1uVHlwZSA9IEdyaWRDb2x1bW5UeXBlLlNUUklORztcclxuICAgICAgICB0aGlzLkNvbHVtbkFsaWdubWVudCA9IEdyaWRDb2x1bW5BbGlnbm1lbnQuTEVGVDtcclxuICAgICAgICB0aGlzLlZhbGlkYXRpb25zID0gW107XHJcbiAgICAgICAgdGhpcy5tVmFsaWRhdGlvbkVycm9ycyA9IFtdO1xyXG4gICAgICAgIHRoaXMuRGVjaW1hbFByZWNpc2lvbiA9IDE7XHJcbiAgICAgICAgdGhpcy5BbGxvd05lZ2F0aXZlVmFsdWVzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5Jc1JlcXVpcmVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5Jc1Zpc2libGUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuSXNIaWRkZW4gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLlVzZUNvbERpdmlkZXJzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5IYXNOYXRpdmVGaWx0ZXJGb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgIC8vcHVibGljIEZvcmVpZ25Db21ib01vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLkZvcmVpZ25BbGxvd051bGwgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLkZvcmVpZ25LZXlGaWx0ZXJDb21ib01vZGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLk9wdGlvbnNMaXN0VXNlRGVzY3JpcHRpb25zID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5FZGl0VGltZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuVGltZVByZWNpc2lvbiA9IDE7XHJcbiAgICAgICAgdGhpcy5ZZWFyU2VsZWN0aW9uQXJyYXkgPSBbXTtcclxuICAgICAgICB0aGlzLlJlc3BvbnNpdmVDb2x1bW5zWHNOciA9IDEyO1xyXG4gICAgICAgIHRoaXMuUmVzcG9uc2l2ZUNvbHVtbnNMZ05yID0gMTI7XHJcbiAgICAgICAgdGhpcy5Gb3JtRmllbGRUeXBlcyA9IEdyaWRDb2x1bW5UeXBlLlJlc3BvbnNpdmVDb2x1bW5UeXBlcztcclxuICAgICAgICB0aGlzLkRhdGFGaWVsZCA9IGRhdGFGaWVsZDtcclxuICAgICAgICB0aGlzLkhlYWRlclRleHQgPSBkYXRhRmllbGQ7XHJcbiAgICAgICAgdmFyIGZpZWxkcztcclxuICAgICAgICAvL2FsdGVybmF0aXZlciBQZmFkIFRyZW5uZXIgZmFsbHMgZWluIFwiLlwiIGluIGVpbmVtIEZlbGQgKEtleSB3w6RyZSlcclxuICAgICAgICBpZiAoZGF0YUZpZWxkICYmIGRhdGFGaWVsZC5pbmRleE9mKFwifFwiKSA+IDApIHtcclxuICAgICAgICAgICAgZmllbGRzID0gZGF0YUZpZWxkLnNwbGl0KFwifFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZpZWxkcyA9IGRhdGFGaWVsZC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZDEgPSBmaWVsZHNbMF07XHJcbiAgICAgICAgaWYgKGZpZWxkcy5sZW5ndGggPiAxKVxyXG4gICAgICAgICAgICB0aGlzLmQyID0gZmllbGRzWzFdO1xyXG4gICAgICAgIGlmIChmaWVsZHMubGVuZ3RoID4gMilcclxuICAgICAgICAgICAgdGhpcy5kMyA9IGZpZWxkc1syXTtcclxuICAgICAgICBpZiAoZmllbGRzLmxlbmd0aCA+IDMpXHJcbiAgICAgICAgICAgIHRoaXMuZDQgPSBmaWVsZHNbM107XHJcbiAgICAgICAgaWYgKGZpZWxkcy5sZW5ndGggPiA0KVxyXG4gICAgICAgICAgICB0aGlzLmQ1ID0gZmllbGRzWzRdO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgR3JpZENvbHVtbi5wcm90b3R5cGUuSW5qZWN0QmluZGluZ01lY2hhbmlzbSA9IGZ1bmN0aW9uIChlbmdpbmUsIHNpZ25hbGVyKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLkJpbmRpbmdFbmdpbmUgPSBlbmdpbmU7XHJcbiAgICAgICAgdGhpcy5TaWduYWxlciA9IHNpZ25hbGVyO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyU3Vic2NyaXB0aW9uID0gdGhpcy5CaW5kaW5nRW5naW5lLnByb3BlcnR5T2JzZXJ2ZXIodGhpcywgJ0ZpbHRlckV4cHJlc3Npb24nKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGZ1bmN0aW9uIChuZXdWYWx1ZSwgb2xkVmFsdWUpIHtcclxuICAgICAgICAgICAgX3RoaXMuU2lnbmFsZXIuc2lnbmFsKF90aGlzLm93bmluZ0dyaWQuZ3JpZEtleSk7XHJcbiAgICAgICAgICAgIF90aGlzLm93bmluZ0dyaWQuRmlsdGVyQ2hhbmdlZC50cmlnZ2VyKCk7XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vd25pbmdHcmlkLklzVmlydHVhbCkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub3duaW5nR3JpZC50YXNrUXVldWUucXVldWVNaWNyb1Rhc2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm93bmluZ0dyaWQuU2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub3duaW5nR3JpZC50YXNrUXVldWUucXVldWVNaWNyb1Rhc2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm93bmluZ0dyaWQuTW92ZVJvd1RvVmlldygwKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5leHRlcm5hbEZpbHRlclN1YnNjcmlwdGlvbiA9IHRoaXMuQmluZGluZ0VuZ2luZS5wcm9wZXJ0eU9ic2VydmVyKHRoaXMsICdFeHRlcm5hbEZpbHRlckV4cHJlc3Npb24nKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGZ1bmN0aW9uIChuZXdWYWx1ZSwgb2xkVmFsdWUpIHtcclxuICAgICAgICAgICAgX3RoaXMuU2lnbmFsZXIuc2lnbmFsKF90aGlzLm93bmluZ0dyaWQuZ3JpZEtleSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgR3JpZENvbHVtbi5wcm90b3R5cGUuU2V0SGVhZGVyID0gZnVuY3Rpb24gKGhlYWRlclRleHQpIHtcclxuICAgICAgICB0aGlzLkhlYWRlclRleHQgPSBoZWFkZXJUZXh0O1xyXG4gICAgICAgI
23HJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRDb2x1bW4ucHJvdG90eXBlLlNldEhlYWRlclRvb2x0aXAgPSBmdW5jdGlvbiAodG9vbHRpcFRleHQpIHtcclxuICAgICAgICB0aGlzLkhlYWRlclRvb2x0aXAgPSB0b29sdGlwVGV4dDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkQ29sdW1uLnByb3RvdHlwZS5TZXRVc2VDb2xEaXZpZGVycyA9IGZ1bmN0aW9uIChzZXQpIHtcclxuICAgICAgICB0aGlzLlVzZUNvbERpdmlkZXJzID0gc2V0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRDb2x1bW4ucHJvdG90eXBlLlNldFJlbWFyayA9IGZ1bmN0aW9uIChyZW1hcmspIHtcclxuICAgICAgICB0aGlzLlJlbWFyayA9IHJlbWFyaztcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkQ29sdW1uLnByb3RvdHlwZS5TZXRUaW1lUHJlY2lzaW9uID0gZnVuY3Rpb24gKHByZWNpc2lvbikge1xyXG4gICAgICAgIHRoaXMuVGltZVByZWNpc2lvbiA9IHByZWNpc2lvbjtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkQ29sdW1uLnByb3RvdHlwZS5TZXRFZGl0YWJsZUZpZWxkQ291bnQgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICB0aGlzLkVkaXRhYmxlRmllbGRDb3VudCA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRDb2x1bW4ucHJvdG90eXBlLlNldEFsbG93Qm9vbGVhbk51bGwgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICB0aGlzLkFsbG93Qm9vbGVhbk51bGwgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkQ29sdW1uLnByb3RvdHlwZS5TZXRDb2x1bW5UeXBlID0gZnVuY3Rpb24gKGNvbHVtblR5cGUpIHtcclxuICAgICAgICB0aGlzLkNvbHVtblR5cGUgPSBjb2x1bW5UeXBlO1xyXG4gICAgICAgIGlmIChjb2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLkNIRUNLQk9YKVxyXG4gICAgICAgICAgICB0aGlzLkNvbHVtbkFsaWdubWVudCA9IEdyaWRDb2x1bW5BbGlnbm1lbnQuQ0VOVEVSO1xyXG4gICAgICAgIGlmIChjb2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLk5VTUJFUilcclxuICAgICAgICAgICAgdGhpcy5Db2x1bW5BbGlnbm1lbnQgPSBHcmlkQ29sdW1uQWxpZ25tZW50LlJJR0hUO1xyXG4gICAgICAgIGlmIChjb2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLkRBVEUgJiYgIXRoaXMuRm9ybWF0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuU2V0Rm9ybWF0KFwiREQgTU1NIFlZWVlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbHVtblR5cGUgIT0gR3JpZENvbHVtblR5cGUuREFURSAmJiAhdGhpcy5FZGl0YWJsZUZpZWxkQ291bnQpIHtcclxuICAgICAgICAgICAgdGhpcy5TZXRFZGl0YWJsZUZpZWxkQ291bnQoMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb2x1bW5UeXBlID09IEdyaWRDb2x1bW5UeXBlLkRBVEUgfHwgY29sdW1uVHlwZSA9PSBHcmlkQ29sdW1uVHlwZS5TSVdJREFURVRJTUUpIHtcclxuICAgICAgICAgICAgdmFyIHRlbXBZZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpICsgNTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuWWVhclNlbGVjdGlvbkFycmF5Lmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gdGVtcFllYXI7IGkgPiB0ZW1wWWVhciAtIDEwMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ZZWFyU2VsZWN0aW9uQXJyYXkucHVzaChpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkQ29sdW1uLnByb3RvdHlwZS5TZXRGb3JtYXQgPSBmdW5jdGlvbiAoZm9ybWF0KSB7XHJcbiAgICAgICAgdGhpcy5Gb3JtYXQgPSBmb3JtYXQ7XHJcbiAgICAgICAgdGhpcy5FZGl0VGltZSA9IChmb3JtYXQudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmRleE9mKFwiaGg6bW1cIikgPj0gMCk7XHJcbiAgICAgICAgaWYgKGZvcm1hdC5lbmRzV2l0aChcIi5mZmZcIikpXHJcbiAgICAgICAgICAgIHRoaXMuU2V0VGltZVByZWNpc2lvbigzKTtcclxuICAgICAgICBpZiAoZm9ybWF0LmVuZHNXaXRoKFwiLmZmXCIpKVxyXG4gICAgICAgICAgICB0aGlzLlNldFRpbWVQcmVjaXNpb24oMik7XHJcbiAgICAgICAgaWYgKGZvcm1hdC5lbmRzV2l0aChcIi5mXCIpKVxyXG4gICAgICAgICAgICB0aGlzLlNldFRpbWVQcmVjaXNpb24oMSk7XHJcbiAgICAgICAgaWYgKGZvcm1hdC5lbmRzV2l0aChcIjpzc1wiKSlcclxuICAgICAgICAgICAgdGhpcy5TZXRUaW1lUHJlY2lzaW9uKDApO1xyXG4gICAgICAgIGlmICh0aGlzLkVkaXRUaW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuU2V0RWRpdGFibGVGaWVsZENvdW50KDIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkQ29sdW1uLnByb3RvdHlwZS5TZXREZWNpbWFsUHJlY2lzaW9uID0gZnVuY3Rpb24gKHByZWMpIHtcclxuICAgICAgICB0aGlzLkRlY2ltYWxQcmVjaXNpb24gPSBNYXRoLm1heChNYXRoLnJvdW5kKHByZWMpLCAwKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkQ29sdW1uLnByb3RvdHlwZS5TZXRBbGxvd05lZ2F0aXZlVmFsdWVzID0gZnVuY3Rpb24gKHllc25vKSB7XHJcbiAgICAgICAgdGhpcy5BbGxvd05lZ2F0aXZlVmFsdWVzID0geWVzbm87XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEdyaWRDb2x1bW4ucHJvdG90eXBlLCBcIkhhc0RhdGVFZGl0aW5nRm9ybWF0XCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuRm9ybWF0ICYmIHRoaXMuRm9ybWF0LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcImhoXCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgI
23H1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgR3JpZENvbHVtbi5wcm90b3R5cGUuU2V0U29ydEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChhdHQpIHtcclxuICAgICAgICB0aGlzLlNvcnRCeUF0dHJpYnV0ZSA9IGF0dDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkQ29sdW1uLnByb3RvdHlwZS5TZXRWaWV3VGVtcGxhdGUgPSBmdW5jdGlvbiAodGVtcGxhdGUpIHtcclxuICAgICAgICB0aGlzLlZpZXdUZW1wbGF0ZSA9IHRlbXBsYXRlO1xyXG4gICAgICAgIHRoaXMuQ29sdW1uVHlwZSA9IEdyaWRDb2x1bW5UeXBlLlRFTVBMQVRFO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRDb2x1bW4ucHJvdG90eXBlLlNldEZvcmVpZ25LZXlUZW1wbGF0ZSA9IGZ1bmN0aW9uICh0ZW1wbGF0ZSkge1xyXG4gICAgICAgIHRoaXMuRm9yZWlnbktleVRlbXBsYXRlID0gdGVtcGxhdGU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgR3JpZENvbHVtbi5wcm90b3R5cGUuU2V0RWRpdG9yVGVtcGxhdGUgPSBmdW5jdGlvbiAodGVtcGxhdGUpIHtcclxuICAgICAgICB0aGlzLkVkaXRvclRlbXBsYXRlID0gdGVtcGxhdGU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgR3JpZENvbHVtbi5wcm90b3R5cGUuU2V0RWRpdG9yVGVtcGxhdGVPcHRpb25zID0gZnVuY3Rpb24gKHRlbXBsYXRlT3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMuRWRpdG9yVGVtcGxhdGVPcHRpb25zID0gdGVtcGxhdGVPcHRpb25zO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRDb2x1bW4ucHJvdG90eXBlLlNldEFkYXB0aXZlV2lkdGggPSBmdW5jdGlvbiAoc2hvd0Zyb21XaWR0aCwgdG9XaWR0aCkge1xyXG4gICAgICAgIHRoaXMuTWluV2lkdGhUb1Nob3cgPSBzaG93RnJvbVdpZHRoO1xyXG4gICAgICAgIHRoaXMuTWF4V2lkdGhUb1Nob3cgPSB0b1dpZHRoO1xyXG4gICAgICAgIGlmICghdGhpcy5NaW5XaWR0aFRvU2hvdyB8fCB0aGlzLk1pbldpZHRoVG9TaG93ID09IDApXHJcbiAgICAgICAgICAgIHRoaXMuTWluV2lkdGhUb1Nob3cgPSAxO1xyXG4gICAgICAgIGlmICghdGhpcy5NYXhXaWR0aFRvU2hvdylcclxuICAgICAgICAgICAgdGhpcy5NYXhXaWR0aFRvU2hvdyA9IDEwMDAwO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRDb2x1bW4ucHJvdG90eXBlLlNldENvbHVtbkFsaWdubWVudCA9IGZ1bmN0aW9uIChjb2x1bW5BbGlnbm1lbnQpIHtcclxuICAgICAgICB0aGlzLkNvbHVtbkFsaWdubWVudCA9IGNvbHVtbkFsaWdubWVudDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkQ29sdW1uLnByb3RvdHlwZS5TZXRFZGl0YWJsZSA9IGZ1bmN0aW9uIChlZGl0YWJsZSkge1xyXG4gICAgICAgIHRoaXMuRWRpdGFibGUgPSBlZGl0YWJsZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkQ29sdW1uLnByb3RvdHlwZS5TZXRSZXNwb25zaXZlQ29sdW1ucyA9IGZ1bmN0aW9uIChjb2xzKSB7XHJcbiAgICAgICAgaWYgKFszLCA0LCA2LCAxMl0uaW5kZXhPZihjb2xzKSA+PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuUmVzcG9uc2l2ZUNvbHVtbnNYc05yID0gY29scztcclxuICAgICAgICAgICAgdGhpcy5SZXNwb25zaXZlQ29sdW1uc0xnTnIgPSBjb2xzO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBHcmlkQ29sdW1uLnByb3RvdHlwZS5TZXRJc1JlcXVpcmVkID0gZnVuY3Rpb24gKHJlcSkge1xyXG4gICAgICAgIHRoaXMuSXNSZXF1aXJlZCA9IHJlcTtcclxuICAgICAgICBpZiAocmVxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkVmFsaWRhdGlvbihuZXcgUmVxdWlyZWRWYWxpZGF0aW9uKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoR3JpZENvbHVtbi5wcm90b3R5cGUsIFwiUmVzcG9uc2l2ZVhzQ29sdW1uc0lucHV0XCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIHJlc3BvbnNpdmVDb2x1bW5zID0gdGhpcy5SZXNwb25zaXZlQ29sdW1uc1hzTnI7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm93bmluZ0dyaWQuUmVzcG9uc2l2ZVRpdGxlUG9zaXRpb24gPT0gUmVzcG9uc2l2ZVRpdGxlUG9zaXRpb24uSU5MSU5FKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMub3duaW5nR3JpZC5TaG93UmVtYXJrcyAmJiB0aGlzLm93bmluZ0dyaWQuUmVzcG9uc2l2ZVJlbWFya1Bvc2l0aW9uID09IFJlc3BvbnNpdmVSZW1hcmtQb3NpdGlvbi5CT1RUT00pIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMub3duaW5nR3JpZC5TaG93UmVtYXJrcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNpdmVDb2x1bW5zID0gODtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNpdmVDb2x1bW5zID0gNDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICgodGhpcy5vd25pbmdHcmlkLlNob3dSZW1hcmtzICYmIHRoaXMub3duaW5nR3JpZC5SZXNwb25zaXZlUmVtYXJrUG9zaXRpb24gPT0gUmVzcG9uc2l2ZVJlbWFya1Bvc2l0aW9uLkJPVFRPTSkgfHxcclxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5vd25pbmdHcmlkLlNob3dSZW1hcmtzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2l2ZUNvbHVtbnMgPSAxMjtcclxuICAgICAgICAgICAgICAgI
23H1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNpdmVDb2x1bW5zID0gdGhpcy5SZXNwb25zaXZlQ29sdW1uc1hzTnIgPj0gNiA/IDggOiA2O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zaXZlQ29sdW1ucztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShHcmlkQ29sdW1uLnByb3RvdHlwZSwgXCJSZXNwb25zaXZlTGdDb2x1bW5zSW5wdXRcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcmVzcG9uc2l2ZUNvbHVtbnMgPSB0aGlzLlJlc3BvbnNpdmVDb2x1bW5zTGdOcjtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3duaW5nR3JpZC5SZXNwb25zaXZlVGl0bGVQb3NpdGlvbiA9PSBSZXNwb25zaXZlVGl0bGVQb3NpdGlvbi5JTkxJTkUpIHtcclxuICAgICAgICAgICAgICAgIGlmICgodGhpcy5vd25pbmdHcmlkLlNob3dSZW1hcmtzICYmIHRoaXMub3duaW5nR3JpZC5SZXNwb25zaXZlUmVtYXJrUG9zaXRpb24gPT0gUmVzcG9uc2l2ZVJlbWFya1Bvc2l0aW9uLkJPVFRPTSkgfHxcclxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5vd25pbmdHcmlkLlNob3dSZW1hcmtzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2l2ZUNvbHVtbnMgPSA4O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2l2ZUNvbHVtbnMgPSA0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzLm93bmluZ0dyaWQuU2hvd1JlbWFya3MgJiYgdGhpcy5vd25pbmdHcmlkLlJlc3BvbnNpdmVSZW1hcmtQb3NpdGlvbiA9PSBSZXNwb25zaXZlUmVtYXJrUG9zaXRpb24uQk9UVE9NKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLm93bmluZ0dyaWQuU2hvd1JlbWFya3MpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNwb25zaXZlQ29sdW1ucyA9IDEyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2l2ZUNvbHVtbnMgPSB0aGlzLlJlc3BvbnNpdmVDb2x1bW5zWHNOciA+PSA2ID8gOCA6IDY7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNpdmVDb2x1bW5zO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEdyaWRDb2x1bW4ucHJvdG90eXBlLCBcIlJlc3BvbnNpdmVYc0NvbHVtbnNUaXRsZVwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm93bmluZ0dyaWQuUmVzcG9uc2l2ZVRpdGxlUG9zaXRpb24gPT0gUmVzcG9uc2l2ZVRpdGxlUG9zaXRpb24uVE9QKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEyO1xyXG4gICAgICAgICAgICB2Y
23XIgY29scyA9IHRoaXMub3duaW5nR3JpZC5TaG93UmVtYXJrcyAmJiB0aGlzLm93bmluZ0dyaWQuUmVzcG9uc2l2ZVJlbWFya1Bvc2l0aW9uID09IFJlc3BvbnNpdmVSZW1hcmtQb3NpdGlvbi5JTkxJTkUgPyA0IDogNjtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbHM7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoR3JpZENvbHVtbi5wcm90b3R5cGUsIFwiUmVzcG9uc2l2ZUxnQ29sdW1uc1RpdGxlXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3duaW5nR3JpZC5SZXNwb25zaXZlVGl0bGVQb3NpdGlvbiA9PSBSZXNwb25zaXZlVGl0bGVQb3NpdGlvbi5UT1ApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMTI7XHJcbiAgICAgICAgICAgIHZhciBjb2xzID0gNDtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbHM7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoR3JpZENvbHVtbi5wcm90b3R5cGUsIFwiUmVzcG9uc2l2ZVhzQ29sdW1uc1JlbWFya3NcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMub3duaW5nR3JpZC5TaG93UmVtYXJrcylcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vd25pbmdHcmlkLlNob3dSZW1hcmtzICYmIHRoaXMub3duaW5nR3JpZC5SZXNwb25zaXZlUmVtYXJrUG9zaXRpb24gPT0gUmVzcG9uc2l2ZVJlbWFya1Bvc2l0aW9uLkJPVFRPTSlcclxuICAgICAgICAgICAgICAgIHJldHVybiAxMjtcclxuICAgICAgICAgICAgaWYgKHRoaXMuUmVzcG9uc2l2ZUNvbHVtbnNYc05yID49IDYpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gNDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3duaW5nR3JpZC5SZXNwb25zaXZlVGl0bGVQb3NpdGlvbiA9PSBSZXNwb25zaXZlVGl0bGVQb3NpdGlvbi5JTkxJTkUgPyA0IDogNjtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShHcmlkQ29sdW1uLnByb3RvdHlwZSwgXCJSZXNwb25zaXZlTGdDb2x1bW5zUmVtYXJrc1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5vd25pbmdHcmlkLlNob3dSZW1hcmtzKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm93bmluZ0dyaWQuU2hvd1JlbWFya3MgJiYgdGhpcy5vd25pbmdHcmlkLlJlc3BvbnNpdmVSZW1hcmtQb3NpdGlvbiA9PSBSZXNwb25zaXZlUmVtYXJrUG9zaXRpb24uQk9UVE9NKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEyO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5SZXNwb25zaXZlQ29sdW1uc0xnTnIgPj0gNilcclxuICAgICAgICAgICAgICAgIHJldHVybiA0O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vd25pbmdHcmlkLlJlc3BvbnNpdmVUaXRsZVBvc2l0aW9uID09IFJlc3BvbnNpdmVUaXRsZVBvc2l0aW9uLklOTElORSA/IDQgOiA2O1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgR3JpZENvbHVtbi5wcm90b3R5cGUuUmVzaXplUmVzcG9uc2l2ZUZvcm1Db2x1bW4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLlJlc3BvbnNpdmVDb2x1bW5zWHNOcikge1xyXG4gICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNldFJlc3BvbnNpdmVDb2x1bW5zKDQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgNDpcclxuICAgICAgICAgICAgICAgIHRoaXMuU2V0UmVzcG9uc2l2ZUNvbHVtbnMoNik7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDEyOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5TZXRSZXNwb25zaXZlQ29sdW1ucygzKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDY6XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNldFJlc3BvbnNpdmVDb2x1bW5zKDEyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgR3JpZENvbHVtbi5wcm90b3R5cGUuSGFzTmF0aXZlRmlsdGVyRm9jdXNDaGFuZ2VkID0gZnVuY3Rpb24gKG5ld1ZhbCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHRoaXMub3duaW5nR3JpZCkge1xyXG4gICAgICAgICAgICB0aGlzLm93bmluZ0dyaWQudGFza1F1ZXVlLnF1ZXVlTWljcm9UYXNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdWYWwgJiYgX3RoaXMuRmlsdGVyRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5GaWx0ZXJFbGVtZW50LmNoaWxkcmVuWzBdLnNlbGVjdClcclxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuRmlsdGVyRWxlbWVudC5jaGlsZHJlblswXS5zZWxlY3QoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEdyaWRDb2x1bW4ucHJvdG90eXBlLklzSGlkZGVuQ2hhbmdlZCA9IGZ1bmN0aW9uIChuZXdWYWwsIG9sZFZhbCkge1xyXG4gICAgICAgIGlmICh0aGlzLm93bmluZ0dyaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5vd25pbmdHcmlkLlNldEFjdGl2ZUNvbHVtbnMoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgR3JpZENvbHVtbi5wcm90b3R5cGUuSXNWaXNpYmxlQ2hhbmdlZCA9IGZ1bmN0aW9uIChuZXdWYWwsIG9sZFZhbCkge1xyXG4gICAgICAgIGlmICh0aGlzLm93bmluZ0dyaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5vd25pbmdHcmlkLlNldEFjdGl2ZUNvbHVtbnMoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgR3JpZENvbHVtbi5wcm90b3R5cGUuU2V0VmlzaWJsZSA9IGZ1bmN0aW9uICh2aXNpYmxlKSB7XHJcbiAgICAgICAgdGhpcy5Jc1Zpc2libGUgPSB2aXNpYmxlO1xyXG4gICAgICAgIGlmICh0aGlzLm93bmluZ0dyaWQpXHJcbiAgICAgICAgICAgI
23HRoaXMub3duaW5nR3JpZC5TZW5kU2lnbmFsKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgR3JpZENvbHVtbi5wcm90b3R5cGUuU2V0Rm9yZWlnbktleSA9IGZ1bmN0aW9uIChpdGVtcywga2V5RmllbGQsIGRlc2NyaXB0aW9uRmllbGQsIGNvbWJvTW9kZSwgYWxsb3dOdWxsLCBmaWx0ZXJDb21ib01vZGUpIHtcclxuICAgICAgICB0aGlzLkNvbHVtblR5cGUgPSBHcmlkQ29sdW1uVHlwZS5GT1JFSUdOS0VZO1xyXG4gICAgICAgIHRoaXMuRm9yZWlnbkl0ZW1zID0gaXRlbXM7XHJcbiAgICAgICAgdGhpcy5Gb3JlaWduS2V5RmllbGQgPSBrZXlGaWVsZDtcclxuICAgICAgICB0aGlzLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkID0gZGVzY3JpcHRpb25GaWVsZDtcclxuICAgICAgICB2YXIgZmllbGRzID0gZGVzY3JpcHRpb25GaWVsZC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgdGhpcy5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kMSA9IGZpZWxkc1swXTtcclxuICAgICAgICB0aGlzLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkID0gZmllbGRzWzBdO1xyXG4gICAgICAgIGlmIChmaWVsZHMubGVuZ3RoID4gMSlcclxuICAgICAgICAgICAgdGhpcy5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kMiA9IGZpZWxkc1sxXTtcclxuICAgICAgICBpZiAoZmllbGRzLmxlbmd0aCA+IDIpXHJcbiAgICAgICAgICAgIHRoaXMuRm9yZWlnbkRlc2NyaXB0aW9uRmllbGRfZDMgPSBmaWVsZHNbMl07XHJcbiAgICAgICAgaWYgKGZpZWxkcy5sZW5ndGggPiAzKVxyXG4gICAgICAgICAgICB0aGlzLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2Q0ID0gZmllbGRzWzNdO1xyXG4gICAgICAgIGlmIChmaWVsZHMubGVuZ3RoID4gNClcclxuICAgICAgICAgICAgdGhpcy5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kNSA9IGZpZWxkc1s0XTtcclxuICAgICAgICAvL3RoaXMuRm9yZWlnbkNvbWJvTW9kZSA9IGNvbWJvTW9kZTtcclxuICAgICAgICB0aGlzLkZvcmVpZ25BbGxvd051bGwgPSBhbGxvd051bGw7XHJcbiAgICAgICAgdGhpcy5Gb3JlaWduS2V5RmlsdGVyQ29tYm9Nb2RlID0gZmlsdGVyQ29tYm9Nb2RlO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRDb2x1bW4ucHJvdG90eXBlLlNldE9wdGlvbnNMaXN0ID0gZnVuY3Rpb24gKGRhdGFSb3csIGl0ZW1zLCBrZXlGaWVsZCwgZGVzY3JpcHRpb25GaWVsZCwgdXNlRGVzY3JpcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5Db2x1bW5UeXBlID0gR3JpZENvbHVtblR5cGUuT1BUSU9OU0xJU1Q7XHJcbiAgICAgICAgdmFyIGN1cnJlbnRJdGVtcyA9IGRhdGFSb3dbdGhpcy5EYXRhRmllbGRdO1xyXG4gICAgICAgIGlmIChjdXJyZW50SXRlbXMpIHtcclxuICAgICAgICAgICAgdmFyIGNoZWNrZWRJdGVtcyA9IGN1cnJlbnRJdGVtcy5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0KSB7XHJcbiAgICAgICAgICAgICAgICBpdC5DaGVja2VkID0gY2hlY2tlZEl0ZW1zLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA9PSBpdFtrZXlGaWVsZF07IH0pLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoaXQpIHsgcmV0dXJuIGl0LkNoZWNrZWQgPSBmYWxzZTsgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuRm9yZWlnbkl0ZW1zID0gaXRlbXM7XHJcbiAgICAgICAgdGhpcy5Gb3JlaWduS2V5RmllbGQgPSBrZXlGaWVsZDtcclxuICAgICAgICB0aGlzLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkID0gZGVzY3JpcHRpb25GaWVsZDtcclxuICAgICAgICB0aGlzLk9wdGlvbnNMaXN0VXNlRGVzY3JpcHRpb25zID0gdXNlRGVzY3JpcHRpb25zO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRDb2x1bW4ucHJvdG90eXBlLlNldFNlbGVjdGlvbkdyaWQgPSBmdW5jdGlvbiAobW9kZWwsIHRhcmdldCkge1xyXG4gICAgICAgIHRoaXMuU2VsZWN0aW9uR3JpZCA9IG1vZGVsO1xyXG4gICAgICAgIHRoaXMuU2VsZWN0aW9uVGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRDb2x1bW4ucHJvdG90eXBlLlNldEZpbHRlciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHRoaXMuQ29sdW1uVHlwZSA9PSBHcmlkQ29sdW1uVHlwZS5DSEVDS0JPWCkge1xyXG4gICAgICAgICAgICB2Y
23XIgbnJDbGlja3MgPSAwO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5GaWx0ZXJFeHByZXNzaW9uID09IG51bGwgJiYgdmFsdWUgPT0gZmFsc2UpXHJcbiAgICAgICAgICAgICAgICBuckNsaWNrcyA9IDI7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkZpbHRlckV4cHJlc3Npb24gPT0gbnVsbCAmJiB2YWx1ZSA9PSB0cnVlKVxyXG4gICAgICAgICAgICAgICAgbnJDbGlja3MgPSAxO1xyXG4gICAgICAgICAgICB2YXIgZXZlbnQxO1xyXG4gICAgICAgICAgICB2YXIgZXZlbnQyO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQxID0gbmV3IE1vdXNlRXZlbnQoJ2NsaWNrJywge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpZXc6IHdpbmRvdyxcclxuICAgICAgICAgICAgICAgICAgICBidWJibGVzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBldmVudDIgPSBuZXcgTW91c2VFdmVudCgnY2xpY2snLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlldzogd2luZG93LFxyXG4gICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50MSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiTW91c2VFdmVudFwiKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50MS5pbml0TW91c2VFdmVudChcImNsaWNrXCIsIHRydWUsIHRydWUsIHdpbmRvdywgMCwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQyID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJNb3VzZUV2ZW50XCIpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQyLmluaXRNb3VzZUV2ZW50KFwiY2xpY2tcIiwgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAwLCAwLCAwLCAwLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCwgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGVsZW1lbnRJZDEgPSB0aGlzLm93bmluZ0dyaWQuZ3JpZEtleSArIFwiX2ZpbHRlcl9cIiArIHRoaXMuRGF0YUZpZWxkICsgXCJfMVwiO1xyXG4gICAgICAgICAgICB2Y
23XIgY2IxID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkMSk7XHJcbiAgICAgICAgICAgIHZhciBlbGVtZW50SWQyID0gdGhpcy5vd25pbmdHcmlkLmdyaWRLZXkgKyBcIl9maWx0ZXJfXCIgKyB0aGlzLkRhdGFGaWVsZCArIFwiXzJcIjtcclxuICAgICAgICAgICAgdmFyIGNiMiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZDIpO1xyXG4gICAgICAgICAgICBpZiAoY2IxKVxyXG4gICAgICAgICAgICAgICAgY2IxLmRpc3BhdGNoRXZlbnQoZXZlbnQxKTtcclxuICAgICAgICAgICAgaWYgKGNiMilcclxuICAgICAgICAgICAgICAgIGNiMi5kaXNwYXRjaEV2ZW50KGV2ZW50MSk7XHJcbiAgICAgICAgICAgIGlmIChuckNsaWNrcyA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub3duaW5nR3JpZC50YXNrUXVldWUucXVldWVUYXNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2IxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYjEuZGlzcGF0Y2hFdmVudChldmVudDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYjIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiMi5kaXNwYXRjaEV2ZW50KGV2ZW50Mik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5GaWx0ZXJFeHByZXNzaW9uID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEdyaWRDb2x1bW4ucHJvdG90eXBlLlNldEhpZ2hsaWdodEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZuKSB7XHJcbiAgICAgICAgdGhpcy5IaWdobGlnaHRGdW5jdGlvbiA9IGZuO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRDb2x1bW4ucHJvdG90eXBlLlRvZ2dsZU9wdGlvbiA9IGZ1bmN0aW9uIChkYXRhUm93LCBpdGVtKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICBpZiAodGhpcy5Gb3JlaWduSXRlbXMgJiYgdGhpcy5FZGl0YWJsZSAmJiB0aGlzLm93bmluZ0dyaWQuQ2FuRWRpdCkge1xyXG4gICAgICAgICAgICB2Y
23XIgcyA9IFwiXCI7XHJcbiAgICAgICAgICAgIHZhciB0b2cgPSB0aGlzLkZvcmVpZ25JdGVtcy5maW5kKGZ1bmN0aW9uIChmKSB7IHJldHVybiBmID09IGl0ZW07IH0pO1xyXG4gICAgICAgICAgICBpZiAodG9nKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodG9nLkNoZWNrZWQgJiYgdG9nLkNoZWNrZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvZy5DaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0b2cuQ2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5Gb3JlaWduSXRlbXMuZm9yRWFjaChmdW5jdGlvbiAob3B0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0LkNoZWNrZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocy5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzID0gcyArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHMgPSBzICsgb3B0W190aGlzLkZvcmVpZ25LZXlGaWVsZF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKHMpO1xyXG4gICAgICAgICAgICBkYXRhUm93W3RoaXMuRGF0YUZpZWxkXSA9IHM7XHJcbiAgICAgICAgICAgIHRoaXMub3duaW5nR3JpZC5BZnRlckV4aXRFZGl0TW9kZS50cmlnZ2VyKGRhdGFSb3csIHRoaXMsIHMpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBHcmlkQ29sdW1uLnByb3RvdHlwZS5BZGRWYWxpZGF0aW9uID0gZnVuY3Rpb24gKHZhbGlkYXRpb24pIHtcclxuICAgICAgICB0aGlzLlZhbGlkYXRpb25zLnB1c2godmFsaWRhdGlvbik7XHJcbiAgICAgICAgaWYgKHZhbGlkYXRpb24gaW5zdGFuY2VvZiBEYXRlUmFuZ2VWYWxpZGF0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuWWVhclNlbGVjdGlvbkFycmF5ID0gW107XHJcbiAgICAgICAgICAgIHZhciB2ID0gdmFsaWRhdGlvbjtcclxuICAgICAgICAgICAgdmFyIGxhc3R
23ZZWFyID0gdi5NYXhEYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICAgICAgICAgIHZhciBmaXJzdFllYXIgPSB2Lk1pbkRhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGxhc3RZZWFyOyBpID49IGZpcnN0WWVhcjsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlllYXJTZWxlY3Rpb25BcnJheS5wdXNoKGkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuICAgIEdyaWRDb2x1bW4ucHJvdG90eXBlLlNldFdpZHRoID0gZnVuY3Rpb24gKHdpZHRoKSB7XHJcbiAgICAgICAgdGhpcy5XaWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMudXNlV2lkdGggPSB3aWR0aDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoR3JpZENvbHVtbi5wcm90b3R5cGUsIFwiVmFsaWRhdGlvbkVycm9yc1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1WYWxpZGF0aW9uRXJyb3JzO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoZXJycykge1xyXG4gICAgICAgICAgICB0aGlzLm1WYWxpZGF0aW9uRXJyb3JzID0gZXJycztcclxuICAgICAgICAgICAgaWYgKHRoaXMub3duaW5nR3JpZClcclxuICAgICAgICAgICAgICAgIHRoaXMub3duaW5nR3JpZC5Db2xsZWN0VmFsaWRhdGlvbkVycm9ycygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgR3JpZENvbHVtbi5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJTdWJzY3JpcHRpb24pXHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyU3Vic2NyaXB0aW9uLmRpc3Bvc2UoKTtcclxuICAgICAgICBpZiAodGhpcy5leHRlcm5hbEZpbHRlclN1YnNjcmlwdGlvbilcclxuICAgICAgICAgICAgdGhpcy5leHRlcm5hbEZpbHRlclN1YnNjcmlwdGlvbi5kaXNwb3NlKCk7XHJcbiAgICB9O1xyXG4gICAgX19kZWNvcmF0ZShbXHJcbiAgICAgICAgb2JzZXJ2YWJsZSxcclxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgQm9vbGVhbilcclxuICAgIF0sIEdyaWRDb2x1bW4ucHJvdG90eXBlLCBcIklzVmlzaWJsZVwiLCB2b2lkIDApO1xyXG4gICAgX19kZWNvcmF0ZShbXHJcbiAgICAgICAgb2JzZXJ2YWJsZSxcclxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgQm9vbGVhbilcclxuICAgIF0sIEdyaWRDb2x1bW4ucHJvdG90eXBlLCBcIklzSGlkZGVuXCIsIHZvaWQgMCk7XHJcbiAgICBfX2RlY29yYXRlKFtcclxuICAgICAgICBvYnNlcnZhYmxlLFxyXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBCb29sZWFuKVxyXG4gICAgXSwgR3JpZENvbHVtbi5wcm90b3R5cGUsIFwiSGFzTmF0aXZlRmlsdGVyRm9jdXNcIiwgdm9pZCAwKTtcclxuICAgIF9fZGVjb3JhdGUoW1xyXG4gICAgICAgIGNvbXB1dGVkRnJvbShcIkZvcm1hdFwiKSxcclxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgQm9vbGVhbiksXHJcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtdKVxyXG4gICAgXSwgR3JpZENvbHVtbi5wcm90b3R5cGUsIFwiSGFzRGF0ZUVkaXRpbmdGb3JtYXRcIiwgbnVsbCk7XHJcbiAgICBfX2RlY29yYXRlKFtcclxuICAgICAgICBjb21wdXRlZEZyb20oXCJSZXNwb25zaXZlQ29sdW1uc1hzTnJcIiksXHJcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE51bWJlciksXHJcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtdKVxyXG4gICAgXSwgR3JpZENvbHVtbi5wcm90b3R5cGUsIFwiUmVzcG9uc2l2ZVhzQ29sdW1uc0lucHV0XCIsIG51bGwpO1xyXG4gICAgX19kZWNvcmF0ZShbXHJcbiAgICAgICAgY29tcHV0ZWRGcm9tKFwiUmVzcG9uc2l2ZUNvbHVtbnNMZ05yXCIpLFxyXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBOdW1iZXIpLFxyXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbXSlcclxuICAgIF0sIEdyaWRDb2x1bW4ucHJvdG90eXBlLCBcIlJlc3BvbnNpdmVMZ0NvbHVtbnNJbnB1dFwiLCBudWxsKTtcclxuICAgIF9fZGVjb3JhdGUoW1xyXG4gICAgICAgIGNvbXB1dGVkRnJvbShcIlJlc3BvbnNpdmVDb2x1bW5zWHNOclwiKSxcclxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgTnVtYmVyKSxcclxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW10pXHJcbiAgICBdLCBHcmlkQ29sdW1uLnByb3RvdHlwZSwgXCJSZXNwb25zaXZlWHNDb2x1bW5zVGl0bGVcIiwgbnVsbCk7XHJcbiAgICBfX2RlY29yYXRlKFtcclxuICAgICAgICBjb21wdXRlZEZyb20oXCJSZXNwb25zaXZlQ29sdW1uc0xnTnJcIiksXHJcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE51bWJlciksXHJcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtdKVxyXG4gICAgXSwgR3JpZENvbHVtbi5wcm90b3R5cGUsIFwiUmVzcG9uc2l2ZUxnQ29sdW1uc1RpdGxlXCIsIG51bGwpO1xyXG4gICAgX19kZWNvcmF0ZShbXHJcbiAgICAgICAgY29tcHV0ZWRGcm9tKFwiUmVzcG9uc2l2ZUNvbHVtbnNYc05yXCIpLFxyXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBOdW1iZXIpLFxyXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbXSlcclxuICAgIF0sIEdyaWRDb2x1bW4ucHJvdG90eXBlLCBcIlJlc3BvbnNpdmVYc0NvbHVtbnNSZW1hcmtzXCIsIG51bGwpO1xyXG4gICAgX19kZWNvcmF0ZShbXHJcbiAgICAgICAgY29tcHV0ZWRGcm9tKFwiUmVzcG9uc2l2ZUNvbHVtbnNMZ05yXCIpLFxyXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBOdW1iZXIpLFxyXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbXSlcclxuICAgIF0sIEdyaWRDb2x1bW4ucHJvdG90eXBlLCBcIlJlc3BvbnNpdmVMZ0NvbHVtbnNSZW1hcmtzXCIsIG51bGwpO1xyXG4gICAgcmV0dXJuIEdyaWRDb2x1bW47XHJcbn0oKSk7XHJcbmV4cG9ydCB7
23IEdyaWRDb2x1bW4gfTtcclxudmFyIEdyaWRDb2x1bW5UeXBlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gR3JpZENvbHVtblR5cGUoKSB7XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoR3JpZENvbHVtblR5cGUsIFwiU1RSSU5HXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiU1RSSU5HXCI7IH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEdyaWRDb2x1bW5UeXBlLCBcIlBBU1NXT1JEXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiUEFTU1dPUkRcIjsgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoR3JpZENvbHVtblR5cGUsIFwiQ0hFQ0tCT1hcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gXCJDSEVDS0JPWFwiOyB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShHcmlkQ29sdW1uVHlwZSwgXCJEQVRFXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiREFURVwiOyB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShHcmlkQ29sdW1uVHlwZSwgXCJTSVdJREFURVRJTUVcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gXCJTSVdJREFURVRJTUVcIjsgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoR3JpZENvbHVtblR5cGUsIFwiU0lXSU5FVFRJTUVcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gXCJTSVdJTkVUVElNRVwiOyB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShHcmlkQ29sdW1uVHlwZSwgXCJTSVdJTkVUUE9JTlRTXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiU0lXSU5FVFBPSU5UU1wiOyB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShHcmlkQ29sdW1uVHlwZSwgXCJURVhUXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiVEVYVFwiOyB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShHcmlkQ29sdW1uVHlwZSwgXCJGT1JFSUdOS0VZXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiRk9SRUlHTktFWVwiOyB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShHcmlkQ29sdW1uVHlwZSwgXCJOVU1CRVJcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gXCJOVU1CRVJcIjsgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoR3JpZENvbHVtblR5cGUsIFwiREVDSU1BTFwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBcIkRFQ0lNQUxcIjsgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoR3JpZENvbHVtblR5cGUsIFwiT1BUSU9OU0xJU1RcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gXCJPUFRJT05TTElTVFwiOyB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShHcmlkQ29sdW1uVHlwZSwgXCJURU1QTEFURVwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBcIlRFTVBMQVRFXCI7IH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEdyaWRDb2x1bW5UeXBlLCBcIlNPUlRPUkRFUlwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBcIlNPUlRPUkRFUlwiOyB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShHcmlkQ29sdW1uVHlwZSwgXCJSZXNwb25zaXZlQ29sdW1uVHlwZXNcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2Y
23XIgbGlzdCA9IFtdO1xyXG4gICAgICAgICAgICBsaXN0LnB1c2goeyBDb2RlOiBcIlNUUklOR1wiLCBEZXNjcmlwdGlvbjogXCJTdHJpbmdcIiB9KTtcclxuICAgICAgICAgICAgbGlzdC5wdXNoKHsgQ29kZTogXCJURVhUXCIsIERlc2NyaXB0aW9uOiBcIlRleHRcIiB9KTtcclxuICAgICAgICAgICAgbGlzdC5wdXNoKHsgQ29kZTogXCJOVU1CRVJcIiwgRGVzY3JpcHRpb246IFwiTnVtYmVyXCIgfSk7XHJcbiAgICAgICAgICAgIGxpc3QucHVzaCh7IENvZGU6IFwiREVDSU1BTFwiLCBEZXNjcmlwdGlvbjogXCJEZWNpbWFsXCIgfSk7XHJcbiAgICAgICAgICAgIGxpc3QucHVzaCh7IENvZGU6IFwiREFURVwiLCBEZXNjcmlwdGlvbjogXCJEYXRlXCIgfSk7XHJcbiAgICAgICAgICAgIC8vbGlzdC5wdXNoKHtDb2RlOiBcIlNJV0lEQVRFVElNRVwiLCBEZXNjcmlwdGlvbjogXCJEYXRlIGFuZCBUaW1lXCJ9KTtcclxuICAgICAgICAgICAgbGlzdC5wdXNoKHsgQ29kZTogXCJDSEVDS0JPWFwiLCBEZXNjcmlwdGlvbjogXCJDaGVja2JveFwiIH0pO1xyXG4gICAgICAgICAgICBsaXN0LnB1c2goeyBDb2RlOiBcIlBBU1NXT1JEXCIsIERlc2NyaXB0aW9uOiBcIlBhc3N3b3JkXCIgfSk7XHJcbiAgICAgICAgICAgIGxpc3QucHVzaCh7IENvZGU6IFwiRk9SRUlHTktFWVwiLCBEZXNjcmlwdGlvbjogXCJDdXN0b20gT3B0aW9uc1wiIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbGlzdDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBHcmlkQ29sdW1uVHlwZTtcclxufSgpKTtcclxuZXhwb3J0IHsgR3JpZENvbHVtblR5cGUgfTtcclxudmFyIEdyaWRDb2x1bW5BbGlnbm1lbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBHcmlkQ29sdW1uQWxpZ25tZW50KCkge1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEdyaWRDb2x1bW5BbGlnbm1lbnQsIFwiTEVGVFwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBcIkxFRlRcIjsgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoR3JpZENvbHVtbkFsaWdubWVudCwgXCJDRU5URVJcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gXCJDRU5URVJcIjsgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoR3JpZENvbHVtbkFsaWdubWVudCwgXCJSSUdIVFwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBcIlJJR0hUXCI7IH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIEdyaWRDb2x1bW5BbGlnbm1lbnQ7XHJcbn0oKSk7XHJcbmV4cG9ydCB7IEdyaWRDb2x1bW5BbGlnbm1lbnQgfTtcclxudmFyIE1heExlblZhbGlkYXRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBNYXhMZW5WYWxpZGF0aW9uKG1heExlbiwgZXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5tYXhMZW4gPSBtYXhMZW47XHJcbiAgICAgICAgdGhpcy5tc2cgPSBcIlwiO1xyXG4gICAgICAgIChlcnJvck1lc3NhZ2UpID8gdGhpcy5tc2cgPSBlcnJvck1lc3NhZ2UgOiB0aGlzLm1zZyA9IFwiTWF4aW11bSBsZW5ndGggaXMgXCIgKyBtYXhMZW4udG9TdHJpbmcoKTtcclxuICAgIH1cclxuICAgIE1heExlblZhbGlkYXRpb24ucHJvdG90eXBlLkNoZWNrVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuRXJyb3JNZXNzYWdlID0gXCJcIjtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbikge1xyXG4gICAgICAgICAgICB0aGlzLkVycm9yTWVzc2FnZSA9IHRoaXMubXNnO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLkVycm9yTWVzc2FnZSA9IFwiXCI7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gTWF4TGVuVmFsaWRhdGlvbjtcclxufSgpKTtcclxuZXhwb3J0IHsgTWF4TGVuVmFsaWRhdGlvbiB9O1xyXG52YXIgTWluTGVuVmFsaWRhdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIE1pbkxlblZhbGlkYXRpb24obWluTGVuLCBlcnJvck1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLm1pbkxlbiA9IG1pbkxlbjtcclxuICAgICAgICB0aGlzLm1zZyA9IFwiXCI7XHJcbiAgICAgICAgKGVycm9yTWVzc2FnZSkgPyB0aGlzLm1zZyA9IGVycm9yTWVzc2FnZSA6IHRoaXMubXNnID0gXCJNaW5pbXVtIGxlbmd0aCBpcyBcIiArIG1pbkxlbi50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gICAgTWluTGVuVmFsaWRhdGlvbi5wcm90b3R5cGUuQ2hlY2tWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5FcnJvck1lc3NhZ2UgPSBcIlwiO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IHRoaXMubWluTGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuRXJyb3JNZXNzYWdlID0gdGhpcy5tc2c7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuRXJyb3JNZXNzYWdlID0gXCJcIjtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybi
23BNaW5MZW5WYWxpZGF0aW9uO1xyXG59KCkpO1xyXG5leHBvcnQgeyBNaW5MZW5WYWxpZGF0aW9uIH07XHJcbnZhciBSZXF1aXJlZFZhbGlkYXRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBSZXF1aXJlZFZhbGlkYXRpb24oZXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5tc2cgPSBcIlJlcXVpcmVkIGZpZWxkXCI7XHJcbiAgICAgICAgaWYgKGVycm9yTWVzc2FnZSlcclxuICAgICAgICAgICAgdGhpcy5tc2cgPSBlcnJvck1lc3NhZ2U7XHJcbiAgICB9XHJcbiAgICBSZXF1aXJlZFZhbGlkYXRpb24ucHJvdG90eXBlLkNoZWNrVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikge1xyXG4gICAgICAgICAgICB0aGlzLkVycm9yTWVzc2FnZSA9IHRoaXMubXNnO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLkVycm9yTWVzc2FnZSA9IFwiXCI7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gUmVxdWlyZWRWYWxpZGF0aW9uO1xyXG59KCkpO1xyXG5leHBvcnQgeyBSZXF1aXJlZFZhbGlkYXRpb24gfTtcclxudmFyIFJlZ3VsYXJFeHByZXNzaW9uVmFsaWRhdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIFJlZ3VsYXJFeHByZXNzaW9uVmFsaWRhdGlvbihyZWd1bGFyRXhwcmVzc2lvbiwgZXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5tc2cgPSBcInZhbHVlIGRvZXMgbm90IG1hdGNoXCI7XHJcbiAgICAgICAgaWYgKGVycm9yTWVzc2FnZSlcclxuICAgICAgICAgICAgdGhpcy5tc2cgPSBlcnJvck1lc3NhZ2U7XHJcbiAgICAgICAgdGhpcy5yZSA9IG5ldyBSZWdFeHAocmVndWxhckV4cHJlc3Npb24sIFwiZ1wiKTtcclxuICAgIH1cclxuICAgIFJlZ3VsYXJFeHByZXNzaW9uVmFsaWRhdGlvbi5wcm90b3R5cGUuQ2hlY2tWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5FcnJvck1lc3NhZ2UgPSBcIlwiO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucmUudGVzdCh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5FcnJvck1lc3NhZ2UgPSBcIlwiO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuRXJyb3JNZXNzYWdlID0gdGhpcy5tc2c7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFJlZ3VsYXJFeHByZXNzaW9uVmFsaWRhdGlvbjtcclxufSgpKTtcclxuZXhwb3J0IHsgUmVndWxhckV4cHJlc3Npb25WYWxpZGF0aW9uIH07XHJcbnZhciBMYXRpblZhbGlkYXRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBMYXRpblZhbGlkYXRpb24oZXJyb3JNZXNzYWdlLCBhbGxvd0NSTEYpIHtcclxuICAgICAgICB0aGlzLmFsbG93Q1JMRiA9IGFsbG93Q1JMRjtcclxuICAgICAgICB0aGlzLm1zZyA9IFwidXNlIGVuZ2xpc2ggYWxwaGFiZXQgb25seSFcIjtcclxuICAgICAgICBpZiAoZXJyb3JNZXNzYWdlKVxyXG4gICAgICAgICAgICB0aGlzLm1zZyA9IGVycm9yTWVzc2FnZTtcclxuICAgIH1cclxuICAgIC8vbnVyIDcgYml0IEFTQ0lJISEhXHJcbiAgICBMYXRpblZhbGlkYXRpb24ucHJvdG90eXBlLkNoZWNrVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuRXJyb3JNZXNzYWdlID0gXCJcIjtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGNoYXIgPSB2YWx1ZS5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hbGxvd0NSTEYgJiYgKGNoYXIgPT0gMTAgfHwgY2hhciA9PSAxMykpIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaGFyIDwgMzIgfHwgY2hhciA+IDEyNykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRXJyb3JNZXNzYWdlID0gdGhpcy5tc2c7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBMYXRpblZhbGlkYXRpb247XHJcbn0oKSk7XHJcbmV4cG9ydCB7IExhdGluVmFsaWRhdGlvbiB9O1xyXG52YXIgRW1haWxBZGRyZXNzVmFsaWRhdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEVtYWlsQWRkcmVzc1ZhbGlkYXRpb24oZXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5tc2cgPSBcIm5vIHZhbGlkIEVtYWlsXCI7XHJcbiAgICAgICAgaWYgKGVycm9yTWVzc2FnZSlcclxuICAgICAgICAgICAgdGhpcy5tc2cgPSBlcnJvck1lc3NhZ2U7XHJcbiAgICB9XHJcbiAgICBFbWFpbEFkZHJlc3NWYWxpZGF0aW9uLnByb3RvdHlwZS5DaGVja1ZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLkVycm9yTWVzc2FnZSA9IFwiXCI7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoL15cXHcrKFtcXC4tXT9cXHcrKSpAXFx3KyhbXFwuLV0/XFx3KykqKFxcLlxcd3syLH0pK1xcVz8kLy50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aGlzLkVycm9yTWVzc2FnZSA9IFwiXCI7XHJcbiAgICAgICAgICAgI
23HJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5FcnJvck1lc3NhZ2UgPSB0aGlzLm1zZztcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gRW1haWxBZGRyZXNzVmFsaWRhdGlvbjtcclxufSgpKTtcclxuZXhwb3J0IHsgRW1haWxBZGRyZXNzVmFsaWRhdGlvbiB9O1xyXG52YXIgUGhvbmVOdW1iZXJWYWxpZGF0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gUGhvbmVOdW1iZXJWYWxpZGF0aW9uKGVycm9yTWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMubXNnID0gXCJubyB2YWxpZCBpbnRlcm5hdGlvbmFsIHBob25lIG51bWJlclwiO1xyXG4gICAgICAgIGlmIChlcnJvck1lc3NhZ2UpXHJcbiAgICAgICAgICAgIHRoaXMubXNnID0gZXJyb3JNZXNzYWdlO1xyXG4gICAgfVxyXG4gICAgUGhvbmVOdW1iZXJWYWxpZGF0aW9uLnByb3RvdHlwZS5DaGVja1ZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLkVycm9yTWVzc2FnZSA9IFwiXCI7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xccy9nLCAnJykucmVwbGFjZShcIihcIiwgXCJcIikucmVwbGFjZShcIilcIiwgXCJcIikucmVwbGFjZShcIi1cIiwgXCJcIik7XHJcbiAgICAgICAgaWYgKC9eKFxcK3wwMClcXGR7NSw1MH0kLy50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aGlzLkVycm9yTWVzc2FnZSA9IFwiXCI7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5FcnJvck1lc3NhZ2UgPSB0aGlzLm1zZztcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gUGhvbmVOdW1iZXJWYWxpZGF0aW9uO1xyXG59KCkpO1xyXG5leHBvcnQgeyBQaG9uZU51bWJlclZhbGlkYXRpb24gfTtcclxudmFyIE11bHRpcGxlRW1haWxBZGRyZXNzZXNWYWxpZGF0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gTXVsdGlwbGVFbWFpbEFkZHJlc3Nlc1ZhbGlkYXRpb24oZXJyb3JNZXNzYWdlLCBzZXBhcmF0b3IpIHtcclxuICAgICAgICB0aGlzLm1zZyA9IFwiSW52YWxpZCBFbWFpbFwiO1xyXG4gICAgICAgIGlmIChlcnJvck1lc3NhZ2UpXHJcbiAgICAgICAgICAgIHRoaXMubXNnID0gZXJyb3JNZXNzYWdlO1xyXG4gICAgICAgIGlmIChzZXBhcmF0b3IpXHJcbiAgICAgICAgICAgIHRoaXMuc2VwYXJhdG9yID0gc2VwYXJhdG9yO1xyXG4gICAgfVxyXG4gICAgTXVsdGlwbGVFbWFpbEFkZHJlc3Nlc1ZhbGlkYXRpb24ucHJvdG90eXBlLkNoZWNrVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICB2Y
23XIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5FcnJvck1lc3NhZ2UgPSBcIlwiO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnNlcGFyYXRvcikge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZihcIixcIikgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXBhcmF0b3IgPSBcIixcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKFwiO1wiKSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlcGFyYXRvciA9IFwiO1wiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoXCJcXHJcXG5cIikgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXBhcmF0b3IgPSBcIlxcclxcblwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoXCJcXG5cIikgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXBhcmF0b3IgPSBcIlxcblwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoXCJcXHRcIikgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXBhcmF0b3IgPSBcIlxcdFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBlbWFpbHM7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VwYXJhdG9yKSB7XHJcbiAgICAgICAgICAgIGVtYWlscyA9IHZhbHVlLnNwbGl0KHRoaXMuc2VwYXJhdG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGVtYWlscyA9IFt2YWx1ZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB2YWxpZGF0b3IgPSBuZXcgRW1haWxBZGRyZXNzVmFsaWRhdGlvbigpO1xyXG4gICAgICAgIHZhciBzdWNjZXNzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLkVycm9yTWVzc2FnZSA9IFwiXCI7XHJcbiAgICAgICAgZW1haWxzLmZvckVhY2goZnVuY3Rpb24gKGVtYWlsKSB7XHJcbiAgICAgICAgICAgIGlmIChlbWFpbC50cmltKCkubGVuZ3RoID4gMCAmJiAhdmFsaWRhdG9yLkNoZWNrVmFsdWUoZW1haWwudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuRXJyb3JNZXNzYWdlID0gX3RoaXMubXNnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gTXVsdGlwbGVFbWFpbEFkZHJlc3Nlc1ZhbGlkYXRpb247XHJcbn0oKSk7XHJcbmV4cG9ydCB7IE11bHRpcGxlRW1haWxBZGRyZXNzZXNWYWxpZGF0aW9uIH07XHJcbnZhciBOdW1lcmljVmFsaWRhdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIE51bWVyaWNWYWxpZGF0aW9uKGVycm9yTWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMubXNnID0gXCJNdXN0IGJlIGEgbnVtYmVyXCI7XHJcbiAgICAgICAgaWYgKGVycm9yTWVzc2FnZSlcclxuICAgICAgICAgICAgdGhpcy5tc2cgPSBlcnJvck1lc3NhZ2U7XHJcbiAgICB9XHJcbiAgICBOdW1lcmljVmFsaWRhdGlvbi5wcm90b3R5cGUuQ2hlY2tWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdmFsdWUgfHwgdmFsdWUgPT0gXCJcIikge1xyXG4gICAgICAgICAgICB0aGlzLkVycm9yTWVzc2FnZSA9IFwiXCI7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aGlzLkVycm9yTWVzc2FnZSA9IFwiXCI7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5FcnJvck1lc3NhZ2UgPSB0aGlzLm1zZztcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gTnVtZXJpY1ZhbGlkYXRpb247XHJcbn0oKSk7XHJcbmV4cG9ydCB7IE51bWVyaWNWYWxpZGF0aW9uIH07XHJcbnZhciBOdW1lcmljUmFuZ2VWYWxpZGF0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gTnVtZXJpY1JhbmdlVmFsaWRhdGlvbihtaW5WYWx1ZSwgbWF4VmFsdWUpIHtcclxuICAgICAgICB0aGlzLm1pblZhbHVlID0gbWluVmFsdWU7XHJcbiAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IG1heFZhbHVlO1xyXG4gICAgICAgIHRoaXMubXNnID0gXCJOdW1iZXIgbXVzdCBiZSBpbiByYW5nZVwiO1xyXG4gICAgICAgIHRoaXMubXNnID0gXCJOdW1iZXIgbXVzdCBiZSBiZXR3ZWVuIFwiICsgbWluVmFsdWUudG9TdHJpbmcoKSArIFwiIGFuZCBcIiArIG1heFZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICBOdW1lcmljUmFuZ2VWYWxpZGF0aW9uLnByb3RvdHlwZS5DaGVja1ZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZSA9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuRXJyb3JNZXNzYWdlID0gXCJcIjtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHBhcnNlSW50KHZhbHVlKSA+PSB0aGlzLm1pblZhbHVlICYmIHBhcnNlSW50KHZhbHVlKSA8PSB0aGlzLm1heFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuRXJyb3JNZXNzYWdlID0gXCJcIjtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLkVycm9yTWVzc2FnZSA9IHRoaXMubXNnO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybi
23BOdW1lcmljUmFuZ2VWYWxpZGF0aW9uO1xyXG59KCkpO1xyXG5leHBvcnQgeyBOdW1lcmljUmFuZ2VWYWxpZGF0aW9uIH07XHJcbnZhciBEYXRlUmFuZ2VWYWxpZGF0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gRGF0ZVJhbmdlVmFsaWRhdGlvbihNaW5EYXRlLCBNYXhEYXRlKSB7XHJcbiAgICAgICAgdGhpcy5NaW5EYXRlID0gTWluRGF0ZTtcclxuICAgICAgICB0aGlzLk1heERhdGUgPSBNYXhEYXRlO1xyXG4gICAgfVxyXG4gICAgRGF0ZVJhbmdlVmFsaWRhdGlvbi5wcm90b3R5cGUuQ2hlY2tWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgIHZhciBjZDtcclxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICAgIGNkID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjZCA9IG5ldyBEYXRlKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNkICYmIGNkIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAoY2QuZ2V0VGltZSgpID49IHRoaXMuTWluRGF0ZS5nZXRUaW1lKCkgJiYgY2QuZ2V0VGltZSgpIDw9IHRoaXMuTWF4RGF0ZS5nZXRUaW1lKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuRXJyb3JNZXNzYWdlID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNkLmdldFRpbWUoKSA8IHRoaXMuTWluRGF0ZS5nZXRUaW1lKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkVycm9yTWVzc2FnZSA9IFwiRGF0ZSBtdXN0IGJlIGFmdGVyIFwiICsgdGhpcy5NaW5EYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjZC5nZXRUaW1lKCkgPiB0aGlzLk1heERhdGUuZ2V0VGltZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5FcnJvck1lc3NhZ2UgPSBcIkRhdGUgbXVzdCBiZSBiZWZvcmUgXCIgKyB0aGlzLk1heERhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLkVycm9yTWVzc2FnZSA9IFwiTm90IGEgdmFsaWQgRGF0ZVwiO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBEYXRlUmFuZ2VWYWxpZGF0aW9uO1xyXG59KCkpO1xyXG5leHBvcnQgeyBEYXRlUmFuZ2VWYWxpZGF0aW9uIH07XHJcbnZhciBSZXNwb25zaXZlVGl0bGVQb3NpdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIFJlc3BvbnNpdmVUaXRsZVBvc2l0aW9uKCkge1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlc3BvbnNpdmVUaXRsZVBvc2l0aW9uLCBcIlRPUFwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBcIlRPUFwiOyB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIDtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXNwb25zaXZlVGl0bGVQb3NpdGlvbiwgXCJJTkxJTkVcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gXCJJTkxJTkVcIjsgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICA7XHJcbiAgICByZXR1cm4gUmVzcG9uc2l2ZVRpdGxlUG9zaXRpb247XHJcbn0oKSk7XHJcbmV4cG9ydCB7IFJlc3BvbnNpdmVUaXRsZVBvc2l0aW9uIH07XHJcbnZhciBSZXNwb25zaXZlUmVtYXJrUG9zaXRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBSZXNwb25zaXZlUmVtYXJrUG9zaXRpb24oKSB7XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVzcG9uc2l2ZVJlbWFya1Bvc2l0aW9uLCBcIkJPVFRPTVwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBcIkJPVFRPTVwiOyB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIDtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXNwb25zaXZlUmVtYXJrUG9zaXRpb24sIFwiSU5MSU5FXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiSU5MSU5FXCI7IH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgO1xyXG4gICAgcmV0dXJuIFJlc3BvbnNpdmVSZW1hcmtQb3NpdGlvbjtcclxufSgpKTtcclxuZXhwb3J0IHsgUmVzcG9uc2l2ZVJlbWFya1Bvc2l0aW9uIH07XHJcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0
23E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1Uh/\n");
24
25/***/ }),
26
27/***/ "@siwidata/siwiui/grid-columnfilter":
28/*!*****************************************************************!*\
29  !*** ./node_modules/@siwidata/siwiui/dist/grid-columnfilter.js ***!
30  \*****************************************************************/
31/*! exports provided: SiwiGridColumnFilterValueConverter */
32/***/ (function(module, __webpack_exports__, __webpack_require__) {
33
34"use strict";
35eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SiwiGridColumnFilterValueConverter\", function() { return SiwiGridColumnFilterValueConverter; });\nvar SiwiGridColumnFilterValueConverter = /** @class */ (function () {\r\n    function SiwiGridColumnFilterValueConverter() {\r\n    }\r\n    SiwiGridColumnFilterValueConverter.prototype.toView = function (array, grid, columnFilter) {\r\n        if (!array)\r\n            return [];\r\n        //filtern\r\n        var ret = array;\r\n        ret = ret.filter(function (item) {\r\n            return ((item.HeaderText || '').toLocaleLowerCase().indexOf(columnFilter.toLowerCase()) >= 0);\r\n        });\r\n        //grid.FilteredData = ret;\r\n        return ret;\r\n    };\r\n    return SiwiGridColumnFilterValueConverter;\r\n}());\r\n\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQHNpd2lkYXRhL3Npd2l1aS9ncmlkLWNvbHVtbmZpbHRlci5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2l3aWRhdGEvc2l3aXVpL2Rpc3QvZ3JpZC1jb2x1bW5maWx0ZXIuanM/ZDBlZSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgU2l3aUdyaWRDb2x1bW5GaWx0ZXJWYWx1ZUNvbnZlcnRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIFNpd2lHcmlkQ29sdW1uRmlsdGVyVmFsdWVDb252ZXJ0ZXIoKSB7XHJcbiAgICB9XHJcbiAgICBTaXdpR3JpZENvbHVtbkZpbHRlclZhbHVlQ29udmVydGVyLnByb3RvdHlwZS50b1ZpZXcgPSBmdW5jdGlvbiAoYXJyYXksIGdyaWQsIGNvbHVtbkZpbHRlcikge1xyXG4gICAgICAgIGlmICghYXJyYXkpXHJcbiAgICAgICAgICAgI
35HJldHVybiBbXTtcclxuICAgICAgICAvL2ZpbHRlcm5cclxuICAgICAgICB2YXIgcmV0ID0gYXJyYXk7XHJcbiAgICAgICAgcmV0ID0gcmV0LmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gKChpdGVtLkhlYWRlclRleHQgfHwgJycpLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5kZXhPZihjb2x1bW5GaWx0ZXIudG9Mb3dlckNhc2UoKSkgPj0gMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy9ncmlkLkZpbHRlcmVkRGF0YSA9IHJldDtcclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfTtcclxuICAgIHJldHVybiBTaXdpR3JpZENvbHVtbkZpbHRlclZhbHVlQ29udmVydGVyO1xyXG59KCkpO1xyXG5leHBvcnQgeyBTaXdpR3JpZENvbHVtbkZpbHRlclZhbHVlQ29udmVydGVyIH07XHJcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///@siwidata/siwiui/grid-columnfilter\n");
36
37/***/ }),
38
39/***/ "@siwidata/siwiui/grid-filter":
40/*!***********************************************************!*\
41  !*** ./node_modules/@siwidata/siwiui/dist/grid-filter.js ***!
42  \***********************************************************/
43/*! exports provided: SiwiGridFilterValueConverter */
44/***/ (function(module, __webpack_exports__, __webpack_require__) {
45
46"use strict";
47eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SiwiGridFilterValueConverter\", function() { return SiwiGridFilterValueConverter; });\n/* harmony import */ var _gridmodels__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./gridmodels */ \"1Uh/\");\n/* harmony import */ var _data_path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./data-path */ \"@siwidata/siwiui/data-path\");\n/* harmony import */ var _filter_expression__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./filter-expression */ \"OUDQ\");\n\r\n\r\n\r\nvar SiwiGridFilterValueConverter = /** @class */ (function () {\r\n    function SiwiGridFilterValueConverter() {\r\n    }\r\n    SiwiGridFilterValueConverter.prototype.toView = function (array, grid) {\r\n        if (!array)\r\n            return [];\r\n        var wasUnselected = (grid.CurrentRowIndex == -1);\r\n        //filtern\r\n        var ret = array;\r\n        if (!grid.FilterOnServer) {\r\n            grid.Columns.forEach(function (c) {\r\n                if (c.ExternalFilterExpression && c.ExternalFilterExpression != \"\") {\r\n                    if (c.ColumnType == _gridmodels__WEBPACK_IMPORTED_MODULE_0__[\"GridColumnType\"].STRING) {\r\n                        ret = ret.filter(function (item) {\r\n                            var s = new _data_path__WEBPACK_IMPORTED_MODULE_1__[\"DataPathValueConverter\"]().toView(item, c);\r\n                            return new _filter_expression__WEBPACK_IMPORTED_MODULE_2__[\"FilterExpression\"](c.ExternalFilterExpression).Match(s);\r\n                            //return (s && s.toLocaleLowerCase().indexOf(c.ExternalFilterExpression.toLowerCase()) >= 0);\r\n                        });\r\n                    }\r\n                }\r\n                if (c.FilterExpression !== null) {\r\n                    if ((c.ColumnType == _gridmodels__WEBPACK_IMPORTED_MODULE_0__[\"GridColumnType\"].STRING || (c.ColumnType == _gridmodels__WEBPACK_IMPORTED_MODULE_0__[\"GridColumnType\"].TEMPLATE && (!c.ForeignItems || c.ForeignItems.length == 0))) && c.FilterExpression != \"\") {\r\n                        if (c.ColumnType == _gridmodels__WEBPACK_IMPORTED_MODULE_0__[\"GridColumnType\"].STRING || c.ColumnType == _gridmodels__WEBPACK_IMPORTED_MODULE_0__[\"GridColumnType\"].TEMPLATE) {\r\n                            ret = ret.filter(function (item) {\r\n                                var s = new _data_path__WEBPACK_IMPORTED_MODULE_1__[\"DataPathValueConverter\"]().toView(item, c);\r\n                                return new _filter_expression__WEBPACK_IMPORTED_MODULE_2__[\"FilterExpression\"](c.FilterExpression).Match(s);\r\n                                //return (s && s.toLocaleLowerCase().indexOf(c.FilterExpression.toLowerCase()) >= 0);\r\n                            });\r\n                        }\r\n                    }
47\r\n                    if ((c.ColumnType == _gridmodels__WEBPACK_IMPORTED_MODULE_0__[\"GridColumnType\"].FOREIGNKEY && c.FilterExpression != \"\") ||\r\n                        (c.ColumnType == _gridmodels__WEBPACK_IMPORTED_MODULE_0__[\"GridColumnType\"].TEMPLATE && c.FilterExpression != \"\" && c.ForeignItems && c.ForeignItems.length > 0)) {\r\n                        if (c.ForeignKeyFilterComboMode || c.ForeignKeyTemplate) {\r\n                            var filterKey_1 = c.ForeignItems.find(function (f) { return f == c.FilterExpression; });\r\n                            if (filterKey_1) {\r\n                                ret = ret.filter(function (item) {\r\n                                    var itemToHandle = item[c.d1];\r\n                                    if (c.d5) {\r\n                                        itemToHandle = item[c.d1][c.d2][c.d3][c.d4][c.d5];\r\n                                    }\r\n                                    else if (c.d4) {\r\n                                        itemToHandle = item[c.d1][c.d2][c.d3][c.d4];\r\n                                    }\r\n                                    else if (c.d3) {\r\n                                        itemToHandle = item[c.d1][c.d2][c.d3];\r\n                                    }\r\n                                    else if (c.d2) {\r\n                                        itemToHandle = item[c.d1][c.d2];\r\n                                    }\r\n                                    if (c.ForeignKeyField) {\r\n                                        return itemToHandle == filterKey_1 || itemToHandle == filterKey_1[c.ForeignKeyField];\r\n                                    }\r\n                                    else {\r\n                                        return itemToHandle == filterKey_1;\r\n                                    }\r\n                                });\r\n                            }\r\n                            else {\r\n                                ret = [];\r\n                            }\r\n                        }\r\n                        else {\r\n                            try {\r\n                                var filteredItems_1 = c.ForeignItems.filter(function (f) {\r\n                                    if (c.ForeignDescriptionField_d5
47) {\r\n                                        return f[c.ForeignDescriptionField_d1][c.ForeignDescriptionField_d2][c.ForeignDescriptionField_d3][c.ForeignDescriptionField_d4][c.ForeignDescriptionField_d5].toLocaleLowerCase().indexOf(c.FilterExpression.toLowerCase()) >= 0;\r\n                                    }\r\n                                    else if (c.ForeignDescriptionField_d4) {\r\n                                        return f[c.ForeignDescriptionField_d1][c.ForeignDescriptionField_d2][c.ForeignDescriptionField_d3][c.ForeignDescriptionField_d4].toLocaleLowerCase().indexOf(c.FilterExpression.toLowerCase()) >= 0;\r\n                                    }\r\n                                    else if (c.ForeignDescriptionField_d3) {\r\n                                        return f[c.ForeignDescriptionField_d1][c.ForeignDescriptionField_d2][c.ForeignDescriptionField_d3].toLocaleLowerCase().indexOf(c.FilterExpression.toLowerCase()) >= 0;\r\n                                    }\r\n                                    else if (c.ForeignDescriptionField_d2) {\r\n                                        return f[c.ForeignDescriptionField_d1][c.ForeignDescriptionField_d2].toLocaleLowerCase().indexOf(c.FilterExpression.toLowerCase()) >= 0;\r\n                                    }\r\n                                    else {\r\n                                        return f[c.ForeignDescriptionField].toLocaleLowerCase().indexOf(c.FilterExpression.toLowerCase()) >= 0;\r\n                                    }\r\n                                });\r\n                                if (filteredItems_1) {\r\n                                    ret = ret.filter(function (item) {\r\n                                        var itemToHandle = item[c.d1];\r\n                                        if (c.d5) {\r\n                                            itemToHandle = item[c.d1][c.d2][c.d3][c.d4][c.d5];\r\n                                        }\r\n                                        else if (c.d4) {\r\n                                            itemToHandle = item[c.d1][c.d2][c.d3][c.d4];\r\n                                        }\r\n                                        else if (c.d3) {\r\n                                            itemToHandle = item[c.d1][c.d2][c.d3];\r\n                                        }\r\n                                        else if (c.d2) {\r\n                                            itemToHandle = item[c.d1][c.d2];\r\n                                        }\r\n                                        if (c.ForeignKeyField != null) {\r\n                                            return filteredItems_1.filter(function (f) { return f == itemToHandle || f[c.ForeignKeyField] == itemToHandle; }).length > 0;\r\n                                        }\r\n                                        else {\r\n                                            return filteredItems_1.filter(function (f) { return f == itemToHandle; }).length >= 0;\r\n                                        }\r\n                                    });\r\n                                }\r\n                                else {\r\n                                    ret = [];\r\n                                }\r\n                            }\r\n                            catch (e) {\r\n                                console.log(e);\r\n                            }\r\n                        }\r\n                    }\r\n                    if (c.ColumnType == _gridmodels__WEBPACK_IMPORTED_MODULE_0__[\"GridColumnType\"].CHECKBOX) {\r\n                        if (c.ColumnType == _gridmodels__WEBPACK_IMPORTED_MODULE_0__[\"GridColumnType\"].CHECKBOX) {\r\n                            ret = ret.filter(function (item) {\r\n                                var s = new _data_path__WEBPACK_IMPORTED_MODULE_1__[\"DataPathValueConverter\"]().toView(item, c);\r\n                                switch (c.FilterExpression) {\r\n                                    case true:\r\n                                    case \"true\":\r\n                                        return s == true;\r\n                                    //break;\r\n                                    case false:\r\n                                    case \"false\":\r\n                                        return s == false;\r\n                                    //break;\r\n                                    default:\r\n                                        return true;\r\n                                    //break;\r\n                                }\r\n                                //return (s != null && s === c.FilterExpression);\r\n                            });\r\n                        }\r\n                    }\r\n                }\r\n            });\r\n        }\r\n        grid.FilteredData = ret;\r\n        if (!grid.FilterOnServer) {\r\n            //aktuelle zeile wieder auf aktuell selektiertes item setzen\r\n            var idx = -1;\r\n            var newIdx = 0;\r\n            for (idx = 0; idx < ret.length; idx++) {\r\n                var f = ret[idx];\r\n                if (f === grid.SelectedItem) {\r\n                    newIdx = idx;\r\n                    break;\r\n                }\r\n            }\r\n            if (!wasUnselected && grid.CurrentRowIndex != newIdx) {\r\n                grid.CurrentRowIndex = newIdx;\r\n                if (grid.IsVirtual) {\r\n                    if (ret.length <= grid.VisibleRows) {\r\n                        grid.ScrollTop = 0;\r\n                    }\r\n                    else {\r\n                        grid.MoveRowToView(newIdx);\r\n                    }\r\n                }\r\n                else {\r\n                    grid.MoveRowToView(newIdx);\r\n                }\r\n            }\r\n        }\r\n        return ret;\r\n    };\r\n    return SiwiGridFilterValueConverter;\r\n}());\r\n\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQHNpd2lkYXRhL3Npd2l1aS9ncmlkLWZpbHRlci5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2l3aWRhdGEvc2l3aXVpL2Rpc3QvZ3JpZC1maWx0ZXIuanM/MjlhYyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHcmlkQ29sdW1uVHlwZSB9IGZyb20gJy4vZ3JpZG1vZGVscyc7XHJcbmltcG9ydCB7
47IERhdGFQYXRoVmFsdWVDb252ZXJ0ZXIgfSBmcm9tICcuL2RhdGEtcGF0aCc7XHJcbmltcG9ydCB7IEZpbHRlckV4cHJlc3Npb24gfSBmcm9tICcuL2ZpbHRlci1leHByZXNzaW9uJztcclxudmFyIFNpd2lHcmlkRmlsdGVyVmFsdWVDb252ZXJ0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBTaXdpR3JpZEZpbHRlclZhbHVlQ29udmVydGVyKCkge1xyXG4gICAgfVxyXG4gICAgU2l3aUdyaWRGaWx0ZXJWYWx1ZUNvbnZlcnRlci5wcm90b3R5cGUudG9WaWV3ID0gZnVuY3Rpb24gKGFycmF5LCBncmlkKSB7XHJcbiAgICAgICAgaWYgKCFhcnJheSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHZhciB3YXNVbnNlbGVjdGVkID0gKGdyaWQuQ3VycmVudFJvd0luZGV4ID09IC0xKTtcclxuICAgICAgICAvL2ZpbHRlcm5cclxuICAgICAgICB2YXIgcmV0ID0gYXJyYXk7XHJcbiAgICAgICAgaWYgKCFncmlkLkZpbHRlck9uU2VydmVyKSB7XHJcbiAgICAgICAgICAgIGdyaWQuQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYy5FeHRlcm5hbEZpbHRlckV4cHJlc3Npb24gJiYgYy5FeHRlcm5hbEZpbHRlckV4cHJlc3Npb24gIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjLkNvbHVtblR5cGUgPT0gR3JpZENvbHVtblR5cGUuU1RSSU5HKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldC5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gbmV3IERhdGFQYXRoVmFsdWVDb252ZXJ0ZXIoKS50b1ZpZXcoaXRlbSwgYyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbHRlckV4cHJlc3Npb24oYy5FeHRlcm5hbEZpbHRlckV4cHJlc3Npb24pLk1hdGNoKHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gKHMgJiYgcy50b0xvY2FsZUxvd2VyQ2FzZSgpLmluZGV4T2YoYy5FeHRlcm5hbEZpbHRlckV4cHJlc3Npb24udG9Mb3dlckNhc2UoKSkgPj0gMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjLkZpbHRlckV4cHJlc3Npb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKGMuQ29sdW1uVHlwZSA9PSBHcmlkQ29sdW1uVHlwZS5TVFJJTkcgfHwgKGMuQ29sdW1uVHlwZSA9PSBHcmlkQ29sdW1uVHlwZS5URU1QTEFURSAmJiAoIWMuRm9yZWlnbkl0ZW1zIHx8IGMuRm9yZWlnbkl0ZW1zLmxlbmd0aCA9PSAwKSkpICYmIGMuRmlsdGVyRXhwcmVzc2lvbiAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLkNvbHVtblR5cGUgPT0gR3JpZENvbHVtblR5cGUuU1RSSU5HIHx8IGMuQ29sdW1uVHlwZSA9PSBHcmlkQ29sdW1uVHlwZS5URU1QTEFURSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0LmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gbmV3IERhdGFQYXRoVmFsdWVDb252ZXJ0ZXIoKS50b1ZpZXcoaXRlbSwgYyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJFeHByZXNzaW9uKGMuRmlsdGVyRXhwcmVzc2lvbikuTWF0Y2gocyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gKHMgJiYgcy50b0xvY2FsZUxvd2VyQ2FzZSgpLmluZGV4T2YoYy5GaWx0ZXJFeHByZXNzaW9uLnRvTG93ZXJDYXNlKCkpID49IDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKChjLkNvbHVtblR5cGUgPT0gR3JpZENvbHVtblR5cGUuRk9SRUlHTktFWSAmJiBjLkZpbHRlckV4cHJlc3Npb24gIT0gXCJcIikgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGMuQ29sdW1uVHlwZSA9PSBHcmlkQ29sdW1uVHlwZS5URU1QTEFURSAmJiBjLkZpbHRlckV4cHJlc3Npb24gIT0gXCJcIiAmJiBjLkZvcmVpZ25JdGVtcyAmJiBjLkZvcmVpZ25JdGVtcy5sZW5ndGggPiAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5Gb3JlaWduS2V5RmlsdGVyQ29tYm9Nb2RlIHx8IGMuRm9yZWlnbktleVRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
47XIgZmlsdGVyS2V5XzEgPSBjLkZvcmVpZ25JdGVtcy5maW5kKGZ1bmN0aW9uIChmKSB7IHJldHVybiBmID09IGMuRmlsdGVyRXhwcmVzc2lvbjsgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyS2V5XzEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXQuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtVG9IYW5kbGUgPSBpdGVtW2MuZDFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5kNSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVRvSGFuZGxlID0gaXRlbVtjLmQxXVtjLmQyXVtjLmQzXVtjLmQ0XVtjLmQ1XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjLmQ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtVG9IYW5kbGUgPSBpdGVtW2MuZDFdW2MuZDJdW2MuZDNdW2MuZDRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMuZDMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1Ub0hhbmRsZSA9IGl0ZW1bYy5kMV1bYy5kMl1bYy5kM107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYy5kMikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVRvSGFuZGxlID0gaXRlbVtjLmQxXVtjLmQyXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5Gb3JlaWduS2V5RmllbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtVG9IYW5kbGUgPT0gZmlsdGVyS2V5XzEgfHwgaXRlbVRvSGFuZGxlID09IGZpbHRlcktleV8xW2MuRm9yZWlnbktleUZpZWxkXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtVG9IYW5kbGUgPT0gZmlsdGVyS2V5XzE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y
47XIgZmlsdGVyZWRJdGVtc18xID0gYy5Gb3JlaWduSXRlbXMuZmlsdGVyKGZ1bmN0aW9uIChmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2Q1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZltjLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2QxXVtjLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2QyXVtjLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2QzXVtjLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2Q0XVtjLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2Q1XS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluZGV4T2YoYy5GaWx0ZXJFeHByZXNzaW9uLnRvTG93ZXJDYXNlKCkpID49IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYy5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kNCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZbYy5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kMV1bYy5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kMl1bYy5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kM11bYy5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kNF0udG9Mb2NhbGVMb3dlckNhc2UoKS5pbmRleE9mKGMuRmlsdGVyRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpKSA+PSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMuRm9yZWlnbkRlc2NyaXB0aW9uRmllbGRfZDMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmW2MuRm9yZWlnbkRlc2NyaXB0aW9uRmllbGRfZDFdW2MuRm9yZWlnbkRlc2NyaXB0aW9uRmllbGRfZDJdW2MuRm9yZWlnbkRlc2NyaXB0aW9uRmllbGRfZDNdLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5kZXhPZihjLkZpbHRlckV4cHJlc3Npb24udG9Mb3dlckNhc2UoKSkgPj0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2QyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZltjLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2QxXVtjLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2QyXS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluZGV4T2YoYy5GaWx0ZXJFeHByZXNzaW9uLnRvTG93ZXJDYXNlKCkpID49IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZltjLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkXS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluZGV4T2YoYy5GaWx0ZXJFeHByZXNzaW9uLnRvTG93ZXJDYXNlKCkpID49IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWRJdGVtc18xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldC5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtVG9IYW5kbGUgPSBpdGVtW2MuZDFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMuZDUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtVG9IYW5kbGUgPSBpdGVtW2MuZDFdW2MuZDJdW2MuZDNdW2MuZDRdW2MuZDVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYy5kNCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1Ub0hhbmRsZSA9IGl0ZW1bYy5kMV1bYy5kMl1bYy5kM11bYy5kNF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjLmQzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVRvSGFuZGxlID0gaXRlbVtjLmQxXVtjLmQyXVtjLmQzXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMuZDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtVG9IYW5kbGUgPSBpdGVtW2MuZDFdW2MuZDJdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMuRm9yZWlnbktleUZpZWxkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyZWRJdGVtc18xLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA9PSBpdGVtVG9IYW5kbGUgfHwgZltjLkZvcmVpZ25LZXlGaWVsZF0gPT0gaXRlbVRvSGFuZGxlOyB9KS5sZW5ndGggPiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ
47pbHRlcmVkSXRlbXNfMS5maWx0ZXIoZnVuY3Rpb24gKGYpIHsgcmV0dXJuIGYgPT0gaXRlbVRvSGFuZGxlOyB9KS5sZW5ndGggPj0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjLkNvbHVtblR5cGUgPT0gR3JpZENvbHVtblR5cGUuQ0hFQ0tCT1gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMuQ29sdW1uVHlwZSA9PSBHcmlkQ29sdW1uVHlwZS5DSEVDS0JPWCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0LmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gbmV3IERhdGFQYXRoVmFsdWVDb252ZXJ0ZXIoKS50b1ZpZXcoaXRlbSwgYyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjLkZpbHRlckV4cHJlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0cnVlOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidHJ1ZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMgPT0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9icmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBmYWxzZTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImZhbHNlXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyA9PSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9icmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2JyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiAocyAhPSBudWxsICYmIHMgPT09IGMuRmlsdGVyRXhwcmVzc2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdyaWQuRmlsdGVyZWREYXRhID0gcmV0O1xyXG4gICAgICAgIGlmICghZ3JpZC5GaWx0ZXJPblNlcnZlcikge1xyXG4gICAgICAgICAgICAvL2FrdHVlbGxlIHplaWxlIHdpZWRlciBhdWYgYWt0dWVsbCBzZWxla3RpZXJ0ZXMgaXRlbSBzZXR6ZW5cclxuICAgICAgICAgICAgdmFyIGlkeCA9IC0xO1xyXG4gICAgICAgICAgICB2Y
47XIgbmV3SWR4ID0gMDtcclxuICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCByZXQubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGYgPSByZXRbaWR4XTtcclxuICAgICAgICAgICAgICAgIGlmIChmID09PSBncmlkLlNlbGVjdGVkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld0lkeCA9IGlkeDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXdhc1Vuc2VsZWN0ZWQgJiYgZ3JpZC5DdXJyZW50Um93SW5kZXggIT0gbmV3SWR4KSB7XHJcbiAgICAgICAgICAgICAgICBncmlkLkN1cnJlbnRSb3dJbmRleCA9IG5ld0lkeDtcclxuICAgICAgICAgICAgICAgIGlmIChncmlkLklzVmlydHVhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXQubGVuZ3RoIDw9IGdyaWQuVmlzaWJsZVJvd3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZC5TY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZC5Nb3ZlUm93VG9WaWV3KG5ld0lkeCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JpZC5Nb3ZlUm93VG9WaWV3KG5ld0lkeCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gU2l3aUdyaWRGaWx0ZXJWYWx1ZUNvbnZlcnRlcjtcclxufSgpKTtcclxuZXhwb3J0IHsgU2l3aUdyaWRGaWx0ZXJWYWx1ZUNvbnZlcnRlciB9O1xyXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///@siwidata/siwiui/grid-filter\n");
48
49/***/ }),
50
51/***/ "@siwidata/siwiui/grid-foreignitem":
52/*!****************************************************************!*\
53  !*** ./node_modules/@siwidata/siwiui/dist/grid-foreignitem.js ***!
54  \****************************************************************/
55/*! exports provided: ForeignItemValueConverter */
56/***/ (function(module, __webpack_exports__, __webpack_require__) {
57
58"use strict";
59eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ForeignItemValueConverter\", function() { return ForeignItemValueConverter; });\nvar ForeignItemValueConverter = /** @class */ (function () {\r\n    function ForeignItemValueConverter() {\r\n    }\r\n    ForeignItemValueConverter.prototype.toView = function (item, column, nix) {\r\n        if (!item)\r\n            return \"\";
59\r\n        if (column.ForeignDescriptionField_d5) {\r\n            return item[column.ForeignDescriptionField_d1][column.ForeignDescriptionField_d2][column.ForeignDescriptionField_d3][column.ForeignDescriptionField_d4][column.ForeignDescriptionField_d5];\r\n        }\r\n        else if (column.ForeignDescriptionField_d4) {\r\n            return item[column.ForeignDescriptionField_d1][column.ForeignDescriptionField_d2][column.ForeignDescriptionField_d3][column.ForeignDescriptionField_d4];\r\n        }\r\n        else if (column.ForeignDescriptionField_d3) {\r\n            return item[column.ForeignDescriptionField_d1][column.ForeignDescriptionField_d2][column.ForeignDescriptionField_d3];\r\n        }\r\n        else if (column.ForeignDescriptionField_d2) {\r\n            return item[column.ForeignDescriptionField_d1][column.ForeignDescriptionField_d2];\r\n        }\r\n        else {\r\n            return item[column.ForeignDescriptionField];\r\n        }\r\n    };\r\n    return ForeignItemValueConverter;\r\n}());\r\n\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQHNpd2lkYXRhL3Npd2l1aS9ncmlkLWZvcmVpZ25pdGVtLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzaXdpZGF0YS9zaXdpdWkvZGlzdC9ncmlkLWZvcmVpZ25pdGVtLmpzP2E3ZjIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIEZvcmVpZ25JdGVtVmFsdWVDb252ZXJ0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBGb3JlaWduSXRlbVZhbHVlQ29udmVydGVyKCkge1xyXG4gICAgfVxyXG4gICAgRm9yZWlnbkl0ZW1WYWx1ZUNvbnZlcnRlci5wcm90b3R5cGUudG9WaWV3ID0gZnVuY3Rpb24gKGl0ZW0sIGNvbHVtbiwgbml4KSB7XHJcbiAgICAgICAgaWYgKCFpdGVtKVxyXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcclxuICAgICAgICBpZiAoY29sdW1uLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2Q1KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtW2NvbHVtbi5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kMV1bY29sdW1uLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2QyXVtjb2x1bW4uRm9yZWlnbkRlc2NyaXB0aW9uRmllbGRfZDNdW2NvbHVtbi5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kNF1bY29sdW1uLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2Q1XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29sdW1uLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2Q0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtW2NvbHVtbi5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kMV1bY29sdW1uLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2QyXVtjb2x1bW4uRm9yZWlnbkRlc2NyaXB0aW9uRmllbGRfZDNdW2NvbHVtbi5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kNF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbHVtbi5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kMykge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbVtjb2x1bW4uRm9yZWlnbkRlc2NyaXB0aW9uRmllbGRfZDFdW2NvbHVtbi5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kMl1bY29sdW1uLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2QzXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29sdW1uLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2QyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtW2NvbHVtbi5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kMV1bY29sdW1uLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2QyXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtW2NvbHVtbi5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBGb3JlaWduSXRlbVZhbHVlQ29udmVydGVyO1xyXG59KCkpO1xyXG5leHBvcnQgeyBGb3JlaWduSXRlbVZhbHVlQ29udmVydGVyIH07XHJcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///@siwidata/siwiui/grid-foreignitem\n");
60
61/***/ }),
62
63/***/ "@siwidata/siwiui/grid-foreignkey":
64/*!***************************************************************!*\
65  !*** ./node_modules/@siwidata/siwiui/dist/grid-foreignkey.js ***!
66  \***************************************************************/
67/*! exports provided: ForeignKeyValueConverter */
68/***/ (function(module, __webpack_exports__, __webpack_require__) {
69
70"use strict";
71eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ForeignKeyValueConverter\", function() { return ForeignKeyValueConverter; });\nvar ForeignKeyValueConverter = /** @class */ (function () {\r\n    function ForeignKeyValueConverter() {\r\n    }\r\n    ForeignKeyValueConverter.prototype.toView = function (row, column, item) {\r\n        if (!row)\r\n            return \"\";\r\n        if (!column.ForeignItems)\r\n            return \"\";\r\n        var item = undefined;\r\n        if (column.d5) {\r\n            if (row[column.d1] && row[column.d1][column.d2] && row[column.d1][column.d2][column.d3] && row[column.d1][column.d2][column.d3][column.d4] &&\r\n                row[column.d1][column.d2][column.d3][column.d4][column.d5] !== undefined && row[column.d1][column.d2][column.d3][column.d4][column.d5] !== null &&\r\n                row[column.d1][column.d2][column.d3][column.d4][column.d5] !== \"\") {\r\n                if (column.ForeignKeyField) {\r\n                    item = column.ForeignItems.find(function (f) { return f == row[column.d1][column.d2][column.d3][column.d4][column.d5] || f[column.ForeignKeyField] == row[column.d1][column.d2][column.d3][column.d4][column.d5]; });\r\n                }\r\n                else {\r\n                    item = column.ForeignItems.find(function (f) { return f == row[column.d1][column.d2][column.d3][column.d4][column.d5]; });\r\n                }\r\n            }\r\n        }\r\n        else if (column.d4) {\r\n            if (row[column.d1] && row[column.d1][column.d2] && row[column.d1][column.d2][column.d3] && row[column.d1][column.d2][column.d3][column.d4] !== undefined &&\r\n                row[column.d1][column.d2][column.d3][column.d4] !== null && row[column.d1][column.d2][column.d3][column.d4] !== \"\") {\r\n                if (column.ForeignKeyField) {\r\n                    item = column.ForeignItems.find(function (f) { return f == row[column.d1][column.d2][column.d3][column.d4] || f[column.ForeignKeyField] == row[column.d1][column.d2][column.d3][column.d4]; });\r\n                }\r\n                else {\r\n                    item = column.ForeignItems.find(function (f) { return f == row[column.d1][column.d2][column.d3][column.d4]; });\r\n                }\r\n            }\r\n        }\r\n        else if (column.d3) {\r\n            if (row[column.d1] && row[column.d1][column.d2] && row[column.d1][column.d2][column.d3] !== undefined && row[column.d1][column.d2][column.d3] !== null && row[column.d1][column.d2][column.d3] !== \"\") {\r\n                if (column.ForeignKeyField) {\r\n                    item = column.ForeignItems.find(function (f) { return f == row[column.d1][column.d2][column.d3] || f[column.ForeignKeyField] == row[column.d1][column.d2][column.d3]; });\r\n                }\r\n                else {\r\n                    item = column.ForeignItems.find(function (f) { return f == row[column.d1][column.d2][column.d3]; });\r\n                }\r\n            }\r\n        }\r\n        else if (column.d2) {\r\n            if (row[column.d1] && row[column.d1][column.d2] !== undefined && row[column.d1][column.d2] !== null && row[column.d1][column.d2] !== \"\") {\r\n                if (column.ForeignKeyField) {\r\n                    item = column.ForeignItems.find(function (f) { return f == row[column.d1][column.d2] || f[column.ForeignKeyField] == row[column.d1][column.d2]; });\r\n                }\r\n                else {\r\n                    item = column.ForeignItems.find(function (f) { return f == row[column.d1][column.d2]; });\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            if (row[column.d1] !== undefined && row[column.d1] !== null && row[column.d1] !== \"\") {\r\n                if (column.ForeignKeyField) {\r\n                    item = column.ForeignItems.find(function (f) { return f == row[column.d1] || f[column.ForeignKeyField] == row[column.d1]; });\r\n                }\r\n                else {\r\n                    item = column.ForeignItems.find(function (f) { return f == row[column.d1]; });\r\n                }\r\n            }\r\n        }\r\n        if (item) {\r\n            if (column.ForeignDescriptionField_d5
71) {\r\n                return item[column.ForeignDescriptionField_d1][column.ForeignDescriptionField_d2][column.ForeignDescriptionField_d3][column.ForeignDescriptionField_d4][column.ForeignDescriptionField_d5];\r\n            }\r\n            else if (column.ForeignDescriptionField_d4) {\r\n                return item[column.ForeignDescriptionField_d1][column.ForeignDescriptionField_d2][column.ForeignDescriptionField_d3][column.ForeignDescriptionField_d4];\r\n            }\r\n            else if (column.ForeignDescriptionField_d3) {\r\n                return item[column.ForeignDescriptionField_d1][column.ForeignDescriptionField_d2][column.ForeignDescriptionField_d3];\r\n            }\r\n            else if (column.ForeignDescriptionField_d2) {\r\n                return item[column.ForeignDescriptionField_d1][column.ForeignDescriptionField_d2];\r\n            }\r\n            else {\r\n                return item[column.ForeignDescriptionField];\r\n            }\r\n        }\r\n        else\r\n            return \"\";\r\n    };\r\n    return ForeignKeyValueConverter;\r\n}());\r\n\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQHNpd2lkYXRhL3Npd2l1aS9ncmlkLWZvcmVpZ25rZXkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNpd2lkYXRhL3Npd2l1aS9kaXN0L2dyaWQtZm9yZWlnbmtleS5qcz82MWI1Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBGb3JlaWduS2V5VmFsdWVDb252ZXJ0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBGb3JlaWduS2V5VmFsdWVDb252ZXJ0ZXIoKSB7XHJcbiAgICB9XHJcbiAgICBGb3JlaWduS2V5VmFsdWVDb252ZXJ0ZXIucHJvdG90eXBlLnRvVmlldyA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbiwgaXRlbSkge1xyXG4gICAgICAgIGlmICghcm93KVxyXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcclxuICAgICAgICBpZiAoIWNvbHVtbi5Gb3JlaWduSXRlbXMpXHJcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgIHZhciBpdGVtID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmIChjb2x1bW4uZDUpIHtcclxuICAgICAgICAgICAgaWYgKHJvd1tjb2x1bW4uZDFdICYmIHJvd1tjb2x1bW4uZDFdW2NvbHVtbi5kMl0gJiYgcm93W2NvbHVtbi5kMV1bY29sdW1uLmQyXVtjb2x1bW4uZDNdICYmIHJvd1tjb2x1bW4uZDFdW2NvbHVtbi5kMl1bY29sdW1uLmQzXVtjb2x1bW4uZDRdICYmXHJcbiAgICAgICAgICAgICAgICByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM11bY29sdW1uLmQ0XVtjb2x1bW4uZDVdICE9PSB1bmRlZmluZWQgJiYgcm93W2NvbHVtbi5kMV1bY29sdW1uLmQyXVtjb2x1bW4uZDNdW2NvbHVtbi5kNF1bY29sdW1uLmQ1XSAhPT0gbnVsbCAmJlxyXG4gICAgICAgICAgICAgICAgcm93W2NvbHVtbi5kMV1bY29sdW1uLmQyXVtjb2x1bW4uZDNdW2NvbHVtbi5kNF1bY29sdW1uLmQ1XSAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5Gb3JlaWduS2V5RmllbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtID0gY29sdW1uLkZvcmVpZ25JdGVtcy5maW5kKGZ1bmN0aW9uIChmKSB7IHJldHVybiBmID09IHJvd1tjb2x1bW4uZDFdW2NvbHVtbi5kMl1bY29sdW1uLmQzXVtjb2x1bW4uZDRdW2NvbHVtbi5kNV0gfHwgZltjb2x1bW4uRm9yZWlnbktleUZpZWxkXSA9PSByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM11bY29sdW1uLmQ0XVtjb2x1bW4uZDVdOyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBjb2x1bW4uRm9yZWlnbkl0ZW1zLmZpbmQoZnVuY3Rpb24gKGYpIHsgcmV0dXJuIGYgPT0gcm93W2NvbHVtbi5kMV1bY29sdW1uLmQyXVtjb2x1bW4uZDNdW2NvbHVtbi5kNF1bY29sdW1uLmQ1XTsgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29sdW1uLmQ0KSB7XHJcbiAgICAgICAgICAgIGlmIChyb3dbY29sdW1uLmQxXSAmJiByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdICYmIHJvd1tjb2x1bW4uZDFdW2NvbHVtbi5kMl1bY29sdW1uLmQzXSAmJiByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM11bY29sdW1uLmQ0XSAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgICAgICAgICByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM11bY29sdW1uLmQ0XSAhPT0gbnVsbCAmJiByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM11bY29sdW1uLmQ0XSAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5Gb3JlaWduS2V5RmllbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtID0gY29sdW1uLkZvcmVpZ25JdGVtcy5maW5kKGZ1bmN0aW9uIChmKSB7IHJldHVybiBmID09IHJvd1tjb2x1bW4uZDFdW2NvbHVtbi5kMl1bY29sdW1uLmQzXVtjb2x1bW4uZDRdIHx8IGZbY29sdW1uLkZvcmVpZ25LZXlGaWVsZF0gPT0gcm93W2NvbHVtbi5kMV1bY29sdW1uLmQyXVtjb2x1bW4uZDNdW2NvbHVtbi5kNF07IH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGNvbHVtbi5Gb3JlaWduSXRlbXMuZmluZChmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA9PSByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM11bY29sdW1uLmQ0XTsgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgI
71H1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29sdW1uLmQzKSB7XHJcbiAgICAgICAgICAgIGlmIChyb3dbY29sdW1uLmQxXSAmJiByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdICYmIHJvd1tjb2x1bW4uZDFdW2NvbHVtbi5kMl1bY29sdW1uLmQzXSAhPT0gdW5kZWZpbmVkICYmIHJvd1tjb2x1bW4uZDFdW2NvbHVtbi5kMl1bY29sdW1uLmQzXSAhPT0gbnVsbCAmJiByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM10gIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uRm9yZWlnbktleUZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGNvbHVtbi5Gb3JlaWduSXRlbXMuZmluZChmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA9PSByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM10gfHwgZltjb2x1bW4uRm9yZWlnbktleUZpZWxkXSA9PSByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM107IH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGNvbHVtbi5Gb3JlaWduSXRlbXMuZmluZChmdW5jdGlvbiAoZikgeyByZXR1cm4gZiA9PSByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM107IH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbHVtbi5kMikge1xyXG4gICAgICAgICAgICBpZiAocm93W2NvbHVtbi5kMV0gJiYgcm93W2NvbHVtbi5kMV1bY29sdW1uLmQyXSAhPT0gdW5kZWZpbmVkICYmIHJvd1tjb2x1bW4uZDFdW2NvbHVtbi5kMl0gIT09IG51bGwgJiYgcm93W2NvbHVtbi5kMV1bY29sdW1uLmQyXSAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5Gb3JlaWduS2V5RmllbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtID0gY29sdW1uLkZvcmVpZ25JdGVtcy5maW5kKGZ1bmN0aW9uIChmKSB7IHJldHVybiBmID09IHJvd1tjb2x1bW4uZDFdW2NvbHVtbi5kMl0gfHwgZltjb2x1bW4uRm9yZWlnbktleUZpZWxkXSA9PSByb3dbY29sdW1uLmQxXVtjb2x1bW4uZDJdOyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBjb2x1bW4uRm9yZWlnbkl0ZW1zLmZpbmQoZnVuY3Rpb24gKGYpIHsgcmV0dXJuIGYgPT0gcm93W2NvbHVtbi5kMV1bY29sdW1uLmQyXTsgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChyb3dbY29sdW1uLmQxXSAhPT0gdW5kZWZpbmVkICYmIHJvd1tjb2x1bW4uZDFdICE9PSBudWxsICYmIHJvd1tjb2x1bW4uZDFdICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLkZvcmVpZ25LZXlGaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBjb2x1bW4uRm9yZWlnbkl0ZW1zLmZpbmQoZnVuY3Rpb24gKGYpIHsgcmV0dXJuIGYgPT0gcm93W2NvbHVtbi5kMV0gfHwgZltjb2x1bW4uRm9yZWlnbktleUZpZWxkXSA9PSByb3dbY29sdW1uLmQxXTsgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtID0gY29sdW1uLkZvcmVpZ25JdGVtcy5maW5kKGZ1bmN0aW9uIChmKSB7IHJldHVybiBmID09IHJvd1tjb2x1bW4uZDFdOyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2Q1KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVtjb2x1bW4uRm9yZWlnbkRlc2NyaXB0aW9uRmllbGRfZDFdW2NvbHVtbi5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kMl1bY29sdW1uLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2QzXVtjb2x1bW4uRm9yZWlnbkRlc2NyaXB0aW9uRmllbGRfZDRdW2NvbHVtbi5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kNV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoY29sdW1uLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2Q0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVtjb2x1bW4uRm9yZWlnbkRlc2NyaXB0aW9uRmllbGRfZDFdW2NvbHVtbi5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kMl1bY29sdW1uLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2QzXVtjb2x1bW4uRm9yZWlnbkRlc2NyaXB0aW9uRmllbGRfZDRdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbHVtbi5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kMykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bY29sdW1uLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2QxXVtjb2x1bW4uRm9yZWlnbkRlc2NyaXB0aW9uRmllbGRfZDJdW2NvbHVtbi5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kM107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoY29sdW1uLkZvcmVpZ25EZXNjcmlwdGlvbkZpZWxkX2QyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVtjb2x1bW4uRm9yZWlnbkRlc2NyaXB0aW9uRmllbGRfZDFdW2NvbHVtbi5Gb3JlaWduRGVzY3JpcHRpb25GaWVsZF9kMl07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVtjb2x1bW4uRm9yZWlnbkRlc2NyaXB0aW9uRmllbGRdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIEZvcmVpZ25LZXlWYWx1ZUNvbnZlcnRlcjtcclxufSgpKTtcclxuZXhwb3J0IHsgRm9yZWlnbktleVZhbHVlQ29udmVydGVyIH07XHJcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///@siwidata/siwiui/grid-foreignkey\n");
72
73/***/ }),
74
75/***/ "@siwidata/siwiui/grid-row-cells.html":
76/*!****************************************************************!*\
77  !*** ./node_modules/@siwidata/siwiui/dist/grid-row-cells.html ***!
78  \****************************************************************/
79/*! no static exports found */
80/***/ (function(module, exports, __webpack_require__) {
81
82eval("module.exports = \"<template containerless>\\r\\n    <require from=\\\"./grid-sort\\\" containerless></require>\\r\\n    <require from=\\\"./grid-filter\\\" containerless></require>\\r\\n    <require from=\\\"./grid-foreignkey\\\" containerless></require>\\r\\n    <require from=\\\"./grid-foreignitem\\\" containerless></require>\\r\\n    <require from=\\\"./decimal-format\\\"></require>\\r\\n    <require from=\\\"./tri-state-checkbox-custom-attribute\\\" containerless></require>\\r\\n    <require from=\\\"./editors/numeric-input\\\"></require>\\r\\n    <require from=\\\"@siwidata/converters/date-format\\\" containerless></require>\\r\\n    <require from=\\\"@siwidata/converters/datetime-format\\\" containerless></require>\\r\\n    <require from=\\\"@siwidata/converters/net-time\\\" containerless></require>\\r\\n    <require from=\\\"@siwidata/converters/net-points\\\" containerless></require>\\r\\n    <require from=\\\"./limit-loop\\\" containerless></require>\\r\\n    \\r\\n    <template repeat.for=\\\"col of model.ActiveColumns\\\" containerless>\\r\\n        <td click.trigger=\\\"model.CellClicked($event,model.IsVirtual ? $parent.$index + model.FirstVisibleRow : $parent.$index,$index)\\\"\\r\\n            css=\\\"min-width: ${col.useWidth};max-width: ${col.useWidth} \\\"\\r\\n            class=\\\"${model.CurrentColIndex==$index && model.mCurrentRowIndex == (model.IsVirtual ? $parent.$index + model.FirstVisibleRow : $parent.$index) ? 'activeCell' : ''}\\r\\n                                    ${model.EditColIndex==$index && model.EditRowIndex == (model.IsVirtual ? $parent.$index + model.FirstVisibleRow : $parent.$index) ? 'editCell' : 'clip'}\\r\\n                                    ${col.ColumnAlignment == 'CENTER' ? 'alignCenter' : ''}\\r\\n                                    ${col.ColumnAlignment == 'RIGHT' ? 'alignRight' : ''}\\r\\n                                    ${col.UseColDividers ? 'colDividers': ''}\\r\\n                                    ${model.UseRowDividers ? 'rowDividers': ''}\\\">\\r\\n            <!-- EDITOR TEMPLATES -->\\r\\n            <template if.bind=\\\"model.EditColIndex === $index && model.EditRowIndex === (model.IsVirtual ? $parent.$index + model.FirstVisibleRow : $parent.$index)\\\">\\r\\n                <template if.bind=\\\"col.EditorTemplate\\\">\\r\\n                    <compose view=\\\"${col.EditorTemplate}\\\" model.bind=\\\"model\\\"></compose>\\r\\n                </template>\\r\\n                <template else>\\r\\n                    <template if.bind=\\\"col.ColumnType == 'CHECKBOX'\\\">\\r\\n                        <template if.bind=\\\"col.d5\\\">\\r\\n                            <input if.bind=\\\"!col.AllowBooleanNull\\\" ref=\\\"col.InputElement1\\\" type=\\\"checkbox\\\" checked.one-way=\\\"row[col.d1][col.d2][col.d3][col.d4][col.d5]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.trigger=\\\"model.EditCheckBox(row,col,row[col.d1][col.d2][col.d3][col.d4][col.d5])\\\" />\\r\\n                            <input if.bind=\\\"col.AllowBooleanNull\\\" ref=\\\"col.InputElement1\\\" type=\\\"checkbox\\\" tri-state.two-way=\\\"row[col.d1][col.d2][col.d3][col.d4][col.d5]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.trigger=\\\"model.EditCheckBox(row,col,row[col.d1][col.d2][col.d3][col.d4][col.d5])\\\" />\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d4 && !col.d5\\\">\\r\\n                            <input if.bind=\\\"!col.AllowBooleanNull\\\" ref=\\\"col.InputElement1\\\" type=\\\"checkbox\\\" checked.one-way=\\\"row[col.d1][col.d2][col.d3][col.d4]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.trigger=\\\"model.EditCheckBox(row,col,row[col.d1][col.d2][col.d3][col.d4])\\\" />\\r\\n                            <input if.bind=\\\"col.AllowBooleanNull\\\" ref=\\\"col.InputElement1\\\" type=\\\"checkbox\\\" tri-state.two-way=\\\"row[col.d1][col.d2][col.d3][col.d4]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.trigger=\\\"model.EditCheckBox(row,col,row[col.d1][col.d2][col.d3][col.d4])\\\" />\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d3 && !col.d4\\\">\\r\\n                            <input if.bind=\\\"!col.AllowBooleanNull\\\" ref=\\\"col.InputElement1\\\" type=\\\"checkbox\\\" checked.one-way=\\\"row[col.d1][col.d2][col.d3]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.trigger=\\\"model.EditCheckBox(row,col,row[col.d1][col.d2][col.d3])\\\" />\\r\\n                            <input if.bind=\\\"col.AllowBooleanNull\\\" ref=\\\"col.InputElement1\\\" type=\\\"checkbox\\\" tri-state.two-way=\\\"row[col.d1][col.d2][col.d3]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.trigger=\\\"model.EditCheckBox(row,col,row[col.d1][col.d2][col.d3])\\\" />\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d2 && !col.d3\\\">\\r\\n                            <input if.bind=\\\"!col.AllowBooleanNull\\\" ref=\\\"col.InputElement1\\\" type=\\\"checkbox\\\" checked.one-way=\\\"row[col.d1][col.d2]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.trigger=\\\"model.EditCheckBox(row,col,row[col.d1][col.d2])\\\" />\\r\\n                            <input if.bind=\\\"col.AllowBooleanNull\\\" ref=\\\"col.InputElement1\\\" type=\\\"checkbox\\\" tri-state.two-way=\\\"row[col.d1][col.d2]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.trigger=\\\"model.EditCheckBox(row,col,row[col.d1][col.d2])\\\" />\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d1 && !col.d2\\\">\\r\\n                            <input if.bind=\\\"!col.AllowBooleanNull\\\" ref=\\\"col.InputElement1\\\" type=\\\"checkbox\\\" checked.bind=\\\"row[col.d1]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.delegate=\\\"model.CheckBoxClicked()\\\" />\\r\\n                            <input if.bind=\\\"col.AllowBooleanNull\\\" ref=\\\"col.InputElement1\\\" type=\\\"checkbox\\\" tri-state.two-way=\\\"row[col.d1]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.delegate=\\\"model.CheckBoxClicked()\\\" />\\r\\n                        </template>\\r\\n                    </template>\\r\\n                    <template if.bind=\\\"col.ColumnType=='STRING'\\\">\\r\\n                        <input class=\\\"${model.EditValidationError && model.EditValidationError != '' ? 'validationError' : ''}\\\"\\r\\n                               type=\\\"text\\\" value.t
82wo-way=\\\"model.EditValue\\\" focus.bind=\\\"model.NativeFocus\\\"\\r\\n                               title=\\\"${model.EditValidationError}\\\" ref=\\\"col.InputElement1\\\" />\\r\\n                    </template>\\r\\n                    <template if.bind=\\\"col.ColumnType=='NUMBER'\\\">\\r\\n                        <numeric-input value.two-way=\\\"model.EditValue\\\" focus.bind=\\\"model.NativeFocus\\\" ref=\\\"col.InputElement1\\\" allow-negative-values.bind=\\\"col.AllowNegativeValues\\\"\\r\\n                                       class=\\\"${model.EditValidationError && model.EditValidationError != '' ? 'validationError' : ''}\\\" title=\\\"${model.EditValidationError}\\\" />\\r\\n                        <!--\\r\\n                        <input type=\\\"number\\\" value.two-way=\\\"model.EditValue\\\" focus.bind=\\\"model.NativeFocus\\\" ref=\\\"col.InputElement1\\\"\\r\\n                                                    class=\\\"${model.EditValidationError && model.EditValidationError != '' ? 'validationError' : ''}\\\" title=\\\"${model.EditValidationError}\\\" />\\r\\n                        -->\\r\\n                    </template>\\r\\n                    <template if.bind=\\\"col.ColumnType=='DECIMAL'\\\">\\r\\n                        <numeric-input value.two-way=\\\"model.EditValue\\\" focus.bind=\\\"model.NativeFocus\\\" ref=\\\"col.InputElement1\\\" decimal-precision.bind=\\\"col.DecimalPrecision\\\" allow-negative-values.bind=\\\"col.AllowNegativeValues\\\"\\r\\n                                       class=\\\"${model.EditValidationError && model.EditValidationError != '' ? 'validationError' : ''}\\\" title=\\\"${model.EditValidationError}\\\" />\\r\\n                    </template>\\r\\n                    <template if.bind=\\\"col.ColumnType=='DATE'\\\">\\r\\n                        <input ref=\\\"col.InputElement1\\\" type=\\\"date\\\" value.bind=\\\"model.EditValueDateString\\\" style=\\\"${col.EditTime ? 'width: 50%;' : ''}\\\" class=\\\"${model.EditValidationError && model.EditValidationError != '' ? 'validationError' : ''}\\\" title=\\\"${model.EditValidationError}\\\" />\\r\\n                        <input ref=\\\"col.InputElement2\\\" if.bind=\\\"col.EditTime\\\" type=\\\"time\\\" value.bind=\\\"model.EditValueTimeString\\\" />\\r\\n                    </template>\\r\\n                    <template if.bind=\\\"col.ColumnType=='SIWIDATETIME'\\\">\\r\\n                        <input ref=\\\"col.InputElement1\\\" if.bind=\\\"col.HasDateEditingFormat\\\" type=\\\"date\\\" value.bind=\\\"model.EditValueDateString\\\"\\r\\n                               class=\\\"${model.EditValidationError && model.EditValidationError != '' ? 'validationError' : ''}\\\" title=\\\"${model.EditValidationError}\\\" />\\r\\n                        <input ref=\\\"col.InputElement2\\\" if.bind=\\\"col.EditTime\\\" type=\\\"time\\\" value.bind=\\\"model.EditValueTimeString\\\"\\r\\n                               class=\\\"${model.EditValidationError && model.EditValidationError != '' ? 'validationError' : ''}\\\" title=\\\"${model.EditValidationError}\\\" />\\r\\n                    </template>\\r\\n                    <!-- ACHTUNG: kein compose wenn option repeat.for, aurelia bug ?, ForeignKeyTemplate not supported in IE (wegen template repeat.for) -->\\r\\n                    <template if.bind=\\\"col.ColumnType=='FOREIGNKEY' && col.ForeignKeyTemplate\\\">\\r\\n                        <select ref=\\\"col.InputElement1\\\" value.bind=\\\"model.EditValue\\\">\\r\\n                            <option if.bind=\\\"col.ForeignAllowNull\\\">---</option>\\r\\n                            <template repeat.for=\\\"item of col.ForeignItems\\\">\\r\\n                                <option model.bind=\\\"item\\\"><compose view.bind=\\\"col.ForeignKeyTemplate\\\" model.bind=\\\"item\\\"></compose></option>\\r\\n                            </template>\\r\\n                        </select>\\r\\n                    </template>\\r\\n                    <template if.bind=\\\"col.ColumnType=='FOREIGNKEY' && !col.ForeignKeyTemplate\\\">\\r\\n                        <select ref=\\\"col.InputElement1\\\" value.bind=\\\"model.EditValue\\\">\\r\\n                            <option if.bind=\\\"col.ForeignAllowNull\\\">---</option>\\r\\n                            <option repeat.for=\\\"item of col.ForeignItems\\\" model.bind=\\\"item\\\">${item | foreignItem : col}</option>\\r\\n                        </select>\\r\\n                    </template>\\r\\n                    <template if.bind=\\\"col.ColumnType=='SORTORDER'\\\">\\r\\n                        <button type=\\\"button\\\" class=\\\"btn btn-default btn-xs\\\" style=\\\"padding: 1px 1px !important; line-height: 1.0; margin-bottom: 1px;\\\" click.trigger=\\\"model.ReSortUp(row)\\\" ref=\\\"InputElement1\\\" show.bind=\\\"$parent.$index != 0 || model.FirstVisibleRow != 0\\\">\\r\\n                            <i class=\\\"fas fa-arrow-up\\\"></i>\\r\\n                        </button>\\r\\n                        <button type=\\\"button\\\" class=\\\"btn btn-default btn-xs\\\" style=\\\"padding: 1px 1px !important; line-height: 1.0; margin-bottom: 1px;\\\" click.trigger=\\\"model.ReSortDown(row)\\\" ref=\\\"InputElement2\\\" show.bind=\\\"$parent.$index < model.DataSource.length - 1\\\">\\r\\n                            <i class=\\\"fas fa-arrow-down\\\"></i>\\r\\n                        </button>\\r\\n                    </template>\\r\\n                </template>\\r\\n            </template>\\r\\n            <!-- ENDE EDITOR TEMPLATES -->\\r\\n            <!-- VIEW TEMPLATES -->\\r\\n            <template if.bind=\\\"model.EditColIndex !== $index || model.EditRowIndex !== (model.IsVirtual ? $parent.$index + model.FirstVisibleRow : $parent.$index)\\\">\\r\\n                <template if.bind=\\\"col.ViewTemplate\\\">\\r\\n                    <compose view=\\\"${col.ViewTemplate}\\\" model.bind=\\\"row\\\"></compose>\\r\\n                </template>\\r\\n                <template else>\\r\\n                    <template if.bind=\\\"col.ColumnType == 'CHECKBOX'\\\">\\r\\n                        <template if.bind=\\\"col.d5\\\">\\r\\n                            <input if.bind=\\\"!col.AllowBooleanNull\\\" type=\\\"checkbox\\\" checked.one-way=\\\"row[col.d1][col.d2][col.d3][col.d4][col.d5]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.trigger=\\\"model.EditCheckBox(row,col,row[col.d1][col.d2][col.d3][col.d4][col.d5])\\\" />\\r\\n                            <input if.bind=\\\"col.AllowBooleanNull\\\" type=\\\"checkbox\\\" tri-state.bind=\\\"row[col.d1][col.d2][col.d3][col.d4][col.d5]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.trigger=\\\"model.EditCheckBox(row,col,row[col.d1][col.d2][col.d3][col.d4][col.d5])\\\" />\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d4 && !col.d5\\\">\\r\\n                            <input if.bind=\\\"!col.AllowBooleanNull\\\" type=\\\"checkbox\\\" checked.one-way=\\\"row[col.d1][col.d2][col.d3][col.d4]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.trigger=\\\"model.EditCheckBox(row,col,row[col.d1][col.d2][col.d3][col.d4])\\\" />\\r\\n                            <input if.bind=\\\"col.AllowBooleanNull\\\" type=\\\"checkbox\\\" tri-state.bind=\\\"row[col.d1][col.d2][col.d3][col.d4]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.trigger=\\\"model.EditCheckBox(row,col,row[col.d1][col.d2][col.d3][col.d4])\\\" />\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d3 && !col.d4\\\">\\r\\n                            <input if.bind=\\\"!col.AllowBooleanNull\\\" type=\\\"checkbox\\\" checked.one-way=\\\"row[col.d1][col.d2][col.d3]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.trigger=\\\"model.EditCheckBox(row,col,row[col.d1][col.d2][col.d3])\\\" />\\r\\n                            <input if.bind=\\\"col.AllowBooleanNull\\\" type=\\\"checkbox\\\" tri-state.bind=\\\"row[col.d1][col.d2][col.d3]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.trigger=\\\"model.EditCheckBox(row,col,row[col.d1][col.d2][col.d3])\\\" />\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d2 && !col.d3\\\">\\r\\n                            <input if.bind=\\\"!col.AllowBooleanNull\\\" type=\\\"checkbox\\\" checked.one-way=\\\"row[col.d1][col.d2]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.trigger=\\\"model.EditCheckBox(row,col,row[col.d1][col.d2])\\\" />\\r\\n                            <input if.bind=\\\"col.AllowBooleanNull\\\" type=\\\"checkbox\\\" tri-state.bind=\\\"row[col.d1][col.d2]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.trigger=\\\"model.EditCheckBox(row,col,row[col.d1][col.d2])\\\" />\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d1 && !col.d2\\\">\\r\\n                            <input if.bind=\\\"!col.AllowBooleanNull\\\" type=\\\"checkbox\\\" checked.bind=\\\"row[col.d1]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.delegate=\\\"model.CheckBoxClicked()\\\" />\\r\\n                            <input if.bind=\\\"col.AllowBooleanNull\\\" type=\\\"checkbox\\\" tri-state.bind=\\\"row[col.d1]\\\" disabled.bind=\\\"!model.CanEdit || !col.Editable\\\" click.delegate=\\\"model.CheckBoxClicked()\\\" />\\r\\n                        </template>\\r\\n                    </template>\\r\\n\\r\\n                    <template if.bind=\\\"col.ColumnType == 'FOREIGNKEY'\\\">
82\\r\\n                        <span if.bind=\\\"col.d5\\\" textcontent.bind=\\\"row | foreignKey:col:row[col.d1][col.d2][col.d3][col.d4][col.d5]\\\"></span>\\r\\n                        <span if.bind=\\\"col.d4 && !col.d5\\\" textcontent.bind=\\\"row | foreignKey:col:row[col.d1][col.d2][col.d3][col.d4]\\\"></span>\\r\\n                        <span if.bind=\\\"col.d3 && !col.d4\\\" textcontent.bind=\\\"row | foreignKey:col:row[col.d1][col.d2][col.d3]\\\"></span>\\r\\n                        <span if.bind=\\\"col.d2 && !col.d3\\\" textcontent.bind=\\\"row | foreignKey:col:row[col.d1][col.d2]\\\"></span>\\r\\n                        <span if.bind=\\\"col.d1 && !col.d2\\\" textcontent.bind=\\\"row | foreignKey:col:row[col.d1]\\\"></span>\\r\\n                    </template>\\r\\n                    <template if.bind=\\\"col.ColumnType=='DECIMAL'\\\">\\r\\n                        <template if.bind=\\\"col.d5\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3][col.d4][col.d5] | decimalFormat:col\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d4 && !col.d5\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3][col.d4] | decimalFormat:col\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d3 && !col.d4\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3] | decimalFormat:col\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d2 && !col.d3\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2] | decimalFormat:col\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d1 && !col.d2\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1] | decimalFormat:col\\\"></span>\\r\\n                        </template>\\r\\n                    </template>\\r\\n                    <template if.bind=\\\"col.ColumnType=='STRING' || col.ColumnType=='NUMBER' || (col.ColumnType=='SORTORDER' && !model.CanEdit)\\\">\\r\\n                        <template if.bind=\\\"col.d5\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3][col.d4][col.d5]\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d4 && !col.d5\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3][col.d4]\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d3 && !col.d4\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3]\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d2 && !col.d3\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2]\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d1 && !col.d2\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1]\\\"></span>\\r\\n                        </template>\\r\\n                    </template>\\r\\n                    <template if.bind=\\\"col.ColumnType=='DATE'\\\">\\r\\n                        <template if.bind=\\\"col.d5\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3][col.d4][col.d5] | dateFormat : col.Format\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d4 && !col.d5\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3][col.d4] | dateFormat : col.Format\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d3 && !col.d4\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3] | dateFormat : col.Format\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d2 && !col.d3\\\">
82\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2] | dateFormat : col.Format\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d1 && !col.d2\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1] | dateFormat : col.Format\\\"></span>\\r\\n                        </template>\\r\\n                    </template>\\r\\n                    <template if.bind=\\\"col.ColumnType=='SIWIDATETIME'\\\">\\r\\n                        <template if.bind=\\\"col.d5\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3][col.d4][col.d5] | datetimeFormat : col.Format\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d4 && !col.d5\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3][col.d4] | datetimeFormat : col.Format\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d3 && !col.d4\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3] | datetimeFormat : col.Format\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d2 && !col.d3\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2] | datetimeFormat : col.Format\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d1 && !col.d2\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1] | datetimeFormat : col.Format\\\"></span>\\r\\n                        </template>\\r\\n                    </template>\\r\\n                    <template if.bind=\\\"col.ColumnType=='SIWINETTIME'\\\">\\r\\n                        <template if.bind=\\\"col.d5\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3][col.d4][col.d5] | netTime : col.TimePrecision\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d4 && !col.d5\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3][col.d4] | netTime : col.TimePrecision\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d3 && !col.d4\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3] | netTime : col.TimePrecision\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d2 && !col.d3\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2] | netTime : col.TimePrecision\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d1 && !col.d2\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1] | netTime : col.TimePrecision\\\"></span>\\r\\n                        </template>\\r\\n                    </template>\\r\\n                    <template if.bind=\\\"col.ColumnType=='SIWINETPOINTS'\\\">\\r\\n                        <template if.bind=\\\"col.d5\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3][col.d4][col.d5] | netPoints : col.TimePrecision\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d4 && !col.d5\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3][col.d4] | netPoints : col.TimePrecision\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d3 && !col.d4\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2][col.d3] | netPoints : col.TimePrecision\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d2 && !col.d3\\\">\\r\\n                            <span textcontent.bind=\\\"row[col.d1][col.d2] | netPoints : col.TimePrecision\\\"></span>\\r\\n                        </template>\\r\\n                        <template if.bind=\\\"col.d1 && !col.d2\\\">
82\\r\\n                            <span textcontent.bind=\\\"row[col.d1] | netPoints : col.TimePrecision\\\"></span>\\r\\n                        </template>\\r\\n                    </template>\\r\\n                    <template if.bind=\\\"col.ColumnType=='SORTORDER' && model.CanEdit\\\">\\r\\n                        <button type=\\\"button\\\" class=\\\"btn btn-default btn-xs\\\" style=\\\"padding: 1px 1px !important; line-height: 1.0; margin-bottom: 1px;\\\" click.trigger=\\\"model.ReSortUp(row)\\\" ref=\\\"InputElement1\\\" show.bind=\\\"$parent.$index != 0 || model.FirstVisibleRow != 0\\\">\\r\\n                            <i class=\\\"fas fa-arrow-up\\\"></i>\\r\\n                        </button>\\r\\n                        <button type=\\\"button\\\" class=\\\"btn btn-default btn-xs\\\" style=\\\"padding: 1px 1px !important; line-height: 1.0; margin-bottom: 1px;\\\" click.trigger=\\\"model.ReSortDown(row)\\\" ref=\\\"InputElement2\\\" show.bind=\\\"$parent.$index < model.DataSource.length - 1\\\">\\r\\n                            <i class=\\\"fas fa-arrow-down\\\"></i>\\r\\n                        </button>\\r\\n                    </template>\\r\\n                </template>\\r\\n            </template>\\r\\n\\r\\n            <!-- ENDE VIEW TEMPLATES -->\\r\\n        </td>\\r\\n    </template>\\r\\n\\r\\n</template>\\r\\n\";//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQHNpd2lkYXRhL3Npd2l1aS9ncmlkLXJvdy1jZWxscy5odG1sLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzaXdpZGF0YS9zaXdpdWkvZGlzdC9ncmlkLXJvdy1jZWxscy5odG1sPzJkODUiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBcIjx0ZW1wbGF0ZSBjb250YWluZXJsZXNzPlxcclxcbiAgICA8cmVxdWlyZSBmcm9tPVxcXCIuL2dyaWQtc29ydFxcXCIgY29udGFpbmVybGVzcz48L3JlcXVpcmU+XFxyXFxuICAgIDxyZXF1aXJlIGZyb209XFxcIi4vZ3JpZC1maWx0ZXJcXFwiIGNvbnRhaW5lcmxlc3M+PC9yZXF1aXJlPlxcclxcbiAgICA8cmVxdWlyZSBmcm9tPVxcXCIuL2dyaWQtZm9yZWlnbmtleVxcXCIgY29udGFpbmVybGVzcz48L3JlcXVpcmU+XFxyXFxuICAgIDxyZXF1aXJlIGZyb209XFxcIi4vZ3JpZC1mb3JlaWduaXRlbVxcXCIgY29udGFpbmVybGVzcz48L3JlcXVpcmU+XFxyXFxuICAgIDxyZXF1aXJlIGZyb209XFxcIi4vZGVjaW1hbC1mb3JtYXRcXFwiPjwvcmVxdWlyZT5cXHJcXG4gICAgPHJlcXVpcmUgZnJvbT1cXFwiLi90cmktc3RhdGUtY2hlY2tib3gtY3VzdG9tLWF0dHJpYnV0ZVxcXCIgY29udGFpbmVybGVzcz48L3JlcXVpcmU+XFxyXFxuICAgIDxyZXF1aXJlIGZyb209XFxcIi4vZWRpdG9ycy9udW1lcmljLWlucHV0XFxcIj48L3JlcXVpcmU+XFxyXFxuICAgIDxyZXF1aXJlIGZyb209XFxcIkBzaXdpZGF0YS9jb252ZXJ0ZXJzL2RhdGUtZm9ybWF0XFxcIiBjb250YWluZXJsZXNzPjwvcmVxdWlyZT5cXHJcXG4gICAgPHJlcXVpcmUgZnJvbT1cXFwiQHNpd2lkYXRhL2NvbnZlcnRlcnMvZGF0ZXRpbWUtZm9ybWF0XFxcIiBjb250YWluZXJsZXNzPjwvcmVxdWlyZT5cXHJcXG4gICAgPHJlcXVpcmUgZnJvbT1cXFwiQHNpd2lkYXRhL2NvbnZlcnRlcnMvbmV0LXRpbWVcXFwiIGNvbnRhaW5lcmxlc3M+PC9yZXF1aXJlPlxcclxcbiAgICA8cmVxdWlyZSBmcm9tPVxcXCJAc2l3aWRhdGEvY29udmVydGVycy9uZXQtcG9pbnRzXFxcIiBjb250YWluZXJsZXNzPjwvcmVxdWlyZT5cXHJcXG4gICAgPHJlcXVpcmUgZnJvbT1cXFwiLi9saW1pdC1sb29wXFxcIiBjb250YWluZXJsZXNzPjwvcmVxdWlyZT5cXHJcXG4gICAgXFxyXFxuICAgIDx0ZW1wbGF0ZSByZXBlYXQuZm9yPVxcXCJjb2wgb2YgbW9kZWwuQWN0aXZlQ29sdW1uc1xcXCIgY29udGFpbmVybGVzcz5cXHJcXG4gICAgICAgIDx0ZCBjbGljay50cmlnZ2VyPVxcXCJtb2RlbC5DZWxsQ2xpY2tlZCgkZXZlbnQsbW9kZWwuSXNWaXJ0dWFsID8gJHBhcmVudC4kaW5kZXggKyBtb2RlbC5GaXJzdFZpc2libGVSb3cgOiAkcGFyZW50LiRpbmRleCwkaW5kZXgpXFxcIlxcclxcbiAgICAgICAgICAgIGNzcz1cXFwibWluLXdpZHRoOiAke2NvbC51c2VXaWR0aH07bWF4LXdpZHRoOiAke2NvbC51c2VXaWR0aH0gXFxcIlxcclxcbiAgICAgICAgICAgIGNsYXNzPVxcXCIke21vZGVsLkN1cnJlbnRDb2xJbmRleD09JGluZGV4ICYmIG1vZGVsLm1DdXJyZW50Um93SW5kZXggPT0gKG1vZGVsLklzVmlydHVhbCA/ICRwYXJlbnQuJGluZGV4ICsgbW9kZWwuRmlyc3RWaXNpYmxlUm93IDogJHBhcmVudC4kaW5kZXgpID8gJ2FjdGl2ZUNlbGwnIDogJyd9XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHttb2RlbC5FZGl0Q29sSW5kZXg9PSRpbmRleCAmJiBtb2RlbC5FZGl0Um93SW5kZXggPT0gKG1vZGVsLklzVmlydHVhbCA/ICRwYXJlbnQuJGluZGV4ICsgbW9kZWwuRmlyc3RWaXNpYmxlUm93IDogJHBhcmVudC4kaW5kZXgpID8gJ2VkaXRDZWxsJyA6ICdjbGlwJ31cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2NvbC5Db2x1bW5BbGlnbm1lbnQgPT0gJ0NFTlRFUicgPyAnYWxpZ25DZW50ZXInIDogJyd9XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtjb2wuQ29sdW1uQWxpZ25tZW50ID09ICdSSUdIVCcgPyAnYWxpZ25SaWdodCcgOiAnJ31cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2NvbC5Vc2VDb2xEaXZpZGVycyA/ICdjb2xEaXZpZGVycyc6ICcnfVxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7bW9kZWwuVXNlUm93RGl2aWRlcnMgPyAncm93RGl2aWRlcnMnOiAnJ31cXFwiPlxcclxcbiAgICAgICAgICAgIDwhLS0gRURJVE9SIFRFTVBMQVRFUyAtLT5cXHJcXG4gICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwibW9kZWwuRWRpdENvbEluZGV4ID09PSAkaW5kZXggJiYgbW9kZWwuRWRpdFJvd0luZGV4ID09PSAobW9kZWwuSXNWaXJ0dWFsID8gJHBhcmVudC4kaW5kZXggKyBtb2RlbC5GaXJzdFZpc2libGVSb3cgOiAkcGFyZW50LiRpbmRleClcXFwiPlxcclxcbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLkVkaXRvclRlbXBsYXRlXFxcIj5cXHJcXG4gICAgICAgICAgICAgICAgICAgIDxjb21wb3NlIHZpZXc9XFxcIiR7Y29sLkVkaXRvclRlbXBsYXRlfVxcXCIgbW9kZWwuYmluZD1cXFwibW9kZWxcXFwiPjwvY29tcG9zZT5cXHJcXG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlIGVsc2U+XFxyXFxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLkNvbHVtblR5cGUgPT0gJ0NIRUNLQk9YJ1xcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmLmJpbmQ9XFxcImNvbC5kNVxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZi5iaW5kPVxcXCIhY29sLkFsbG93Qm9vbGVhbk51bGxcXFwiIHJlZj1cXFwiY29sLklucHV0RWxlbWVudDFcXFwiIHR5cGU9XFxcImNoZWNrYm94XFxcIiBjaGVja2VkLm9uZS13YXk9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVtjb2wuZDRdW2NvbC5kNV1cXFwiIGRpc2FibGVkLmJpbmQ9XFxcIiFtb2RlbC5DYW5FZGl0IHx8ICFjb2wuRWRpdGFibGVcXFwiIGNsaWNrLnRyaWdnZXI9XFxcIm1vZGVsLkVkaXRDaGVja0JveChyb3csY29sLHJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVtjb2wuZDRdW2NvbC5kNV0pXFxcIiAvPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWYuYmluZD1cXFwiY29sLkFsbG93Qm9vbGVhbk51bGxcXFwiIHJlZj1cXFwiY29sLklucHV0RWxlbWVudDFcXFwiIHR5cGU9XFxcImNoZWNrYm94XFxcIiB0cmktc3RhdGUudHdvLXdheT1cXFwicm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdW2NvbC5kNF1bY29sLmQ1XVxcXCIgZGlzYWJsZWQuYmluZD1cXFwiIW1vZGVsLkNhbkVkaXQgfHwgIWNvbC5FZGl0YWJsZVxcXCIgY2xpY2sudHJpZ2dlcj1cXFwibW9kZWwuRWRpdENoZWNrQm94KHJvdyxjb2wscm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdW2NvbC5kNF1bY29sLmQ1XSlcXFwiIC8+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLmQ0ICYmICFjb2wuZDVcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWYuYmluZD1cXFwiIWNvbC5BbGxvd0Jvb2xlYW5OdWxsXFxcIiByZWY9XFxcImNvbC5JbnB1dEVsZW1lbnQ
82xXFxcIiB0eXBlPVxcXCJjaGVja2JveFxcXCIgY2hlY2tlZC5vbmUtd2F5PVxcXCJyb3dbY29sLmQxXVtjb2wuZDJdW2NvbC5kM11bY29sLmQ0XVxcXCIgZGlzYWJsZWQuYmluZD1cXFwiIW1vZGVsLkNhbkVkaXQgfHwgIWNvbC5FZGl0YWJsZVxcXCIgY2xpY2sudHJpZ2dlcj1cXFwibW9kZWwuRWRpdENoZWNrQm94KHJvdyxjb2wscm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdW2NvbC5kNF0pXFxcIiAvPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWYuYmluZD1cXFwiY29sLkFsbG93Qm9vbGVhbk51bGxcXFwiIHJlZj1cXFwiY29sLklucHV0RWxlbWVudDFcXFwiIHR5cGU9XFxcImNoZWNrYm94XFxcIiB0cmktc3RhdGUudHdvLXdheT1cXFwicm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdW2NvbC5kNF1cXFwiIGRpc2FibGVkLmJpbmQ9XFxcIiFtb2RlbC5DYW5FZGl0IHx8ICFjb2wuRWRpdGFibGVcXFwiIGNsaWNrLnRyaWdnZXI9XFxcIm1vZGVsLkVkaXRDaGVja0JveChyb3csY29sLHJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVtjb2wuZDRdKVxcXCIgLz5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuZDMgJiYgIWNvbC5kNFxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZi5iaW5kPVxcXCIhY29sLkFsbG93Qm9vbGVhbk51bGxcXFwiIHJlZj1cXFwiY29sLklucHV0RWxlbWVudDFcXFwiIHR5cGU9XFxcImNoZWNrYm94XFxcIiBjaGVja2VkLm9uZS13YXk9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVxcXCIgZGlzYWJsZWQuYmluZD1cXFwiIW1vZGVsLkNhbkVkaXQgfHwgIWNvbC5FZGl0YWJsZVxcXCIgY2xpY2sudHJpZ2dlcj1cXFwibW9kZWwuRWRpdENoZWNrQm94KHJvdyxjb2wscm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdKVxcXCIgLz5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlmLmJpbmQ9XFxcImNvbC5BbGxvd0Jvb2xlYW5OdWxsXFxcIiByZWY9XFxcImNvbC5JbnB1dEVsZW1lbnQxXFxcIiB0eXBlPVxcXCJjaGVja2JveFxcXCIgdHJpLXN0YXRlLnR3by13YXk9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVxcXCIgZGlzYWJsZWQuYmluZD1cXFwiIW1vZGVsLkNhbkVkaXQgfHwgIWNvbC5FZGl0YWJsZVxcXCIgY2xpY2sudHJpZ2dlcj1cXFwibW9kZWwuRWRpdENoZWNrQm94KHJvdyxjb2wscm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdKVxcXCIgLz5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuZDIgJiYgIWNvbC5kM1xcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZi5iaW5kPVxcXCIhY29sLkFsbG93Qm9vbGVhbk51bGxcXFwiIHJlZj1cXFwiY29sLklucHV0RWxlbWVudDFcXFwiIHR5cGU9XFxcImNoZWNrYm94XFxcIiBjaGVja2VkLm9uZS13YXk9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl1cXFwiIGRpc2FibGVkLmJpbmQ9XFxcIiFtb2RlbC5DYW5FZGl0IHx8ICFjb2wuRWRpdGFibGVcXFwiIGNsaWNrLnRyaWdnZXI9XFxcIm1vZGVsLkVkaXRDaGVja0JveChyb3csY29sLHJvd1tjb2wuZDFdW2NvbC5kMl0pXFxcIiAvPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWYuYmluZD1cXFwiY29sLkFsbG93Qm9vbGVhbk51bGxcXFwiIHJlZj1cXFwiY29sLklucHV0RWxlbWVudDFcXFwiIHR5cGU9XFxcImNoZWNrYm94XFxcIiB0cmktc3RhdGUudHdvLXdheT1cXFwicm93W2NvbC5kMV1bY29sLmQyXVxcXCIgZGlzYWJsZWQuYmluZD1cXFwiIW1vZGVsLkNhbkVkaXQgfHwgIWNvbC5FZGl0YWJsZVxcXCIgY2xpY2sudHJpZ2dlcj1cXFwibW9kZWwuRWRpdENoZWNrQm94KHJvdyxjb2wscm93W2NvbC5kMV1bY29sLmQyXSlcXFwiIC8+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLmQxICYmICFjb2wuZDJcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWYuYmluZD1cXFwiIWNvbC5BbGxvd0Jvb2xlYW5OdWxsXFxcIiByZWY9XFxcImNvbC5JbnB1dEVsZW1lbnQxXFxcIiB0eXBlPVxcXCJjaGVja2JveFxcXCIgY2hlY2tlZC5iaW5kPVxcXCJyb3dbY29sLmQxXVxcXCIgZGlzYWJsZWQuYmluZD1cXFwiIW1vZGVsLkNhbkVkaXQgfHwgIWNvbC5FZGl0YWJsZVxcXCIgY2xpY2suZGVsZWdhdGU9XFxcIm1vZGVsLkNoZWNrQm94Q2xpY2tlZCgpXFxcIiAvPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWYuYmluZD1cXFwiY29sLkFsbG93Qm9vbGVhbk51bGxcXFwiIHJlZj1cXFwiY29sLklucHV0RWxlbWVudDFcXFwiIHR5cGU9XFxcImNoZWNrYm94XFxcIiB0cmktc3RhdGUudHdvLXdheT1cXFwicm93W2NvbC5kMV1cXFwiIGRpc2FibGVkLmJpbmQ9XFxcIiFtb2RlbC5DYW5FZGl0IHx8ICFjb2wuRWRpdGFibGVcXFwiIGNsaWNrLmRlbGVnYXRlPVxcXCJtb2RlbC5DaGVja0JveENsaWNrZWQoKVxcXCIgLz5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuQ29sdW1uVHlwZT09J1NUUklORydcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cXFwiJHttb2RlbC5FZGl0VmFsaWRhdGlvbkVycm9yICYmIG1vZGVsLkVkaXRWYWxpZGF0aW9uRXJyb3IgIT0gJycgPyAndmFsaWRhdGlvbkVycm9yJyA6ICcnfVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cXFwidGV4dFxcXCIgdmFsdWUud
82HdvLXdheT1cXFwibW9kZWwuRWRpdFZhbHVlXFxcIiBmb2N1cy5iaW5kPVxcXCJtb2RlbC5OYXRpdmVGb2N1c1xcXCJcXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XFxcIiR7bW9kZWwuRWRpdFZhbGlkYXRpb25FcnJvcn1cXFwiIHJlZj1cXFwiY29sLklucHV0RWxlbWVudDFcXFwiIC8+XFxyXFxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmLmJpbmQ9XFxcImNvbC5Db2x1bW5UeXBlPT0nTlVNQkVSJ1xcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPG51bWVyaWMtaW5wdXQgdmFsdWUudHdvLXdheT1cXFwibW9kZWwuRWRpdFZhbHVlXFxcIiBmb2N1cy5iaW5kPVxcXCJtb2RlbC5OYXRpdmVGb2N1c1xcXCIgcmVmPVxcXCJjb2wuSW5wdXRFbGVtZW50MVxcXCIgYWxsb3ctbmVnYXRpdmUtdmFsdWVzLmJpbmQ9XFxcImNvbC5BbGxvd05lZ2F0aXZlVmFsdWVzXFxcIlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCIke21vZGVsLkVkaXRWYWxpZGF0aW9uRXJyb3IgJiYgbW9kZWwuRWRpdFZhbGlkYXRpb25FcnJvciAhPSAnJyA/ICd2YWxpZGF0aW9uRXJyb3InIDogJyd9XFxcIiB0aXRsZT1cXFwiJHttb2RlbC5FZGl0VmFsaWRhdGlvbkVycm9yfVxcXCIgLz5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tXFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcIm51bWJlclxcXCIgdmFsdWUud
82HdvLXdheT1cXFwibW9kZWwuRWRpdFZhbHVlXFxcIiBmb2N1cy5iaW5kPVxcXCJtb2RlbC5OYXRpdmVGb2N1c1xcXCIgcmVmPVxcXCJjb2wuSW5wdXRFbGVtZW50MVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XFxcIiR7bW9kZWwuRWRpdFZhbGlkYXRpb25FcnJvciAmJiBtb2RlbC5FZGl0VmFsaWRhdGlvbkVycm9yICE9ICcnID8gJ3ZhbGlkYXRpb25FcnJvcicgOiAnJ31cXFwiIHRpdGxlPVxcXCIke21vZGVsLkVkaXRWYWxpZGF0aW9uRXJyb3J9XFxcIiAvPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIC0tPlxcclxcbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuQ29sdW1uVHlwZT09J0RFQ0lNQUwnXFxcIj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8bnVtZXJpYy1pbnB1dCB2YWx1ZS50d28td2F5PVxcXCJtb2RlbC5FZGl0VmFsdWVcXFwiIGZvY3VzLmJpbmQ9XFxcIm1vZGVsLk5hdGl2ZUZvY3VzXFxcIiByZWY9XFxcImNvbC5JbnB1dEVsZW1lbnQxXFxcIiBkZWNpbWFsLXByZWNpc2lvbi5iaW5kPVxcXCJjb2wuRGVjaW1hbFByZWNpc2lvblxcXCIgYWxsb3ctbmVnYXRpdmUtdmFsdWVzLmJpbmQ9XFxcImNvbC5BbGxvd05lZ2F0aXZlVmFsdWVzXFxcIlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCIke21vZGVsLkVkaXRWYWxpZGF0aW9uRXJyb3IgJiYgbW9kZWwuRWRpdFZhbGlkYXRpb25FcnJvciAhPSAnJyA/ICd2YWxpZGF0aW9uRXJyb3InIDogJyd9XFxcIiB0aXRsZT1cXFwiJHttb2RlbC5FZGl0VmFsaWRhdGlvbkVycm9yfVxcXCIgLz5cXHJcXG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLkNvbHVtblR5cGU9PSdEQVRFJ1xcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHJlZj1cXFwiY29sLklucHV0RWxlbWVudDFcXFwiIHR5cGU9XFxcImRhdGVcXFwiIHZhbHVlLmJpbmQ9XFxcIm1vZGVsLkVkaXRWYWx1ZURhdGVTdHJpbmdcXFwiIHN0eWxlPVxcXCIke2NvbC5FZGl0VGltZSA/ICd3aWR0aDogNTAlOycgOiAnJ31cXFwiIGNsYXNzPVxcXCIke21vZGVsLkVkaXRWYWxpZGF0aW9uRXJyb3IgJiYgbW9kZWwuRWRpdFZhbGlkYXRpb25FcnJvciAhPSAnJyA/ICd2YWxpZGF0aW9uRXJyb3InIDogJyd9XFxcIiB0aXRsZT1cXFwiJHttb2RlbC5FZGl0VmFsaWRhdGlvbkVycm9yfVxcXCIgLz5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcmVmPVxcXCJjb2wuSW5wdXRFbGVtZW50MlxcXCIgaWYuYmluZD1cXFwiY29sLkVkaXRUaW1lXFxcIiB0eXBlPVxcXCJ0aW1lXFxcIiB2YWx1ZS5iaW5kPVxcXCJtb2RlbC5FZGl0VmFsdWVUaW1lU3RyaW5nXFxcIiAvPlxcclxcbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuQ29sdW1uVHlwZT09J1NJV0lEQVRFVElNRSdcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCByZWY9XFxcImNvbC5JbnB1dEVsZW1lbnQxXFxcIiBpZi5iaW5kPVxcXCJjb2wuSGFzRGF0ZUVkaXRpbmdGb3JtYXRcXFwiIHR5cGU9XFxcImRhdGVcXFwiIHZhbHVlLmJpbmQ9XFxcIm1vZGVsLkVkaXRWYWx1ZURhdGVTdHJpbmdcXFwiXFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVxcXCIke21vZGVsLkVkaXRWYWxpZGF0aW9uRXJyb3IgJiYgbW9kZWwuRWRpdFZhbGlkYXRpb25FcnJvciAhPSAnJyA/ICd2YWxpZGF0aW9uRXJyb3InIDogJyd9XFxcIiB0aXRsZT1cXFwiJHttb2RlbC5FZGl0VmFsaWRhdGlvbkVycm9yfVxcXCIgLz5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcmVmPVxcXCJjb2wuSW5wdXRFbGVtZW50MlxcXCIgaWYuYmluZD1cXFwiY29sLkVkaXRUaW1lXFxcIiB0eXBlPVxcXCJ0aW1lXFxcIiB2YWx1ZS5iaW5kPVxcXCJtb2RlbC5FZGl0VmFsdWVUaW1lU3RyaW5nXFxcIlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cXFwiJHttb2RlbC5FZGl0VmFsaWRhdGlvbkVycm9yICYmIG1vZGVsLkVkaXRWYWxpZGF0aW9uRXJyb3IgIT0gJycgPyAndmFsaWRhdGlvbkVycm9yJyA6ICcnfVxcXCIgdGl0bGU9XFxcIiR7bW9kZWwuRWRpdFZhbGlkYXRpb25FcnJvcn1cXFwiIC8+XFxyXFxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBBQ0hUVU5HOiBrZWluIGNvbXBvc2Ugd2VubiBvcHRpb24gcmVwZWF0LmZvciwgYXVyZWxpYSBidWcgPywgRm9yZWlnbktleVRlbXBsYXRlIG5vdCBzdXBwb3J0ZWQgaW4gSUUgKHdlZ2VuIHRlbXBsYXRlIHJlcGVhdC5mb3IpIC0tPlxcclxcbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmLmJpbmQ9XFxcImNvbC5Db2x1bW5UeXBlPT0nRk9SRUlHTktFWScgJiYgY29sLkZvcmVpZ25LZXlUZW1wbGF0ZVxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCByZWY9XFxcImNvbC5JbnB1dEVsZW1lbnQxXFxcIiB2YWx1ZS5iaW5kPVxcXCJtb2RlbC5FZGl0VmFsdWVcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGlmLmJpbmQ9XFxcImNvbC5Gb3JlaWduQWxsb3dOdWxsXFxcIj4tLS08L29wdGlvbj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIHJlcGVhdC5mb3I9XFxcIml0ZW0gb2YgY29sLkZvcmVpZ25JdGVtc1xcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIG1vZGVsLmJpbmQ9XFxcIml0ZW1cXFwiPjxjb21wb3NlIHZpZXcuYmluZD1cXFwiY29sLkZvcmVpZ25LZXlUZW1wbGF0ZVxcXCIgbW9kZWwuYmluZD1cXFwiaXRlbVxcXCI+PC9jb21wb3NlPjwvb3B0aW9uPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxcclxcbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuQ29sdW1uVHlwZT09J0ZPUkVJR05LRVknICYmICFjb2wuRm9yZWlnbktleVRlbXBsYXRlXFxcIj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IHJlZj1cXFwiY29sLklucHV0RWxlbWVudDFcXFwiIHZhbHVlLmJpbmQ9XFxcIm1vZGVsLkVkaXRWYWx1ZVxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gaWYuYmluZD1cXFwiY29sLkZvcmVpZ25BbGxvd051bGxcXFwiPi0tLTwvb3B0aW9uPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHJlcGVhdC5mb3I9XFxcIml0ZW0gb2YgY29sLkZvcmVpZ25JdGVtc1xcXCIgbW9kZWwuYmluZD1cXFwiaXRlbVxcXCI+JHtpdGVtIHwgZm9yZWlnbkl0ZW0gOiBjb2x9PC9vcHRpb24+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XFxyXFxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmLmJpbmQ9XFxcImNvbC5Db2x1bW5UeXBlPT0nU09
82SVE9SREVSJ1xcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLWRlZmF1bHQgYnRuLXhzXFxcIiBzdHlsZT1cXFwicGFkZGluZzogMXB4IDFweCAhaW1wb3J0YW50OyBsaW5lLWhlaWdodDogMS4wOyBtYXJnaW4tYm90dG9tOiAxcHg7XFxcIiBjbGljay50cmlnZ2VyPVxcXCJtb2RlbC5SZVNvcnRVcChyb3cpXFxcIiByZWY9XFxcIklucHV0RWxlbWVudDFcXFwiIHNob3cuYmluZD1cXFwiJHBhcmVudC4kaW5kZXggIT0gMCB8fCBtb2RlbC5GaXJzdFZpc2libGVSb3cgIT0gMFxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVxcXCJmYXMgZmEtYXJyb3ctdXBcXFwiPjwvaT5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImJ0biBidG4tZGVmYXVsdCBidG4teHNcXFwiIHN0eWxlPVxcXCJwYWRkaW5nOiAxcHggMXB4ICFpbXBvcnRhbnQ7IGxpbmUtaGVpZ2h0OiAxLjA7IG1hcmdpbi1ib3R0b206IDFweDtcXFwiIGNsaWNrLnRyaWdnZXI9XFxcIm1vZGVsLlJlU29ydERvd24ocm93KVxcXCIgcmVmPVxcXCJJbnB1dEVsZW1lbnQyXFxcIiBzaG93LmJpbmQ9XFxcIiRwYXJlbnQuJGluZGV4IDwgbW9kZWwuRGF0YVNvdXJjZS5sZW5ndGggLSAxXFxcIj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XFxcImZhcyBmYS1hcnJvdy1kb3duXFxcIj48L2k+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxyXFxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgICAgPCEtLSBFTkRFIEVESVRPUiBURU1QTEFURVMgLS0+XFxyXFxuICAgICAgICAgICAgPCEtLSBWSUVXIFRFTVBMQVRFUyAtLT5cXHJcXG4gICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwibW9kZWwuRWRpdENvbEluZGV4ICE9PSAkaW5kZXggfHwgbW9kZWwuRWRpdFJvd0luZGV4ICE9PSAobW9kZWwuSXNWaXJ0dWFsID8gJHBhcmVudC4kaW5kZXggKyBtb2RlbC5GaXJzdFZpc2libGVSb3cgOiAkcGFyZW50LiRpbmRleClcXFwiPlxcclxcbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLlZpZXdUZW1wbGF0ZVxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICA8Y29tcG9zZSB2aWV3PVxcXCIke2NvbC5WaWV3VGVtcGxhdGV9XFxcIiBtb2RlbC5iaW5kPVxcXCJyb3dcXFwiPjwvY29tcG9zZT5cXHJcXG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlIGVsc2U+XFxyXFxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLkNvbHVtblR5cGUgPT0gJ0NIRUNLQk9YJ1xcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmLmJpbmQ9XFxcImNvbC5kNVxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZi5iaW5kPVxcXCIhY29sLkFsbG93Qm9vbGVhbk51bGxcXFwiIHR5cGU9XFxcImNoZWNrYm94XFxcIiBjaGVja2VkLm9uZS13YXk9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVtjb2wuZDRdW2NvbC5kNV1cXFwiIGRpc2FibGVkLmJpbmQ9XFxcIiFtb2RlbC5DYW5FZGl0IHx8ICFjb2wuRWRpdGFibGVcXFwiIGNsaWNrLnRyaWdnZXI9XFxcIm1vZGVsLkVkaXRDaGVja0JveChyb3csY29sLHJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVtjb2wuZDRdW2NvbC5kNV0pXFxcIiAvPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWYuYmluZD1cXFwiY29sLkFsbG93Qm9vbGVhbk51bGxcXFwiIHR5cGU9XFxcImNoZWNrYm94XFxcIiB0cmktc3RhdGUuYmluZD1cXFwicm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdW2NvbC5kNF1bY29sLmQ1XVxcXCIgZGlzYWJsZWQuYmluZD1cXFwiIW1vZGVsLkNhbkVkaXQgfHwgIWNvbC5FZGl0YWJsZVxcXCIgY2xpY2sudHJpZ2dlcj1cXFwibW9kZWwuRWRpdENoZWNrQm94KHJvdyxjb2wscm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdW2NvbC5kNF1bY29sLmQ1XSlcXFwiIC8+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLmQ0ICYmICFjb2wuZDVcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWYuYmluZD1cXFwiIWNvbC5BbGxvd0Jvb2xlYW5OdWxsXFxcIiB0eXBlPVxcXCJjaGVja2JveFxcXCIgY2hlY2tlZC5vbmUtd2F5PVxcXCJyb3dbY29sLmQxXVtjb2wuZDJdW2NvbC5kM11bY29sLmQ0XVxcXCIgZGlzYWJsZWQuYmluZD1cXFwiIW1vZGVsLkNhbkVkaXQgfHwgIWNvbC5FZGl0YWJsZVxcXCIgY2xpY2sudHJpZ2dlcj1cXFwibW9kZWwuRWRpdENoZWNrQm94KHJvdyxjb2wscm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdW2NvbC5kNF0pXFxcIiAvPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWYuYmluZD1cXFwiY29sLkFsbG93Qm9vbGVhbk51bGxcXFwiIHR5cGU9XFxcImNoZWNrYm94XFxcIiB0cmktc3RhdGUuYmluZD1cXFwicm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdW2NvbC5kNF1cXFwiIGRpc2FibGVkLmJpbmQ9XFxcIiFtb2RlbC5DYW5FZGl0IHx8ICFjb2wuRWRpdGFibGVcXFwiIGNsaWNrLnRyaWdnZXI9XFxcIm1vZGVsLkVkaXRDaGVja0JveChyb3csY29sLHJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVtjb2wuZDRdKVxcXCIgLz5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuZDMgJiYgIWNvbC5kNFxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZi5iaW5kPVxcXCIhY29sLkFsbG93Qm9vbGVhbk51bGxcXFwiIHR5cGU9XFxcImNoZWNrYm94XFxcIiBjaGVja2VkLm9uZS13YXk9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVxcXCIgZGlzYWJsZWQuYmluZD1cXFwiIW1vZGVsLkNhbkVkaXQgfHwgIWNvbC5FZGl0YWJsZVxcXCIgY2xpY2sudHJpZ2dlcj1cXFwibW9kZWwuRWRpdENoZWNrQm94KHJvdyxjb2wscm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdKVxcXCIgLz5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlmLmJpbmQ9XFxcImNvbC5BbGxvd0Jvb2xlYW5OdWxsXFxcIiB0eXBlPVxcXCJjaGVja2JveFxcXCIgdHJpLXN0YXRlLmJpbmQ9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVxcXCIgZGlzYWJsZWQuYmluZD1cXFwiIW1vZGVsLkNhbkVkaXQgfHwgIWNvbC5FZGl0YWJsZVxcXCIgY2xpY2sudHJpZ2dlcj1cXFwibW9kZWwuRWRpdENoZWNrQm94KHJvdyxjb2wscm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdKVxcXCIgLz5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuZDIgJiYgIWNvbC5kM1xcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZi5iaW5kPVxcXCIhY29sLkFsbG93Qm9vbGVhbk51bGxcXFwiIHR5cGU9XFxcImNoZWNrYm94XFxcIiBjaGVja2VkLm9uZS13YXk9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl1cXFwiIGRpc2FibGVkLmJpbmQ9XFxcIiFtb2RlbC5DYW5FZGl0IHx8ICFjb2wuRWRpdGFibGVcXFwiIGNsaWNrLnRyaWdnZXI9XFxcIm1vZGVsLkVkaXRDaGVja0JveChyb3csY29sLHJvd1tjb2wuZDFdW2NvbC5kMl0pXFxcIiAvPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWYuYmluZD1cXFwiY29sLkFsbG93Qm9vbGVhbk51bGxcXFwiIHR5cGU9XFxcImNoZWNrYm94XFxcIiB0cmktc3RhdGUuYmluZD1cXFwicm93W2NvbC5kMV1bY29sLmQyXVxcXCIgZGlzYWJsZWQuYmluZD1cXFwiIW1vZGVsLkNhbkVkaXQgfHwgIWNvbC5FZGl0YWJsZVxcXCIgY2xpY2sudHJpZ2dlcj1cXFwibW9kZWwuRWRpdENoZWNrQm94KHJvdyxjb2wscm93W2NvbC5kMV1bY29sLmQyXSlcXFwiIC8+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLmQxICYmICFjb2wuZDJcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWYuYmluZD1cXFwiIWNvbC5BbGxvd0Jvb2xlYW5OdWxsXFxcIiB0eXBlPVxcXCJjaGVja2JveFxcXCIgY2hlY2tlZC5iaW5kPVxcXCJyb3dbY29sLmQxXVxcXCIgZGlzYWJsZWQuYmluZD1cXFwiIW1vZGVsLkNhbkVkaXQgfHwgIWNvbC5FZGl0YWJsZVxcXCIgY2xpY2suZGVsZWdhdGU9XFxcIm1vZGVsLkNoZWNrQm94Q2xpY2tlZCgpXFxcIiAvPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWYuYmluZD1cXFwiY29sLkFsbG93Qm9vbGVhbk51bGxcXFwiIHR5cGU9XFxcImNoZWNrYm94XFxcIiB0cmktc3RhdGUuYmluZD1cXFwicm93W2NvbC5kMV1cXFwiIGRpc2FibGVkLmJpbmQ9XFxcIiFtb2RlbC5DYW5FZGl0IHx8ICFjb2wuRWRpdGFibGVcXFwiIGNsaWNrLmRlbGVnYXRlPVxcXCJtb2RlbC5DaGVja0JveENsaWNrZWQoKVxcXCIgLz5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuQ29sdW1uVHlwZSA9PSAnRk9SRUlHTktFWSdcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlmLmJpbmQ9XFxcImNvbC5kNVxcXCIgdGV4dGNvbnRlbnQuYmluZD1cXFwicm93IHwgZm9yZWlnbktleTpjb2w6cm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdW2NvbC5kNF1bY29sLmQ1XVxcXCI+P
82C9zcGFuPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlmLmJpbmQ9XFxcImNvbC5kNCAmJiAhY29sLmQ1XFxcIiB0ZXh0Y29udGVudC5iaW5kPVxcXCJyb3cgfCBmb3JlaWduS2V5OmNvbDpyb3dbY29sLmQxXVtjb2wuZDJdW2NvbC5kM11bY29sLmQ0XVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlmLmJpbmQ9XFxcImNvbC5kMyAmJiAhY29sLmQ0XFxcIiB0ZXh0Y29udGVudC5iaW5kPVxcXCJyb3cgfCBmb3JlaWduS2V5OmNvbDpyb3dbY29sLmQxXVtjb2wuZDJdW2NvbC5kM11cXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZi5iaW5kPVxcXCJjb2wuZDIgJiYgIWNvbC5kM1xcXCIgdGV4dGNvbnRlbnQuYmluZD1cXFwicm93IHwgZm9yZWlnbktleTpjb2w6cm93W2NvbC5kMV1bY29sLmQyXVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlmLmJpbmQ9XFxcImNvbC5kMSAmJiAhY29sLmQyXFxcIiB0ZXh0Y29udGVudC5iaW5kPVxcXCJyb3cgfCBmb3JlaWduS2V5OmNvbDpyb3dbY29sLmQxXVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuQ29sdW1uVHlwZT09J0RFQ0lNQUwnXFxcIj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLmQ1XFxcIj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGV4dGNvbnRlbnQuYmluZD1cXFwicm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdW2NvbC5kNF1bY29sLmQ1XSB8IGRlY2ltYWxGb3JtYXQ6Y29sXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLmQ0ICYmICFjb2wuZDVcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0ZXh0Y29udGVudC5iaW5kPVxcXCJyb3dbY29sLmQxXVtjb2wuZDJdW2NvbC5kM11bY29sLmQ0XSB8IGRlY2ltYWxGb3JtYXQ6Y29sXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLmQzICYmICFjb2wuZDRcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0ZXh0Y29udGVudC5iaW5kPVxcXCJyb3dbY29sLmQxXVtjb2wuZDJdW2NvbC5kM10gfCBkZWNpbWFsRm9ybWF0OmNvbFxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmLmJpbmQ9XFxcImNvbC5kMiAmJiAhY29sLmQzXFxcIj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGV4dGNvbnRlbnQuYmluZD1cXFwicm93W2NvbC5kMV1bY29sLmQyXSB8IGRlY2ltYWxGb3JtYXQ6Y29sXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLmQxICYmICFjb2wuZDJcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0ZXh0Y29udGVudC5iaW5kPVxcXCJyb3dbY29sLmQxXSB8IGRlY2ltYWxGb3JtYXQ6Y29sXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLkNvbHVtblR5cGU9PSdTVFJJTkcnIHx8IGNvbC5Db2x1bW5UeXBlPT0nTlVNQkVSJyB8fCAoY29sLkNvbHVtblR5cGU9PSdTT1JUT1JERVInICYmICFtb2RlbC5DYW5FZGl0KVxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmLmJpbmQ9XFxcImNvbC5kNVxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRleHRjb250ZW50LmJpbmQ9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVtjb2wuZDRdW2NvbC5kNV1cXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuZDQgJiYgIWNvbC5kNVxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRleHRjb250ZW50LmJpbmQ9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVtjb2wuZDRdXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLmQzICYmICFjb2wuZDRcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0ZXh0Y29udGVudC5iaW5kPVxcXCJyb3dbY29sLmQxXVtjb2wuZDJdW2NvbC5kM11cXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuZDIgJiYgIWNvbC5kM1xcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRleHRjb250ZW50LmJpbmQ9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl1cXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuZDEgJiYgIWNvbC5kMlxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRleHRjb250ZW50LmJpbmQ9XFxcInJvd1tjb2wuZDFdXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLkNvbHVtblR5cGU9PSdEQVRFJ1xcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmLmJpbmQ9XFxcImNvbC5kNVxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRleHRjb250ZW50LmJpbmQ9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVtjb2wuZDRdW2NvbC5kNV0gfCBkYXRlRm9ybWF0IDogY29sLkZvcm1hdFxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmLmJpbmQ9XFxcImNvbC5kNCAmJiAhY29sLmQ1XFxcIj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGV4dGNvbnRlbnQuYmluZD1cXFwicm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdW2NvbC5kNF0gfCBkYXRlRm9ybWF0IDogY29sLkZvcm1hdFxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmLmJpbmQ9XFxcImNvbC5kMyAmJiAhY29sLmQ0XFxcIj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGV4dGNvbnRlbnQuYmluZD1cXFwicm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdIHwgZGF0ZUZvcm1hdCA6IGNvbC5Gb3JtYXRcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuZDIgJiYgIWNvbC5kM1xcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRleHRjb250ZW50LmJpbmQ9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl0gfCBkYXRlRm9ybWF0IDogY29sLkZvcm1hdFxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmLmJpbmQ9XFxcImNvbC5kMSAmJiAhY29sLmQyXFxcIj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGV4dGNvbnRlbnQuYmluZD1cXFwicm93W2NvbC5kMV0gfC
82BkYXRlRm9ybWF0IDogY29sLkZvcm1hdFxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmLmJpbmQ9XFxcImNvbC5Db2x1bW5UeXBlPT0nU0lXSURBVEVUSU1FJ1xcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmLmJpbmQ9XFxcImNvbC5kNVxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRleHRjb250ZW50LmJpbmQ9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVtjb2wuZDRdW2NvbC5kNV0gfCBkYXRldGltZUZvcm1hdCA6IGNvbC5Gb3JtYXRcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuZDQgJiYgIWNvbC5kNVxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRleHRjb250ZW50LmJpbmQ9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVtjb2wuZDRdIHwgZGF0ZXRpbWVGb3JtYXQgOiBjb2wuRm9ybWF0XFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLmQzICYmICFjb2wuZDRcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0ZXh0Y29udGVudC5iaW5kPVxcXCJyb3dbY29sLmQxXVtjb2wuZDJdW2NvbC5kM10gfCBkYXRldGltZUZvcm1hdCA6IGNvbC5Gb3JtYXRcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuZDIgJiYgIWNvbC5kM1xcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRleHRjb250ZW50LmJpbmQ9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl0gfCBkYXRldGltZUZvcm1hdCA6IGNvbC5Gb3JtYXRcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuZDEgJiYgIWNvbC5kMlxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRleHRjb250ZW50LmJpbmQ9XFxcInJvd1tjb2wuZDFdIHwgZGF0ZXRpbWVGb3JtYXQgOiBjb2wuRm9ybWF0XFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLkNvbHVtblR5cGU9PSdTSVdJTkVUVElNRSdcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuZDVcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0ZXh0Y29udGVudC5iaW5kPVxcXCJyb3dbY29sLmQxXVtjb2wuZDJdW2NvbC5kM11bY29sLmQ0XVtjb2wuZDVdIHwgbmV0VGltZSA6IGNvbC5UaW1lUHJlY2lzaW9uXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLmQ0ICYmICFjb2wuZDVcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0ZXh0Y29udGVudC5iaW5kPVxcXCJyb3dbY29sLmQxXVtjb2wuZDJdW2NvbC5kM11bY29sLmQ0XSB8IG5ldFRpbWUgOiBjb2wuVGltZVByZWNpc2lvblxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmLmJpbmQ9XFxcImNvbC5kMyAmJiAhY29sLmQ0XFxcIj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGV4dGNvbnRlbnQuYmluZD1cXFwicm93W2NvbC5kMV1bY29sLmQyXVtjb2wuZDNdIHwgbmV0VGltZSA6IGNvbC5UaW1lUHJlY2lzaW9uXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLmQyICYmICFjb2wuZDNcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0ZXh0Y29udGVudC5iaW5kPVxcXCJyb3dbY29sLmQxXVtjb2wuZDJdIHwgbmV0VGltZSA6IGNvbC5UaW1lUHJlY2lzaW9uXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLmQxICYmICFjb2wuZDJcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0ZXh0Y29udGVudC5iaW5kPVxcXCJyb3dbY29sLmQxXSB8IG5ldFRpbWUgOiBjb2wuVGltZVByZWNpc2lvblxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmLmJpbmQ9XFxcImNvbC5Db2x1bW5UeXBlPT0nU0lXSU5FVFBPSU5UUydcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuZDVcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0ZXh0Y29udGVudC5iaW5kPVxcXCJyb3dbY29sLmQxXVtjb2wuZDJdW2NvbC5kM11bY29sLmQ0XVtjb2wuZDVdIHwgbmV0UG9pbnRzIDogY29sLlRpbWVQcmVjaXNpb25cXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuZDQgJiYgIWNvbC5kNVxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRleHRjb250ZW50LmJpbmQ9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXVtjb2wuZDRdIHwgbmV0UG9pbnRzIDogY29sLlRpbWVQcmVjaXNpb25cXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuZDMgJiYgIWNvbC5kNFxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRleHRjb250ZW50LmJpbmQ9XFxcInJvd1tjb2wuZDFdW2NvbC5kMl1bY29sLmQzXSB8IG5ldFBvaW50cyA6
82IGNvbC5UaW1lUHJlY2lzaW9uXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWYuYmluZD1cXFwiY29sLmQyICYmICFjb2wuZDNcXFwiPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0ZXh0Y29udGVudC5iaW5kPVxcXCJyb3dbY29sLmQxXVtjb2wuZDJdIHwgbmV0UG9pbnRzIDogY29sLlRpbWVQcmVjaXNpb25cXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuZDEgJiYgIWNvbC5kMlxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRleHRjb250ZW50LmJpbmQ9XFxcInJvd1tjb2wuZDFdIHwgbmV0UG9pbnRzIDogY29sLlRpbWVQcmVjaXNpb25cXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZi5iaW5kPVxcXCJjb2wuQ29sdW1uVHlwZT09J1NPUlRPUkRFUicgJiYgbW9kZWwuQ2FuRWRpdFxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLWRlZmF1bHQgYnRuLXhzXFxcIiBzdHlsZT1cXFwicGFkZGluZzogMXB4IDFweCAhaW1wb3J0YW50OyBsaW5lLWhlaWdodDogMS4wOyBtYXJnaW4tYm90dG9tOiAxcHg7XFxcIiBjbGljay50cmlnZ2VyPVxcXCJtb2RlbC5SZVNvcnRVcChyb3cpXFxcIiByZWY9XFxcIklucHV0RWxlbWVudDFcXFwiIHNob3cuYmluZD1cXFwiJHBhcmVudC4kaW5kZXggIT0gMCB8fCBtb2RlbC5GaXJzdFZpc2libGVSb3cgIT0gMFxcXCI+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVxcXCJmYXMgZmEtYXJyb3ctdXBcXFwiPjwvaT5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImJ0biBidG4tZGVmYXVsdCBidG4teHNcXFwiIHN0eWxlPVxcXCJwYWRkaW5nOiAxcHggMXB4ICFpbXBvcnRhbnQ7IGxpbmUtaGVpZ2h0OiAxLjA7IG1hcmdpbi1ib3R0b206IDFweDtcXFwiIGNsaWNrLnRyaWdnZXI9XFxcIm1vZGVsLlJlU29ydERvd24ocm93KVxcXCIgcmVmPVxcXCJJbnB1dEVsZW1lbnQyXFxcIiBzaG93LmJpbmQ9XFxcIiRwYXJlbnQuJGluZGV4IDwgbW9kZWwuRGF0YVNvdXJjZS5sZW5ndGggLSAxXFxcIj5cXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XFxcImZhcyBmYS1hcnJvdy1kb3duXFxcIj48L2k+XFxyXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxyXFxuICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuICAgICAgICAgICAgPCEtLSBFTkRFIFZJRVcgVEVNUExBVEVTIC0tPlxcclxcbiAgICAgICAgPC90ZD5cXHJcXG4gICAgPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48L3RlbXBsYXRlPlxcclxcblwiOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///@siwidata/siwiui/grid-row-cells.html\n");
83
84/***/ })
84,
85
86/***/ "@siwidata/siwiui/grid-sort":
87/*!*********************************************************!*\
88  !*** ./node_modules/@siwidata/siwiui/dist/grid-sort.js ***!
89  \*********************************************************/
90/*! exports provided: SiwiGridSortValueConverter, SiwiGridColumnSortValueConverter */
91/***/ (function(module, __webpack_exports__, __webpack_require__) {
92
93"use strict";
94eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SiwiGridSortValueConverter\", function() { return SiwiGridSortValueConverter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SiwiGridColumnSortValueConverter\", function() { return SiwiGridColumnSortValueConverter; });\n/* harmony import */ var _gridmodels__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./gridmodels */ \"1Uh/\");\n/* harmony import */ var aurelia_event_aggregator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! aurelia-event-aggregator */ \"aurelia-event-aggregator\");\n/* harmony import */ var aurelia_framework__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! aurelia-framework */ \"aurelia-framework\");\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    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;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n};\r\nvar __metadata = (undefined && undefined.__metadata) || function (k, v) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\r\n};\r\n\r\n\r\n\r\nvar SiwiGridSortValueConverter = /** @class */ (function () {\r\n    function SiwiGridSortValueConverter(eventAggregator) {\r\n        var _this = this;\r\n        this.eventAggregator = eventAggregator;\r\n        this.eventAggregator.subscribe(\"invalidate-sort-cache\", function (col) {\r\n            if (col == _this._column) {\r\n                _this._cache = null;\r\n            }\r\n        });\r\n    }\r\n    SiwiGridSortValueConverter.prototype.toView = function (array, column, direction) {\r\n        if (!column)\r\n            return array;\r\n        if (!array)\r\n            return array;\r\n        var factor = direction ? -1 : 1;\r\n        if (direction == this._dir && column == this._column && this._cache && this._cache == array) {\r\n            return this._cache;\r\n        }\r\n        this._dir = direction;\r\n        this._column = column;\r\n        var ret = array;\r\n        ret = ret.sort(function (a, b) {\r\n            var ta;\r\n            var tb;\r\n            if (column.SortByAttribute) {\r\n                var splits = column.SortByAttribute.split(\".\");\r\n                if (splits.length >= 5) {\r\n                    if (a != undefined && a[splits[0]][splits[1]][splits[2]][splits[3]])\r\n                        ta = a[splits[0]][splits[1]][splits[2]][splits[3]][splits[4]];\r\n                    if (b != undefined && b[splits[0]][splits[1]][splits[2]][splits[3]])\r\n                        tb = b[splits[0]][splits[1]][splits[2]][splits[3]][splits[4]];\r\n                }\r\n                else if (splits.length == 4) {\r\n                    if (a != undefined && a[splits[0]][splits[1]][splits[2]])\r\n                        ta = a[splits[0]][splits[1]][splits[2]][splits[3]];\r\n                    if (b != undefined && b[splits[0]][splits[1]][splits[2]])\r\n                        tb = b[splits[0]][splits[1]][splits[2]][splits[3]];\r\n                }\r\n                else if (splits.length == 3) {\r\n                    if (a != undefined && a[splits[0]][splits[1]])\r\n                        ta = a[splits[0]][splits[1]][splits[2]];\r\n                    if (b != undefined && b[splits[0]][splits[1]])\r\n                        tb = b[splits[0]][splits[1]][splits[2]];\r\n                }\r\n                else if (splits.length == 2) {\r\n                    if (a != undefined && a[splits[0]])\r\n                        ta = a[splits[0]][splits[1]];\r\n                    if (b != undefined && b[splits[0]])\r\n                        tb = b[splits[0]][splits[1]];\r\n                }\r\n                else {\r\n                    if (a != undefined)\r\n                        ta = a[column.SortByAttribute];\r\n                    if (b != undefined)\r\n                        tb = b[column.SortByAttribute];\r\n                }\r\n            }\r\n            else {\r\n                if (column.d5) {\r\n                    if (a != undefined && a[column.d1][column.d2][column.d3][column.d4])\r\n                        ta = a[column.d1][column.d2][column.d3][column.d4][column.d5];\r\n                    if (b != undefined && b[column.d1][column.d2][column.d3][column.d4])\r\n                        tb = b[column.d1][column.d2][column.d3][column.d4][column.d5];\r\n                }\r\n                else if (column.d4) {\r\n                    if (a != undefined && a[column.d1][column.d2][column.d3])\r\n                        ta = a[column.d1][column.d2][column.d3][column.d4];\r\n                    if (b != undefined && b[column.d1][column.d2][column.d3])\r\n                        tb = b[column.d1][column.d2][column.d3][column.d4];\r\n                }\r\n                else if (column.d3) {\r\n                    if (a != undefined && a[column.d1][column.d2])\r\n                        ta = a[column.d1][column.d2][column.d3];\r\n                    if (b != undefined && b[column.d1][column.d2])\r\n                        tb = b[column.d1][column.d2][column.d3];\r\n                }\r\n                else if (column.d2) {\r\n                    if (a != undefined && a[column.d1])\r\n                        ta = a[column.d1][column.d2];\r\n                    if (b != undefined && b[column.d1])\r\n                        tb = b[column.d1][column.d2];\r\n                }\r\n                else {\r\n                    if (a != undefined)\r\n                        ta = a[column.d1];\r\n                    if (b != undefined)\r\n                        tb = b[column.d1];\r\n                }\r\n            }\r\n            if (ta == undefined)\r\n                ta = 0;\r\n            if (tb == undefined)\r\n                tb = 0;\r\n            if (column.ColumnType == _gridmodels__WEBPACK_IMPORTED_MODULE_0__[\"GridColumnType\"].CHECKBOX) {\r\n                return factor * ((ta && !tb) ? 1 : -1);\r\n            }\r\n            else {\r\n                return factor * ((ta < tb) ? 1 : -1);\r\n            }\r\n        });\r\n        this._cache = ret;\r\n        return ret;\r\n    };\r\n    SiwiGridSortValueConverter = __decorate([\r\n        Object(aurelia_framework__WEBPACK_IMPORTED_MODULE_2__[\"inject\"])(aurelia_event_aggregator__WEBPACK_IMPORTED_MODULE_1__[\"EventAggregator\"]),\r\n        __metadata(\"design:paramtypes\", [aurelia_event_aggregator__WEBPACK_IMPORTED_MODULE_1__[\"EventAggregator\"]])\r\n    ], SiwiGridSortValueConverter);\r\n    return SiwiGridSortValueConverter;\r\n}());\r\n\r\nvar SiwiGridColumnSortValueConverter = /** @class */ (function () {\r\n    function SiwiGridColumnSortValueConverter() {\r\n    }\r\n    SiwiGridColumnSortValueConverter.prototype.toView = function (array, column, direction) {\r\n        if (!column)\r\n            return array;\r\n        if (!array)\r\n            return array;\r\n        var factor = direction ? -1 : 1;\r\n        return array.sort(function (a, b) {\r\n            var ta;\r\n            var tb;\r\n            ta = a.HeaderText;\r\n            tb = b.HeaderText;\r\n            return factor * ((ta < tb) ? 1 : -1);\r\n        });\r\n    };\r\n    return SiwiGridColumnSortValueConverter;\r\n}());\r\n\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQHNpd2lkYXRhL3Npd2l1aS9ncmlkLXNvcnQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNpd2lkYXRhL3Npd2l1aS9kaXN0L2dyaWQtc29ydC5qcz83NzA5Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBfX2RlY29yYXRlID0gKHRoaXMgJiYgdGhpcy5fX2RlY29yYXRlKSB8fCBmdW5jdGlvbiAoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ
947XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn07XHJcbnZhciBfX21ldGFkYXRhID0gKHRoaXMgJiYgdGhpcy5fX21ldGFkYXRhKSB8fCBmdW5jdGlvbiAoaywgdikge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKGssIHYpO1xyXG59O1xyXG5pbXBvcnQgeyBHcmlkQ29sdW1uVHlwZSB9IGZyb20gJy4vZ3JpZG1vZGVscyc7XHJcbmltcG9ydCB7IEV2ZW50QWdncmVnYXRvciB9IGZyb20gJ2F1cmVsaWEtZXZlbnQtYWdncmVnYXRvcic7XHJcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJ2F1cmVsaWEtZnJhbWV3b3JrJztcclxudmFyIFNpd2lHcmlkU29ydFZhbHVlQ29udmVydGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gU2l3aUdyaWRTb3J0VmFsdWVDb252ZXJ0ZXIoZXZlbnRBZ2dyZWdhdG9yKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLmV2ZW50QWdncmVnYXRvciA9IGV2ZW50QWdncmVnYXRvcjtcclxuICAgICAgICB0aGlzLmV2ZW50QWdncmVnYXRvci5zdWJzY3JpYmUoXCJpbnZhbGlkYXRlLXNvcnQtY2FjaGVcIiwgZnVuY3Rpb24gKGNvbCkge1xyXG4gICAgICAgICAgICBpZiAoY29sID09IF90aGlzLl9jb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9jYWNoZSA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIFNpd2lHcmlkU29ydFZhbHVlQ29udmVydGVyLnByb3RvdHlwZS50b1ZpZXcgPSBmdW5jdGlvbiAoYXJyYXksIGNvbHVtbiwgZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgaWYgKCFjb2x1bW4pXHJcbiAgICAgICAgICAgIHJldHVybiBhcnJheTtcclxuICAgICAgICBpZiAoIWFycmF5KVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyYXk7XHJcbiAgICAgICAgdmFyIGZhY3RvciA9IGRpcmVjdGlvbiA/IC0xIDogMTtcclxuICAgICAgICBpZiAoZGlyZWN0aW9uID09IHRoaXMuX2RpciAmJiBjb2x1bW4gPT0gdGhpcy5fY29sdW1uICYmIHRoaXMuX2NhY2hlICYmIHRoaXMuX2NhY2hlID09IGFycmF5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZGlyID0gZGlyZWN0aW9uO1xyXG4gICAgICAgIHRoaXMuX2NvbHVtbiA9IGNvbHVtbjtcclxuICAgICAgICB2Y
94XIgcmV0ID0gYXJyYXk7XHJcbiAgICAgICAgcmV0ID0gcmV0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgICAgICAgICAgdmFyIHRhO1xyXG4gICAgICAgICAgICB2YXIgdGI7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4uU29ydEJ5QXR0cmlidXRlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3BsaXRzID0gY29sdW1uLlNvcnRCeUF0dHJpYnV0ZS5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3BsaXRzLmxlbmd0aCA+PSA1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEgIT0gdW5kZWZpbmVkICYmIGFbc3BsaXRzWzBdXVtzcGxpdHNbMV1dW3NwbGl0c1syXV1bc3BsaXRzWzNdXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGEgPSBhW3NwbGl0c1swXV1bc3BsaXRzWzFdXVtzcGxpdHNbMl1dW3NwbGl0c1szXV1bc3BsaXRzWzRdXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYiAhPSB1bmRlZmluZWQgJiYgYltzcGxpdHNbMF1dW3NwbGl0c1sxXV1bc3BsaXRzWzJdXVtzcGxpdHNbM11dKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YiA9IGJbc3BsaXRzWzBdXVtzcGxpdHNbMV1dW3NwbGl0c1syXV1bc3BsaXRzWzNdXVtzcGxpdHNbNF1dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3BsaXRzLmxlbmd0aCA9PSA0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEgIT0gdW5kZWZpbmVkICYmIGFbc3BsaXRzWzBdXVtzcGxpdHNbMV1dW3NwbGl0c1syXV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhID0gYVtzcGxpdHNbMF1dW3NwbGl0c1sxXV1bc3BsaXRzWzJdXVtzcGxpdHNbM11dO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChiICE9IHVuZGVmaW5lZCAmJiBiW3NwbGl0c1swXV1bc3BsaXRzWzFdXVtzcGxpdHNbMl1dKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YiA9IGJbc3BsaXRzWzBdXVtzcGxpdHNbMV1dW3NwbGl0c1syXV1bc3BsaXRzWzNdXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNwbGl0cy5sZW5ndGggPT0gMykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhICE9IHVuZGVmaW5lZCAmJiBhW3NwbGl0c1swXV1bc3BsaXRzWzFdXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGEgPSBhW3NwbGl0c1swXV1bc3BsaXRzWzFdXVtzcGxpdHNbMl1dO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChiICE9IHVuZGVmaW5lZCAmJiBiW3NwbGl0c1swXV1bc3BsaXRzWzFdXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGIgPSBiW3NwbGl0c1swXV1bc3BsaXRzWzFdXVtzcGxpdHNbMl1dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3BsaXRzLmxlbmd0aCA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEgIT0gdW5kZWZpbmVkICYmIGFbc3BsaXRzWzBdXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGEgPSBhW3NwbGl0c1swXV1bc3BsaXRzWzFdXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYiAhPSB1bmRlZmluZWQgJiYgYltzcGxpdHNbMF1dKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YiA9IGJbc3BsaXRzWzBdXVtzcGxpdHNbMV1dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YSA9IGFbY29sdW1uLlNvcnRCeUF0dHJpYnV0ZV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YiA9IGJbY29sdW1uLlNvcnRCeUF0dHJpYnV0ZV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmQ1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEgIT0gdW5kZWZpbmVkICYmIGFbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM11bY29sdW1uLmQ0XSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGEgPSBhW2NvbHVtbi5kMV1bY29sdW1uLmQyXVtjb2x1bW4uZDNdW2NvbHVtbi5kNF1bY29sdW1uLmQ1XTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYiAhPSB1bmRlZmluZWQgJiYgYltjb2x1bW4uZDFdW2NvbHVtbi5kMl1bY29sdW1uLmQzXVtjb2x1bW4uZDRdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YiA9IGJbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM11bY29sdW1uLmQ0XVtjb2x1bW4uZDVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sdW1uLmQ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEgIT0gdW5kZWZpbmVkICYmIGFbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM10pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhID0gYVtjb2x1bW4uZDFdW2NvbHVtbi5kMl1bY29sdW1uLmQzXVtjb2x1bW4uZDRdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChiICE9IHVuZGVmaW5lZCAmJiBiW2NvbHVtbi5kMV1bY29sdW1uLmQyXVtjb2x1bW4uZDNdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YiA9IGJbY29sdW1uLmQxXVtjb2x1bW4uZDJdW2NvbHVtbi5kM11bY29sdW1uLmQ0XTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbHVtbi5kMykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhICE9IHVuZGVmaW5lZCAmJiBhW2NvbHVtbi5kMV1bY29sdW1uLmQyXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGEgPSBhW2NvbHVtbi5kMV1bY29sdW1uLmQyXVtjb2x1bW4uZDNdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChiICE9IHVuZGVmaW5lZCAmJiBiW2NvbHVtbi5kMV1bY29sdW1uLmQyXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGIgPSBiW2NvbHVtbi5kMV1bY29sdW1uLmQyXVtjb2x1bW4uZDNdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sdW1uLmQyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEgIT0gdW5kZWZpbmVkICYmIGFbY29sdW1uLmQxXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGEgPSBhW2NvbHVtbi5kMV1bY29sdW1uLmQyXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYiAhPSB1bmRlZmluZWQgJiYgYltjb2x1bW4uZDFdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YiA9IGJbY29sdW1uLmQxXVtjb2x1bW4uZDJdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YSA9IGFbY29sdW1uLmQxXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYiAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgI
94HRiID0gYltjb2x1bW4uZDFdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0YSA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICB0YSA9IDA7XHJcbiAgICAgICAgICAgIGlmICh0YiA9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICB0YiA9IDA7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4uQ29sdW1uVHlwZSA9PSBHcmlkQ29sdW1uVHlwZS5DSEVDS0JPWCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvciAqICgodGEgJiYgIXRiKSA/IDEgOiAtMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yICogKCh0YSA8IHRiKSA/IDEgOiAtMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9jYWNoZSA9IHJldDtcclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfTtcclxuICAgIFNpd2lHcmlkU29ydFZhbHVlQ29udmVydGVyID0gX19kZWNvcmF0ZShbXHJcbiAgICAgICAgaW5qZWN0KEV2ZW50QWdncmVnYXRvciksXHJcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtFdmVudEFnZ3JlZ2F0b3JdKVxyXG4gICAgXSwgU2l3aUdyaWRTb3J0VmFsdWVDb252ZXJ0ZXIpO1xyXG4gICAgcmV0dXJuIFNpd2lHcmlkU29ydFZhbHVlQ29udmVydGVyO1xyXG59KCkpO1xyXG5leHBvcnQgeyBTaXdpR3JpZFNvcnRWYWx1ZUNvbnZlcnRlciB9O1xyXG52YXIgU2l3aUdyaWRDb2x1bW5Tb3J0VmFsdWVDb252ZXJ0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBTaXdpR3JpZENvbHVtblNvcnRWYWx1ZUNvbnZlcnRlcigpIHtcclxuICAgIH1cclxuICAgIFNpd2lHcmlkQ29sdW1uU29ydFZhbHVlQ29udmVydGVyLnByb3RvdHlwZS50b1ZpZXcgPSBmdW5jdGlvbiAoYXJyYXksIGNvbHVtbiwgZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgaWYgKCFjb2x1bW4pXHJcbiAgICAgICAgICAgIHJldHVybiBhcnJheTtcclxuICAgICAgICBpZiAoIWFycmF5KVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyYXk7XHJcbiAgICAgICAgdmFyIGZhY3RvciA9IGRpcmVjdGlvbiA/IC0xIDogMTtcclxuICAgICAgICByZXR1cm4gYXJyYXkuc29ydChmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgICAgICAgICB2Y
94XIgdGE7XHJcbiAgICAgICAgICAgIHZhciB0YjtcclxuICAgICAgICAgICAgdGEgPSBhLkhlYWRlclRleHQ7XHJcbiAgICAgICAgICAgIHRiID0gYi5IZWFkZXJUZXh0O1xyXG4gICAgICAgICAgICByZXR1cm4gZmFjdG9yICogKCh0YSA8IHRiKSA/IDEgOiAtMSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFNpd2lHcmlkQ29sdW1uU29ydFZhbHVlQ29udmVydGVyO1xyXG59KCkpO1xyXG5leHBvcnQgeyBTaXdpR3JpZENvbHVtblNvcnRWYWx1ZUNvbnZlcnRlciB9O1xyXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///@siwidata/siwiui/grid-sort\n");
95
96/***/ }),
97
98/***/ "ihW7":
99/*!***************************************************************!*\
100  !*** ./node_modules/@siwidata/siwiui/dist/googleanalytics.js ***!
101  \***************************************************************/
102/*! exports provided: GoogleAnalytics */
103/***/ (function(module, __webpack_exports__, __webpack_require__) {
104
105"use strict";
106eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"GoogleAnalytics\", function() { return GoogleAnalytics; });\n/* harmony import */ var _siwidata_config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @siwidata/config */ \"4fGU\");\n/* harmony import */ var _siwidata_config__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_siwidata_config__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _siwidata_storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @siwidata/storage */ \"GRkO\");\n/* harmony import */ var _siwidata_storage__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_siwidata_storage__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var aurelia_event_aggregator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! aurelia-event-aggregator */ \"aurelia-event-aggregator\");\n/* harmony import */ var aurelia_fetch_client__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! aurelia-fetch-client */ \"qQke\");\n\r\n\r\n\r\n\r\nvar CGoogleAnalytics = /** @class */ (function () {\r\n    function CGoogleAnalytics(Storage) {\r\n        this.Storage = Storage;\r\n    }\r\n    Object.defineProperty(CGoogleAnalytics.prototype, \"HasConsentBeenDeclared\", {\r\n        get: function () {\r\n            if (this.Storage.get('ga-consent')) {\r\n                return true;\r\n            }\r\n            return false;\r\n        },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    Object.defineProperty(CGoogleAnalytics.prototype, \"HasConsentBeenGiven\", {\r\n        get: function () {\r\n            return this.HasConsentBeenDeclared && this.Storage.get('ga-consent') == \"yes\";\r\n        },\r\n        enumerable: true,\r\n        configurable: true\r\n    });\r\n    CGoogleAnalytics.prototype.Enable = function (trackingID) {\r\n        this.Storage.set('ga-consent', 'yes');\r\n        window['GoogleAnalyticsObject'] = 'ga';\r\n        window['ga'] = window['ga'] || function () {\r\n            (window['ga'].q = window['ga'].q || []).push(arguments);\r\n        }, window['ga'].l = new Date().getTime();\r\n        var elem = document.createElement('script');\r\n        var headElem = document.getElementsByTagName('head')[0];\r\n        elem.async = true;\r\n        elem.src = 'https://www.google-analytics.com/analytics.js';\r\n        headElem.insertBefore(elem, headElem.firstElementChild);\r\n        window['ga'](\"create\", trackingID);\r\n        //window['ga']('set', 'anonymizeIp', true);\r\n    };\r\n    CGoogleAnalytics.prototype.Disable = function (trackingID) {\r\n        this.Storage.set('ga-consent', 'no');\r\n        if (!window.ga) {\r\n            return;\r\n        }\r\n        else {\r\n            //window['ga']('set', 'anonymizeIp', true);\r\n            window['ga'](\"create\", trackingID, { 'storage': 'none' });\r\n        }\r\n    };\r\n    CGoogleAnalytics.prototype.SendPageView = function (page) {\r\n        if (window.ga) {\r\n            if (!page.startsWith(\"/\")) {\r\n                page = \"/\" + page;\r\n            }\r\n            window['ga']('set', 'page', page);\r\n            window['ga']('send', 'pageview');\r\n        }\r\n    };\r\n    return CGoogleAnalytics;\r\n}());\r\nvar GoogleAnalytics = new CGoogleAnalytics(new _siwidata_storage__WEBPACK_IMPORTED_MODULE_1__[\"Storage\"](new _siwidata_config__WEBPACK_IMPORTED_MODULE_0__[\"Config\"](new aurelia_fetch_client__WEBPACK_IMPORTED_MODULE_3__[\"HttpClient\"](), new aurelia_event_aggregator__WEBPACK_IMPORTED_MODULE_2__[\"EventAggregator\"]())));\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWhXNy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2l3aWRhdGEvc2l3aXVpL2Rpc3QvZ29vZ2xlYW5hbHl0aWNzLmpzPzhhMTUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnQHNpd2lkYXRhL2NvbmZpZyc7XHJcbmltcG9ydCB7
106IFN0b3JhZ2UgfSBmcm9tICdAc2l3aWRhdGEvc3RvcmFnZSc7XHJcbmltcG9ydCB7IEV2ZW50QWdncmVnYXRvciB9IGZyb20gJ2F1cmVsaWEtZXZlbnQtYWdncmVnYXRvcic7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdhdXJlbGlhLWZldGNoLWNsaWVudCc7XHJcbnZhciBDR29vZ2xlQW5hbHl0aWNzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gQ0dvb2dsZUFuYWx5dGljcyhTdG9yYWdlKSB7XHJcbiAgICAgICAgdGhpcy5TdG9yYWdlID0gU3RvcmFnZTtcclxuICAgIH1cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDR29vZ2xlQW5hbHl0aWNzLnByb3RvdHlwZSwgXCJIYXNDb25zZW50QmVlbkRlY2xhcmVkXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuU3RvcmFnZS5nZXQoJ2dhLWNvbnNlbnQnKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENHb29nbGVBbmFseXRpY3MucHJvdG90eXBlLCBcIkhhc0NvbnNlbnRCZWVuR2l2ZW5cIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5IYXNDb25zZW50QmVlbkRlY2xhcmVkICYmIHRoaXMuU3RvcmFnZS5nZXQoJ2dhLWNvbnNlbnQnKSA9PSBcInllc1wiO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgQ0dvb2dsZUFuYWx5dGljcy5wcm90b3R5cGUuRW5hYmxlID0gZnVuY3Rpb24gKHRyYWNraW5nSUQpIHtcclxuICAgICAgICB0aGlzLlN0b3JhZ2Uuc2V0KCdnYS1jb25zZW50JywgJ3llcycpO1xyXG4gICAgICAgIHdpbmRvd1snR29vZ2xlQW5hbHl0aWNzT2JqZWN0J10gPSAnZ2EnO1xyXG4gICAgICAgIHdpbmRvd1snZ2EnXSA9IHdpbmRvd1snZ2EnXSB8fCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICh3aW5kb3dbJ2dhJ10ucSA9IHdpbmRvd1snZ2EnXS5xIHx8IFtdKS5wdXNoKGFyZ3VtZW50cyk7XHJcbiAgICAgICAgfSwgd2luZG93WydnYSddLmwgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICB2Y
106XIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xyXG4gICAgICAgIHZhciBoZWFkRWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07XHJcbiAgICAgICAgZWxlbS5hc3luYyA9IHRydWU7XHJcbiAgICAgICAgZWxlbS5zcmMgPSAnaHR0cHM6Ly93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vYW5hbHl0aWNzLmpzJztcclxuICAgICAgICBoZWFkRWxlbS5pbnNlcnRCZWZvcmUoZWxlbSwgaGVhZEVsZW0uZmlyc3RFbGVtZW50Q2hpbGQpO1xyXG4gICAgICAgIHdpbmRvd1snZ2EnXShcImNyZWF0ZVwiLCB0cmFja2luZ0lEKTtcclxuICAgICAgICAvL3dpbmRvd1snZ2EnXSgnc2V0JywgJ2Fub255bWl6ZUlwJywgdHJ1ZSk7XHJcbiAgICB9O1xyXG4gICAgQ0dvb2dsZUFuYWx5dGljcy5wcm90b3R5cGUuRGlzYWJsZSA9IGZ1bmN0aW9uICh0cmFja2luZ0lEKSB7XHJcbiAgICAgICAgdGhpcy5TdG9yYWdlLnNldCgnZ2EtY29uc2VudCcsICdubycpO1xyXG4gICAgICAgIGlmICghd2luZG93LmdhKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vd2luZG93WydnYSddKCdzZXQnLCAnYW5vbnltaXplSXAnLCB0cnVlKTtcclxuICAgICAgICAgICAgd2luZG93WydnYSddKFwiY3JlYXRlXCIsIHRyYWNraW5nSUQsIHsgJ3N0b3JhZ2UnOiAnbm9uZScgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIENHb29nbGVBbmFseXRpY3MucHJvdG90eXBlLlNlbmRQYWdlVmlldyA9IGZ1bmN0aW9uIChwYWdlKSB7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5nYSkge1xyXG4gICAgICAgICAgICBpZiAoIXBhZ2Uuc3RhcnRzV2l0aChcIi9cIikpIHtcclxuICAgICAgICAgICAgICAgIHBhZ2UgPSBcIi9cIiArIHBhZ2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgd2luZG93WydnYSddKCdzZXQnLCAncGFnZScsIHBhZ2UpO1xyXG4gICAgICAgICAgICB3aW5kb3dbJ2dhJ10oJ3NlbmQnLCAncGFnZXZpZXcnKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIENHb29nbGVBbmFseXRpY3M7XHJcbn0oKSk7XHJcbmV4cG9ydCB2YXIgR29vZ2xlQW5hbHl0aWNzID0gbmV3IENHb29nbGVBbmFseXRpY3MobmV3IFN0b3JhZ2UobmV3IENvbmZpZyhuZXcgSHR0cENsaWVudCgpLCBuZXcgRXZlbnRBZ2dyZWdhdG9yKCkpKSk7XHJcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///ihW7\n");
107
108/***/ })
109
110}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.