adui
Version:
<div> <img src="https://wxa.wxs.qq.com/mpweb/delivery/legacy/wxadtouch/upload/t1/od834zef_52939fc6.png" style="margin:40px 0 0 -8px; background-color: #fcfcfc; box-shadow: none;" /> </div>
603 lines (490 loc) • 74.4 kB
JavaScript
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var React = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _classnames = _interopRequireDefault(require("classnames"));
var _rcSelect = _interopRequireDefault(require("rc-select"));
var _OptGroup = _interopRequireDefault(require("./OptGroup"));
var _Option = _interopRequireDefault(require("./Option"));
var _omit = _interopRequireDefault(require("../_util/omit"));
var _icon = _interopRequireDefault(require("../icon"));
var _configProvider = require("../config-provider");
var _placements = _interopRequireDefault(require("../tooltip/placements"));
require("./style");
var _motion = require("../_util/motion");
var _excluded = ["allowClear", "className", "getPopupContainer", "onChange", "options", "placeholder", "placeholderColor", "placement", "rightIcon", "searchable", "size", "theme", "value"];
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
var noop = function noop() {};
var prefix = "adui-select";
var Select = function (_React$Component) {
_inherits(Select, _React$Component);
var _super = _createSuper(Select);
function Select(props) {
var _this;
_classCallCheck(this, Select);
_this = _super.call(this, props);
_this.hash = Math.random().toString(36).slice(2);
_this.locked = false;
_this.select = void 0;
_this.search = void 0;
_this.menu = void 0;
_this.saveSelect = function (node) {
_this.select = node;
};
_this.saveSearch = function (node) {
_this.search = node;
};
_this.onDropdownVisibleChange = function (open) {
var _this$props = _this.props,
onDropdownVisibleChange = _this$props.onDropdownVisibleChange,
openProp = _this$props.open;
var _this$state = _this.state,
value = _this$state.value,
selectId = _this$state.selectId;
if (_this.locked) {
return;
}
if (openProp === null) {
_this.setState({
open: open
});
}
if (open) {
_this.preventVisibleChange();
setTimeout(function () {
if (_this.search) {
if (value) {
var id = selectId;
if (!selectId) {
var _this$search$parentNo, _this$search$parentNo2;
id = (_this$search$parentNo = _this.search.parentNode) === null || _this$search$parentNo === void 0 ? void 0 : (_this$search$parentNo2 = _this$search$parentNo.nextSibling) === null || _this$search$parentNo2 === void 0 ? void 0 : _this$search$parentNo2.id;
_this.setState({
selectId: id
});
}
if (id) {
var _document$getElementB, _parent$getElementsBy;
var parent = (_document$getElementB = document.getElementById(id)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.nextSibling;
var el = parent === null || parent === void 0 ? void 0 : (_parent$getElementsBy = parent.getElementsByClassName("adui-select-item-option-selected")[0]) === null || _parent$getElementsBy === void 0 ? void 0 : _parent$getElementsBy.children[0];
var listHolder = parent === null || parent === void 0 ? void 0 : parent.getElementsByClassName("rc-virtual-list-holder")[0];
if (listHolder) {
listHolder.dispatchEvent(new Event("scroll"));
if (listHolder.children[0]) {
listHolder.children[0].dispatchEvent(new Event("scroll"));
}
}
if (el) {
_this.setState({
placeholderText: el.dataset.html || el.innerHTML
});
}
}
} else {
_this.setState({
placeholderText: ""
});
}
_this.search.focus();
}
}, 150);
} else {
if (_this.search) {
_this.search.value = "";
}
_this.setState({
placeholderShow: false
});
}
if (onDropdownVisibleChange) {
onDropdownVisibleChange(open);
}
};
_this.onSelect = function (value, option) {
var _this$props2 = _this.props,
onSelect = _this$props2.onSelect,
valueProp = _this$props2.value;
if (valueProp === null) {
_this.setState({
value: value
});
}
if (onSelect && valueProp !== value) {
onSelect(value, option);
}
if (_this.search) {
_this.search.value = "";
}
if (_this.select && _this.select.setInputValue) {
_this.select.setInputValue("");
}
};
_this.handleDropdownRender = function (menu) {
_this.menu = menu;
var _this$props3 = _this.props,
searchable = _this$props3.searchable,
searchPlaceholder = _this$props3.searchPlaceholder,
searchInputProps = _this$props3.searchInputProps,
topContent = _this$props3.topContent,
bottomContent = _this$props3.bottomContent;
if (searchable) {
return React.createElement("div", null, topContent, React.createElement("div", {
className: "".concat(prefix, "-search")
}, React.createElement("input", _extends({
ref: _this.saveSearch,
placeholder: searchPlaceholder,
onChange: _this.handleSearch,
onCompositionStart: _this.handleSearchStart,
onCompositionUpdate: _this.handleSearchUpdate,
onCompositionEnd: _this.handleSearchEnd,
onKeyDown: _this.handleSearchKeyDown,
onMouseDown: _this.preventVisibleChange,
onMouseUp: _this.preventVisibleChange
}, searchInputProps || {})), React.createElement(_icon["default"], {
icon: "search",
className: "".concat(prefix, "-icon")
})), menu, bottomContent);
}
return React.createElement(React.Fragment, null, topContent, menu, bottomContent);
};
_this.handleSearchStart = function (e) {
var onSearchCompositionStart = _this.props.onSearchCompositionStart;
var target;
if (e) {
target = e.target;
} else {
target = _this.search;
}
if (onSearchCompositionStart) {
onSearchCompositionStart(target.value);
}
};
_this.handleSearchUpdate = function (e) {
var onSearchCompositionUpdate = _this.props.onSearchCompositionUpdate;
var target;
if (e) {
target = e.target;
} else {
target = _this.search;
}
if (onSearchCompositionUpdate) {
onSearchCompositionUpdate(target.value);
}
};
_this.handleSearchEnd = function (e) {
var onSearchCompositionEnd = _this.props.onSearchCompositionEnd;
var target;
if (e) {
target = e.target;
} else {
target = _this.search;
}
if (onSearchCompositionEnd) {
onSearchCompositionEnd(target.value);
}
};
_this.handleSearch = function (e) {
var target;
if (e) {
target = e.target;
} else {
target = _this.search;
}
var val = target.value;
var _this$state2 = _this.state,
placeholderShow = _this$state2.placeholderShow,
selectId = _this$state2.selectId;
if (val && !placeholderShow) {
_this.setState({
placeholderShow: true
});
}
if (!val && placeholderShow) {
_this.setState({
placeholderShow: false
});
}
if (_this.select) {
var id = selectId;
if (!selectId) {
var _target$parentNode, _target$parentNode$ne;
id = (_target$parentNode = target.parentNode) === null || _target$parentNode === void 0 ? void 0 : (_target$parentNode$ne = _target$parentNode.nextSibling) === null || _target$parentNode$ne === void 0 ? void 0 : _target$parentNode$ne.id;
_this.setState({
selectId: id
});
}
var realInput = document.querySelector(".adui-select-selection-search [aria-owns=\"".concat(id, "\"]"));
if (realInput) {
var lastValue = realInput.value;
realInput.value = val;
var event = new Event("input", {
bubbles: true
});
var tracker = realInput._valueTracker;
if (tracker) {
tracker.setValue(lastValue);
}
realInput.dispatchEvent(event);
}
}
};
_this.handleSearchKeyDown = function (e) {
if (_this.select && _this.select.onInputKeyDown) {
_this.select.onInputKeyDown(e);
}
};
_this.preventVisibleChange = function () {
_this.locked = true;
setTimeout(function () {
_this.locked = false;
_this.setState({
open: true
});
}, 200);
};
var defaultOpen = props.defaultOpen,
defaultValue = props.defaultValue,
_open = props.open,
_value = props.value;
var valueState;
if (_value !== null) {
if (_value === "") {
valueState = undefined;
} else {
valueState = _value;
}
} else if (defaultValue !== null) {
valueState = defaultValue;
}
var openState;
if (_open !== null) {
openState = _open;
} else if (defaultOpen !== null) {
openState = defaultOpen;
}
_this.state = {
open: openState,
placeholderShow: false,
selectId: "",
placeholderText: "",
value: valueState
};
return _this;
}
_createClass(Select, [{
key: "render",
value: function render() {
var _this2 = this;
var _this$props4 = this.props,
allowClear = _this$props4.allowClear,
className = _this$props4.className,
getPopupContainer = _this$props4.getPopupContainer,
_onChange = _this$props4.onChange,
options = _this$props4.options,
placeholder = _this$props4.placeholder,
placeholderColor = _this$props4.placeholderColor,
placement = _this$props4.placement,
rightIcon = _this$props4.rightIcon,
searchable = _this$props4.searchable,
size = _this$props4.size,
theme = _this$props4.theme,
valueProp = _this$props4.value,
otherProps = _objectWithoutProperties(_this$props4, _excluded);
var restProps = (0, _omit["default"])(otherProps, ["defaultValue", "open", "onDropdownVisibleChange", "onSelect", "searchPlaceholder", "onSearchCompositionStart", "onSearchCompositionUpdate", "onSearchCompositionEnd", "searchInputProps", "topContent", "bottomContent"]);
var _this$state3 = this.state,
openState = _this$state3.open,
placeholderShow = _this$state3.placeholderShow,
placeholderText = _this$state3.placeholderText,
valueState = _this$state3.value;
var openProps = {};
if (typeof openState === "boolean") {
openProps.open = openState;
}
if (valueState !== null) {
openProps.value = valueProp === "" ? placeholderColor ? React.createElement("span", {
style: {
color: placeholderColor
}
}, placeholder) : placeholder : valueState;
}
var transitionName = "slide-up";
var dropdownEl = document.querySelector(".adui-select-dropdown-".concat(this.hash));
if (dropdownEl) {
var _dropdownEl$getBoundi = dropdownEl.getBoundingClientRect(),
width = _dropdownEl$getBoundi.width,
height = _dropdownEl$getBoundi.height;
if (width * height > _motion.BOUNCE_SIZE) {
transitionName = "slide-up-bounce";
}
}
return React.createElement(_configProvider.ConfigContext.Consumer, null, function (_ref) {
var _classNames;
var getPopupContainerContext = _ref.getPopupContainer;
return React.createElement(_rcSelect["default"], _extends({
allowClear: allowClear,
className: (0, _classnames["default"])(className, "".concat(prefix, "-select"), "".concat(prefix, "-").concat(size), (_classNames = {}, _defineProperty(_classNames, "".concat(prefix, "-value_is_empty_string"), valueState === "" || valueState === undefined), _defineProperty(_classNames, "".concat(prefix, "-light"), theme === "light"), _defineProperty(_classNames, "".concat(prefix, "-select_placeholderShow"), placeholderShow), _classNames)),
"data-value": valueState || placeholder,
menuItemSelectedIcon: null,
dropdownAlign: (0, _placements["default"])({
alignEdge: true
})[placement || "bottomLeft"],
dropdownClassName: "adui-select-dropdown-".concat(_this2.hash, " adui-select-dropdown-").concat(size, " ").concat(searchable ? "adui-select-dropdown-searchable" : ""),
dropdownRender: _this2.handleDropdownRender,
suffixIcon: React.createElement(React.Fragment, null, placeholderShow && (typeof (placeholderText || placeholder || "") === "string" ? React.createElement("div", {
className: "".concat(prefix, "-placeholder-text"),
style: {
color: !valueState ? placeholderColor || "var(--gray-700)" : "var(--gray-900)"
},
dangerouslySetInnerHTML: {
__html: "".concat(placeholderText || placeholder || "")
}
}) : React.createElement("div", {
className: "".concat(prefix, "-placeholder-text"),
style: {
color: !valueState ? placeholderColor || "var(--gray-700)" : "var(--gray-900)"
}
}, placeholderText || placeholder || "")), React.createElement(_icon["default"], {
icon: rightIcon || "triangle-down",
color: "var(--transparent-gray-700)"
})),
clearIcon: React.createElement("div", {
style: {
background: "radial-gradient(\n circle at 50% 50%, #fff 50%, transparent 50%\n )"
}
}, React.createElement(_icon["default"], {
icon: "cancel-circle",
color: "var(--transparent-gray-700)"
})),
listHeight: 250,
listItemHeight: size === "large" ? 40 : size === "medium" ? 36 : 32,
notFoundContent: "\u65E0\u5339\u914D\u7ED3\u679C",
onDropdownVisibleChange: _this2.onDropdownVisibleChange,
onSelect: _this2.onSelect,
onChange: function onChange(v, ops) {
if (v === undefined && ops === undefined && allowClear) {
_this2.onSelect(v, ops);
}
if (_onChange) {
_onChange(v, ops);
}
},
defaultActiveFirstOption: false,
getPopupContainer: getPopupContainer || getPopupContainerContext,
optionLabelProp: options ? "label" : "children",
optionFilterProp: options ? "label" : "children",
options: options,
placeholder: placeholderColor ? React.createElement("span", {
style: {
color: placeholderColor
}
}, placeholder) : placeholder,
prefixCls: "adui-select",
showSearch: true,
ref: _this2.saveSelect,
transitionName: transitionName
}, openProps, restProps));
});
}
}]);
return Select;
}(React.Component);
Select.type = "Select";
Select.Option = _Option["default"];
Select.OptGroup = _OptGroup["default"];
Select.propTypes = {
allowClear: _propTypes["default"].bool,
bottomContent: _propTypes["default"].node,
children: _propTypes["default"].node,
className: _propTypes["default"].string,
defaultOpen: _propTypes["default"].bool,
defaultValue: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
dropdownMatchSelectWidth: _propTypes["default"].bool,
getPopupContainer: _propTypes["default"].func,
onDropdownVisibleChange: _propTypes["default"].func,
onPopupScroll: _propTypes["default"].func,
onSearch: _propTypes["default"].func,
onSearchCompositionStart: _propTypes["default"].func,
onSearchCompositionUpdate: _propTypes["default"].func,
onSearchCompositionEnd: _propTypes["default"].func,
searchInputProps: _propTypes["default"].any,
onSelect: _propTypes["default"].func,
open: _propTypes["default"].bool,
options: _propTypes["default"].array,
placeholder: _propTypes["default"].any,
placeholderColor: _propTypes["default"].string,
placement: _propTypes["default"].oneOf(["top", "left", "right", "bottom", "topLeft", "topRight", "bottomLeft", "bottomRight", "leftTop", "leftBottom", "rightTop", "rightBottom"]),
rightIcon: _propTypes["default"].any,
searchPlaceholder: _propTypes["default"].string,
searchable: _propTypes["default"].bool,
size: _propTypes["default"].oneOf(["mini", "small", "medium", "large"]),
theme: _propTypes["default"].oneOf([null, "light"]),
topContent: _propTypes["default"].node,
value: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number])
};
Select.defaultProps = {
allowClear: false,
bottomContent: null,
children: null,
className: undefined,
defaultOpen: null,
defaultValue: null,
dropdownMatchSelectWidth: true,
getPopupContainer: null,
onDropdownVisibleChange: noop,
onPopupScroll: noop,
onSearch: noop,
onSearchCompositionStart: noop,
onSearchCompositionUpdate: noop,
onSearchCompositionEnd: noop,
searchInputProps: {},
onSelect: noop,
open: null,
options: undefined,
placeholder: "请选择",
placeholderColor: undefined,
placement: "bottomLeft",
rightIcon: "triangle-down",
searchPlaceholder: "搜索",
searchable: false,
size: "small",
theme: null,
topContent: null
};
Select.getDerivedStateFromProps = function (_ref2) {
var open = _ref2.open,
value = _ref2.value;
var newState = {};
if (open !== null) {
newState.open = open;
}
if (value !== null) {
if (value === "") {
newState.value = undefined;
} else {
newState.value = value;
}
}
return Object.keys(newState).length > 0 ? newState : null;
};
var _default = Select;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJub29wIiwicHJlZml4IiwiU2VsZWN0IiwicHJvcHMiLCJoYXNoIiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwic2xpY2UiLCJsb2NrZWQiLCJzZWxlY3QiLCJzZWFyY2giLCJtZW51Iiwic2F2ZVNlbGVjdCIsIm5vZGUiLCJzYXZlU2VhcmNoIiwib25Ecm9wZG93blZpc2libGVDaGFuZ2UiLCJvcGVuIiwib3BlblByb3AiLCJzdGF0ZSIsInZhbHVlIiwic2VsZWN0SWQiLCJzZXRTdGF0ZSIsInByZXZlbnRWaXNpYmxlQ2hhbmdlIiwic2V0VGltZW91dCIsImlkIiwicGFyZW50Tm9kZSIsIm5leHRTaWJsaW5nIiwicGFyZW50IiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImVsIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsImNoaWxkcmVuIiwibGlzdEhvbGRlciIsImRpc3BhdGNoRXZlbnQiLCJFdmVudCIsInBsYWNlaG9sZGVyVGV4dCIsImRhdGFzZXQiLCJodG1sIiwiaW5uZXJIVE1MIiwiZm9jdXMiLCJwbGFjZWhvbGRlclNob3ciLCJvblNlbGVjdCIsIm9wdGlvbiIsInZhbHVlUHJvcCIsInNldElucHV0VmFsdWUiLCJoYW5kbGVEcm9wZG93blJlbmRlciIsInNlYXJjaGFibGUiLCJzZWFyY2hQbGFjZWhvbGRlciIsInNlYXJjaElucHV0UHJvcHMiLCJ0b3BDb250ZW50IiwiYm90dG9tQ29udGVudCIsImhhbmRsZVNlYXJjaCIsImhhbmRsZVNlYXJjaFN0YXJ0IiwiaGFuZGxlU2VhcmNoVXBkYXRlIiwiaGFuZGxlU2VhcmNoRW5kIiwiaGFuZGxlU2VhcmNoS2V5RG93biIsImUiLCJvblNlYXJjaENvbXBvc2l0aW9uU3RhcnQiLCJ0YXJnZXQiLCJvblNlYXJjaENvbXBvc2l0aW9uVXBkYXRlIiwib25TZWFyY2hDb21wb3NpdGlvbkVuZCIsInZhbCIsInJlYWxJbnB1dCIsInF1ZXJ5U2VsZWN0b3IiLCJsYXN0VmFsdWUiLCJldmVudCIsImJ1YmJsZXMiLCJ0cmFja2VyIiwiX3ZhbHVlVHJhY2tlciIsInNldFZhbHVlIiwib25JbnB1dEtleURvd24iLCJkZWZhdWx0T3BlbiIsImRlZmF1bHRWYWx1ZSIsInZhbHVlU3RhdGUiLCJ1bmRlZmluZWQiLCJvcGVuU3RhdGUiLCJhbGxvd0NsZWFyIiwiY2xhc3NOYW1lIiwiZ2V0UG9wdXBDb250YWluZXIiLCJvbkNoYW5nZSIsIm9wdGlvbnMiLCJwbGFjZWhvbGRlciIsInBsYWNlaG9sZGVyQ29sb3IiLCJwbGFjZW1lbnQiLCJyaWdodEljb24iLCJzaXplIiwidGhlbWUiLCJvdGhlclByb3BzIiwicmVzdFByb3BzIiwib21pdCIsIm9wZW5Qcm9wcyIsImNvbG9yIiwidHJhbnNpdGlvbk5hbWUiLCJkcm9wZG93bkVsIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJCT1VOQ0VfU0laRSIsImdldFBvcHVwQ29udGFpbmVyQ29udGV4dCIsImNsYXNzTmFtZXMiLCJnZXRQbGFjZW1lbnRzIiwiYWxpZ25FZGdlIiwiX19odG1sIiwiYmFja2dyb3VuZCIsInYiLCJvcHMiLCJSZWFjdCIsIkNvbXBvbmVudCIsInR5cGUiLCJPcHRpb24iLCJPcHRHcm91cCIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsImJvb2wiLCJzdHJpbmciLCJvbmVPZlR5cGUiLCJudW1iZXIiLCJkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgiLCJmdW5jIiwib25Qb3B1cFNjcm9sbCIsIm9uU2VhcmNoIiwiYW55IiwiYXJyYXkiLCJvbmVPZiIsImRlZmF1bHRQcm9wcyIsImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyIsIm5ld1N0YXRlIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCJdLCJzb3VyY2VzIjpbIi4uLy4uL2NvbXBvbmVudHMvc2VsZWN0L1NlbGVjdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L25vLWRhbmdlciAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCJcbmltcG9ydCBSY1NlbGVjdCBmcm9tIFwicmMtc2VsZWN0XCJcbmltcG9ydCBPcHRHcm91cCBmcm9tIFwiLi9PcHRHcm91cFwiXG5pbXBvcnQgT3B0aW9uIGZyb20gXCIuL09wdGlvblwiXG5pbXBvcnQgb21pdCBmcm9tIFwiLi4vX3V0aWwvb21pdFwiXG5pbXBvcnQgSWNvbiwgeyBJY29uTmFtZXMgfSBmcm9tIFwiLi4vaWNvblwiXG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSBcIi4uL2NvbmZpZy1wcm92aWRlclwiXG5pbXBvcnQgeyBQbGFjZW1lbnQgfSBmcm9tIFwiLi4vcG9wLXRyaWdnZXJcIlxuaW1wb3J0IGdldFBsYWNlbWVudHMgZnJvbSBcIi4uL3Rvb2x0aXAvcGxhY2VtZW50c1wiXG5pbXBvcnQgXCIuL3N0eWxlXCJcbmltcG9ydCB7IEJPVU5DRV9TSVpFIH0gZnJvbSBcIi4uL191dGlsL21vdGlvblwiXG5cbi8qKlxuICogU2VsZWN0IOWwgeijheS6jiByYy1zZWxlY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvc2VsZWN0XG4gKiByYy1zZWxlY3Qg5pys6LqrIHByb3BzIOmdnuW4uOmdnuW4uOWkmuOAguiAjOWmgiBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSDov5nmoLfnmoQgcHJvcCDnlJroh7PkuI3lnKjmlofmoaPkuK3vvJtcbiAqIOiwg+eUqCByYy1zZWxlY3Qg55qE5YaF572u5pa55rOV77yMU2VsZWN0IOWunueOsOS6huWKn+iDveeahOWGjeWwgeijhe+8jOWmguWGheW1jOaQnOe0ouS+nemdoOeahOaYryB0aGlzLnNlbGVjdC5vbklucHV0Q2hhbmdl77ybXG4gKiByYy1zZWxlY3Qg5LuN54S25pyJ6K645aSa5YC85b6X5YaN5bCB6KOF5ZKM57un57ut5a2m5Lmg55qE5L2Z5Zyw77yMKirmnKrmnaXnmoTlj6/nu7TmiqTnqbrpl7TmmK/pnZ7luLjlpKfnmoQqKuOAglxuICovXG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fVxuY29uc3QgcHJlZml4ID0gXCJhZHVpLXNlbGVjdFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlbGVjdCB7XG4gIGZvcmNlUG9wdXBBbGlnbj86ICgpID0+IHZvaWRcbiAgZ2V0Um9vdERvbU5vZGU/OiAoKSA9PiBIVE1MRWxlbWVudFxuICBvbklucHV0Q2hhbmdlPzogKGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB2b2lkXG4gIG9uSW5wdXRLZXlEb3duPzogKGU6IFJlYWN0LktleWJvYXJkRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHZvaWRcbiAgc2V0SW5wdXRWYWx1ZT86ICh2YWx1ZT86IHN0cmluZykgPT4gdm9pZFxuICBnZXRQb3B1cERPTU5vZGU6ICgpID0+IEhUTUxFbGVtZW50XG59XG5cbnR5cGUgVmFsdWVUeXBlID0gUmVhY3QuUmVhY3RUZXh0XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlbGVjdFByb3BzPFQgZXh0ZW5kcyBWYWx1ZVR5cGUgPSBWYWx1ZVR5cGU+IHtcbiAgW2tleTogc3RyaW5nXTogYW55XG4gIC8qKlxuICAgKiDmmK/lkKbmj5DkvpvmuIXpmaTlip/og71cbiAgICovXG4gIGFsbG93Q2xlYXI/OiBib29sZWFuXG4gIC8qKlxuICAgKiDkuIvmi4nmoYblupXpg6jmmL7npLrnmoToh6rlrprkuYnlhYPntKBcbiAgICovXG4gIGJvdHRvbUNvbnRlbnQ/OiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqXG4gICAqIOWtkOiKgueCuVxuICAgKi9cbiAgY2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqXG4gICAqIOmZhOWKoOexu+WQjVxuICAgKi9cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiDlhoXpg6jpqbHliqjvvJrmmK/lkKblsZXlvIBcbiAgICovXG4gIGRlZmF1bHRPcGVuPzogYm9vbGVhbiB8IG51bGxcbiAgLyoqXG4gICAqIOWGhemDqOmpseWKqO+8muW9k+WJjemAieS4remhueeahOWAvFxuICAgKi9cbiAgZGVmYXVsdFZhbHVlPzogVCB8IG51bGxcbiAgLyoqXG4gICAqIOS4i+aLieWIl+ihqOaYr+WQpuWSjOmAieaLqeWZqOWQjOWuvVxuICAgKi9cbiAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoPzogYm9vbGVhblxuICAvKipcbiAgICog5oyH5a6a5by55Ye65bGC55qE54i257qn77yM6buY6K6k5Li6IGRvY3VtZW50LmJvZHlcbiAgICovXG4gIGdldFBvcHVwQ29udGFpbmVyPzogbnVsbCB8ICgobm9kZTogSFRNTEVsZW1lbnQpID0+IEhUTUxFbGVtZW50KVxuICAvKipcbiAgICog5LiL5ouJ5YiX6KGo5pi+56S65Y+Y5YyW5pe255qEIGhhbmRsZXLvvIzlj4LmlbDvvJpib29sXG4gICAqL1xuICBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZT86IChvcGVuOiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKlxuICAgKiDkuIvmi4nliJfooajmu5rliqjml7bnmoQgaGFuZGxlciwg5Y+C5pWw77yaZVxuICAgKi9cbiAgb25Qb3B1cFNjcm9sbD86IChlOiBSZWFjdC5Nb3VzZUV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4gdm9pZFxuICAvKipcbiAgICog5pCc57Si5pe255qEIGhhbmRsZXIsIOWPguaVsO+8mnN0cmluZ1xuICAgKi9cbiAgb25TZWFyY2g/OiAodmFsOiBzdHJpbmcpID0+IHZvaWRcbiAgLyoqXG4gICAqIOaQnOe0oiBDb21wb3NpdGlvblN0YXJ0IOeahCBoYW5kbGVyLCDlj4LmlbDvvJpzdHJpbmdcbiAgICovXG4gIG9uU2VhcmNoQ29tcG9zaXRpb25TdGFydD86ICh2YWw6IHN0cmluZykgPT4gdm9pZFxuICAvKipcbiAgICog5pCc57SiIENvbXBvc2l0aW9uVXBkYXRlIOeahCBoYW5kbGVyLCDlj4LmlbDvvJpzdHJpbmdcbiAgICovXG4gIG9uU2VhcmNoQ29tcG9zaXRpb25VcGRhdGU/OiAodmFsOiBzdHJpbmcpID0+IHZvaWRcbiAgLyoqXG4gICAqIOaQnOe0oiBDb21wb3NpdGlvbkVuZCDnmoQgaGFuZGxlciwg5Y+C5pWw77yac3RyaW5nXG4gICAqL1xuICBvblNlYXJjaENvbXBvc2l0aW9uRW5kPzogKHZhbDogc3RyaW5nKSA9PiB2b2lkXG4gIC8qKlxuICAgKiDmm7TlpJroh6rlrprkuYkgc2VhcmNoIGlucHV0IOeahCBQcm9wXG4gICAqL1xuICBzZWFyY2hJbnB1dFByb3BzPzoge1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxuICB9XG4gIC8qKlxuICAgKiDpgInmi6nml7bnmoQgaGFuZGxlcu+8jOWPguaVsO+8mih2YWx1ZSwgb3B0aW9uKVxuICAgKi9cbiAgb25TZWxlY3Q/OiAodmFsdWU6IFQsIG9wdGlvbjogUmVhY3QuUmVhY3RFbGVtZW50PGFueT4pID0+IHZvaWRcbiAgLyoqXG4gICAqIOWklumDqOaOp+WItu+8muaYr+WQpuWxleW8gFxuICAgKi9cbiAgb3Blbj86IG51bGwgfCBib29sZWFuXG4gIC8qKlxuICAgKiDlj6/nm7TmjqXkvKDlhaUgb3B0aW9uc++8jOabv+S7o+aJi+WKqOaehOmAoCBjaGlsZHJlbiBqc3gg55qE5pa55byP77yM6ZyA5Lyg5YWl5q+P6aG555qEIGxhYmVsIOWSjCB2YWx1ZVxuICAgKi9cbiAgb3B0aW9ucz86IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbiAgICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgICBkaXNhYmxlZD86IGJvb2xlYW5cbiAgICBsYWJlbDogUmVhY3QuUmVhY3ROb2RlXG4gICAgdmFsdWU6IFRcbiAgfVtdXG4gIC8qKlxuICAgKiDpgInmi6nmoYbpu5jorqTmloflrZdcbiAgICovXG4gIHBsYWNlaG9sZGVyPzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDpgInmi6nmoYbpu5jorqTmloflrZfnmoTpopzoibJcbiAgICovXG4gIHBsYWNlaG9sZGVyQ29sb3I/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOiuvue9riBwbGFjZW1lbnRcbiAgICovXG4gIHBsYWNlbWVudD86IFBsYWNlbWVudFxuICAvKipcbiAgICog6K6+572u5Y+z5Zu+5qCHXG4gICAqL1xuICByaWdodEljb24/OiBJY29uTmFtZXNcbiAgLyoqXG4gICAqIOaQnOe0ouahhum7mOiupOaWh+Wtl1xuICAgKi9cbiAgc2VhcmNoYWJsZT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOaYr+WQpumcgOimgeWGheW1jOaQnOe0olxuICAgKi9cbiAgc2VhcmNoUGxhY2Vob2xkZXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOiuvue9ruWwuuWvuO+8jOi3n+edgCBidXR0b24g6LWwXG4gICAqL1xuICBzaXplPzogXCJtaW5pXCIgfCBcInNtYWxsXCIgfCBcIm1lZGl1bVwiIHwgXCJsYXJnZVwiXG4gIC8qKlxuICAgKiDorr7nva7kuLvpophcbiAgICovXG4gIHRoZW1lPzogbnVsbCB8IFwibGlnaHRcIlxuICAvKipcbiAgICog5LiL5ouJ5qGG6aG26YOo5pi+56S655qE6Ieq5a6a5LmJ5YWD57SgXG4gICAqL1xuICB0b3BDb250ZW50PzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDlpJbpg6jmjqfliLbvvJrlvZPliY3pgInkuK3pobnnmoTlgLxcbiAgICovXG4gIHZhbHVlPzogVCB8IG51bGxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VsZWN0U3RhdGU8VCBleHRlbmRzIFZhbHVlVHlwZSA9IFZhbHVlVHlwZT4ge1xuICBvcGVuPzogYm9vbGVhblxuICBwbGFjZWhvbGRlclNob3c/OiBib29sZWFuXG4gIHBsYWNlaG9sZGVyVGV4dD86IHN0cmluZ1xuICB2YWx1ZT86IFQgfCBudWxsXG4gIHNlbGVjdElkPzogc3RyaW5nXG59XG5cbi8qKlxuICog6YCJ5oup5Zmo55So5LqO6YCJ5oup5p+Q6aG55YaF5a6544CCXG4gKiDpgInmi6nlmajlr7nmr5TljZXpgIkgUmFkaW8g55qE5LyY5Yq/5piv77yM5b2T6YCJ6aG56L+H5aSa5pe277yM6YCJ5oup5Zmo5Y+v5a+55YaF5a655pS26LW377yM5bm25pu05YWz5rOo5LqO5bey6YCJ6aG544CCXG4gKiDpgJrluLjvvIzlvZPnlKjmiLfog73lpJ/pgJrov4flt7LpgInpobnvvIzovbvmmJPlvpfnn6XlhbbkvZnpgInpobnnmoTop4Tlvovml7bvvIjlpoLlubTku73jgIHln47luILnrYnvvInvvIzpgInmi6nlmaggU2VsZWN0IOaYr+avlOi+g+WlveeahOmAieaLqeOAglxuICovXG5jbGFzcyBTZWxlY3Q8VCBleHRlbmRzIFZhbHVlVHlwZSA9IFZhbHVlVHlwZT4gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8XG4gIElTZWxlY3RQcm9wczxUPixcbiAgSVNlbGVjdFN0YXRlPFQ+XG4+IHtcbiAgcHVibGljIHN0YXRpYyB0eXBlID0gXCJTZWxlY3RcIlxuXG4gIHB1YmxpYyBzdGF0aWMgT3B0aW9uOiB0eXBlb2YgT3B0aW9uID0gT3B0aW9uXG5cbiAgcHVibGljIHN0YXRpYyBPcHRHcm91cDogdHlwZW9mIE9wdEdyb3VwID0gT3B0R3JvdXBcblxuICBwdWJsaWMgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAvKipcbiAgICAgKiDmmK/lkKbmj5DkvpvmuIXpmaTlip/og71cbiAgICAgKi9cbiAgICBhbGxvd0NsZWFyOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAvKipcbiAgICAgKiDkuIvmi4nmoYblupXpg6jmmL7npLrnmoToh6rlrprkuYnlhYPntKBcbiAgICAgKi9cbiAgICBib3R0b21Db250ZW50OiBQcm9wVHlwZXMubm9kZSxcbiAgICAvKipcbiAgICAgKiDlrZDoioLngrlcbiAgICAgKi9cbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICog6ZmE5Yqg57G75ZCNXG4gICAgICovXG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIOWGhemDqOmpseWKqO+8muaYr+WQpuWxleW8gFxuICAgICAqL1xuICAgIGRlZmF1bHRPcGVuOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAvKipcbiAgICAgKiDlhoXpg6jpqbHliqjvvJrlvZPliY3pgInkuK3pobnnmoTlgLxcbiAgICAgKi9cbiAgICBkZWZhdWx0VmFsdWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKSxcbiAgICAvKipcbiAgICAgKiDkuIvmi4nliJfooajmmK/lkKblkozpgInmi6nlmajlkIzlrr1cbiAgICAgKi9cbiAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGg6IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOaMh+WumuW8ueWHuuWxgueahOeItue6p++8jOm7mOiupOS4uiBkb2N1bWVudC5ib2R5XG4gICAgICovXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOS4i+aLieWIl+ihqOaYvuekuuWPmOWMluaXtueahCBoYW5kbGVy77yM5Y+C5pWw77yaYm9vbFxuICAgICAqL1xuICAgIG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiDkuIvmi4nliJfooajmu5rliqjml7bnmoQgaGFuZGxlciwg5Y+C5pWw77yaZVxuICAgICAqL1xuICAgIG9uUG9wdXBTY3JvbGw6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOaQnOe0ouaXtueahCBoYW5kbGVyLCDlj4LmlbDvvJpzdHJpbmdcbiAgICAgKi9cbiAgICBvblNlYXJjaDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICog5pCc57SiIENvbXBvc2l0aW9uU3RhcnQg55qEIGhhbmRsZXIsIOWPguaVsO+8mnN0cmluZ1xuICAgICAqL1xuICAgIG9uU2VhcmNoQ29tcG9zaXRpb25TdGFydDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICog5pCc57SiIENvbXBvc2l0aW9uVXBkYXRlIOeahCBoYW5kbGVyLCDlj4LmlbDvvJpzdHJpbmdcbiAgICAgKi9cbiAgICBvblNlYXJjaENvbXBvc2l0aW9uVXBkYXRlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiDmkJzntKIgQ29tcG9zaXRpb25FbmQg55qEIGhhbmRsZXIsIOWPguaVsO+8mnN0cmluZ1xuICAgICAqL1xuICAgIG9uU2VhcmNoQ29tcG9zaXRpb25FbmQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOabtOWkmuiHquWumuS5iSBzZWFyY2ggaW5wdXQg55qEIFByb3BcbiAgICAgKi9cbiAgICBzZWFyY2hJbnB1dFByb3BzOiBQcm9wVHlwZXMuYW55LFxuICAgIC8qKlxuICAgICAqIOmAieaLqeaXtueahCBoYW5kbGVy77yM5Y+C5pWw77yaKHZhbHVlLCBvcHRpb24pXG4gICAgICovXG4gICAgb25TZWxlY3Q6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOWklumDqOaOp+WItu+8muaYr+WQpuWxleW8gFxuICAgICAqL1xuICAgIG9wZW46IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOWPr+ebtOaOpeS8oOWFpSBvcHRpb25z77yM5pu/5Luj5omL5Yqo5p6E6YCgIGNoaWxkcmVuIGpzeCDnmoTmlrnlvI/vvIzpnIDkvKDlhaXmr4/pobnnmoQgbGFiZWwg5ZKMIHZhbHVlXG4gICAgICovXG4gICAgb3B0aW9uczogUHJvcFR5cGVzLmFycmF5LFxuICAgIC8qKlxuICAgICAqIOmAieaLqeahhum7mOiupOaWh+Wtl1xuICAgICAqL1xuICAgIHBsYWNlaG9sZGVyOiBQcm9wVHlwZXMuYW55LFxuICAgIC8qKlxuICAgICAqIOmAieaLqeahhum7mOiupOaWh+Wtl+eahOminOiJslxuICAgICAqL1xuICAgIHBsYWNlaG9sZGVyQ29sb3I6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgLyoqXG4gICAgICog6K6+572uIHBsYWNlbWVudFxuICAgICAqL1xuICAgIHBsYWNlbWVudDogUHJvcFR5cGVzLm9uZU9mKFtcbiAgICAgIFwidG9wXCIsXG4gICAgICBcImxlZnRcIixcbiAgICAgIFwicmlnaHRcIixcbiAgICAgIFwiYm90dG9tXCIsXG4gICAgICBcInRvcExlZnRcIixcbiAgICAgIFwidG9wUmlnaHRcIixcbiAgICAgIFwiYm90dG9tTGVmdFwiLFxuICAgICAgXCJib3R0b21SaWdodFwiLFxuICAgICAgXCJsZWZ0VG9wXCIsXG4gICAgICBcImxlZnRCb3R0b21cIixcbiAgICAgIFwicmlnaHRUb3BcIixcbiAgICAgIFwicmlnaHRCb3R0b21cIixcbiAgICBdKSxcbiAgICAvKipcbiAgICAgKiDorr7nva7lj7Plm77moIdcbiAgICAgKi9cbiAgICByaWdodEljb246IFByb3BUeXBlcy5hbnksXG4gICAgLyoqXG4gICAgICog5pCc57Si5qGG6buY6K6k5paH5a2XXG4gICAgICovXG4gICAgc2VhcmNoUGxhY2Vob2xkZXI6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgLyoqXG4gICAgICog5piv5ZCm6ZyA6KaB5YaF5bWM5pCc57SiXG4gICAgICovXG4gICAgc2VhcmNoYWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgLyoqXG4gICAgICog6K6+572u5bC65a+477yM6Lef552AIGJ1dHRvbiDotbBcbiAgICAgKi9cbiAgICBzaXplOiBQcm9wVHlwZXMub25lT2YoW1wibWluaVwiLCBcInNtYWxsXCIsIFwibWVkaXVtXCIsIFwibGFyZ2VcIl0pLFxuICAgIC8qKlxuICAgICAqIOiuvue9ruS4u+mimFxuICAgICAqL1xuICAgIHRoZW1lOiBQcm9wVHlwZXMub25lT2YoW251bGwsIFwibGlnaHRcIl0pLFxuICAgIC8qKlxuICAgICAqIOS4i+aLieahhumhtumDqOaYvuekuueahOiHquWumuS5ieWFg+e0oFxuICAgICAqL1xuICAgIHRvcENvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLFxuICAgIC8qKlxuICAgICAqIOWklumDqOaOp+WItu+8muW9k+WJjemAieS4remhueeahOWAvFxuICAgICAqL1xuICAgIHZhbHVlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGRlZmF1bHRQcm9wczogSVNlbGVjdFByb3BzID0ge1xuICAgIGFsbG93Q2xlYXI6IGZhbHNlLFxuICAgIGJvdHRvbUNvbnRlbnQ6IG51bGwsXG4gICAgY2hpbGRyZW46IG51bGwsXG4gICAgY2xhc3NOYW1lOiB1bmRlZmluZWQsXG4gICAgZGVmYXVsdE9wZW46IG51bGwsXG4gICAgZGVmYXVsdFZhbHVlOiBudWxsLFxuICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aDogdHJ1ZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogbnVsbCxcbiAgICBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZTogbm9vcCxcbiAgICBvblBvcHVwU2Nyb2xsOiBub29wLFxuICAgIG9uU2VhcmNoOiBub29wLFxuICAgIG9uU2VhcmNoQ29tcG9zaXRpb25TdGFydDogbm9vcCxcbiAgICBvblNlYXJjaENvbXBvc2l0aW9uVXBkYXRlOiBub29wLFxuICAgIG9uU2VhcmNoQ29tcG9zaXRpb25FbmQ6IG5vb3AsXG4gICAgc2VhcmNoSW5wdXRQcm9wczoge30sXG4gICAgb25TZWxlY3Q6IG5vb3AsXG4gICAgb3BlbjogbnVsbCxcbiAgICBvcHRpb25zOiB1bmRlZmluZWQsXG4gICAgcGxhY2Vob2xkZXI6IFwi6K+36YCJ5oupXCIsXG4gICAgcGxhY2Vob2xkZXJDb2xvcjogdW5kZWZpbmVkLFxuICAgIHBsYWNlbWVudDogXCJib3R0b21MZWZ0XCIsXG4gICAgcmlnaHRJY29uOiBcInRyaWFuZ2xlLWRvd25cIixcbiAgICBzZWFyY2hQbGFjZWhvbGRlcjogXCLmkJzntKJcIixcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBzaXplOiBcInNtYWxsXCIsXG4gICAgdGhlbWU6IG51bGwsXG4gICAgdG9wQ29udGVudDogbnVsbCxcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gKHsgb3BlbiwgdmFsdWUgfTogSVNlbGVjdFByb3BzKSA9PiB7XG4gICAgY29uc3QgbmV3U3RhdGU6IElTZWxlY3RTdGF0ZSA9IHt9XG4gICAgaWYgKG9wZW4gIT09IG51bGwpIHtcbiAgICAgIG5ld1N0YXRlLm9wZW4gPSBvcGVuXG4gICAgfVxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgIG5ld1N0YXRlLnZhbHVlID0gdW5kZWZpbmVkXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdTdGF0ZS52YWx1ZSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhuZXdTdGF0ZSkubGVuZ3RoID4gMCA/IG5ld1N0YXRlIDogbnVsbFxuICB9XG5cbiAgcHVibGljIGhhc2ggPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKVxuXG4gIHB1YmxpYyBsb2NrZWQgPSBmYWxzZVxuXG4gIHB1YmxpYyBzZWxlY3Q6IElTZWxlY3RcblxuICBwdWJsaWMgc2VhcmNoOiBIVE1MSW5wdXRFbGVtZW50XG5cbiAgcHVibGljIG1lbnU6IEpTWC5FbGVtZW50XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IElTZWxlY3RQcm9wczxUPikge1xuICAgIHN1cGVyKHByb3BzKVxuICAgIGNvbnN0IHsgZGVmYXVsdE9wZW4sIGRlZmF1bHRWYWx1ZSwgb3BlbiwgdmFsdWUgfSA9IHByb3BzXG5cbiAgICBsZXQgdmFsdWVTdGF0ZTogVCB8IHVuZGVmaW5lZFxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgIHZhbHVlU3RhdGUgPSB1bmRlZmluZWRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlU3RhdGUgPSB2YWx1ZVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGVmYXVsdFZhbHVlICE9PSBudWxsKSB7XG4gICAgICB2YWx1ZVN0YXRlID0gZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgbGV0IG9wZW5TdGF0ZVxuICAgIGlmIChvcGVuICE9PSBudWxsKSB7XG4gICAgICBvcGVuU3RhdGUgPSBvcGVuXG4gICAgfSBlbHNlIGlmIChkZWZhdWx0T3BlbiAhPT0gbnVsbCkge1xuICAgICAgb3BlblN0YXRlID0gZGVmYXVsdE9wZW5cbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIG9wZW46IG9wZW5TdGF0ZSxcbiAgICAgIHBsYWNlaG9sZGVyU2hvdzogZmFsc2UsXG4gICAgICBzZWxlY3RJZDogXCJcIixcbiAgICAgIHBsYWNlaG9sZGVyVGV4dDogXCJcIixcbiAgICAgIHZhbHVlOiB2YWx1ZVN0YXRlLFxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzYXZlU2VsZWN0ID0gKG5vZGU6IElTZWxlY3QpID0+IHtcbiAgICB0aGlzLnNlbGVjdCA9IG5vZGVcbiAgfVxuXG4gIHB1YmxpYyBzYXZlU2VhcmNoID0gKG5vZGU6IEhUTUxJbnB1dEVsZW1lbnQpID0+IHtcbiAgICB0aGlzLnNlYXJjaCA9IG5vZGVcbiAgfVxuXG4gIHB1YmxpYyBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSA9IChvcGVuOiBib29sZWFuKSA9PiB7XG4gICAgY29uc3QgeyBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSwgb3Blbjogb3BlblByb3AgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCB7IHZhbHVlLCBzZWxlY3RJZCB9ID0gdGhpcy5zdGF0ZVxuXG4gICAgaWYgKHRoaXMubG9ja2VkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKG9wZW5Qcm9wID09PSBudWxsKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgb3BlbiB9KVxuICAgIH1cbiAgICBpZiAob3Blbikge1xuICAgICAgdGhpcy5wcmV2ZW50VmlzaWJsZUNoYW5nZSgpXG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zZWFyY2gpIHtcbiAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGxldCBpZCA9IHNlbGVjdElkXG4gICAgICAgICAgICBpZiAoIXNlbGVjdElkKSB7XG4gICAgICAgICAgICAgIGlkID0gKHRoaXMuc2VhcmNoLnBhcmVudE5vZGU/Lm5leHRTaWJsaW5nIGFzIEVsZW1lbnQpPy5pZFxuICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0SWQ6IGlkIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpPy5uZXh0U2libGluZyBhcyBFbGVtZW50XG5cbiAgICAgICAgICAgICAgY29uc3QgZWwgPSBwYXJlbnQ/LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXG4gICAgICAgICAgICAgICAgXCJhZHVpLXNlbGVjdC1pdGVtLW9wdGlvbi1zZWxlY3RlZFwiXG4gICAgICAgICAgICAgIClbMF0/LmNoaWxkcmVuWzBdIGFzIEhUTUxFbGVtZW50XG5cbiAgICAgICAgICAgICAgY29uc3QgbGlzdEhvbGRlciA9IHBhcmVudD8uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcbiAgICAgICAgICAgICAgICBcInJjLXZpcnR1YWwtbGlzdC1ob2xkZXJcIlxuICAgICAgICAgICAgICApWzBdIGFzIEhUTUxFbGVtZW50XG5cbiAgICAgICAgICAgICAgaWYgKGxpc3RIb2xkZXIpIHtcbiAgICAgICAgICAgICAgICBsaXN0SG9sZGVyLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwic2Nyb2xsXCIpKVxuXG4gICAgICAgICAgICAgICAgaWYgKGxpc3RIb2xkZXIuY2hpbGRyZW5bMF0pIHtcbiAgICAgICAgICAgICAgICAgIGxpc3RIb2xkZXIuY2hpbGRyZW5bMF0uZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJzY3JvbGxcIikpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlclRleHQ6IGVsLmRhdGFzZXQuaHRtbCB8fCBlbC5pbm5lckhUTUwsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJUZXh0OiBcIlwiLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zZWFyY2guZm9jdXMoKVxuICAgICAgICB9XG4gICAgICB9LCAxNTApXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnNlYXJjaCkge1xuICAgICAgICB0aGlzLnNlYXJjaC52YWx1ZSA9IFwiXCJcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBwbGFjZWhvbGRlclNob3c6IGZhbHNlLFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlKSB7XG4gICAgICBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZShvcGVuKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblNlbGVjdCA9ICh2YWx1ZTogVCwgb3B0aW9uOiBhbnkpID0+IHtcbiAgICBjb25zdCB7IG9uU2VsZWN0LCB2YWx1ZTogdmFsdWVQcm9wIH0gPSB0aGlzLnByb3BzXG5cbiAgICBpZiAodmFsdWVQcm9wID09PSBudWxsKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgdmFsdWUsXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAob25TZWxlY3QgJiYgdmFsdWVQcm9wICE9PSB2YWx1ZSkge1xuICAgICAgb25TZWxlY3QodmFsdWUsIG9wdGlvbilcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWFyY2gpIHtcbiAgICAgIHRoaXMuc2VhcmNoLnZhbHVlID0gXCJcIlxuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3QgJiYgdGhpcy5zZWxlY3Quc2V0SW5wdXRWYWx1ZSkge1xuICAgICAgdGhpcy5zZWxlY3Quc2V0SW5wdXRWYWx1ZShcIlwiKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVEcm9wZG93blJlbmRlciA9IChtZW51OiBKU1guRWxlbWVudCkgPT4ge1xuICAgIHRoaXMubWVudSA9IG1lbnVcbiAgICBjb25zdCB7XG4gICAgICBzZWFyY2hhYmxlLFxuICAgICAgc2VhcmNoUGxhY2Vob2xkZXIsXG4gICAgICBzZWFyY2hJbnB1dFByb3BzLFxuICAgICAgdG9wQ29udGVudCxcbiAgICAgIGJvdHRvbUNvbnRlbnQsXG4gICAgfSA9IHRoaXMucHJvcHNcbiAgICBpZiAoc2VhcmNoYWJsZSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICB7dG9wQ29udGVudH1cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cHJlZml4fS1zZWFyY2hgfT5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICByZWY9e3RoaXMuc2F2ZVNlYXJjaH1cbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3NlYXJjaFBsYWNlaG9sZGVyfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5oYW5kbGVTZWFyY2h9XG4gICAgICAgICAgICAgIG9uQ29tcG9zaXRpb25TdGFydD17dGhpcy5oYW5kbGVTZWFyY2hTdGFydH1cbiAgICAgICAgICAgICAgb25Db21wb3NpdGlvblVwZGF0ZT17dGhpcy5oYW5kbGVTZWFyY2hVcGRhdGV9XG4gICAgICAgICAgICAgIG9uQ29tcG9zaXRpb25FbmQ9e3RoaXMuaGFuZGxlU2VhcmNoRW5kfVxuICAgICAgICAgICAgICBvbktleURvd249e3RoaXMuaGFuZGxlU2VhcmNoS2V5RG93bn1cbiAgICAgICAgICAgICAgb25Nb3VzZURvd249e3RoaXMucHJldmVudFZpc2libGVDaGFuZ2V9XG4gICAgICAgICAgICAgIG9uTW91c2VVcD17dGhpcy5wcmV2ZW50VmlzaWJsZUNoYW5nZX1cbiAgICAgICAgICAgICAgey4uLihzZWFyY2hJbnB1dFByb3BzIHx8IHt9KX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8SWNvbiBpY29uPVwic2VhcmNoXCIgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWljb25gfSAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHttZW51fVxuICAgICAgICAgIHtib3R0b21Db250ZW50fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIHt0b3BDb250ZW50fVxuICAgICAgICB7bWVudX1cbiAgICAgICAge2JvdHRvbUNvbnRlbnR9XG4gICAgICA8Lz5cbiAgICApXG4gIH1cblxuICBwdWJsaWMgaGFuZGxlU2VhcmNoU3RhcnQ6IFJlYWN0LkNvbXBvc2l0aW9uRXZlbnRIYW5kbGVyPEhUTUxJbnB1dEVsZW1lbnQ+ID0gKFxuICAgIGVcbiAgKSA9PiB7XG4gICAgY29uc3QgeyBvblNlYXJjaENvbXBvc2l0aW9uU3RhcnQgfSA9IHRoaXMucHJvcHNcbiAgICBsZXQgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50XG4gICAgaWYgKGUpIHtcbiAgICAgIHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnRcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0ID0gdGhpcy5zZWFyY2hcbiAgICB9XG4gICAgaWYgKG9uU2VhcmNoQ29tcG9zaXRpb25TdGFydCkge1xuICAgICAgb25TZWFyY2hDb21wb3NpdGlvblN0YXJ0KHRhcmdldC52YWx1ZSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlU2VhcmNoVXBkYXRlOiBSZWFjdC5Db21wb3NpdGlvbkV2ZW50SGFuZGxlcjxIVE1MSW5wdXRFbGVtZW50PiA9IChcbiAgICBlXG4gICkgPT4ge1xuICAgIGNvbnN0IHsgb25TZWFyY2hDb21wb3NpdGlvblVwZGF0ZSB9ID0gdGhpcy5wcm9wc1xuICAgIGxldCB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnRcbiAgICBpZiAoZSkge1xuICAgICAgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudFxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQgPSB0aGlzLnNlYXJjaFxuICAgIH1cbiAgICBpZiAob25TZWFyY2hDb21wb3NpdGlvblVwZGF0ZSkge1xuICAgICAgb25TZWFyY2hDb21wb3NpdGlvblVwZGF0ZSh0YXJnZXQudmFsdWUpXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhbmRsZVNlYXJjaEVuZDogUmVhY3QuQ29tcG9zaXRpb25FdmVudEhhbmRsZXI8SFRNTElucHV0RWxlbWVudD4gPSAoXG4gICAgZVxuICApID0+IHtcbiAgICBjb25zdCB7IG9uU2VhcmNoQ29tcG9zaXRpb25FbmQgfSA9IHRoaXMucHJvcHNcbiAgICBsZXQgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50XG4gICAgaWYgKGUpIHtcbiAgICAgIHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnRcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0ID0gdGhpcy5zZWFyY2hcbiAgICB9XG4gICAgaWYgKG9uU2VhcmNoQ29tcG9zaXRpb25FbmQpIHtcbiAgICAgIG9uU2VhcmNoQ29tcG9zaXRpb25FbmQodGFyZ2V0LnZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVTZWFyY2ggPSAoZT86IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgbGV0IHRhcmdldDogSFRNTElucHV0RWxlbWVudFxuICAgIGlmIChlKSB7XG4gICAgICB0YXJnZXQgPSBlLnRhcmdldFxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQgPSB0aGlzLnNlYXJjaFxuICAgIH1cbiAgICBjb25zdCB2YWwgPSB0YXJnZXQudmFsdWVcbiAgICBjb25zdCB7IHBsYWNlaG9sZGVyU2hvdywgc2VsZWN0SWQgfSA9IHRoaXMuc3RhdGVcbiAgICBpZiAodmFsICYmICFwbGFjZWhvbGRlclNob3cpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBwbGFjZWhvbGRlclNob3c6IHRydWUgfSlcbiAgICB9XG4gICAgaWYgKCF2YWwgJiYgcGxhY2Vob2xkZXJTaG93KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgcGxhY2Vob2xkZXJTaG93OiBmYWxzZSB9KVxuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3QpIHtcbiAgICAgIGxldCBpZCA9IHNlbGVjdElkXG4gICAgICBpZiAoIXNlbGVjdElkKSB7XG4gICAgICAgIGlkID0gKHRhcmdldC5wYXJlbnROb2RlPy5uZXh0U2libGluZyBhcyBFbGVtZW50KT8uaWRcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlbGVjdElkOiBpZCB9KVxuICAgICAgfVxuICAgICAgY29uc3QgcmVhbElucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgYC5hZHVpLXNlbGVjdC1zZWxlY3Rpb24tc2VhcmNoIFthcmlhLW93bnM9XCIke2lkfVwiXWBcbiAgICAgICkgYXMgYW55XG4gICAgICBpZiAocmVhbElucHV0KSB7XG4gICAgICAgIGNvbnN0IGxhc3RWYWx1ZSA9IHJlYWxJbnB1dC52YWx1ZVxuICAgICAgICByZWFsSW5wdXQudmFsdWUgPSB2YWxcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUgfSlcbiAgICAgICAgLy8gaGFjayBSZWFjdDE2IOWGhemDqOWumuS5ieS6hmRlc2NyaXB0b3Lmi6bmiKp2YWx1Ze+8jOatpOWkhOmHjee9rueKtuaAgVxuICAgICAgICBjb25zdCB0cmFja2VyID0gcmVhbElucHV0Ll92YWx1ZVRyYWNrZXJcbiAgICAgICAgaWYgKHRyYWNrZXIpIHtcbiAgICAgICAgICB0cmFja2VyLnNldFZhbHVlKGxhc3RWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZWFsSW5wdXQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlU2VhcmNoS2V5RG93biA9IChlOiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ICYmIHRoaXMuc2VsZWN0Lm9uSW5wdXRLZXlEb3duKSB7XG4gICAgICB0aGlzLnNlbGVjdC5vbklucHV0S2V5RG93bihlKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwcmV2ZW50VmlzaWJsZUNoYW5nZSA9ICgpID0+IHtcbiAgICB0aGlzLmxvY2tlZCA9IHRydWVcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubG9ja2VkID0gZmFsc2VcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuOiB0cnVlIH0pXG4gICAgfSwgMjAwKVxuICB9XG5cbiAgcHVibGljIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBhbGxvd0NsZWFyLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXIsXG4gICAgICBvbkNoYW5nZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICAgIHBsYWNlaG9sZGVyQ29sb3IsXG4gICAgICBwbGFjZW1lbnQsXG4gICAgICByaWdodEljb24sXG4gICAgICBzZWFyY2hhYmxlLFxuICAgICAgc2l6ZSxcbiAgICAgIHRoZW1lLFxuICAgICAgdmFsdWU6IHZhbHVlUHJvcCxcbiAgICAgIC4uLm90aGVyUHJvcHNcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgY29uc3QgcmVzdFByb3BzID0gb21pdChvdGhlclByb3BzLCBbXG4gICAgICBcImRlZmF1bHRWYWx1ZVwiLFxuICAgICAgXCJvcGVuXCIsXG4gICAgICBcIm9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlXCIsXG4gICAgICBcIm9uU2VsZWN0XCIsXG4gICAgICBcInNlYXJjaFBsYWNlaG9sZGVyXCIsXG4gICAgICBcIm9uU2VhcmNoQ29tcG9zaXRpb25TdGFydFwiLFxuICAgICAgXCJvblNlYXJjaENvbXBvc2l0aW9uVXBkYXRlXCIsXG4gICAgICBcIm9uU2VhcmNoQ29tcG9zaXRpb25FbmRcIixcbiAgICAgIFwic2VhcmNoSW5wdXRQcm9wc1wiLFxuICAgICAgXCJ0b3BDb250ZW50XCIsXG4gICAgICBcImJvdHRvbUNvbnRlbnRcIixcbiAgICBdKVxuXG4gICAgY29uc3Qge1xuICAgICAgb3Blbjogb3BlblN0YXRlLFxuICAgICAgcGxhY2Vob2xkZXJTaG93LFxuICAgICAgcG