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>
279 lines (243 loc) • 34.4 kB
JavaScript
var _excluded = ["afterClose", "bodyScrollable", "children", "className", "destroyAfterClose", "escapeKeyClosable", "headerContent", "headerElement", "headerStyle", "maskClassName", "maskClosable", "maskStyle", "maskVisible", "maskMotionName", "getMotionName", "onClose", "placement", "size", "style", "visible", "zIndex"];
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; }
import React, { useEffect, useMemo, useRef, useState } from "react";
import PropTypes from "prop-types";
import classNames from "classnames";
import CSSMotion from "rc-motion";
import getScrollBarSize from "rc-util/lib/getScrollBarSize";
import Button from "../button";
import Portal from "../portal";
import "./style";
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 = useState(visible),
_useState2 = _slicedToArray(_useState, 2),
hasEverOpened = _useState2[0],
setHasEverOpened = _useState2[1];
var wrapperRef = useRef(null);
var scrollbarWidth = useMemo(getScrollBarSize, []);
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 = "";
};
useEffect(function () {
if (visible && wrapperRef.current) {
setScrollbarPadding({
bodyScrollable: bodyScrollable
});
}
}, [visible]);
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 = classNames(className, "".concat(prefix, "-").concat(placement), "".concat(prefix, "-").concat(size), "".concat(prefix, "-inner"));
var getComponent = function getComponent() {
return React.createElement("div", {
className: "".concat(prefix, "-wrapper"),
ref: wrapperRef,
style: {
display: visible ? "block" : "",
zIndex: zIndex
},
tabIndex: 0,
role: "none",
onKeyDown: handleKeyDown
}, React.createElement(CSSMotion, {
motionName: maskMotionName || "".concat(prefix, "-mask"),
visible: visible && maskVisible
}, function (_ref3, ref) {
var cls = _ref3.className;
return React.createElement("div", {
ref: ref,
className: classNames("".concat(prefix, "-mask"), maskClassName, cls),
role: "none",
style: maskStyle,
onClick: function onClick() {
if (maskClosable) {
handleClose();
}
}
});
}), React.createElement(CSSMotion, {
onAppearStart: handleEnter,
onEnterStart: handleEnter,
onLeaveEnd: handleLeave,
motionName: getMotionName(placement) || "".concat(prefix, "-").concat(placement),
visible: visible
}, function (_ref4, ref) {
var cls = _ref4.className;
return React.createElement("div", _extends({
ref: ref,
className: classNames(classSet, cls),
style: _objectSpread({
margin: "auto",
zIndex: 1
}, style)
}, otherProps), headerElement === null ? null : headerElement || React.createElement("div", {
className: "".concat(prefix, "-header"),
style: headerStyle
}, React.createElement(Button, {
theme: "light",
size: "medium",
leftIcon: "cancel",
className: "".concat(prefix, "-header-close"),
onClick: function onClick() {
return handleClose();
}
}), React.createElement("i", {
className: "".concat(prefix, "-header-divider")
}), headerContent && React.createElement("div", {
className: "".concat(prefix, "-header-content")
}, headerContent)), React.createElement("div", {
className: "".concat(prefix, "-body")
}, children));
}));
};
if (!hasEverOpened) {
return null;
}
return React.createElement(Portal, {
onChildrenMount: handleChildrenMount
}, getComponent());
};
Drawer.displayName = "Drawer";
Drawer.propTypes = {
afterClose: PropTypes.func,
bodyScrollable: PropTypes.bool,
children: PropTypes.node,
className: PropTypes.string,
destroyAfterClose: PropTypes.bool,
escapeKeyClosable: PropTypes.bool,
headerContent: PropTypes.node,
headerElement: PropTypes.node,
headerStyle: PropTypes.object,
maskClassName: PropTypes.string,
maskClosable: PropTypes.bool,
maskStyle: PropTypes.object,
maskVisible: PropTypes.bool,
onClose: PropTypes.func,
placement: PropTypes.oneOf(["top", "right", "bottom", "left"]),
size: PropTypes.oneOf(["mini", "small", "medium", "large"]),
visible: PropTypes.bool,
zIndex: PropTypes.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)"
};
export default Drawer;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsIlByb3BUeXBlcyIsImNsYXNzTmFtZXMiLCJDU1NNb3Rpb24iLCJnZXRTY3JvbGxCYXJTaXplIiwiQnV0dG9uIiwiUG9ydGFsIiwicHJlZml4IiwiRHJhd2VyIiwiYWZ0ZXJDbG9zZSIsImJvZHlTY3JvbGxhYmxlIiwiY2hpbGRyZW4iLCJjbGFzc05hbWUiLCJkZXN0cm95QWZ0ZXJDbG9zZSIsImVzY2FwZUtleUNsb3NhYmxlIiwiaGVhZGVyQ29udGVudCIsImhlYWRlckVsZW1lbnQiLCJoZWFkZXJTdHlsZSIsIm1hc2tDbGFzc05hbWUiLCJtYXNrQ2xvc2FibGUiLCJtYXNrU3R5bGUiLCJtYXNrVmlzaWJsZSIsIm1hc2tNb3Rpb25OYW1lIiwiZ2V0TW90aW9uTmFtZSIsIm9uQ2xvc2UiLCJwbGFjZW1lbnQiLCJzaXplIiwic3R5bGUiLCJ2aXNpYmxlIiwiekluZGV4UHJvcCIsInpJbmRleCIsIm90aGVyUHJvcHMiLCJoYXNFdmVyT3BlbmVkIiwic2V0SGFzRXZlck9wZW5lZCIsIndyYXBwZXJSZWYiLCJzY3JvbGxiYXJXaWR0aCIsImJvZHlJc092ZXJmbG93aW5nIiwic2V0U2Nyb2xsYmFyUGFkZGluZyIsImJvZHlTY3JvbGxhYmxlUGFyYW0iLCJ3aW5kb3ciLCJpbm5lcldpZHRoIiwiZG9jdW1lbnQiLCJib2R5IiwiY2xpZW50V2lkdGgiLCJwYWRkaW5nUmlnaHQiLCJ1bmRlZmluZWQiLCJjbGFzc0xpc3QiLCJhZGQiLCJvdmVyZmxvdyIsInJlc2V0U2Nyb2xsYmFyUGFkZGluZyIsInJlbW92ZSIsImN1cnJlbnQiLCJoYW5kbGVDaGlsZHJlbk1vdW50IiwiaGFuZGxlQ2xvc2UiLCJoYW5kbGVLZXlEb3duIiwiZSIsImtleSIsInN0b3BQcm9wYWdhdGlvbiIsImhhbmRsZUVudGVyIiwiZm9jdXMiLCJoYW5kbGVMZWF2ZSIsImRpc3BsYXkiLCJjbGFzc1NldCIsImdldENvbXBvbmVudCIsInJlZiIsImNscyIsIm1hcmdpbiIsImRpc3BsYXlOYW1lIiwicHJvcFR5cGVzIiwiZnVuYyIsImJvb2wiLCJub2RlIiwic3RyaW5nIiwib2JqZWN0Iiwib25lT2YiLCJhbnkiLCJkZWZhdWx0UHJvcHMiXSwic291cmNlcyI6WyIuLi8uLi9jb21wb25lbnRzL2RyYXdlci9EcmF3ZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiXG5pbXBvcnQgQ1NTTW90aW9uIGZyb20gXCJyYy1tb3Rpb25cIlxuaW1wb3J0IGdldFNjcm9sbEJhclNpemUgZnJvbSBcInJjLXV0aWwvbGliL2dldFNjcm9sbEJhclNpemVcIlxuaW1wb3J0IEJ1dHRvbiBmcm9tIFwiLi4vYnV0dG9uXCJcbmltcG9ydCBQb3J0YWwgZnJvbSBcIi4uL3BvcnRhbFwiXG5pbXBvcnQgXCIuL3N0eWxlXCJcblxuY29uc3QgcHJlZml4ID0gXCJhZHVpLWRyYXdlclwiXG5cbnR5cGUgVFBsYWNlbWVudCA9IFwidG9wXCIgfCBcInJpZ2h0XCIgfCBcImJvdHRvbVwiIHwgXCJsZWZ0XCJcblxuZXhwb3J0IGludGVyZmFjZSBJRHJhd2VyUHJvcHMge1xuICBba2V5OiBzdHJpbmddOiBhbnlcbiAgLyoqXG4gICAqIOWFs+mXreWQju+8iHRyYW5zaXRpb24g57uT5p2f5ZCO77yJ55qEIGhhbmRsZXJcbiAgICovXG4gIGFmdGVyQ2xvc2U/OiAoKCkgPT4gdm9pZCkgfCBudWxsXG4gIC8qKlxuICAgKiB2aXNpYmxlIOaXtumhtemdouiDveWQpua7muWKqFxuICAgKi9cbiAgYm9keVNjcm9sbGFibGU/OiBib29sZWFuXG4gIC8qKlxuICAgKiDlrZDoioLngrlcbiAgICovXG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDpmYTliqDnsbvlkI3vvIzms6jmhI8gRHJhd2VyIOaJgOacieeahOWxnuaAp+S8mumZhOWKoOWIsOWGhemDqOeahOWGheWuueWFg+e0oOS4iu+8jOiAjOS4jeaYr+WMheWQqyBtYXNrIOeahOacgOWkluWxguWFg+e0oFxuICAgKi9cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiDmmK/lkKbmr4/mrKEgdmlzaWJsZTogZmFsc2Ug6YO96ZSA5q+BIGRvbVxuICAgKi9cbiAgZGVzdHJveUFmdGVyQ2xvc2U/OiBib29sZWFuXG4gIC8qKlxuICAgKiDmmK/lkKbmlK/mjIEgRVNDIOWFs+mXrVxuICAgKi9cbiAgZXNjYXBlS2V5Q2xvc2FibGU/OiBib29sZWFuXG4gIC8qKlxuICAgKiBoZWFkZXIg5qCH6aKY5qCP5YaF6YOo55qE5YaF5a65XG4gICAqL1xuICBoZWFkZXJDb250ZW50PzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDlrozlhajoh6rlrprkuYkgaGVhZGVyIOeahOWGheWuuVxuICAgKi9cbiAgaGVhZGVyRWxlbWVudD86IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICog6K6+572uIGhlYWRlciDmoLflvI9cbiAgICovXG4gIGhlYWRlclN0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllc1xuICAvKipcbiAgICogbWFzayDnmoTnsbvlkI1cbiAgICovXG4gIG1hc2tDbGFzc05hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOeCueWHuyBtYXNrIOaYr+WQpuinpuWPkSBjYW5jZWwg5LqL5Lu2XG4gICAqL1xuICBtYXNrQ2xvc2FibGU/OiBib29sZWFuXG4gIC8qKlxuICAgKiBtYXNrIOeahOagt+W8j1xuICAgKi9cbiAgbWFza1N0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllc1xuICAvKipcbiAgICog5piv5ZCm5pi+56S6IG1hc2tcbiAgICovXG4gIG1hc2tWaXNpYmxlPzogYm9vbGVhblxuICAvKipcbiAgICog6K6+572uIG1hc2sg55qEIENTUyBNb3Rpb24gbmFtZVxuICAgKi9cbiAgbWFza01vdGlvbk5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOiuvue9riBkaWFsb2cg55qEIENTUyBNb3Rpb24gbmFtZVxuICAgKi9cbiAgZ2V0TW90aW9uTmFtZT86IChwbGFjZW1lbnQ6IFRQbGFjZW1lbnQpID0+IHN0cmluZ1xuICAvKipcbiAgICog5YWz6Zet5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uQ2xvc2U/OiAoKCkgPT4gdm9pZCkgfCBudWxsXG4gIC8qKlxuICAgKiDkvY3nva5cbiAgICovXG4gIHBsYWNlbWVudD86IFRQbGFjZW1lbnRcbiAgLyoqXG4gICAqIOWwuuWvuFxuICAgKi9cbiAgc2l6ZT86IFwibWluaVwiIHwgXCJzbWFsbFwiIHwgXCJtZWRpdW1cIiB8IFwibGFyZ2VcIlxuICAvKipcbiAgICog5aSW6YOo5o6n5Yi277ya5piv5ZCm5pi+56S6XG4gICAqL1xuICB2aXNpYmxlPzogYm9vbGVhblxuICAvKipcbiAgICog6K6+572uIHotaW5kZXgg5bGC57qn77yM6buY6K6k5Li6IHZhcigtLXotaW5kZXgtZGlhbG9nKVxuICAgKi9cbiAgekluZGV4PzogUmVhY3QuUmVhY3ROb2RlXG59XG5cbi8qKlxuICog5rWu5bGC6KaG55uW5Zyo6aG16Z2i5YaF5a655LiK77yM5bm25Zu65a6a5Zyo5bGP5bmV55qE6L6557yY44CCXG4gKi9cbmNvbnN0IERyYXdlcjogUmVhY3QuRkM8SURyYXdlclByb3BzPiA9ICh7XG4gIGFmdGVyQ2xvc2UsXG4gIGJvZHlTY3JvbGxhYmxlLFxuICBjaGlsZHJlbixcbiAgY2xhc3NOYW1lLFxuICBkZXN0cm95QWZ0ZXJDbG9zZSxcbiAgZXNjYXBlS2V5Q2xvc2FibGUsXG4gIGhlYWRlckNvbnRlbnQsXG4gIGhlYWRlckVsZW1lbnQsXG4gIGhlYWRlclN0eWxlLFxuICBtYXNrQ2xhc3NOYW1lLFxuICBtYXNrQ2xvc2FibGUsXG4gIG1hc2tTdHlsZSxcbiAgbWFza1Zpc2libGUsXG4gIG1hc2tNb3Rpb25OYW1lLFxuICBnZXRNb3Rpb25OYW1lID0gKCkgPT4gXCJcIixcbiAgb25DbG9zZSxcbiAgcGxhY2VtZW50ID0gXCJyaWdodFwiLFxuICBzaXplLFxuICBzdHlsZSxcbiAgdmlzaWJsZSxcbiAgekluZGV4OiB6SW5kZXhQcm9wLFxuICAuLi5vdGhlclByb3BzXG59OiBJRHJhd2VyUHJvcHMpID0+IHtcbiAgY29uc3QgekluZGV4ID0gekluZGV4UHJvcCBhcyBSZWFjdC5DU1NQcm9wZXJ0aWVzW1wiekluZGV4XCJdXG4gIGNvbnN0IFtoYXNFdmVyT3BlbmVkLCBzZXRIYXNFdmVyT3BlbmVkXSA9IHVzZVN0YXRlKHZpc2libGUpXG4gIGNvbnN0IHdyYXBwZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG5cbiAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB1c2VNZW1vKGdldFNjcm9sbEJhclNpemUsIFtdKVxuICBsZXQgYm9keUlzT3ZlcmZsb3dpbmcgPSBmYWxzZVxuXG4gIGNvbnN0IHNldFNjcm9sbGJhclBhZGRpbmcgPSAoe1xuICAgIGJvZHlTY3JvbGxhYmxlOiBib2R5U2Nyb2xsYWJsZVBhcmFtLFxuICB9OiB7XG4gICAgYm9keVNjcm9sbGFibGU/OiBib29sZWFuXG4gIH0pID0+IHtcbiAgICBjb25zdCB7IGlubmVyV2lkdGggfSA9IHdpbmRvd1xuICAgIGJvZHlJc092ZXJmbG93aW5nID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCA8IGlubmVyV2lkdGhcbiAgICBpZiAoYm9keUlzT3ZlcmZsb3dpbmcgJiYgIWRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0KSB7XG4gICAgICBpZiAoc2Nyb2xsYmFyV2lkdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IGAke3Njcm9sbGJhcldpZHRofXB4YFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChib2R5U2Nyb2xsYWJsZVBhcmFtKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoXCJhZHVpLXNjcm9sbGJhci1oaWRkZW5cIilcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCJcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNldFNjcm9sbGJhclBhZGRpbmcgPSAoKSA9PiB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKFwiYWR1aS1zY3JvbGxiYXItaGlkZGVuXCIpXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9IFwiXCJcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IFwiXCJcbiAgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHZpc2libGUgJiYgd3JhcHBlclJlZi5jdXJyZW50KSB7XG4gICAgICBzZXRTY3JvbGxiYXJQYWRkaW5nKHsgYm9keVNjcm9sbGFibGUgfSlcbiAgICB9XG4gIH0sIFt2aXNpYmxlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4gcmVzZXRTY3JvbGxiYXJQYWRkaW5nLCBbXSlcblxuICAvLyDnm7jlvZPkuo7nlJ/lkb3lkajmnJ8gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXG4gIGlmICh2aXNpYmxlICYmICFoYXNFdmVyT3BlbmVkKSB7XG4gICAgc2V0SGFzRXZlck9wZW5lZCh0cnVlKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQ2hpbGRyZW5Nb3VudCA9ICgpID0+IHtcbiAgICBpZiAodmlzaWJsZSkge1xuICAgICAgc2V0U2Nyb2xsYmFyUGFkZGluZyh7IGJvZHlTY3JvbGxhYmxlIH0pXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQ2xvc2UgPSAoKSA9PiB7XG4gICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgIG9uQ2xvc2UoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUtleURvd24gPSAoZTogUmVhY3QuS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIGlmIChlc2NhcGVLZXlDbG9zYWJsZSAmJiBlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUVudGVyID0gKCkgPT4ge1xuICAgIGlmIChlc2NhcGVLZXlDbG9zYWJsZSAmJiB3cmFwcGVyUmVmLmN1cnJlbnQpIHtcbiAgICAgIHdyYXBwZXJSZWYuY3VycmVudC5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlTGVhdmUgPSAoKSA9PiB7XG4gICAgaWYgKHdyYXBwZXJSZWYuY3VycmVudCkge1xuICAgICAgd3JhcHBlclJlZi5jdXJyZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxuICAgIH1cbiAgICByZXNldFNjcm9sbGJhclBhZGRpbmcoKVxuXG4gICAgaWYgKGFmdGVyQ2xvc2UpIHtcbiAgICAgIGFmdGVyQ2xvc2UoKVxuICAgIH1cblxuICAgIGlmIChkZXN0cm95QWZ0ZXJDbG9zZSkge1xuICAgICAgc2V0SGFzRXZlck9wZW5lZChmYWxzZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBjbGFzc1NldCA9IGNsYXNzTmFtZXMoXG4gICAgY2xhc3NOYW1lLFxuICAgIGAke3ByZWZpeH0tJHtwbGFjZW1lbnR9YCxcbiAgICBgJHtwcmVmaXh9LSR7c2l6ZX1gLFxuICAgIGAke3ByZWZpeH0taW5uZXJgXG4gIClcblxuICBjb25zdCBnZXRDb21wb25lbnQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LXdyYXBwZXJgfVxuICAgICAgICByZWY9e3dyYXBwZXJSZWZ9XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgZGlzcGxheTogdmlzaWJsZSA/IFwiYmxvY2tcIiA6IFwiXCIsXG4gICAgICAgICAgekluZGV4LFxuICAgICAgICB9fVxuICAgICAgICB0YWJJbmRleD17MH1cbiAgICAgICAgcm9sZT1cIm5vbmVcIlxuICAgICAgICBvbktleURvd249e2hhbmRsZUtleURvd259XG4gICAgICA+XG4gICAgICAgIDxDU1NNb3Rpb25cbiAgICAgICAgICBtb3Rpb25OYW1lPXttYXNrTW90aW9uTmFtZSB8fCBgJHtwcmVmaXh9LW1hc2tgfVxuICAgICAgICAgIHZpc2libGU9e3Zpc2libGUgJiYgbWFza1Zpc2libGV9XG4gICAgICAgID5cbiAgICAgICAgICB7KHsgY2xhc3NOYW1lOiBjbHMgfSwgcmVmKSA9PiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIHJlZj17cmVmfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoYCR7cHJlZml4fS1tYXNrYCwgbWFza0NsYXNzTmFtZSwgY2xzKX1cbiAgICAgICAgICAgICAgcm9sZT1cIm5vbmVcIlxuICAgICAgICAgICAgICBzdHlsZT17bWFza1N0eWxlfVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1hc2tDbG9zYWJsZSkge1xuICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9DU1NNb3Rpb24+XG4gICAgICAgIDxDU1NNb3Rpb25cbiAgICAgICAgICBvbkFwcGVhclN0YXJ0PXtoYW5kbGVFbnRlcn1cbiAgICAgICAgICBvbkVudGVyU3RhcnQ9e2hhbmRsZUVudGVyfVxuICAgICAgICAgIG9uTGVhdmVFbmQ9e2hhbmRsZUxlYXZlfVxuICAgICAgICAgIG1vdGlvbk5hbWU9e2dldE1vdGlvbk5hbWUocGxhY2VtZW50KSB8fCBgJHtwcmVmaXh9LSR7cGxhY2VtZW50fWB9XG4gICAgICAgICAgdmlzaWJsZT17dmlzaWJsZX1cbiAgICAgICAgPlxuICAgICAgICAgIHsoeyBjbGFzc05hbWU6IGNscyB9LCByZWYpID0+IChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhjbGFzc1NldCwgY2xzKX1cbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBtYXJnaW46IFwiYXV0b1wiLFxuICAgICAgICAgICAgICAgIHpJbmRleDogMSxcbiAgICAgICAgICAgICAgICAuLi5zdHlsZSxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgey4uLm90aGVyUHJvcHN9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtoZWFkZXJFbGVtZW50ID09PSBudWxsXG4gICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgOiBoZWFkZXJFbGVtZW50IHx8IChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3ByZWZpeH0taGVhZGVyYH0gc3R5bGU9e2hlYWRlclN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGVtZT1cImxpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJtZWRpdW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEljb249XCJjYW5jZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWhlYWRlci1jbG9zZWB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVDbG9zZSgpfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWhlYWRlci1kaXZpZGVyYH0gLz5cbiAgICAgICAgICAgICAgICAgICAgICB7aGVhZGVyQ29udGVudCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cHJlZml4fS1oZWFkZXItY29udGVudGB9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7aGVhZGVyQ29udGVudH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3ByZWZpeH0tYm9keWB9PntjaGlsZHJlbn08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvQ1NTTW90aW9uPlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgaWYgKCFoYXNFdmVyT3BlbmVkKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiA8UG9ydGFsIG9uQ2hpbGRyZW5Nb3VudD17aGFuZGxlQ2hpbGRyZW5Nb3VudH0+e2dldENvbXBvbmVudCgpfTwvUG9ydGFsPlxufVxuXG5EcmF3ZXIuZGlzcGxheU5hbWUgPSBcIkRyYXdlclwiXG5cbkRyYXdlci5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiDlhbPpl63lkI7vvIh0cmFuc2l0aW9uIOe7k+adn+WQju+8ieeahCBoYW5kbGVyXG4gICAqL1xuICBhZnRlckNsb3NlOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqXG4gICAqIHZpc2libGUg5pe26aG16Z2i6IO95ZCm5rua5YqoXG4gICAqL1xuICBib2R5U2Nyb2xsYWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gIC8qKlxuICAgKiDlrZDoioLngrlcbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgLyoqXG4gICAqIOmZhOWKoOexu+WQje+8jOazqOaEjyBEaWFsb2cg5omA5pyJ55qE5bGe5oCn5Lya6ZmE5Yqg5Yiw5YaF6YOo55qE5YaF5a655YWD57Sg5LiK77yM6ICM5LiN5piv5YyF5ZCrIG1hc2sg55qE5pyA5aSW5bGC5YWD57SgXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiDmmK/lkKbmr4/mrKEgdmlzaWJsZTogZmFsc2Ug6YO96ZSA5q+BIGRvbVxuICAgKi9cbiAgZGVzdHJveUFmdGVyQ2xvc2U6IFByb3BUeXBlcy5ib29sLFxuICAvKipcbiAgICog5piv5ZCm5pSv5oyBIEVTQyDlhbPpl61cbiAgICovXG4gIGVzY2FwZUtleUNsb3NhYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAqIGhlYWRlciDmoIfpopjmoI/lhoXpg6jnmoTlhoXlrrlcbiAgICovXG4gIGhlYWRlckNvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLFxuICAvKipcbiAgICog5a6M5YWo6Ieq5a6a5LmJIGhlYWRlciDnmoTlhoXlrrlcbiAgICovXG4gIGhlYWRlckVsZW1lbnQ6IFByb3BUeXBlcy5ub2RlLFxuICAvKipcbiAgICog6K6+572uIGhlYWRlciDmoLflvI9cbiAgICovXG4gIGhlYWRlclN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKipcbiAgICogbWFzayDnmoTnsbvlkI1cbiAgICovXG4gIG1hc2tDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiDngrnlh7sgbWFzayDmmK/lkKbop6blj5EgY2FuY2VsIOS6i+S7tlxuICAgKi9cbiAgbWFza0Nsb3NhYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAqIG1hc2sg55qE5qC35byPXG4gICAqL1xuICBtYXNrU3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKlxuICAgKiDmmK/lkKbmmL7npLogbWFza1xuICAgKi9cbiAgbWFza1Zpc2libGU6IFByb3BUeXBlcy5ib29sLFxuICAvKipcbiAgICog5YWz6Zet5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uQ2xvc2U6IFByb3BUeXBlcy5mdW5jLFxuICAvKipcbiAgICog5L2N572uXG4gICAqL1xuICBwbGFjZW1lbnQ6IFByb3BUeXBlcy5vbmVPZihbXCJ0b3BcIiwgXCJyaWdodFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIl0pLFxuICAvKipcbiAgICog5bC65a+4XG4gICAqL1xuICBzaXplOiBQcm9wVHlwZXMub25lT2YoW1wibWluaVwiLCBcInNtYWxsXCIsIFwibWVkaXVtXCIsIFwibGFyZ2VcIl0pLFxuICAvKipcbiAgICog5aSW6YOo5o6n5Yi277ya5piv5ZCm5pi+56S6XG4gICAqL1xuICB2aXNpYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAqIOiuvue9riB6LWluZGV4IOWxgue6p++8jOm7mOiupOS4uiB2YXIoLS16LWluZGV4LWRpYWxvZylcbiAgICovXG4gIHpJbmRleDogUHJvcFR5cGVzLmFueSxcbn1cblxuRHJhd2VyLmRlZmF1bHRQcm9wcyA9IHtcbiAgYWZ0ZXJDbG9zZTogbnVsbCxcbiAgYm9keVNjcm9sbGFibGU6IHRydWUsXG4gIGNoaWxkcmVuOiBudWxsLFxuICBjbGFzc05hbWU6IHVuZGVmaW5lZCxcbiAgZGVzdHJveUFmdGVyQ2xvc2U6IGZhbHNlLFxuICBlc2NhcGVLZXlDbG9zYWJsZTogdHJ1ZSxcbiAgaGVhZGVyQ29udGVudDogbnVsbCxcbiAgaGVhZGVyRWxlbWVudDogdW5kZWZpbmVkLFxuICBoZWFkZXJTdHlsZToge30sXG4gIG1hc2tDbGFzc05hbWU6IHVuZGVmaW5lZCxcbiAgbWFza0Nsb3NhYmxlOiBmYWxzZSxcbiAgbWFza1N0eWxlOiB7fSxcbiAgbWFza1Zpc2libGU6IGZhbHNlLFxuICBtYXNrTW90aW9uTmFtZTogXCJcIixcbiAgZ2V0TW90aW9uTmFtZTogKCkgPT4gXCJcIixcbiAgb25DbG9zZTogbnVsbCxcbiAgcGxhY2VtZW50OiBcInJpZ2h0XCIsXG4gIHNpemU6IFwibWVkaXVtXCIsXG4gIHZpc2libGU6IGZhbHNlLFxuICB6SW5kZXg6IFwidmFyKC0tei1pbmRleC1kaWFsb2cpXCIsXG59XG5cbmV4cG9ydCBkZWZhdWx0IERyYXdlclxuIl0s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