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>
303 lines (253 loc) • 36.5 kB
JavaScript
;
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 _rcMotion = _interopRequireDefault(require("rc-motion"));
var _getScrollBarSize = _interopRequireDefault(require("rc-util/lib/getScrollBarSize"));
var _button = _interopRequireDefault(require("../button"));
var _portal = _interopRequireDefault(require("../portal"));
require("./style");
var _excluded = ["afterClose", "bodyScrollable", "children", "className", "destroyAfterClose", "escapeKeyClosable", "headerContent", "headerElement", "headerStyle", "maskClassName", "maskClosable", "maskStyle", "maskVisible", "maskMotionName", "getMotionName", "onClose", "placement", "size", "style", "visible", "zIndex"];
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 _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 ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
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 _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
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; }
var prefix = "adui-drawer";
var Drawer = function Drawer(_ref) {
var afterClose = _ref.afterClose,
bodyScrollable = _ref.bodyScrollable,
children = _ref.children,
className = _ref.className,
destroyAfterClose = _ref.destroyAfterClose,
escapeKeyClosable = _ref.escapeKeyClosable,
headerContent = _ref.headerContent,
headerElement = _ref.headerElement,
headerStyle = _ref.headerStyle,
maskClassName = _ref.maskClassName,
maskClosable = _ref.maskClosable,
maskStyle = _ref.maskStyle,
maskVisible = _ref.maskVisible,
maskMotionName = _ref.maskMotionName,
_ref$getMotionName = _ref.getMotionName,
getMotionName = _ref$getMotionName === void 0 ? function () {
return "";
} : _ref$getMotionName,
onClose = _ref.onClose,
_ref$placement = _ref.placement,
placement = _ref$placement === void 0 ? "right" : _ref$placement,
size = _ref.size,
style = _ref.style,
visible = _ref.visible,
zIndexProp = _ref.zIndex,
otherProps = _objectWithoutProperties(_ref, _excluded);
var zIndex = zIndexProp;
var _useState = (0, _react.useState)(visible),
_useState2 = _slicedToArray(_useState, 2),
hasEverOpened = _useState2[0],
setHasEverOpened = _useState2[1];
var wrapperRef = (0, _react.useRef)(null);
var scrollbarWidth = (0, _react.useMemo)(_getScrollBarSize["default"], []);
var bodyIsOverflowing = false;
var setScrollbarPadding = function setScrollbarPadding(_ref2) {
var bodyScrollableParam = _ref2.bodyScrollable;
var _window = window,
innerWidth = _window.innerWidth;
bodyIsOverflowing = document.body.clientWidth < innerWidth;
if (bodyIsOverflowing && !document.body.style.paddingRight) {
if (scrollbarWidth !== undefined) {
document.body.style.paddingRight = "".concat(scrollbarWidth, "px");
}
}
if (bodyScrollableParam) {
document.body.classList.add("adui-scrollbar-hidden");
} else {
document.body.style.overflow = "hidden";
}
};
var resetScrollbarPadding = function resetScrollbarPadding() {
document.body.classList.remove("adui-scrollbar-hidden");
document.body.style.overflow = "";
document.body.style.paddingRight = "";
};
(0, _react.useEffect)(function () {
if (visible && wrapperRef.current) {
setScrollbarPadding({
bodyScrollable: bodyScrollable
});
}
}, [visible]);
(0, _react.useEffect)(function () {
return resetScrollbarPadding;
}, []);
if (visible && !hasEverOpened) {
setHasEverOpened(true);
}
var handleChildrenMount = function handleChildrenMount() {
if (visible) {
setScrollbarPadding({
bodyScrollable: bodyScrollable
});
}
};
var handleClose = function handleClose() {
if (onClose) {
onClose();
}
};
var handleKeyDown = function handleKeyDown(e) {
if (escapeKeyClosable && e.key === "Escape") {
e.stopPropagation();
handleClose();
}
};
var handleEnter = function handleEnter() {
if (escapeKeyClosable && wrapperRef.current) {
wrapperRef.current.focus();
}
};
var handleLeave = function handleLeave() {
if (wrapperRef.current) {
wrapperRef.current.style.display = "none";
}
resetScrollbarPadding();
if (afterClose) {
afterClose();
}
if (destroyAfterClose) {
setHasEverOpened(false);
}
};
var classSet = (0, _classnames["default"])(className, "".concat(prefix, "-").concat(placement), "".concat(prefix, "-").concat(size), "".concat(prefix, "-inner"));
var getComponent = function getComponent() {
return _react["default"].createElement("div", {
className: "".concat(prefix, "-wrapper"),
ref: wrapperRef,
style: {
display: visible ? "block" : "",
zIndex: zIndex
},
tabIndex: 0,
role: "none",
onKeyDown: handleKeyDown
}, _react["default"].createElement(_rcMotion["default"], {
motionName: maskMotionName || "".concat(prefix, "-mask"),
visible: visible && maskVisible
}, function (_ref3, ref) {
var cls = _ref3.className;
return _react["default"].createElement("div", {
ref: ref,
className: (0, _classnames["default"])("".concat(prefix, "-mask"), maskClassName, cls),
role: "none",
style: maskStyle,
onClick: function onClick() {
if (maskClosable) {
handleClose();
}
}
});
}), _react["default"].createElement(_rcMotion["default"], {
onAppearStart: handleEnter,
onEnterStart: handleEnter,
onLeaveEnd: handleLeave,
motionName: getMotionName(placement) || "".concat(prefix, "-").concat(placement),
visible: visible
}, function (_ref4, ref) {
var cls = _ref4.className;
return _react["default"].createElement("div", _extends({
ref: ref,
className: (0, _classnames["default"])(classSet, cls),
style: _objectSpread({
margin: "auto",
zIndex: 1
}, style)
}, otherProps), headerElement === null ? null : headerElement || _react["default"].createElement("div", {
className: "".concat(prefix, "-header"),
style: headerStyle
}, _react["default"].createElement(_button["default"], {
theme: "light",
size: "medium",
leftIcon: "cancel",
className: "".concat(prefix, "-header-close"),
onClick: function onClick() {
return handleClose();
}
}), _react["default"].createElement("i", {
className: "".concat(prefix, "-header-divider")
}), headerContent && _react["default"].createElement("div", {
className: "".concat(prefix, "-header-content")
}, headerContent)), _react["default"].createElement("div", {
className: "".concat(prefix, "-body")
}, children));
}));
};
if (!hasEverOpened) {
return null;
}
return _react["default"].createElement(_portal["default"], {
onChildrenMount: handleChildrenMount
}, getComponent());
};
Drawer.displayName = "Drawer";
Drawer.propTypes = {
afterClose: _propTypes["default"].func,
bodyScrollable: _propTypes["default"].bool,
children: _propTypes["default"].node,
className: _propTypes["default"].string,
destroyAfterClose: _propTypes["default"].bool,
escapeKeyClosable: _propTypes["default"].bool,
headerContent: _propTypes["default"].node,
headerElement: _propTypes["default"].node,
headerStyle: _propTypes["default"].object,
maskClassName: _propTypes["default"].string,
maskClosable: _propTypes["default"].bool,
maskStyle: _propTypes["default"].object,
maskVisible: _propTypes["default"].bool,
onClose: _propTypes["default"].func,
placement: _propTypes["default"].oneOf(["top", "right", "bottom", "left"]),
size: _propTypes["default"].oneOf(["mini", "small", "medium", "large"]),
visible: _propTypes["default"].bool,
zIndex: _propTypes["default"].any
};
Drawer.defaultProps = {
afterClose: null,
bodyScrollable: true,
children: null,
className: undefined,
destroyAfterClose: false,
escapeKeyClosable: true,
headerContent: null,
headerElement: undefined,
headerStyle: {},
maskClassName: undefined,
maskClosable: false,
maskStyle: {},
maskVisible: false,
maskMotionName: "",
getMotionName: function getMotionName() {
return "";
},
onClose: null,
placement: "right",
size: "medium",
visible: false,
zIndex: "var(--z-index-dialog)"
};
var _default = Drawer;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwcmVmaXgiLCJEcmF3ZXIiLCJhZnRlckNsb3NlIiwiYm9keVNjcm9sbGFibGUiLCJjaGlsZHJlbiIsImNsYXNzTmFtZSIsImRlc3Ryb3lBZnRlckNsb3NlIiwiZXNjYXBlS2V5Q2xvc2FibGUiLCJoZWFkZXJDb250ZW50IiwiaGVhZGVyRWxlbWVudCIsImhlYWRlclN0eWxlIiwibWFza0NsYXNzTmFtZSIsIm1hc2tDbG9zYWJsZSIsIm1hc2tTdHlsZSIsIm1hc2tWaXNpYmxlIiwibWFza01vdGlvbk5hbWUiLCJnZXRNb3Rpb25OYW1lIiwib25DbG9zZSIsInBsYWNlbWVudCIsInNpemUiLCJzdHlsZSIsInZpc2libGUiLCJ6SW5kZXhQcm9wIiwiekluZGV4Iiwib3RoZXJQcm9wcyIsInVzZVN0YXRlIiwiaGFzRXZlck9wZW5lZCIsInNldEhhc0V2ZXJPcGVuZWQiLCJ3cmFwcGVyUmVmIiwidXNlUmVmIiwic2Nyb2xsYmFyV2lkdGgiLCJ1c2VNZW1vIiwiZ2V0U2Nyb2xsQmFyU2l6ZSIsImJvZHlJc092ZXJmbG93aW5nIiwic2V0U2Nyb2xsYmFyUGFkZGluZyIsImJvZHlTY3JvbGxhYmxlUGFyYW0iLCJ3aW5kb3ciLCJpbm5lcldpZHRoIiwiZG9jdW1lbnQiLCJib2R5IiwiY2xpZW50V2lkdGgiLCJwYWRkaW5nUmlnaHQiLCJ1bmRlZmluZWQiLCJjbGFzc0xpc3QiLCJhZGQiLCJvdmVyZmxvdyIsInJlc2V0U2Nyb2xsYmFyUGFkZGluZyIsInJlbW92ZSIsInVzZUVmZmVjdCIsImN1cnJlbnQiLCJoYW5kbGVDaGlsZHJlbk1vdW50IiwiaGFuZGxlQ2xvc2UiLCJoYW5kbGVLZXlEb3duIiwiZSIsImtleSIsInN0b3BQcm9wYWdhdGlvbiIsImhhbmRsZUVudGVyIiwiZm9jdXMiLCJoYW5kbGVMZWF2ZSIsImRpc3BsYXkiLCJjbGFzc1NldCIsImNsYXNzTmFtZXMiLCJnZXRDb21wb25lbnQiLCJyZWYiLCJjbHMiLCJtYXJnaW4iLCJkaXNwbGF5TmFtZSIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsImZ1bmMiLCJib29sIiwibm9kZSIsInN0cmluZyIsIm9iamVjdCIsIm9uZU9mIiwiYW55IiwiZGVmYXVsdFByb3BzIl0sInNvdXJjZXMiOlsiLi4vLi4vY29tcG9uZW50cy9kcmF3ZXIvRHJhd2VyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIlxuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIlxuaW1wb3J0IENTU01vdGlvbiBmcm9tIFwicmMtbW90aW9uXCJcbmltcG9ydCBnZXRTY3JvbGxCYXJTaXplIGZyb20gXCJyYy11dGlsL2xpYi9nZXRTY3JvbGxCYXJTaXplXCJcbmltcG9ydCBCdXR0b24gZnJvbSBcIi4uL2J1dHRvblwiXG5pbXBvcnQgUG9ydGFsIGZyb20gXCIuLi9wb3J0YWxcIlxuaW1wb3J0IFwiLi9zdHlsZVwiXG5cbmNvbnN0IHByZWZpeCA9IFwiYWR1aS1kcmF3ZXJcIlxuXG50eXBlIFRQbGFjZW1lbnQgPSBcInRvcFwiIHwgXCJyaWdodFwiIHwgXCJib3R0b21cIiB8IFwibGVmdFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgSURyYXdlclByb3BzIHtcbiAgW2tleTogc3RyaW5nXTogYW55XG4gIC8qKlxuICAgKiDlhbPpl63lkI7vvIh0cmFuc2l0aW9uIOe7k+adn+WQju+8ieeahCBoYW5kbGVyXG4gICAqL1xuICBhZnRlckNsb3NlPzogKCgpID0+IHZvaWQpIHwgbnVsbFxuICAvKipcbiAgICogdmlzaWJsZSDml7bpobXpnaLog73lkKbmu5rliqhcbiAgICovXG4gIGJvZHlTY3JvbGxhYmxlPzogYm9vbGVhblxuICAvKipcbiAgICog5a2Q6IqC54K5XG4gICAqL1xuICBjaGlsZHJlbj86IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICog6ZmE5Yqg57G75ZCN77yM5rOo5oSPIERyYXdlciDmiYDmnInnmoTlsZ7mgKfkvJrpmYTliqDliLDlhoXpg6jnmoTlhoXlrrnlhYPntKDkuIrvvIzogIzkuI3mmK/ljIXlkKsgbWFzayDnmoTmnIDlpJblsYLlhYPntKBcbiAgICovXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICog5piv5ZCm5q+P5qyhIHZpc2libGU6IGZhbHNlIOmDvemUgOavgSBkb21cbiAgICovXG4gIGRlc3Ryb3lBZnRlckNsb3NlPzogYm9vbGVhblxuICAvKipcbiAgICog5piv5ZCm5pSv5oyBIEVTQyDlhbPpl61cbiAgICovXG4gIGVzY2FwZUtleUNsb3NhYmxlPzogYm9vbGVhblxuICAvKipcbiAgICogaGVhZGVyIOagh+mimOagj+WGhemDqOeahOWGheWuuVxuICAgKi9cbiAgaGVhZGVyQ29udGVudD86IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICog5a6M5YWo6Ieq5a6a5LmJIGhlYWRlciDnmoTlhoXlrrlcbiAgICovXG4gIGhlYWRlckVsZW1lbnQ/OiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqXG4gICAqIOiuvue9riBoZWFkZXIg5qC35byPXG4gICAqL1xuICBoZWFkZXJTdHlsZT86IFJlYWN0LkNTU1Byb3BlcnRpZXNcbiAgLyoqXG4gICAqIG1hc2sg55qE57G75ZCNXG4gICAqL1xuICBtYXNrQ2xhc3NOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiDngrnlh7sgbWFzayDmmK/lkKbop6blj5EgY2FuY2VsIOS6i+S7tlxuICAgKi9cbiAgbWFza0Nsb3NhYmxlPzogYm9vbGVhblxuICAvKipcbiAgICogbWFzayDnmoTmoLflvI9cbiAgICovXG4gIG1hc2tTdHlsZT86IFJlYWN0LkNTU1Byb3BlcnRpZXNcbiAgLyoqXG4gICAqIOaYr+WQpuaYvuekuiBtYXNrXG4gICAqL1xuICBtYXNrVmlzaWJsZT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOiuvue9riBtYXNrIOeahCBDU1MgTW90aW9uIG5hbWVcbiAgICovXG4gIG1hc2tNb3Rpb25OYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiDorr7nva4gZGlhbG9nIOeahCBDU1MgTW90aW9uIG5hbWVcbiAgICovXG4gIGdldE1vdGlvbk5hbWU/OiAocGxhY2VtZW50OiBUUGxhY2VtZW50KSA9PiBzdHJpbmdcbiAgLyoqXG4gICAqIOWFs+mXreaXtueahCBoYW5kbGVyXG4gICAqL1xuICBvbkNsb3NlPzogKCgpID0+IHZvaWQpIHwgbnVsbFxuICAvKipcbiAgICog5L2N572uXG4gICAqL1xuICBwbGFjZW1lbnQ/OiBUUGxhY2VtZW50XG4gIC8qKlxuICAgKiDlsLrlr7hcbiAgICovXG4gIHNpemU/OiBcIm1pbmlcIiB8IFwic21hbGxcIiB8IFwibWVkaXVtXCIgfCBcImxhcmdlXCJcbiAgLyoqXG4gICAqIOWklumDqOaOp+WItu+8muaYr+WQpuaYvuekulxuICAgKi9cbiAgdmlzaWJsZT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOiuvue9riB6LWluZGV4IOWxgue6p++8jOm7mOiupOS4uiB2YXIoLS16LWluZGV4LWRpYWxvZylcbiAgICovXG4gIHpJbmRleD86IFJlYWN0LlJlYWN0Tm9kZVxufVxuXG4vKipcbiAqIOa1ruWxguimhuebluWcqOmhtemdouWGheWuueS4iu+8jOW5tuWbuuWumuWcqOWxj+W5leeahOi+uee8mOOAglxuICovXG5jb25zdCBEcmF3ZXI6IFJlYWN0LkZDPElEcmF3ZXJQcm9wcz4gPSAoe1xuICBhZnRlckNsb3NlLFxuICBib2R5U2Nyb2xsYWJsZSxcbiAgY2hpbGRyZW4sXG4gIGNsYXNzTmFtZSxcbiAgZGVzdHJveUFmdGVyQ2xvc2UsXG4gIGVzY2FwZUtleUNsb3NhYmxlLFxuICBoZWFkZXJDb250ZW50LFxuICBoZWFkZXJFbGVtZW50LFxuICBoZWFkZXJTdHlsZSxcbiAgbWFza0NsYXNzTmFtZSxcbiAgbWFza0Nsb3NhYmxlLFxuICBtYXNrU3R5bGUsXG4gIG1hc2tWaXNpYmxlLFxuICBtYXNrTW90aW9uTmFtZSxcbiAgZ2V0TW90aW9uTmFtZSA9ICgpID0+IFwiXCIsXG4gIG9uQ2xvc2UsXG4gIHBsYWNlbWVudCA9IFwicmlnaHRcIixcbiAgc2l6ZSxcbiAgc3R5bGUsXG4gIHZpc2libGUsXG4gIHpJbmRleDogekluZGV4UHJvcCxcbiAgLi4ub3RoZXJQcm9wc1xufTogSURyYXdlclByb3BzKSA9PiB7XG4gIGNvbnN0IHpJbmRleCA9IHpJbmRleFByb3AgYXMgUmVhY3QuQ1NTUHJvcGVydGllc1tcInpJbmRleFwiXVxuICBjb25zdCBbaGFzRXZlck9wZW5lZCwgc2V0SGFzRXZlck9wZW5lZF0gPSB1c2VTdGF0ZSh2aXNpYmxlKVxuICBjb25zdCB3cmFwcGVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuXG4gIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gdXNlTWVtbyhnZXRTY3JvbGxCYXJTaXplLCBbXSlcbiAgbGV0IGJvZHlJc092ZXJmbG93aW5nID0gZmFsc2VcblxuICBjb25zdCBzZXRTY3JvbGxiYXJQYWRkaW5nID0gKHtcbiAgICBib2R5U2Nyb2xsYWJsZTogYm9keVNjcm9sbGFibGVQYXJhbSxcbiAgfToge1xuICAgIGJvZHlTY3JvbGxhYmxlPzogYm9vbGVhblxuICB9KSA9PiB7XG4gICAgY29uc3QgeyBpbm5lcldpZHRoIH0gPSB3aW5kb3dcbiAgICBib2R5SXNPdmVyZmxvd2luZyA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggPCBpbm5lcldpZHRoXG4gICAgaWYgKGJvZHlJc092ZXJmbG93aW5nICYmICFkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCkge1xuICAgICAgaWYgKHNjcm9sbGJhcldpZHRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBgJHtzY3JvbGxiYXJXaWR0aH1weGBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYm9keVNjcm9sbGFibGVQYXJhbSkge1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKFwiYWR1aS1zY3JvbGxiYXItaGlkZGVuXCIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzZXRTY3JvbGxiYXJQYWRkaW5nID0gKCkgPT4ge1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShcImFkdWktc2Nyb2xsYmFyLWhpZGRlblwiKVxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSBcIlwiXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBcIlwiXG4gIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh2aXNpYmxlICYmIHdyYXBwZXJSZWYuY3VycmVudCkge1xuICAgICAgc2V0U2Nyb2xsYmFyUGFkZGluZyh7IGJvZHlTY3JvbGxhYmxlIH0pXG4gICAgfVxuICB9LCBbdmlzaWJsZV0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHJlc2V0U2Nyb2xsYmFyUGFkZGluZywgW10pXG5cbiAgLy8g55u45b2T5LqO55Sf5ZG95ZGo5pyfIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1xuICBpZiAodmlzaWJsZSAmJiAhaGFzRXZlck9wZW5lZCkge1xuICAgIHNldEhhc0V2ZXJPcGVuZWQodHJ1ZSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUNoaWxkcmVuTW91bnQgPSAoKSA9PiB7XG4gICAgaWYgKHZpc2libGUpIHtcbiAgICAgIHNldFNjcm9sbGJhclBhZGRpbmcoeyBib2R5U2Nyb2xsYWJsZSB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUNsb3NlID0gKCkgPT4ge1xuICAgIGlmIChvbkNsb3NlKSB7XG4gICAgICBvbkNsb3NlKClcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGU6IFJlYWN0LktleWJvYXJkRXZlbnQpID0+IHtcbiAgICBpZiAoZXNjYXBlS2V5Q2xvc2FibGUgJiYgZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIGhhbmRsZUNsb3NlKClcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVFbnRlciA9ICgpID0+IHtcbiAgICBpZiAoZXNjYXBlS2V5Q2xvc2FibGUgJiYgd3JhcHBlclJlZi5jdXJyZW50KSB7XG4gICAgICB3cmFwcGVyUmVmLmN1cnJlbnQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUxlYXZlID0gKCkgPT4ge1xuICAgIGlmICh3cmFwcGVyUmVmLmN1cnJlbnQpIHtcbiAgICAgIHdyYXBwZXJSZWYuY3VycmVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcbiAgICB9XG4gICAgcmVzZXRTY3JvbGxiYXJQYWRkaW5nKClcblxuICAgIGlmIChhZnRlckNsb3NlKSB7XG4gICAgICBhZnRlckNsb3NlKClcbiAgICB9XG5cbiAgICBpZiAoZGVzdHJveUFmdGVyQ2xvc2UpIHtcbiAgICAgIHNldEhhc0V2ZXJPcGVuZWQoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgY2xhc3NTZXQgPSBjbGFzc05hbWVzKFxuICAgIGNsYXNzTmFtZSxcbiAgICBgJHtwcmVmaXh9LSR7cGxhY2VtZW50fWAsXG4gICAgYCR7cHJlZml4fS0ke3NpemV9YCxcbiAgICBgJHtwcmVmaXh9LWlubmVyYFxuICApXG5cbiAgY29uc3QgZ2V0Q29tcG9uZW50ID0gKCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17YCR7cHJlZml4fS13cmFwcGVyYH1cbiAgICAgICAgcmVmPXt3cmFwcGVyUmVmfVxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIGRpc3BsYXk6IHZpc2libGUgPyBcImJsb2NrXCIgOiBcIlwiLFxuICAgICAgICAgIHpJbmRleCxcbiAgICAgICAgfX1cbiAgICAgICAgdGFiSW5kZXg9ezB9XG4gICAgICAgIHJvbGU9XCJub25lXCJcbiAgICAgICAgb25LZXlEb3duPXtoYW5kbGVLZXlEb3dufVxuICAgICAgPlxuICAgICAgICA8Q1NTTW90aW9uXG4gICAgICAgICAgbW90aW9uTmFtZT17bWFza01vdGlvbk5hbWUgfHwgYCR7cHJlZml4fS1tYXNrYH1cbiAgICAgICAgICB2aXNpYmxlPXt2aXNpYmxlICYmIG1hc2tWaXNpYmxlfVxuICAgICAgICA+XG4gICAgICAgICAgeyh7IGNsYXNzTmFtZTogY2xzIH0sIHJlZikgPT4gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICByZWY9e3JlZn1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKGAke3ByZWZpeH0tbWFza2AsIG1hc2tDbGFzc05hbWUsIGNscyl9XG4gICAgICAgICAgICAgIHJvbGU9XCJub25lXCJcbiAgICAgICAgICAgICAgc3R5bGU9e21hc2tTdHlsZX1cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtYXNrQ2xvc2FibGUpIHtcbiAgICAgICAgICAgICAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvQ1NTTW90aW9uPlxuICAgICAgICA8Q1NTTW90aW9uXG4gICAgICAgICAgb25BcHBlYXJTdGFydD17aGFuZGxlRW50ZXJ9XG4gICAgICAgICAgb25FbnRlclN0YXJ0PXtoYW5kbGVFbnRlcn1cbiAgICAgICAgICBvbkxlYXZlRW5kPXtoYW5kbGVMZWF2ZX1cbiAgICAgICAgICBtb3Rpb25OYW1lPXtnZXRNb3Rpb25OYW1lKHBsYWNlbWVudCkgfHwgYCR7cHJlZml4fS0ke3BsYWNlbWVudH1gfVxuICAgICAgICAgIHZpc2libGU9e3Zpc2libGV9XG4gICAgICAgID5cbiAgICAgICAgICB7KHsgY2xhc3NOYW1lOiBjbHMgfSwgcmVmKSA9PiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIHJlZj17cmVmfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoY2xhc3NTZXQsIGNscyl9XG4gICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiBcImF1dG9cIixcbiAgICAgICAgICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgICAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIHsuLi5vdGhlclByb3BzfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7aGVhZGVyRWxlbWVudCA9PT0gbnVsbFxuICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgIDogaGVhZGVyRWxlbWVudCB8fCAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWhlYWRlcmB9IHN0eWxlPXtoZWFkZXJTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWU9XCJsaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwibWVkaXVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRJY29uPVwiY2FuY2VsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7cHJlZml4fS1oZWFkZXItY2xvc2VgfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlQ2xvc2UoKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzTmFtZT17YCR7cHJlZml4fS1oZWFkZXItZGl2aWRlcmB9IC8+XG4gICAgICAgICAgICAgICAgICAgICAge2hlYWRlckNvbnRlbnQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3ByZWZpeH0taGVhZGVyLWNvbnRlbnRgfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2hlYWRlckNvbnRlbnR9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWJvZHlgfT57Y2hpbGRyZW59PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICA8L0NTU01vdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIGlmICghaGFzRXZlck9wZW5lZCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gPFBvcnRhbCBvbkNoaWxkcmVuTW91bnQ9e2hhbmRsZUNoaWxkcmVuTW91bnR9PntnZXRDb21wb25lbnQoKX08L1BvcnRhbD5cbn1cblxuRHJhd2VyLmRpc3BsYXlOYW1lID0gXCJEcmF3ZXJcIlxuXG5EcmF3ZXIucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICog5YWz6Zet5ZCO77yIdHJhbnNpdGlvbiDnu5PmnZ/lkI7vvInnmoQgaGFuZGxlclxuICAgKi9cbiAgYWZ0ZXJDbG9zZTogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgKiB2aXNpYmxlIOaXtumhtemdouiDveWQpua7muWKqFxuICAgKi9cbiAgYm9keVNjcm9sbGFibGU6IFByb3BUeXBlcy5ib29sLFxuICAvKipcbiAgICog5a2Q6IqC54K5XG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gIC8qKlxuICAgKiDpmYTliqDnsbvlkI3vvIzms6jmhI8gRGlhbG9nIOaJgOacieeahOWxnuaAp+S8mumZhOWKoOWIsOWGhemDqOeahOWGheWuueWFg+e0oOS4iu+8jOiAjOS4jeaYr+WMheWQqyBtYXNrIOeahOacgOWkluWxguWFg+e0oFxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICog5piv5ZCm5q+P5qyhIHZpc2libGU6IGZhbHNlIOmDvemUgOavgSBkb21cbiAgICovXG4gIGRlc3Ryb3lBZnRlckNsb3NlOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAqIOaYr+WQpuaUr+aMgSBFU0Mg5YWz6ZetXG4gICAqL1xuICBlc2NhcGVLZXlDbG9zYWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gIC8qKlxuICAgKiBoZWFkZXIg5qCH6aKY5qCP5YaF6YOo55qE5YaF5a65XG4gICAqL1xuICBoZWFkZXJDb250ZW50OiBQcm9wVHlwZXMubm9kZSxcbiAgLyoqXG4gICAqIOWujOWFqOiHquWumuS5iSBoZWFkZXIg55qE5YaF5a65XG4gICAqL1xuICBoZWFkZXJFbGVtZW50OiBQcm9wVHlwZXMubm9kZSxcbiAgLyoqXG4gICAqIOiuvue9riBoZWFkZXIg5qC35byPXG4gICAqL1xuICBoZWFkZXJTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqXG4gICAqIG1hc2sg55qE57G75ZCNXG4gICAqL1xuICBtYXNrQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICog54K55Ye7IG1hc2sg5piv5ZCm6Kem5Y+RIGNhbmNlbCDkuovku7ZcbiAgICovXG4gIG1hc2tDbG9zYWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gIC8qKlxuICAgKiBtYXNrIOeahOagt+W8j1xuICAgKi9cbiAgbWFza1N0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKipcbiAgICog5piv5ZCm5pi+56S6IG1hc2tcbiAgICovXG4gIG1hc2tWaXNpYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAqIOWFs+mXreaXtueahCBoYW5kbGVyXG4gICAqL1xuICBvbkNsb3NlOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqXG4gICAqIOS9jee9rlxuICAgKi9cbiAgcGxhY2VtZW50OiBQcm9wVHlwZXMub25lT2YoW1widG9wXCIsIFwicmlnaHRcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCJdKSxcbiAgLyoqXG4gICAqIOWwuuWvuFxuICAgKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKFtcIm1pbmlcIiwgXCJzbWFsbFwiLCBcIm1lZGl1bVwiLCBcImxhcmdlXCJdKSxcbiAgLyoqXG4gICAqIOWklumDqOaOp+WItu+8muaYr+WQpuaYvuekulxuICAgKi9cbiAgdmlzaWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gIC8qKlxuICAgKiDorr7nva4gei1pbmRleCDlsYLnuqfvvIzpu5jorqTkuLogdmFyKC0tei1pbmRleC1kaWFsb2cpXG4gICAqL1xuICB6SW5kZXg6IFByb3BUeXBlcy5hbnksXG59XG5cbkRyYXdlci5kZWZhdWx0UHJvcHMgPSB7XG4gIGFmdGVyQ2xvc2U6IG51bGwsXG4gIGJvZHlTY3JvbGxhYmxlOiB0cnVlLFxuICBjaGlsZHJlbjogbnVsbCxcbiAgY2xhc3NOYW1lOiB1bmRlZmluZWQsXG4gIGRlc3Ryb3lBZnRlckNsb3NlOiBmYWxzZSxcbiAgZXNjYXBlS2V5Q2xvc2FibGU6IHRydWUsXG4gIGhlYWRlckNvbnRlbnQ6IG51bGwsXG4gIGhlYWRlckVsZW1lbnQ6IHVuZGVmaW5lZCxcbiAgaGVhZGVyU3R5bGU6IHt9LFxuICBtYXNrQ2xhc3NOYW1lOiB1bmRlZmluZWQsXG4gIG1hc2tDbG9zYWJsZTogZmFsc2UsXG4gIG1hc2tTdHlsZToge30sXG4gIG1hc2tWaXNpYmxlOiBmYWxzZSxcbiAgbWFza01vdGlvbk5hbWU6IFwiXCIsXG4gIGdldE1vdGlvbk5hbWU6ICgpID0+IFwiXCIsXG4gIG9uQ2xvc2U6IG51bGwsXG4gIHBsYWNlbWVudDogXCJyaWdodFwiLFxuICBzaXplOiBcIm1lZGl1bVwiLFxuICB2aXNpYmxlOiBmYWxzZSxcbiAgekluZGV4OiBcInZhcigtLXotaW5kZXgtZGlhbG9nKVwiLFxufVxuXG5leHBvcnQgZGVmYXVsdCBEcmF3ZXJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxNQUFNLEdBQUcsYUFBZjs7QUEyRkEsSUFBTUMsTUFBOEIsR0FBRyxTQUFqQ0EsTUFBaUMsT0F1Qm5CO0VBQUEsSUF0QmxCQyxVQXNCa0IsUUF0QmxCQSxVQXNCa0I7RUFBQSxJQXJCbEJDLGNBcUJrQixRQXJCbEJBLGNBcUJrQjtFQUFBLElBcEJsQkMsUUFvQmtCLFFBcEJsQkEsUUFvQmtCO0VBQUEsSUFuQmxCQyxTQW1Ca0IsUUFuQmxCQSxTQW1Ca0I7RUFBQSxJQWxCbEJDLGlCQWtCa0IsUUFsQmxCQSxpQkFrQmtCO0VBQUEsSUFqQmxCQyxpQkFpQmtCLFFBakJsQkEsaUJBaUJrQjtFQUFBLElBaEJsQkMsYUFnQmtCLFFBaEJsQkEsYUFnQmtCO0VBQUEsSUFmbEJDLGFBZWtCLFFBZmxCQSxhQWVrQjtFQUFBLElBZGxCQyxXQWNrQixRQWRsQkEsV0Fja0I7RUFBQSxJQWJsQkMsYUFha0IsUUFibEJBLGFBYWtCO0VBQUEsSUFabEJDLFlBWWtCLFFBWmxCQSxZQVlrQjtFQUFBLElBWGxCQyxTQVdrQixRQVhsQkEsU0FXa0I7RUFBQSxJQVZsQkMsV0FVa0IsUUFWbEJBLFdBVWtCO0VBQUEsSUFUbEJDLGNBU2tCLFFBVGxCQSxjQVNrQjtFQUFBLDhCQVJsQkMsYUFRa0I7RUFBQSxJQVJsQkEsYUFRa0IsbUNBUkY7SUFBQSxPQUFNLEVBQU47RUFBQSxDQVFFO0VBQUEsSUFQbEJDLE9BT2tCLFFBUGxCQSxPQU9rQjtFQUFBLDBCQU5sQkMsU0FNa0I7RUFBQSxJQU5sQkEsU0FNa0IsK0JBTk4sT0FNTTtFQUFBLElBTGxCQyxJQUtrQixRQUxsQkEsSUFLa0I7RUFBQSxJQUpsQkMsS0FJa0IsUUFKbEJBLEtBSWtCO0VBQUEsSUFIbEJDLE9BR2tCLFFBSGxCQSxPQUdrQjtFQUFBLElBRlZDLFVBRVUsUUFGbEJDLE1BRWtCO0VBQUEsSUFEZkMsVUFDZTs7RUFDbEIsSUFBTUQsTUFBTSxHQUFHRCxVQUFmOztFQUNBLGdCQUEwQyxJQUFBRyxlQUFBLEVBQVNKLE9BQVQsQ0FBMUM7RUFBQTtFQUFBLElBQU9LLGFBQVA7RUFBQSxJQUFzQkMsZ0JBQXRCOztFQUNBLElBQU1DLFVBQVUsR0FBRyxJQUFBQyxhQUFBLEVBQXVCLElBQXZCLENBQW5CO0VBRUEsSUFBTUMsY0FBYyxHQUFHLElBQUFDLGNBQUEsRUFBUUMsNEJBQVIsRUFBMEIsRUFBMUIsQ0FBdkI7RUFDQSxJQUFJQyxpQkFBaUIsR0FBRyxLQUF4Qjs7RUFFQSxJQUFNQyxtQkFBbUIsR0FBRyxTQUF0QkEsbUJBQXNCLFFBSXRCO0lBQUEsSUFIWUMsbUJBR1osU0FISmhDLGNBR0k7SUFDSixjQUF1QmlDLE1BQXZCO0lBQUEsSUFBUUMsVUFBUixXQUFRQSxVQUFSO0lBQ0FKLGlCQUFpQixHQUFHSyxRQUFRLENBQUNDLElBQVQsQ0FBY0MsV0FBZCxHQUE0QkgsVUFBaEQ7O0lBQ0EsSUFBSUosaUJBQWlCLElBQUksQ0FBQ0ssUUFBUSxDQUFDQyxJQUFULENBQWNuQixLQUFkLENBQW9CcUIsWUFBOUMsRUFBNEQ7TUFDMUQsSUFBSVgsY0FBYyxLQUFLWSxTQUF2QixFQUFrQztRQUNoQ0osUUFBUSxDQUFDQyxJQUFULENBQWNuQixLQUFkLENBQW9CcUIsWUFBcEIsYUFBc0NYLGNBQXRDO01BQ0Q7SUFDRjs7SUFFRCxJQUFJSyxtQkFBSixFQUF5QjtNQUN2QkcsUUFBUSxDQUFDQyxJQUFULENBQWNJLFNBQWQsQ0FBd0JDLEdBQXhCLENBQTRCLHVCQUE1QjtJQUNELENBRkQsTUFFTztNQUNMTixRQUFRLENBQUNDLElBQVQsQ0FBY25CLEtBQWQsQ0FBb0J5QixRQUFwQixHQUErQixRQUEvQjtJQUNEO0VBQ0YsQ0FsQkQ7O0VBb0JBLElBQU1DLHFCQUFxQixHQUFHLFNBQXhCQSxxQkFBd0IsR0FBTTtJQUNsQ1IsUUFBUSxDQUFDQyxJQUFULENBQWNJLFNBQWQsQ0FBd0JJLE1BQXhCLENBQStCLHVCQUEvQjtJQUNBVCxRQUFRLENBQUNDLElBQVQsQ0FBY25CLEtBQWQsQ0FBb0J5QixRQUFwQixHQUErQixFQUEvQjtJQUNBUCxRQUFRLENBQUNDLElBQVQsQ0FBY25CLEtBQWQsQ0FBb0JxQixZQUFwQixHQUFtQyxFQUFuQztFQUNELENBSkQ7O0VBTUEsSUFBQU8sZ0JBQUEsRUFBVSxZQUFNO0lBQ2QsSUFBSTNCLE9BQU8sSUFBSU8sVUFBVSxDQUFDcUIsT0FBMUIsRUFBbUM7TUFDakNmLG1CQUFtQixDQUFDO1FBQUUvQixjQUFjLEVBQWRBO01BQUYsQ0FBRCxDQUFuQjtJQUNEO0VBQ0YsQ0FKRCxFQUlHLENBQUNrQixPQUFELENBSkg7RUFNQSxJQUFBMkIsZ0JBQUEsRUFBVTtJQUFBLE9BQU1GLHFCQUFOO0VBQUEsQ0FBVixFQUF1QyxFQUF2Qzs7RUFHQSxJQUFJekIsT0FBTyxJQUFJLENBQUNLLGFBQWhCLEVBQStCO0lBQzdCQyxnQkFBZ0IsQ0FBQyxJQUFELENBQWhCO0VBQ0Q7O0VBRUQsSUFBTXVCLG1CQUFtQixHQUFHLFNBQXRCQSxtQkFBc0IsR0FBTTtJQUNoQyxJQUFJN0IsT0FBSixFQUFhO01BQ1hhLG1CQUFtQixDQUFDO1FBQUUvQixjQUFjLEVBQWRBO01BQUYsQ0FBRCxDQUFuQjtJQUNEO0VBQ0YsQ0FKRDs7RUFNQSxJQUFNZ0QsV0FBVyxHQUFHLFNBQWRBLFdBQWMsR0FBTTtJQUN4QixJQUFJbEMsT0FBSixFQUFhO01BQ1hBLE9BQU87SUFDUjtFQUNGLENBSkQ7O0VBTUEsSUFBTW1DLGFBQWEsR0FBRyxTQUFoQkEsYUFBZ0IsQ0FBQ0MsQ0FBRCxFQUE0QjtJQUNoRCxJQUFJOUMsaUJBQWlCLElBQUk4QyxDQUFDLENBQUNDLEdBQUYsS0FBVSxRQUFuQyxFQUE2QztNQUMzQ0QsQ0FBQyxDQUFDRSxlQUFGO01BQ0FKLFdBQVc7SUFDWjtFQUNGLENBTEQ7O0VBT0EsSUFBTUssV0FBVyxHQUFHLFNBQWRBLFdBQWMsR0FBTTtJQUN4QixJQUFJakQsaUJBQWlCLElBQUlxQixVQUFVLENBQUNxQixPQUFwQyxFQUE2QztNQUMzQ3JCLFVBQVUsQ0FBQ3FCLE9BQVgsQ0FBbUJRLEtBQW5CO0lBQ0Q7RUFDRixDQUpEOztFQU1BLElBQU1DLFdBQVcsR0FBRyxTQUFkQSxXQUFjLEdBQU07SUFDeEIsSUFBSTlCLFVBQVUsQ0FBQ3FCLE9BQWYsRUFBd0I7TUFDdEJyQixVQUFVLENBQUNxQixPQUFYLENBQW1CN0IsS0FBbkIsQ0FBeUJ1QyxPQUF6QixHQUFtQyxNQUFuQztJQUNEOztJQUNEYixxQkFBcUI7O0lBRXJCLElBQUk1QyxVQUFKLEVBQWdCO01BQ2RBLFVBQVU7SUFDWDs7SUFFRCxJQUFJSSxpQkFBSixFQUF1QjtNQUNyQnFCLGdCQUFnQixDQUFDLEtBQUQsQ0FBaEI7SUFDRDtFQUNGLENBYkQ7O0VBZUEsSUFBTWlDLFFBQVEsR0FBRyxJQUFBQyxzQkFBQSxFQUNmeEQsU0FEZSxZQUVaTCxNQUZZLGNBRUZrQixTQUZFLGFBR1psQixNQUhZLGNBR0ZtQixJQUhFLGFBSVpuQixNQUpZLFlBQWpCOztFQU9BLElBQU04RCxZQUFZLEdBQUcsU0FBZkEsWUFBZSxHQUFNO0lBQ3pCLE9BQ0U7TUFDRSxTQUFTLFlBQUs5RCxNQUFMLGFBRFg7TUFFRSxHQUFHLEVBQUU0QixVQUZQO01BR0UsS0FBSyxFQUFFO1FBQ0wrQixPQUFPLEVBQUV0QyxPQUFPLEdBQUcsT0FBSCxHQUFhLEVBRHhCO1FBRUxFLE1BQU0sRUFBTkE7TUFGSyxDQUhUO01BT0UsUUFBUSxFQUFFLENBUFo7TUFRRSxJQUFJLEVBQUMsTUFSUDtNQVNFLFNBQVMsRUFBRTZCO0lBVGIsR0FXRSxnQ0FBQyxvQkFBRDtNQUNFLFVBQVUsRUFBRXJDLGNBQWMsY0FBT2YsTUFBUCxVQUQ1QjtNQUVFLE9BQU8sRUFBRXFCLE9BQU8sSUFBSVA7SUFGdEIsR0FJRyxpQkFBcUJpRCxHQUFyQjtNQUFBLElBQWNDLEdBQWQsU0FBRzNELFNBQUg7TUFBQSxPQUNDO1FBQ0UsR0FBRyxFQUFFMEQsR0FEUDtRQUVFLFNBQVMsRUFBRSxJQUFBRixzQkFBQSxZQUFjN0QsTUFBZCxZQUE2QlcsYUFBN0IsRUFBNENxRCxHQUE1QyxDQUZiO1FBR0UsSUFBSSxFQUFDLE1BSFA7UUFJRSxLQUFLLEVBQUVuRCxTQUpUO1FBS0UsT0FBTyxFQUFFLG1CQUFNO1VBQ2IsSUFBSUQsWUFBSixFQUFrQjtZQUNoQnVDLFdBQVc7VUFDWjtRQUNGO01BVEgsRUFERDtJQUFBLENBSkgsQ0FYRixFQTZCRSxnQ0FBQyxvQkFBRDtNQUNFLGFBQWEsRUFBRUssV0FEakI7TUFFRSxZQUFZLEVBQUVBLFdBRmhCO01BR0UsVUFBVSxFQUFFRSxXQUhkO01BSUUsVUFBVSxFQUFFMUMsYUFBYSxDQUFDRSxTQUFELENBQWIsY0FBK0JsQixNQUEvQixjQUF5Q2tCLFNBQXpDLENBSmQ7TUFLRSxPQUFPLEVBQUVHO0lBTFgsR0FPRyxpQkFBcUIwQyxHQUFyQjtNQUFBLElBQWNDLEdBQWQsU0FBRzNELFNBQUg7TUFBQSxPQUNDO1FBQ0UsR0FBRyxFQUFFMEQsR0FEUDtRQUVFLFNBQVMsRUFBRSxJQUFBRixzQkFBQSxFQUFXRCxRQUFYLEVBQXFCSSxHQUFyQixDQUZiO1FBR0UsS0FBSztVQUNIQyxNQUFNLEVBQUUsTUFETDtVQUVIMUMsTUFBTSxFQUFFO1FBRkwsR0FHQUgsS0FIQTtNQUhQLEdBUU1JLFVBUk4sR0FVR2YsYUFBYSxLQUFLLElBQWxCLEdBQ0csSUFESCxHQUVHQSxhQUFhLElBQ1g7UUFBSyxTQUFTLFlBQUtULE1BQUwsWUFBZDtRQUFvQyxLQUFLLEVBQUVVO01BQTNDLEdBQ0UsZ0NBQUMsa0JBQUQ7UUFDRSxLQUFLLEVBQUMsT0FEUjtRQUVFLElBQUksRUFBQyxRQUZQO1FBR0UsUUFBUSxFQUFDLFFBSFg7UUFJRSxTQUFTLFlBQUtWLE1BQUwsa0JBSlg7UUFLRSxPQUFPLEVBQUU7VUFBQSxPQUFNbUQsV0FBVyxFQUFqQjtRQUFBO01BTFgsRUFERixFQVFFO1FBQUcsU0FBUyxZQUFLbkQsTUFBTDtNQUFaLEVBUkYsRUFTR1EsYUFBYSxJQUNaO1FBQUssU0FBUyxZQUFLUixNQUFMO01BQWQsR0FDR1EsYUFESCxDQVZKLENBYlIsRUE2QkU7UUFBSyxTQUFTLFlBQUtSLE1BQUw7TUFBZCxHQUFtQ0ksUUFBbkMsQ0E3QkYsQ0FERDtJQUFBLENBUEgsQ0E3QkYsQ0FERjtFQXlFRCxDQTFFRDs7RUE0RUEsSUFBSSxDQUFDc0IsYUFBTCxFQUFvQjtJQUNsQixPQUFPLElBQVA7RUFDRDs7RUFFRCxPQUFPLGdDQUFDLGtCQUFEO0lBQVEsZUFBZSxFQUFFd0I7RUFBekIsR0FBK0NZLFlBQVksRUFBM0QsQ0FBUDtBQUNELENBdE1EOztBQXdNQTdELE1BQU0sQ0FBQ2lFLFdBQVAsR0FBcUIsUUFBckI7QUFFQWpFLE1BQU0sQ0FBQ2tFLFNBQVAsR0FBbUI7RUFJakJqRSxVQUFVLEVBQUVrRSxxQkFBQSxDQUFVQyxJQUpMO0VBUWpCbEUsY0FBYyxFQUFFaUUscUJBQUEsQ0FBVUUsSUFSVDtFQVlqQmxFLFFBQVEsRUFBRWdFLHFCQUFBLENBQVVHLElBWkg7RUFnQmpCbEUsU0FBUyxFQUFFK0QscUJBQUEsQ0FBVUksTUFoQko7RUFvQmpCbEUsaUJBQWlCLEVBQUU4RCxxQkFBQSxDQUFVRSxJQXBCWjtFQXdCakIvRCxpQkFBaUIsRUFBRTZELHFCQUFBLENBQVVFLElBeEJaO0VBNEJqQjlELGFBQWEsRUFBRTRELHFCQUFBLENBQVVHLElBNUJSO0VBZ0NqQjlELGFBQWEsRUFBRTJELHFCQUFBLENBQVVHLElBaENSO0VBb0NqQjdELFdBQVcsRUFBRTBELHFCQUFBLENBQVVLLE1BcENOO0VBd0NqQjlELGFBQWEsRUFBRXlELHFCQUFBLENBQVVJLE1BeENSO0VBNENqQjVELFlBQVksRUFBRXdELHFCQUFBLENBQVVFLElBNUNQO0VBZ0RqQnpELFNBQVMsRUFBRXVELHFCQUFBLENBQVVLLE1BaERKO0VBb0RqQjNELFdBQVcsRUFBRXNELHFCQUFBLENBQVVFLElBcEROO0VBd0RqQnJELE9BQU8sRUFBRW1ELHFCQUFBLENBQVVDLElBeERGO0VBNERqQm5ELFNBQVMsRUFBRWtELHFCQUFBLENBQVVNLEtBQVYsQ0FBZ0IsQ0FBQyxLQUFELEVBQVEsT0FBUixFQUFpQixRQUFqQixFQUEyQixNQUEzQixDQUFoQixDQTVETTtFQWdFakJ2RCxJQUFJLEVBQUVpRCxxQkFBQSxDQUFVTSxLQUFWLENBQWdCLENBQUMsTUFBRCxFQUFTLE9BQVQsRUFBa0IsUUFBbEIsRUFBNEIsT0FBNUIsQ0FBaEIsQ0FoRVc7RUFvRWpCckQsT0FBTyxFQUFFK0MscUJBQUEsQ0FBVUUsSUFwRUY7RUF3RWpCL0MsTUFBTSxFQUFFNkMscUJBQUEsQ0FBVU87QUF4RUQsQ0FBbkI7QUEyRUExRSxNQUFNLENBQUMyRSxZQUFQLEdBQXNCO0VBQ3BCMUUsVUFBVSxFQUFFLElBRFE7RUFFcEJDLGNBQWMsRUFBRSxJQUZJO0VBR3BCQyxRQUFRLEVBQUUsSUFIVTtFQUlwQkMsU0FBUyxFQUFFcUMsU0FKUztFQUtwQnBDLGlCQUFpQixFQUFFLEtBTEM7RUFNcEJDLGlCQUFpQixFQUFFLElBTkM7RUFPcEJDLGFBQWEsRUFBRSxJQVBLO0VBUXBCQyxhQUFhLEVBQUVpQyxTQVJLO0VBU3BCaEMsV0FBVyxFQUFFLEVBVE87RUFVcEJDLGFBQWEsRUFBRStCLFNBVks7RUFXcEI5QixZQUFZLEVBQUUsS0FYTTtFQVlwQkMsU0FBUyxFQUFFLEVBWlM7RUFhcEJDLFdBQVcsRUFBRSxLQWJPO0VBY3BCQyxjQUFjLEVBQUUsRUFkSTtFQWVwQkMsYUFBYSxFQUFFO0lBQUEsT0FBTSxFQUFOO0VBQUEsQ0FmSztFQWdCcEJDLE9BQU8sRUFBRSxJQWhCVztFQWlCcEJDLFNBQVMsRUFBRSxPQWpCUztFQWtCcEJDLElBQUksRUFBRSxRQWxCYztFQW1CcEJFLE9BQU8sRUFBRSxLQW5CVztFQW9CcEJFLE1BQU0sRUFBRTtBQXBCWSxDQUF0QjtlQXVCZXRCLE0ifQ==