UNPKG

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>

578 lines (481 loc) 72.6 kB
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); } var _excluded = ["allowClear", "className", "getPopupContainer", "onChange", "options", "placeholder", "placeholderColor", "placement", "rightIcon", "searchable", "size", "theme", "value"]; 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); } import * as React from "react"; import PropTypes from "prop-types"; import classNames from "classnames"; import RcSelect from "rc-select"; import OptGroup from "./OptGroup"; import Option from "./Option"; import omit from "../_util/omit"; import Icon from "../icon"; import { ConfigContext } from "../config-provider"; import getPlacements from "../tooltip/placements"; import "./style"; import { BOUNCE_SIZE } from "../_util/motion"; 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, { 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 = omit(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 > BOUNCE_SIZE) { transitionName = "slide-up-bounce"; } } return React.createElement(ConfigContext.Consumer, null, function (_ref) { var _classNames; var getPopupContainerContext = _ref.getPopupContainer; return React.createElement(RcSelect, _extends({ allowClear: allowClear, className: classNames(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: getPlacements({ 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, { 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, { 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; Select.OptGroup = OptGroup; Select.propTypes = { allowClear: PropTypes.bool, bottomContent: PropTypes.node, children: PropTypes.node, className: PropTypes.string, defaultOpen: PropTypes.bool, defaultValue: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), dropdownMatchSelectWidth: PropTypes.bool, getPopupContainer: PropTypes.func, onDropdownVisibleChange: PropTypes.func, onPopupScroll: PropTypes.func, onSearch: PropTypes.func, onSearchCompositionStart: PropTypes.func, onSearchCompositionUpdate: PropTypes.func, onSearchCompositionEnd: PropTypes.func, searchInputProps: PropTypes.any, onSelect: PropTypes.func, open: PropTypes.bool, options: PropTypes.array, placeholder: PropTypes.any, placeholderColor: PropTypes.string, placement: PropTypes.oneOf(["top", "left", "right", "bottom", "topLeft", "topRight", "bottomLeft", "bottomRight", "leftTop", "leftBottom", "rightTop", "rightBottom"]), rightIcon: PropTypes.any, searchPlaceholder: PropTypes.string, searchable: PropTypes.bool, size: PropTypes.oneOf(["mini", "small", "medium", "large"]), theme: PropTypes.oneOf([null, "light"]), topContent: PropTypes.node, value: PropTypes.oneOfType([PropTypes.string, PropTypes.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; }; export default Select; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlByb3BUeXBlcyIsImNsYXNzTmFtZXMiLCJSY1NlbGVjdCIsIk9wdEdyb3VwIiwiT3B0aW9uIiwib21pdCIsIkljb24iLCJDb25maWdDb250ZXh0IiwiZ2V0UGxhY2VtZW50cyIsIkJPVU5DRV9TSVpFIiwibm9vcCIsInByZWZpeCIsIlNlbGVjdCIsInByb3BzIiwiaGFzaCIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInNsaWNlIiwibG9ja2VkIiwic2VsZWN0Iiwic2VhcmNoIiwibWVudSIsInNhdmVTZWxlY3QiLCJub2RlIiwic2F2ZVNlYXJjaCIsIm9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlIiwib3BlbiIsIm9wZW5Qcm9wIiwic3RhdGUiLCJ2YWx1ZSIsInNlbGVjdElkIiwic2V0U3RhdGUiLCJwcmV2ZW50VmlzaWJsZUNoYW5nZSIsInNldFRpbWVvdXQiLCJpZCIsInBhcmVudE5vZGUiLCJuZXh0U2libGluZyIsInBhcmVudCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJlbCIsImdldEVsZW1lbnRzQnlDbGFzc05hbWUiLCJjaGlsZHJlbiIsImxpc3RIb2xkZXIiLCJkaXNwYXRjaEV2ZW50IiwiRXZlbnQiLCJwbGFjZWhvbGRlclRleHQiLCJkYXRhc2V0IiwiaHRtbCIsImlubmVySFRNTCIsImZvY3VzIiwicGxhY2Vob2xkZXJTaG93Iiwib25TZWxlY3QiLCJvcHRpb24iLCJ2YWx1ZVByb3AiLCJzZXRJbnB1dFZhbHVlIiwiaGFuZGxlRHJvcGRvd25SZW5kZXIiLCJzZWFyY2hhYmxlIiwic2VhcmNoUGxhY2Vob2xkZXIiLCJzZWFyY2hJbnB1dFByb3BzIiwidG9wQ29udGVudCIsImJvdHRvbUNvbnRlbnQiLCJoYW5kbGVTZWFyY2giLCJoYW5kbGVTZWFyY2hTdGFydCIsImhhbmRsZVNlYXJjaFVwZGF0ZSIsImhhbmRsZVNlYXJjaEVuZCIsImhhbmRsZVNlYXJjaEtleURvd24iLCJlIiwib25TZWFyY2hDb21wb3NpdGlvblN0YXJ0IiwidGFyZ2V0Iiwib25TZWFyY2hDb21wb3NpdGlvblVwZGF0ZSIsIm9uU2VhcmNoQ29tcG9zaXRpb25FbmQiLCJ2YWwiLCJyZWFsSW5wdXQiLCJxdWVyeVNlbGVjdG9yIiwibGFzdFZhbHVlIiwiZXZlbnQiLCJidWJibGVzIiwidHJhY2tlciIsIl92YWx1ZVRyYWNrZXIiLCJzZXRWYWx1ZSIsIm9uSW5wdXRLZXlEb3duIiwiZGVmYXVsdE9wZW4iLCJkZWZhdWx0VmFsdWUiLCJ2YWx1ZVN0YXRlIiwidW5kZWZpbmVkIiwib3BlblN0YXRlIiwiYWxsb3dDbGVhciIsImNsYXNzTmFtZSIsImdldFBvcHVwQ29udGFpbmVyIiwib25DaGFuZ2UiLCJvcHRpb25zIiwicGxhY2Vob2xkZXIiLCJwbGFjZWhvbGRlckNvbG9yIiwicGxhY2VtZW50IiwicmlnaHRJY29uIiwic2l6ZSIsInRoZW1lIiwib3RoZXJQcm9wcyIsInJlc3RQcm9wcyIsIm9wZW5Qcm9wcyIsImNvbG9yIiwidHJhbnNpdGlvbk5hbWUiLCJkcm9wZG93bkVsIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJnZXRQb3B1cENvbnRhaW5lckNvbnRleHQiLCJhbGlnbkVkZ2UiLCJfX2h0bWwiLCJiYWNrZ3JvdW5kIiwidiIsIm9wcyIsIkNvbXBvbmVudCIsInR5cGUiLCJwcm9wVHlwZXMiLCJib29sIiwic3RyaW5nIiwib25lT2ZUeXBlIiwibnVtYmVyIiwiZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoIiwiZnVuYyIsIm9uUG9wdXBTY3JvbGwiLCJvblNlYXJjaCIsImFueSIsImFycmF5Iiwib25lT2YiLCJkZWZhdWx0UHJvcHMiLCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCJuZXdTdGF0ZSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiXSwic291cmNlcyI6WyIuLi8uLi9jb21wb25lbnRzL3NlbGVjdC9TZWxlY3QudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9uby1kYW5nZXIgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiXG5pbXBvcnQgUmNTZWxlY3QgZnJvbSBcInJjLXNlbGVjdFwiXG5pbXBvcnQgT3B0R3JvdXAgZnJvbSBcIi4vT3B0R3JvdXBcIlxuaW1wb3J0IE9wdGlvbiBmcm9tIFwiLi9PcHRpb25cIlxuaW1wb3J0IG9taXQgZnJvbSBcIi4uL191dGlsL29taXRcIlxuaW1wb3J0IEljb24sIHsgSWNvbk5hbWVzIH0gZnJvbSBcIi4uL2ljb25cIlxuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gXCIuLi9jb25maWctcHJvdmlkZXJcIlxuaW1wb3J0IHsgUGxhY2VtZW50IH0gZnJvbSBcIi4uL3BvcC10cmlnZ2VyXCJcbmltcG9ydCBnZXRQbGFjZW1lbnRzIGZyb20gXCIuLi90b29sdGlwL3BsYWNlbWVudHNcIlxuaW1wb3J0IFwiLi9zdHlsZVwiXG5pbXBvcnQgeyBCT1VOQ0VfU0laRSB9IGZyb20gXCIuLi9fdXRpbC9tb3Rpb25cIlxuXG4vKipcbiAqIFNlbGVjdCDlsIHoo4Xkuo4gcmMtc2VsZWN0OiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtY29tcG9uZW50L3NlbGVjdFxuICogcmMtc2VsZWN0IOacrOi6qyBwcm9wcyDpnZ7luLjpnZ7luLjlpJrjgILogIzlpoIgb25Ecm9wZG93blZpc2libGVDaGFuZ2Ug6L+Z5qC355qEIHByb3Ag55Sa6Iez5LiN5Zyo5paH5qGj5Lit77ybXG4gKiDosIPnlKggcmMtc2VsZWN0IOeahOWGhee9ruaWueazle+8jFNlbGVjdCDlrp7njrDkuoblip/og73nmoTlho3lsIHoo4XvvIzlpoLlhoXltYzmkJzntKLkvp3pnaDnmoTmmK8gdGhpcy5zZWxlY3Qub25JbnB1dENoYW5nZe+8m1xuICogcmMtc2VsZWN0IOS7jeeEtuacieiuuOWkmuWAvOW+l+WGjeWwgeijheWSjOe7p+e7reWtpuS5oOeahOS9meWcsO+8jCoq5pyq5p2l55qE5Y+v57u05oqk56m66Ze05piv6Z2e5bi45aSn55qEKirjgIJcbiAqL1xuXG5jb25zdCBub29wID0gKCkgPT4ge31cbmNvbnN0IHByZWZpeCA9IFwiYWR1aS1zZWxlY3RcIlxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWxlY3Qge1xuICBmb3JjZVBvcHVwQWxpZ24/OiAoKSA9PiB2b2lkXG4gIGdldFJvb3REb21Ob2RlPzogKCkgPT4gSFRNTEVsZW1lbnRcbiAgb25JbnB1dENoYW5nZT86IChlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4gdm9pZFxuICBvbklucHV0S2V5RG93bj86IChlOiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB2b2lkXG4gIHNldElucHV0VmFsdWU/OiAodmFsdWU/OiBzdHJpbmcpID0+IHZvaWRcbiAgZ2V0UG9wdXBET01Ob2RlOiAoKSA9PiBIVE1MRWxlbWVudFxufVxuXG50eXBlIFZhbHVlVHlwZSA9IFJlYWN0LlJlYWN0VGV4dFxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWxlY3RQcm9wczxUIGV4dGVuZHMgVmFsdWVUeXBlID0gVmFsdWVUeXBlPiB7XG4gIFtrZXk6IHN0cmluZ106IGFueVxuICAvKipcbiAgICog5piv5ZCm5o+Q5L6b5riF6Zmk5Yqf6IO9XG4gICAqL1xuICBhbGxvd0NsZWFyPzogYm9vbGVhblxuICAvKipcbiAgICog5LiL5ouJ5qGG5bqV6YOo5pi+56S655qE6Ieq5a6a5LmJ5YWD57SgXG4gICAqL1xuICBib3R0b21Db250ZW50PzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDlrZDoioLngrlcbiAgICovXG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDpmYTliqDnsbvlkI1cbiAgICovXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICog5YaF6YOo6amx5Yqo77ya5piv5ZCm5bGV5byAXG4gICAqL1xuICBkZWZhdWx0T3Blbj86IGJvb2xlYW4gfCBudWxsXG4gIC8qKlxuICAgKiDlhoXpg6jpqbHliqjvvJrlvZPliY3pgInkuK3pobnnmoTlgLxcbiAgICovXG4gIGRlZmF1bHRWYWx1ZT86IFQgfCBudWxsXG4gIC8qKlxuICAgKiDkuIvmi4nliJfooajmmK/lkKblkozpgInmi6nlmajlkIzlrr1cbiAgICovXG4gIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aD86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOaMh+WumuW8ueWHuuWxgueahOeItue6p++8jOm7mOiupOS4uiBkb2N1bWVudC5ib2R5XG4gICAqL1xuICBnZXRQb3B1cENvbnRhaW5lcj86IG51bGwgfCAoKG5vZGU6IEhUTUxFbGVtZW50KSA9PiBIVE1MRWxlbWVudClcbiAgLyoqXG4gICAqIOS4i+aLieWIl+ihqOaYvuekuuWPmOWMluaXtueahCBoYW5kbGVy77yM5Y+C5pWw77yaYm9vbFxuICAgKi9cbiAgb25Ecm9wZG93blZpc2libGVDaGFuZ2U/OiAob3BlbjogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICog5LiL5ouJ5YiX6KGo5rua5Yqo5pe255qEIGhhbmRsZXIsIOWPguaVsO+8mmVcbiAgICovXG4gIG9uUG9wdXBTY3JvbGw/OiAoZTogUmVhY3QuTW91c2VFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHZvaWRcbiAgLyoqXG4gICAqIOaQnOe0ouaXtueahCBoYW5kbGVyLCDlj4LmlbDvvJpzdHJpbmdcbiAgICovXG4gIG9uU2VhcmNoPzogKHZhbDogc3RyaW5nKSA9PiB2b2lkXG4gIC8qKlxuICAgKiDmkJzntKIgQ29tcG9zaXRpb25TdGFydCDnmoQgaGFuZGxlciwg5Y+C5pWw77yac3RyaW5nXG4gICAqL1xuICBvblNlYXJjaENvbXBvc2l0aW9uU3RhcnQ/OiAodmFsOiBzdHJpbmcpID0+IHZvaWRcbiAgLyoqXG4gICAqIOaQnOe0oiBDb21wb3NpdGlvblVwZGF0ZSDnmoQgaGFuZGxlciwg5Y+C5pWw77yac3RyaW5nXG4gICAqL1xuICBvblNlYXJjaENvbXBvc2l0aW9uVXBkYXRlPzogKHZhbDogc3RyaW5nKSA9PiB2b2lkXG4gIC8qKlxuICAgKiDmkJzntKIgQ29tcG9zaXRpb25FbmQg55qEIGhhbmRsZXIsIOWPguaVsO+8mnN0cmluZ1xuICAgKi9cbiAgb25TZWFyY2hDb21wb3NpdGlvbkVuZD86ICh2YWw6IHN0cmluZykgPT4gdm9pZFxuICAvKipcbiAgICog5pu05aSa6Ieq5a6a5LmJIHNlYXJjaCBpbnB1dCDnmoQgUHJvcFxuICAgKi9cbiAgc2VhcmNoSW5wdXRQcm9wcz86IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbiAgfVxuICAvKipcbiAgICog6YCJ5oup5pe255qEIGhhbmRsZXLvvIzlj4LmlbDvvJoodmFsdWUsIG9wdGlvbilcbiAgICovXG4gIG9uU2VsZWN0PzogKHZhbHVlOiBULCBvcHRpb246IFJlYWN0LlJlYWN0RWxlbWVudDxhbnk+KSA9PiB2b2lkXG4gIC8qKlxuICAgKiDlpJbpg6jmjqfliLbvvJrmmK/lkKblsZXlvIBcbiAgICovXG4gIG9wZW4/OiBudWxsIHwgYm9vbGVhblxuICAvKipcbiAgICog5Y+v55u05o6l5Lyg5YWlIG9wdGlvbnPvvIzmm7/ku6PmiYvliqjmnoTpgKAgY2hpbGRyZW4ganN4IOeahOaWueW8j++8jOmcgOS8oOWFpeavj+mhueeahCBsYWJlbCDlkowgdmFsdWVcbiAgICovXG4gIG9wdGlvbnM/OiB7XG4gICAgW2tleTogc3RyaW5nXTogYW55XG4gICAgY2xhc3NOYW1lPzogc3RyaW5nXG4gICAgZGlzYWJsZWQ/OiBib29sZWFuXG4gICAgbGFiZWw6IFJlYWN0LlJlYWN0Tm9kZVxuICAgIHZhbHVlOiBUXG4gIH1bXVxuICAvKipcbiAgICog6YCJ5oup5qGG6buY6K6k5paH5a2XXG4gICAqL1xuICBwbGFjZWhvbGRlcj86IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICog6YCJ5oup5qGG6buY6K6k5paH5a2X55qE6aKc6ImyXG4gICAqL1xuICBwbGFjZWhvbGRlckNvbG9yPzogc3RyaW5nXG4gIC8qKlxuICAgKiDorr7nva4gcGxhY2VtZW50XG4gICAqL1xuICBwbGFjZW1lbnQ/OiBQbGFjZW1lbnRcbiAgLyoqXG4gICAqIOiuvue9ruWPs+Wbvuagh1xuICAgKi9cbiAgcmlnaHRJY29uPzogSWNvbk5hbWVzXG4gIC8qKlxuICAgKiDmkJzntKLmoYbpu5jorqTmloflrZdcbiAgICovXG4gIHNlYXJjaGFibGU/OiBib29sZWFuXG4gIC8qKlxuICAgKiDmmK/lkKbpnIDopoHlhoXltYzmkJzntKJcbiAgICovXG4gIHNlYXJjaFBsYWNlaG9sZGVyPzogc3RyaW5nXG4gIC8qKlxuICAgKiDorr7nva7lsLrlr7jvvIzot5/nnYAgYnV0dG9uIOi1sFxuICAgKi9cbiAgc2l6ZT86IFwibWluaVwiIHwgXCJzbWFsbFwiIHwgXCJtZWRpdW1cIiB8IFwibGFyZ2VcIlxuICAvKipcbiAgICog6K6+572u5Li76aKYXG4gICAqL1xuICB0aGVtZT86IG51bGwgfCBcImxpZ2h0XCJcbiAgLyoqXG4gICAqIOS4i+aLieahhumhtumDqOaYvuekuueahOiHquWumuS5ieWFg+e0oFxuICAgKi9cbiAgdG9wQ29udGVudD86IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICog5aSW6YOo5o6n5Yi277ya5b2T5YmN6YCJ5Lit6aG555qE5YC8XG4gICAqL1xuICB2YWx1ZT86IFQgfCBudWxsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlbGVjdFN0YXRlPFQgZXh0ZW5kcyBWYWx1ZVR5cGUgPSBWYWx1ZVR5cGU+IHtcbiAgb3Blbj86IGJvb2xlYW5cbiAgcGxhY2Vob2xkZXJTaG93PzogYm9vbGVhblxuICBwbGFjZWhvbGRlclRleHQ/OiBzdHJpbmdcbiAgdmFsdWU/OiBUIHwgbnVsbFxuICBzZWxlY3RJZD86IHN0cmluZ1xufVxuXG4vKipcbiAqIOmAieaLqeWZqOeUqOS6jumAieaLqeafkOmhueWGheWuueOAglxuICog6YCJ5oup5Zmo5a+55q+U5Y2V6YCJIFJhZGlvIOeahOS8mOWKv+aYr++8jOW9k+mAiemhuei/h+WkmuaXtu+8jOmAieaLqeWZqOWPr+WvueWGheWuueaUtui1t++8jOW5tuabtOWFs+azqOS6juW3sumAiemhueOAglxuICog6YCa5bi477yM5b2T55So5oi36IO95aSf6YCa6L+H5bey6YCJ6aG577yM6L275piT5b6X55+l5YW25L2Z6YCJ6aG555qE6KeE5b6L5pe277yI5aaC5bm05Lu944CB5Z+O5biC562J77yJ77yM6YCJ5oup5ZmoIFNlbGVjdCDmmK/mr5TovoPlpb3nmoTpgInmi6njgIJcbiAqL1xuY2xhc3MgU2VsZWN0PFQgZXh0ZW5kcyBWYWx1ZVR5cGUgPSBWYWx1ZVR5cGU+IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PFxuICBJU2VsZWN0UHJvcHM8VD4sXG4gIElTZWxlY3RTdGF0ZTxUPlxuPiB7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZSA9IFwiU2VsZWN0XCJcblxuICBwdWJsaWMgc3RhdGljIE9wdGlvbjogdHlwZW9mIE9wdGlvbiA9IE9wdGlvblxuXG4gIHB1YmxpYyBzdGF0aWMgT3B0R3JvdXA6IHR5cGVvZiBPcHRHcm91cCA9IE9wdEdyb3VwXG5cbiAgcHVibGljIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgLyoqXG4gICAgICog5piv5ZCm5o+Q5L6b5riF6Zmk5Yqf6IO9XG4gICAgICovXG4gICAgYWxsb3dDbGVhcjogUHJvcFR5cGVzLmJvb2wsXG4gICAgLyoqXG4gICAgICog5LiL5ouJ5qGG5bqV6YOo5pi+56S655qE6Ieq5a6a5LmJ5YWD57SgXG4gICAgICovXG4gICAgYm90dG9tQ29udGVudDogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICog5a2Q6IqC54K5XG4gICAgICovXG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuICAgIC8qKlxuICAgICAqIOmZhOWKoOexu+WQjVxuICAgICAqL1xuICAgIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAvKipcbiAgICAgKiDlhoXpg6jpqbHliqjvvJrmmK/lkKblsZXlvIBcbiAgICAgKi9cbiAgICBkZWZhdWx0T3BlbjogUHJvcFR5cGVzLmJvb2wsXG4gICAgLyoqXG4gICAgICog5YaF6YOo6amx5Yqo77ya5b2T5YmN6YCJ5Lit6aG555qE5YC8XG4gICAgICovXG4gICAgZGVmYXVsdFZhbHVlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gICAgLyoqXG4gICAgICog5LiL5ouJ5YiX6KGo5piv5ZCm5ZKM6YCJ5oup5Zmo5ZCM5a69XG4gICAgICovXG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAvKipcbiAgICAgKiDmjIflrprlvLnlh7rlsYLnmoTniLbnuqfvvIzpu5jorqTkuLogZG9jdW1lbnQuYm9keVxuICAgICAqL1xuICAgIGdldFBvcHVwQ29udGFpbmVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiDkuIvmi4nliJfooajmmL7npLrlj5jljJbml7bnmoQgaGFuZGxlcu+8jOWPguaVsO+8mmJvb2xcbiAgICAgKi9cbiAgICBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICog5LiL5ouJ5YiX6KGo5rua5Yqo5pe255qEIGhhbmRsZXIsIOWPguaVsO+8mmVcbiAgICAgKi9cbiAgICBvblBvcHVwU2Nyb2xsOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiDmkJzntKLml7bnmoQgaGFuZGxlciwg5Y+C5pWw77yac3RyaW5nXG4gICAgICovXG4gICAgb25TZWFyY2g6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOaQnOe0oiBDb21wb3NpdGlvblN0YXJ0IOeahCBoYW5kbGVyLCDlj4LmlbDvvJpzdHJpbmdcbiAgICAgKi9cbiAgICBvblNlYXJjaENvbXBvc2l0aW9uU3RhcnQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOaQnOe0oiBDb21wb3NpdGlvblVwZGF0ZSDnmoQgaGFuZGxlciwg5Y+C5pWw77yac3RyaW5nXG4gICAgICovXG4gICAgb25TZWFyY2hDb21wb3NpdGlvblVwZGF0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICog5pCc57SiIENvbXBvc2l0aW9uRW5kIOeahCBoYW5kbGVyLCDlj4LmlbDvvJpzdHJpbmdcbiAgICAgKi9cbiAgICBvblNlYXJjaENvbXBvc2l0aW9uRW5kOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiDmm7TlpJroh6rlrprkuYkgc2VhcmNoIGlucHV0IOeahCBQcm9wXG4gICAgICovXG4gICAgc2VhcmNoSW5wdXRQcm9wczogUHJvcFR5cGVzLmFueSxcbiAgICAvKipcbiAgICAgKiDpgInmi6nml7bnmoQgaGFuZGxlcu+8jOWPguaVsO+8mih2YWx1ZSwgb3B0aW9uKVxuICAgICAqL1xuICAgIG9uU2VsZWN0OiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiDlpJbpg6jmjqfliLbvvJrmmK/lkKblsZXlvIBcbiAgICAgKi9cbiAgICBvcGVuOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAvKipcbiAgICAgKiDlj6/nm7TmjqXkvKDlhaUgb3B0aW9uc++8jOabv+S7o+aJi+WKqOaehOmAoCBjaGlsZHJlbiBqc3gg55qE5pa55byP77yM6ZyA5Lyg5YWl5q+P6aG555qEIGxhYmVsIOWSjCB2YWx1ZVxuICAgICAqL1xuICAgIG9wdGlvbnM6IFByb3BUeXBlcy5hcnJheSxcbiAgICAvKipcbiAgICAgKiDpgInmi6nmoYbpu5jorqTmloflrZdcbiAgICAgKi9cbiAgICBwbGFjZWhvbGRlcjogUHJvcFR5cGVzLmFueSxcbiAgICAvKipcbiAgICAgKiDpgInmi6nmoYbpu5jorqTmloflrZfnmoTpopzoibJcbiAgICAgKi9cbiAgICBwbGFjZWhvbGRlckNvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIOiuvue9riBwbGFjZW1lbnRcbiAgICAgKi9cbiAgICBwbGFjZW1lbnQ6IFByb3BUeXBlcy5vbmVPZihbXG4gICAgICBcInRvcFwiLFxuICAgICAgXCJsZWZ0XCIsXG4gICAgICBcInJpZ2h0XCIsXG4gICAgICBcImJvdHRvbVwiLFxuICAgICAgXCJ0b3BMZWZ0XCIsXG4gICAgICBcInRvcFJpZ2h0XCIsXG4gICAgICBcImJvdHRvbUxlZnRcIixcbiAgICAgIFwiYm90dG9tUmlnaHRcIixcbiAgICAgIFwibGVmdFRvcFwiLFxuICAgICAgXCJsZWZ0Qm90dG9tXCIsXG4gICAgICBcInJpZ2h0VG9wXCIsXG4gICAgICBcInJpZ2h0Qm90dG9tXCIsXG4gICAgXSksXG4gICAgLyoqXG4gICAgICog6K6+572u5Y+z5Zu+5qCHXG4gICAgICovXG4gICAgcmlnaHRJY29uOiBQcm9wVHlwZXMuYW55LFxuICAgIC8qKlxuICAgICAqIOaQnOe0ouahhum7mOiupOaWh+Wtl1xuICAgICAqL1xuICAgIHNlYXJjaFBsYWNlaG9sZGVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIOaYr+WQpumcgOimgeWGheW1jOaQnOe0olxuICAgICAqL1xuICAgIHNlYXJjaGFibGU6IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOiuvue9ruWwuuWvuO+8jOi3n+edgCBidXR0b24g6LWwXG4gICAgICovXG4gICAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKFtcIm1pbmlcIiwgXCJzbWFsbFwiLCBcIm1lZGl1bVwiLCBcImxhcmdlXCJdKSxcbiAgICAvKipcbiAgICAgKiDorr7nva7kuLvpophcbiAgICAgKi9cbiAgICB0aGVtZTogUHJvcFR5cGVzLm9uZU9mKFtudWxsLCBcImxpZ2h0XCJdKSxcbiAgICAvKipcbiAgICAgKiDkuIvmi4nmoYbpobbpg6jmmL7npLrnmoToh6rlrprkuYnlhYPntKBcbiAgICAgKi9cbiAgICB0b3BDb250ZW50OiBQcm9wVHlwZXMubm9kZSxcbiAgICAvKipcbiAgICAgKiDlpJbpg6jmjqfliLbvvJrlvZPliY3pgInkuK3pobnnmoTlgLxcbiAgICAgKi9cbiAgICB2YWx1ZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0UHJvcHM6IElTZWxlY3RQcm9wcyA9IHtcbiAgICBhbGxvd0NsZWFyOiBmYWxzZSxcbiAgICBib3R0b21Db250ZW50OiBudWxsLFxuICAgIGNoaWxkcmVuOiBudWxsLFxuICAgIGNsYXNzTmFtZTogdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRPcGVuOiBudWxsLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbCxcbiAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGg6IHRydWUsXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IG51bGwsXG4gICAgb25Ecm9wZG93blZpc2libGVDaGFuZ2U6IG5vb3AsXG4gICAgb25Qb3B1cFNjcm9sbDogbm9vcCxcbiAgICBvblNlYXJjaDogbm9vcCxcbiAgICBvblNlYXJjaENvbXBvc2l0aW9uU3RhcnQ6IG5vb3AsXG4gICAgb25TZWFyY2hDb21wb3NpdGlvblVwZGF0ZTogbm9vcCxcbiAgICBvblNlYXJjaENvbXBvc2l0aW9uRW5kOiBub29wLFxuICAgIHNlYXJjaElucHV0UHJvcHM6IHt9LFxuICAgIG9uU2VsZWN0OiBub29wLFxuICAgIG9wZW46IG51bGwsXG4gICAgb3B0aW9uczogdW5kZWZpbmVkLFxuICAgIHBsYWNlaG9sZGVyOiBcIuivt+mAieaLqVwiLFxuICAgIHBsYWNlaG9sZGVyQ29sb3I6IHVuZGVmaW5lZCxcbiAgICBwbGFjZW1lbnQ6IFwiYm90dG9tTGVmdFwiLFxuICAgIHJpZ2h0SWNvbjogXCJ0cmlhbmdsZS1kb3duXCIsXG4gICAgc2VhcmNoUGxhY2Vob2xkZXI6IFwi5pCc57SiXCIsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgc2l6ZTogXCJzbWFsbFwiLFxuICAgIHRoZW1lOiBudWxsLFxuICAgIHRvcENvbnRlbnQ6IG51bGwsXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9ICh7IG9wZW4sIHZhbHVlIH06IElTZWxlY3RQcm9wcykgPT4ge1xuICAgIGNvbnN0IG5ld1N0YXRlOiBJU2VsZWN0U3RhdGUgPSB7fVxuICAgIGlmIChvcGVuICE9PSBudWxsKSB7XG4gICAgICBuZXdTdGF0ZS5vcGVuID0gb3BlblxuICAgIH1cbiAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgICBuZXdTdGF0ZS52YWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3U3RhdGUudmFsdWUgPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMobmV3U3RhdGUpLmxlbmd0aCA+IDAgPyBuZXdTdGF0ZSA6IG51bGxcbiAgfVxuXG4gIHB1YmxpYyBoYXNoID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMilcblxuICBwdWJsaWMgbG9ja2VkID0gZmFsc2VcblxuICBwdWJsaWMgc2VsZWN0OiBJU2VsZWN0XG5cbiAgcHVibGljIHNlYXJjaDogSFRNTElucHV0RWxlbWVudFxuXG4gIHB1YmxpYyBtZW51OiBKU1guRWxlbWVudFxuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBJU2VsZWN0UHJvcHM8VD4pIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICBjb25zdCB7IGRlZmF1bHRPcGVuLCBkZWZhdWx0VmFsdWUsIG9wZW4sIHZhbHVlIH0gPSBwcm9wc1xuXG4gICAgbGV0IHZhbHVlU3RhdGU6IFQgfCB1bmRlZmluZWRcbiAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgICB2YWx1ZVN0YXRlID0gdW5kZWZpbmVkXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZVN0YXRlID0gdmFsdWVcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdmFsdWVTdGF0ZSA9IGRlZmF1bHRWYWx1ZVxuICAgIH1cblxuICAgIGxldCBvcGVuU3RhdGVcbiAgICBpZiAob3BlbiAhPT0gbnVsbCkge1xuICAgICAgb3BlblN0YXRlID0gb3BlblxuICAgIH0gZWxzZSBpZiAoZGVmYXVsdE9wZW4gIT09IG51bGwpIHtcbiAgICAgIG9wZW5TdGF0ZSA9IGRlZmF1bHRPcGVuXG4gICAgfVxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBvcGVuOiBvcGVuU3RhdGUsXG4gICAgICBwbGFjZWhvbGRlclNob3c6IGZhbHNlLFxuICAgICAgc2VsZWN0SWQ6IFwiXCIsXG4gICAgICBwbGFjZWhvbGRlclRleHQ6IFwiXCIsXG4gICAgICB2YWx1ZTogdmFsdWVTdGF0ZSxcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2F2ZVNlbGVjdCA9IChub2RlOiBJU2VsZWN0KSA9PiB7XG4gICAgdGhpcy5zZWxlY3QgPSBub2RlXG4gIH1cblxuICBwdWJsaWMgc2F2ZVNlYXJjaCA9IChub2RlOiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XG4gICAgdGhpcy5zZWFyY2ggPSBub2RlXG4gIH1cblxuICBwdWJsaWMgb25Ecm9wZG93blZpc2libGVDaGFuZ2UgPSAob3BlbjogYm9vbGVhbikgPT4ge1xuICAgIGNvbnN0IHsgb25Ecm9wZG93blZpc2libGVDaGFuZ2UsIG9wZW46IG9wZW5Qcm9wIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgeyB2YWx1ZSwgc2VsZWN0SWQgfSA9IHRoaXMuc3RhdGVcblxuICAgIGlmICh0aGlzLmxvY2tlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChvcGVuUHJvcCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW4gfSlcbiAgICB9XG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIHRoaXMucHJldmVudFZpc2libGVDaGFuZ2UoKVxuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoKSB7XG4gICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgaWQgPSBzZWxlY3RJZFxuICAgICAgICAgICAgaWYgKCFzZWxlY3RJZCkge1xuICAgICAgICAgICAgICBpZCA9ICh0aGlzLnNlYXJjaC5wYXJlbnROb2RlPy5uZXh0U2libGluZyBhcyBFbGVtZW50KT8uaWRcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlbGVjdElkOiBpZCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKT8ubmV4dFNpYmxpbmcgYXMgRWxlbWVudFxuXG4gICAgICAgICAgICAgIGNvbnN0IGVsID0gcGFyZW50Py5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxuICAgICAgICAgICAgICAgIFwiYWR1aS1zZWxlY3QtaXRlbS1vcHRpb24tc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICApWzBdPy5jaGlsZHJlblswXSBhcyBIVE1MRWxlbWVudFxuXG4gICAgICAgICAgICAgIGNvbnN0IGxpc3RIb2xkZXIgPSBwYXJlbnQ/LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXG4gICAgICAgICAgICAgICAgXCJyYy12aXJ0dWFsLWxpc3QtaG9sZGVyXCJcbiAgICAgICAgICAgICAgKVswXSBhcyBIVE1MRWxlbWVudFxuXG4gICAgICAgICAgICAgIGlmIChsaXN0SG9sZGVyKSB7XG4gICAgICAgICAgICAgICAgbGlzdEhvbGRlci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInNjcm9sbFwiKSlcblxuICAgICAgICAgICAgICAgIGlmIChsaXN0SG9sZGVyLmNoaWxkcmVuWzBdKSB7XG4gICAgICAgICAgICAgICAgICBsaXN0SG9sZGVyLmNoaWxkcmVuWzBdLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwic2Nyb2xsXCIpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXJUZXh0OiBlbC5kYXRhc2V0Lmh0bWwgfHwgZWwuaW5uZXJIVE1MLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyVGV4dDogXCJcIixcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2VhcmNoLmZvY3VzKClcbiAgICAgICAgfVxuICAgICAgfSwgMTUwKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5zZWFyY2gpIHtcbiAgICAgICAgdGhpcy5zZWFyY2gudmFsdWUgPSBcIlwiXG4gICAgICB9XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgcGxhY2Vob2xkZXJTaG93OiBmYWxzZSxcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSkge1xuICAgICAgb25Ecm9wZG93blZpc2libGVDaGFuZ2Uob3BlbilcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25TZWxlY3QgPSAodmFsdWU6IFQsIG9wdGlvbjogYW55KSA9PiB7XG4gICAgY29uc3QgeyBvblNlbGVjdCwgdmFsdWU6IHZhbHVlUHJvcCB9ID0gdGhpcy5wcm9wc1xuXG4gICAgaWYgKHZhbHVlUHJvcCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHZhbHVlLFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKG9uU2VsZWN0ICYmIHZhbHVlUHJvcCAhPT0gdmFsdWUpIHtcbiAgICAgIG9uU2VsZWN0KHZhbHVlLCBvcHRpb24pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VhcmNoKSB7XG4gICAgICB0aGlzLnNlYXJjaC52YWx1ZSA9IFwiXCJcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0ICYmIHRoaXMuc2VsZWN0LnNldElucHV0VmFsdWUpIHtcbiAgICAgIHRoaXMuc2VsZWN0LnNldElucHV0VmFsdWUoXCJcIilcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRHJvcGRvd25SZW5kZXIgPSAobWVudTogSlNYLkVsZW1lbnQpID0+IHtcbiAgICB0aGlzLm1lbnUgPSBtZW51XG4gICAgY29uc3Qge1xuICAgICAgc2VhcmNoYWJsZSxcbiAgICAgIHNlYXJjaFBsYWNlaG9sZGVyLFxuICAgICAgc2VhcmNoSW5wdXRQcm9wcyxcbiAgICAgIHRvcENvbnRlbnQsXG4gICAgICBib3R0b21Db250ZW50LFxuICAgIH0gPSB0aGlzLnByb3BzXG4gICAgaWYgKHNlYXJjaGFibGUpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAge3RvcENvbnRlbnR9XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3ByZWZpeH0tc2VhcmNoYH0+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgcmVmPXt0aGlzLnNhdmVTZWFyY2h9XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtzZWFyY2hQbGFjZWhvbGRlcn1cbiAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlU2VhcmNofVxuICAgICAgICAgICAgICBvbkNvbXBvc2l0aW9uU3RhcnQ9e3RoaXMuaGFuZGxlU2VhcmNoU3RhcnR9XG4gICAgICAgICAgICAgIG9uQ29tcG9zaXRpb25VcGRhdGU9e3RoaXMuaGFuZGxlU2VhcmNoVXBkYXRlfVxuICAgICAgICAgICAgICBvbkNvbXBvc2l0aW9uRW5kPXt0aGlzLmhhbmRsZVNlYXJjaEVuZH1cbiAgICAgICAgICAgICAgb25LZXlEb3duPXt0aGlzLmhhbmRsZVNlYXJjaEtleURvd259XG4gICAgICAgICAgICAgIG9uTW91c2VEb3duPXt0aGlzLnByZXZlbnRWaXNpYmxlQ2hhbmdlfVxuICAgICAgICAgICAgICBvbk1vdXNlVXA9e3RoaXMucHJldmVudFZpc2libGVDaGFuZ2V9XG4gICAgICAgICAgICAgIHsuLi4oc2VhcmNoSW5wdXRQcm9wcyB8fCB7fSl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPEljb24gaWNvbj1cInNlYXJjaFwiIGNsYXNzTmFtZT17YCR7cHJlZml4fS1pY29uYH0gLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB7bWVudX1cbiAgICAgICAgICB7Ym90dG9tQ29udGVudH1cbiAgICAgICAgPC9kaXY+XG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICB7dG9wQ29udGVudH1cbiAgICAgICAge21lbnV9XG4gICAgICAgIHtib3R0b21Db250ZW50fVxuICAgICAgPC8+XG4gICAgKVxuICB9XG5cbiAgcHVibGljIGhhbmRsZVNlYXJjaFN0YXJ0OiBSZWFjdC5Db21wb3NpdGlvbkV2ZW50SGFuZGxlcjxIVE1MSW5wdXRFbGVtZW50PiA9IChcbiAgICBlXG4gICkgPT4ge1xuICAgIGNvbnN0IHsgb25TZWFyY2hDb21wb3NpdGlvblN0YXJ0IH0gPSB0aGlzLnByb3BzXG4gICAgbGV0IHRhcmdldDogSFRNTElucHV0RWxlbWVudFxuICAgIGlmIChlKSB7XG4gICAgICB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldCA9IHRoaXMuc2VhcmNoXG4gICAgfVxuICAgIGlmIChvblNlYXJjaENvbXBvc2l0aW9uU3RhcnQpIHtcbiAgICAgIG9uU2VhcmNoQ29tcG9zaXRpb25TdGFydCh0YXJnZXQudmFsdWUpXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhbmRsZVNlYXJjaFVwZGF0ZTogUmVhY3QuQ29tcG9zaXRpb25FdmVudEhhbmRsZXI8SFRNTElucHV0RWxlbWVudD4gPSAoXG4gICAgZVxuICApID0+IHtcbiAgICBjb25zdCB7IG9uU2VhcmNoQ29tcG9zaXRpb25VcGRhdGUgfSA9IHRoaXMucHJvcHNcbiAgICBsZXQgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50XG4gICAgaWYgKGUpIHtcbiAgICAgIHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnRcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0ID0gdGhpcy5zZWFyY2hcbiAgICB9XG4gICAgaWYgKG9uU2VhcmNoQ29tcG9zaXRpb25VcGRhdGUpIHtcbiAgICAgIG9uU2VhcmNoQ29tcG9zaXRpb25VcGRhdGUodGFyZ2V0LnZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVTZWFyY2hFbmQ6IFJlYWN0LkNvbXBvc2l0aW9uRXZlbnRIYW5kbGVyPEhUTUxJbnB1dEVsZW1lbnQ+ID0gKFxuICAgIGVcbiAgKSA9PiB7XG4gICAgY29uc3QgeyBvblNlYXJjaENvbXBvc2l0aW9uRW5kIH0gPSB0aGlzLnByb3BzXG4gICAgbGV0IHRhcmdldDogSFRNTElucHV0RWxlbWVudFxuICAgIGlmIChlKSB7XG4gICAgICB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldCA9IHRoaXMuc2VhcmNoXG4gICAgfVxuICAgIGlmIChvblNlYXJjaENvbXBvc2l0aW9uRW5kKSB7XG4gICAgICBvblNlYXJjaENvbXBvc2l0aW9uRW5kKHRhcmdldC52YWx1ZSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlU2VhcmNoID0gKGU/OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgIGxldCB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnRcbiAgICBpZiAoZSkge1xuICAgICAgdGFyZ2V0ID0gZS50YXJnZXRcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0ID0gdGhpcy5zZWFyY2hcbiAgICB9XG4gICAgY29uc3QgdmFsID0gdGFyZ2V0LnZhbHVlXG4gICAgY29uc3QgeyBwbGFjZWhvbGRlclNob3csIHNlbGVjdElkIH0gPSB0aGlzLnN0YXRlXG4gICAgaWYgKHZhbCAmJiAhcGxhY2Vob2xkZXJTaG93KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgcGxhY2Vob2xkZXJTaG93OiB0cnVlIH0pXG4gICAgfVxuICAgIGlmICghdmFsICYmIHBsYWNlaG9sZGVyU2hvdykge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHBsYWNlaG9sZGVyU2hvdzogZmFsc2UgfSlcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0KSB7XG4gICAgICBsZXQgaWQgPSBzZWxlY3RJZFxuICAgICAgaWYgKCFzZWxlY3RJZCkge1xuICAgICAgICBpZCA9ICh0YXJnZXQucGFyZW50Tm9kZT8ubmV4dFNpYmxpbmcgYXMgRWxlbWVudCk/LmlkXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzZWxlY3RJZDogaWQgfSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlYWxJbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIGAuYWR1aS1zZWxlY3Qtc2VsZWN0aW9uLXNlYXJjaCBbYXJpYS1vd25zPVwiJHtpZH1cIl1gXG4gICAgICApIGFzIGFueVxuICAgICAgaWYgKHJlYWxJbnB1dCkge1xuICAgICAgICBjb25zdCBsYXN0VmFsdWUgPSByZWFsSW5wdXQudmFsdWVcbiAgICAgICAgcmVhbElucHV0LnZhbHVlID0gdmFsXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KFwiaW5wdXRcIiwgeyBidWJibGVzOiB0cnVlIH0pXG4gICAgICAgIC8vIGhhY2sgUmVhY3QxNiDlhoXpg6jlrprkuYnkuoZkZXNjcmlwdG9y5oum5oiqdmFsdWXvvIzmraTlpITph43nva7nirbmgIFcbiAgICAgICAgY29uc3QgdHJhY2tlciA9IHJlYWxJbnB1dC5fdmFsdWVUcmFja2VyXG4gICAgICAgIGlmICh0cmFja2VyKSB7XG4gICAgICAgICAgdHJhY2tlci5zZXRWYWx1ZShsYXN0VmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmVhbElucHV0LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhbmRsZVNlYXJjaEtleURvd24gPSAoZTogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgIGlmICh0aGlzLnNlbGVjdCAmJiB0aGlzLnNlbGVjdC5vbklucHV0S2V5RG93bikge1xuICAgICAgdGhpcy5zZWxlY3Qub25JbnB1dEtleURvd24oZSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJldmVudFZpc2libGVDaGFuZ2UgPSAoKSA9PiB7XG4gICAgdGhpcy5sb2NrZWQgPSB0cnVlXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlXG4gICAgICB0aGlzLnNldFN0YXRlKHsgb3BlbjogdHJ1ZSB9KVxuICAgIH0sIDIwMClcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgYWxsb3dDbGVhcixcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgb25DaGFuZ2UsXG4gICAgICBvcHRpb25zLFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICBwbGFjZWhvbGRlckNvbG9yLFxuICAgICAgcGxhY2VtZW50LFxuICAgICAgcmlnaHRJY29uLFxuICAgICAgc2VhcmNoYWJsZSxcbiAgICAgIHNpemUsXG4gICAgICB0aGVtZSxcbiAgICAgIHZhbHVlOiB2YWx1ZVByb3AsXG4gICAgICAuLi5vdGhlclByb3BzXG4gICAgfSA9IHRoaXMucHJvcHNcblxuICAgIGNvbnN0IHJlc3RQcm9wcyA9IG9taXQob3RoZXJQcm9wcywgW1xuICAgICAgXCJkZWZhdWx0VmFsdWVcIixcbiAgICAgIFwib3BlblwiLFxuICAgICAgXCJvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZVwiLFxuICAgICAgXCJvblNlbGVjdFwiLFxuICAgICAgXCJzZWFyY2hQbGFjZWhvbGRlclwiLFxuICAgICAgXCJvblNlYXJjaENvbXBvc2l0aW9uU3RhcnRcIixcbiAgICAgIFwib25TZWFyY2hDb21wb3NpdGlvblVwZGF0ZVwiLFxuICAgICAgXCJvblNlYXJjaENvbXBvc2l0aW9uRW5kXCIsXG4gICAgICBcInNlYXJjaElucHV0UHJvcHNcIixcbiAgICAgIFwidG9wQ29udGVudFwiLFxuICAgICAgXCJib3R0b21Db250ZW50XCIsXG4gICAgXSlcblxuICAgIGNvbnN0IHtcbiAgICAgIG9wZW46IG9wZW5TdGF0ZSxcbiAgICAgIHBsYWNlaG9sZGVyU2hvdyxcbiAgICAgIHBsYWNlaG9sZGVyVGV4dCxcbiAgICAgIHZhbHVlOiB2YWx1ZVN0YXRlLFxuICAgIH0gPSB0aGlzLnN0YXRlXG5cbiAgICAvLyBvcGVuU3RhdGUg5Y+v6IO95pivIHVuZGVmaW5lZCBvciBudWxsXG4gICAgY29uc3Qgb3BlblByb3BzOiB7IG9wZW4/OiBib29sZWFuOyB2YWx1ZT86IFJlYWN0LlJlYWN0Tm9kZSB8IG51bGwgfSA9IHt9XG4gICAgaWYgKHR5cGVvZiBvcGVuU3RhdGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBvcGVuUHJvcHMub3BlbiA9IG9wZW5TdGF0ZVxuICAgIH1cbiAgICBpZiAodmFsdWVTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgb3BlblByb3BzLnZhbHVlID1cbiAgICAgICAgdmFsdWVQcm9wID09PSBcIlwiID8gKFxuICAgICAgICAgIHBsYWNlaG9sZGVyQ29sb3IgPyAoXG4gICAgICAgICAgICA8c3BhbiBzdHlsZT17eyBjb2xvcjogcGxhY2Vob2xkZXJDb2xvciB9fT57cGxhY2Vob2xkZXJ9PC9zcGFuPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICBwbGFjZWhvbGRlclxuICAgICAgICAgIClcbiAgICAgICAgKSA6IChcbiAgICAgICAgICB2YWx1ZVN0YXRlXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBsZXQgdHJhbnNpdGlvbk5hbWUgPSBcInNsaWRlLXVwXCJcblxuICAgIGNvbnN0IGRyb3Bkb3duRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgYC5hZHVpLXNlbGVjdC1kcm9wZG93bi0ke3RoaXMuaGFzaH1gXG4gICAgKSBhcyBIVE1MRGl2RWxlbWVudFxuXG4gICAgaWYgKGRyb3Bkb3duRWwpIHtcbiAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gZHJvcGRvd25FbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgaWYgKHdpZHRoICogaGVpZ2h0ID4gQk9VTkNFX1NJWkUpIHtcbiAgICAgICAgdHJhbnNpdGlvbk5hbWUgPSBcInNsaWRlLXVwLWJvdW5jZVwiXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxDb25maWdDb250ZXh0LkNvbnN1bWVyPlxuICAgICAgICB7KHsgZ2V0UG9wdXBDb250YWluZXI6IGdldFBvcHVwQ29udGFpbmVyQ29udGV4dCB9KSA9PiAoXG4gICAgICAgICAgPFJjU2VsZWN0XG4gICAgICAgICAgICBhbGxvd0NsZWFyPXthbGxvd0NsZWFyfVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFxuICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgIGAke3ByZWZpeH0tc2VsZWN0YCxcbiAgICAgICAgICAgICAgYCR7cHJlZml4fS0ke3NpemV9YCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFtgJHtwcmVmaXh9LXZhbHVlX2lzX2VtcHR5X3N0cmluZ2BdOlxuICAgICAgICAgICAgICAgICAgdmFsdWVTdGF0ZSA9PT0gXCJcIiB8fCB2YWx1ZVN0YXRlID09PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgW2Ake3ByZWZpeH0tbGlnaHRgXTogdGhlbWUgPT09IFwibGlnaHRcIixcbiAgICAgICAgICAgICAgICBbYCR7cHJlZml4fS1zZWxlY3RfcGxhY2Vob2xkZXJTaG93YF06IHBsYWNlaG9sZGVyU2hvdyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIGRhdGEtdmFsdWU9e3ZhbHVlU3RhdGUgfHwgcGxhY2Vob2xkZ