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>

627 lines (523 loc) 77.5 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var React = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _getScrollBarSize = _interopRequireDefault(require("rc-util/lib/getScrollBarSize")); var _classnames = _interopRequireDefault(require("classnames")); var _rcMotion = _interopRequireDefault(require("rc-motion")); var _omit = _interopRequireDefault(require("../_util/omit")); var _portal = _interopRequireDefault(require("../portal")); var _button = _interopRequireDefault(require("../button")); var _icon = _interopRequireDefault(require("../icon")); require("./style"); var _excluded = ["bodyClassName", "bodyStyle", "children", "className", "destroyAfterClose", "footerClassName", "footerElement", "footerStyle", "headerClassName", "headerContent", "headerElement", "headerStyle", "maskClosable", "maskMotionName", "motionName", "steps", "style", "title", "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 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 _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } var prefix = "adui-dialog"; var motionTypes = { base: { animationName: "dialogUpIn", animationDuration: "var(--adui-motion-duration-base)", animationTimingFunction: "var(--adui-motion-ease-base)" }, bounce: { animationName: "dialogUpIn", animationDuration: "var(--adui-motion-duration-bounce)", animationTimingFunction: "var(--adui-motion-ease-bounce)" } }; var lastClickElement = null; var getClickElement = function getClickElement(e) { lastClickElement = e.target; }; if (document.documentElement) { document.documentElement.addEventListener("click", getClickElement, true); } var Dialog = function (_React$Component) { _inherits(Dialog, _React$Component); var _super = _createSuper(Dialog); function Dialog(_props) { var _this; _classCallCheck(this, Dialog); _this = _super.call(this, _props); _this.container = void 0; _this.bodyIsOverflowing = void 0; _this.scrollbarWidth = void 0; _this.dialog = void 0; _this.wrapper = void 0; _this.dialogRef = void 0; _this.isUnmounted = false; _this.saveDialog = function (node) { _this.dialog = node; }; _this.resetScrollbarPadding = function () { var changeBodyStyle = _this.props.changeBodyStyle; if (changeBodyStyle) { document.body.style.overflow = ""; document.body.style.paddingRight = ""; } }; _this.setScrollbarPadding = function () { var changeBodyStyle = _this.props.changeBodyStyle; if (changeBodyStyle) { var _window = window, innerWidth = _window.innerWidth; _this.bodyIsOverflowing = document.body.clientWidth < innerWidth; if (_this.bodyIsOverflowing && !document.body.style.paddingRight) { _this.scrollbarWidth = (0, _getScrollBarSize["default"])(); if (_this.scrollbarWidth !== undefined) { document.body.style.paddingRight = "".concat(_this.scrollbarWidth, "px"); } } document.body.style.overflow = "hidden"; } }; _this.getCancelButton = function () { var _this$props = _this.props, cancelProps = _this$props.cancelProps, cancelText = _this$props.cancelText, steps = _this$props.steps, type = _this$props.type; var currentStep = _this.state.currentStep; var defaultText = currentStep === 0 ? "取消" : "上一步"; var generateButton = function generateButton(props) { var text = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultText; return React.createElement(_button["default"], _extends({ key: "cancel", onClick: _this.handleCancel }, props), text); }; if (steps && steps.length) { var props = steps[currentStep].cancelProps; var text = steps[currentStep].cancelText; return generateButton(props, text); } if (type === "inform") { return null; } return generateButton(cancelProps, cancelText); }; _this.getConfirmButton = function () { var _this$props2 = _this.props, confirmProps = _this$props2.confirmProps, confirmText = _this$props2.confirmText, steps = _this$props2.steps; var currentStep = _this.state.currentStep; var generateButton = function generateButton(props, text) { return React.createElement(_button["default"], _extends({ key: "primary", intent: "primary", onClick: _this.handleConfirm }, props), text); }; if (steps && steps.length) { var props = steps[currentStep].confirmProps; var text = steps[currentStep].confirmText || (currentStep === steps.length - 1 ? "完成" : "下一步"); return generateButton(props, text); } return generateButton(confirmProps, confirmText || "确认"); }; _this.handleKeyDown = function (e) { var escapeKeyClosable = _this.props.escapeKeyClosable; if (escapeKeyClosable && e.key === "Escape") { e.stopPropagation(); _this.handleCancel(); } }; _this.handleCancel = function (type) { var _this$props3 = _this.props, onCancel = _this$props3.onCancel, steps = _this$props3.steps, visible = _this$props3.visible; var currentStep = _this.state.currentStep; if (type === "close" || !steps || !steps.length) { if (visible === null) { _this.setState({ visible: false }); } if (onCancel) { onCancel(); } } else { var onStepCancel = steps[currentStep].onCancel; if (onStepCancel) { onStepCancel(); } if (currentStep === 0) { if (visible === null) { _this.setState({ visible: false }); } } else { _this.setState({ currentStep: currentStep - 1 }); } } }; _this.handleConfirm = function () { var _this$props4 = _this.props, onConfirm = _this$props4.onConfirm, steps = _this$props4.steps, visible = _this$props4.visible; var currentStep = _this.state.currentStep; if (steps && steps.length) { var onStepConfirm = steps[currentStep].onConfirm; if (onStepConfirm) { onStepConfirm(); } if (currentStep === steps.length - 1) { if (visible === null) { _this.setState({ visible: false }); } } else { _this.setState({ currentStep: currentStep + 1 }); } } else { if (visible === null) { _this.setState({ visible: false }); } if (onConfirm) { onConfirm(); } } }; _this.onLeave = function () { var _this$props5 = _this.props, afterClose = _this$props5.afterClose, destroyAfterClose = _this$props5.destroyAfterClose; if (_this.wrapper) { _this.wrapper.style.display = "none"; } _this.resetScrollbarPadding(); if (afterClose) { afterClose(); } if (destroyAfterClose && !_this.isUnmounted) { _this.setState({ hasEverOpened: false }); } }; _this.handleEnterPrepare = function () { var intent = _this.props.intent; _this.dialogRef.style.animationName = ""; setTimeout(function () { var motionStyle = ["danger", "warning"].includes(intent) ? motionTypes.bounce : motionTypes.base; var styles = { animationName: motionStyle.animationName, animationDuration: motionStyle.animationDuration, animationTimingFunction: motionStyle.animationTimingFunction }; Object.assign(_this.dialogRef.style, styles); }, 0); }; _this.handleEnter = function () { var escapeKeyClosable = _this.props.escapeKeyClosable; if (_this.wrapper) { if (escapeKeyClosable) { _this.wrapper.focus(); } } }; _this.handleLeavePrepare = function () { var styles = { animationName: "dialogUpOut" }; if (lastClickElement && "className" in lastClickElement && typeof lastClickElement.className === "string") { if (lastClickElement.className.includes("adui-button-content")) { lastClickElement = lastClickElement.parentElement; } if (lastClickElement.tagName.toLowerCase() === "button" && lastClickElement.className.includes("adui-button-primary")) { styles.animationName = "dialogDownOut"; } } Object.assign(_this.dialogRef.style, styles); }; _this.getComponent = function (options) { var _this$props6 = _this.props, bodyClassName = _this$props6.bodyClassName, bodyStyle = _this$props6.bodyStyle, children = _this$props6.children, className = _this$props6.className, destroyAfterClose = _this$props6.destroyAfterClose, footerClassName = _this$props6.footerClassName, footerElement = _this$props6.footerElement, footerStyle = _this$props6.footerStyle, headerClassName = _this$props6.headerClassName, headerContent = _this$props6.headerContent, headerElement = _this$props6.headerElement, headerStyle = _this$props6.headerStyle, maskClosable = _this$props6.maskClosable, maskMotionName = _this$props6.maskMotionName, motionName = _this$props6.motionName, steps = _this$props6.steps, style = _this$props6.style, title = _this$props6.title, zIndexProp = _this$props6.zIndex, otherProps = _objectWithoutProperties(_this$props6, _excluded); var zIndex = zIndexProp; var restProps = (0, _omit["default"])(otherProps, ["afterClose", "cancelProps", "cancelText", "changeBodyStyle", "confirmProps", "confirmText", "currentStep", "defaultCurrentStep", "defaultVisible", "escapeKeyClosable", "getContainer", "onCancel", "onConfirm", "type", "visible"]); var classSet = (0, _classnames["default"])(className, "".concat(prefix, "-inner")); var currentStep = _this.state.currentStep; var visible = _this.state.visible; if (options && Object.keys(options).includes("visible")) { ; visible = options.visible; } return React.createElement("div", { ref: _this.saveDialog }, React.createElement("div", { className: "".concat(prefix, "-wrapper"), ref: function ref(wrapper) { if (wrapper) { _this.wrapper = wrapper; } }, style: { display: visible ? "flex" : "", zIndex: zIndex }, tabIndex: 0, role: "none", onKeyDown: _this.handleKeyDown }, React.createElement(_rcMotion["default"], { motionName: maskMotionName || "".concat(prefix, "-mask"), visible: visible, removeOnLeave: destroyAfterClose }, function (_ref, ref) { var cls = _ref.className; return React.createElement("div", { ref: ref, className: (0, _classnames["default"])("".concat(prefix, "-mask"), cls), role: "none", onClick: function onClick() { if (maskClosable) { _this.handleCancel("close"); } } }); }), React.createElement(_rcMotion["default"], { onAppearPrepare: _this.handleEnterPrepare, onEnterPrepare: _this.handleEnterPrepare, onAppearStart: _this.handleEnter, onEnterStart: _this.handleEnter, onLeavePrepare: _this.handleLeavePrepare, onLeaveEnd: _this.onLeave, motionName: motionName || prefix, visible: visible, removeOnLeave: destroyAfterClose, ref: function ref(dialogRef) { if (dialogRef) { _this.dialogRef = dialogRef; } } }, function (_ref2, ref) { var cls = _ref2.className; return React.createElement("div", _extends({ ref: ref, className: (0, _classnames["default"])(classSet, cls), style: _objectSpread({ margin: "auto", zIndex: 1 }, style) }, restProps), headerElement === null ? null : headerElement || React.createElement("div", { className: "".concat(prefix, "-header ").concat(headerClassName), style: headerStyle }, [React.createElement("div", { key: 0, className: "".concat(prefix, "-title") }, title), React.createElement("div", { key: 1 }, headerContent && React.createElement("div", { className: "".concat(prefix, "-headerContent") }, headerContent)), React.createElement(_icon["default"], { key: 2, className: "".concat(prefix, "-close"), size: 24, icon: "cancel", onClick: function onClick() { return _this.handleCancel("close"); } })]), React.createElement("div", { className: "".concat(prefix, "-body ").concat(bodyClassName), style: bodyStyle }, steps && steps.length ? steps[currentStep].children : children), footerElement === null ? null : React.createElement("div", { className: "".concat(prefix, "-footer ").concat(footerClassName), style: footerStyle }, footerElement || [_this.getCancelButton(), _this.getConfirmButton()])); }))); }; _this.handleChildrenMount = function () { var visible = _this.state.visible; if (visible && _this.wrapper) { _this.setScrollbarPadding(); } }; _this.componentDidUpdate = function (_, _ref3) { var visiblePrev = _ref3.visible; var visible = _this.state.visible; if (visible !== visiblePrev && visible && _this.wrapper) { _this.setScrollbarPadding(); } }; _this.componentWillUnmount = function () { var visible = _this.state.visible; _this.isUnmounted = true; if (visible) { _this.resetScrollbarPadding(); } }; var _currentStep = _props.currentStep, defaultCurrentStep = _props.defaultCurrentStep, _visible = _props.visible, defaultVisible = _props.defaultVisible; var visibleState = _visible !== null ? !!_visible : !!defaultVisible; var currentStepState = _currentStep !== null ? _currentStep : defaultCurrentStep; _this.state = { visible: visibleState, currentStep: currentStepState || 0, hasEverOpened: visibleState }; return _this; } _createClass(Dialog, [{ key: "render", value: function render() { var getContainer = this.props.getContainer; var hasEverOpened = this.state.hasEverOpened; if (!hasEverOpened) { return null; } return React.createElement(_portal["default"], { onChildrenMount: this.handleChildrenMount, getContainer: getContainer }, this.getComponent()); } }]); return Dialog; }(React.Component); Dialog.propTypes = { afterClose: _propTypes["default"].func, bodyClassName: _propTypes["default"].string, bodyStyle: _propTypes["default"].object, cancelProps: _propTypes["default"].object, cancelText: _propTypes["default"].node, changeBodyStyle: _propTypes["default"].bool, children: _propTypes["default"].node, className: _propTypes["default"].string, confirmProps: _propTypes["default"].object, confirmText: _propTypes["default"].node, currentStep: _propTypes["default"].number, defaultCurrentStep: _propTypes["default"].number, defaultVisible: _propTypes["default"].bool, destroyAfterClose: _propTypes["default"].bool, escapeKeyClosable: _propTypes["default"].bool, footerElement: _propTypes["default"].node, footerClassName: _propTypes["default"].string, footerStyle: _propTypes["default"].object, getContainer: _propTypes["default"].func, headerContent: _propTypes["default"].node, headerElement: _propTypes["default"].node, headerClassName: _propTypes["default"].string, headerStyle: _propTypes["default"].object, maskClosable: _propTypes["default"].bool, maskMotionName: _propTypes["default"].string, motionName: _propTypes["default"].string, onCancel: _propTypes["default"].func, onConfirm: _propTypes["default"].func, style: _propTypes["default"].object, title: _propTypes["default"].node, type: _propTypes["default"].oneOf(["confirm", "inform"]), visible: _propTypes["default"].bool, zIndex: _propTypes["default"].any }; Dialog.defaultProps = { afterClose: null, bodyClassName: "", bodyStyle: {}, cancelProps: {}, cancelText: "取消", changeBodyStyle: true, children: null, className: undefined, confirmProps: {}, confirmText: "确认", currentStep: null, defaultCurrentStep: null, defaultVisible: null, destroyAfterClose: false, escapeKeyClosable: true, footerElement: undefined, footerClassName: "", footerStyle: {}, getContainer: undefined, headerContent: null, headerClassName: "", headerElement: undefined, headerStyle: {}, maskClosable: false, maskMotionName: "", motionName: "", onCancel: null, onConfirm: null, style: {}, title: null, type: "confirm", visible: null, zIndex: "var(--z-index-dialog)" }; Dialog.info = void 0; Dialog.success = void 0; Dialog.warning = void 0; Dialog.danger = void 0; Dialog.confirm = void 0; Dialog.inform = void 0; Dialog.getDerivedStateFromProps = function (_ref4, _ref5) { var currentStep = _ref4.currentStep, visible = _ref4.visible; var hasEverOpened = _ref5.hasEverOpened; var newState = {}; if (currentStep !== null) { newState.currentStep = currentStep; } if (visible !== null) { newState.visible = visible; if (!hasEverOpened && visible) { newState.hasEverOpened = true; } } return Object.keys(newState).length > 0 ? newState : null; }; var _default = Dialog; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwcmVmaXgiLCJtb3Rpb25UeXBlcyIsImJhc2UiLCJhbmltYXRpb25OYW1lIiwiYW5pbWF0aW9uRHVyYXRpb24iLCJhbmltYXRpb25UaW1pbmdGdW5jdGlvbiIsImJvdW5jZSIsImxhc3RDbGlja0VsZW1lbnQiLCJnZXRDbGlja0VsZW1lbnQiLCJlIiwidGFyZ2V0IiwiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwiRGlhbG9nIiwicHJvcHMiLCJjb250YWluZXIiLCJib2R5SXNPdmVyZmxvd2luZyIsInNjcm9sbGJhcldpZHRoIiwiZGlhbG9nIiwid3JhcHBlciIsImRpYWxvZ1JlZiIsImlzVW5tb3VudGVkIiwic2F2ZURpYWxvZyIsIm5vZGUiLCJyZXNldFNjcm9sbGJhclBhZGRpbmciLCJjaGFuZ2VCb2R5U3R5bGUiLCJib2R5Iiwic3R5bGUiLCJvdmVyZmxvdyIsInBhZGRpbmdSaWdodCIsInNldFNjcm9sbGJhclBhZGRpbmciLCJ3aW5kb3ciLCJpbm5lcldpZHRoIiwiY2xpZW50V2lkdGgiLCJnZXRTY3JvbGxCYXJTaXplIiwidW5kZWZpbmVkIiwiZ2V0Q2FuY2VsQnV0dG9uIiwiY2FuY2VsUHJvcHMiLCJjYW5jZWxUZXh0Iiwic3RlcHMiLCJ0eXBlIiwiY3VycmVudFN0ZXAiLCJzdGF0ZSIsImRlZmF1bHRUZXh0IiwiZ2VuZXJhdGVCdXR0b24iLCJ0ZXh0IiwiaGFuZGxlQ2FuY2VsIiwibGVuZ3RoIiwiZ2V0Q29uZmlybUJ1dHRvbiIsImNvbmZpcm1Qcm9wcyIsImNvbmZpcm1UZXh0IiwiaGFuZGxlQ29uZmlybSIsImhhbmRsZUtleURvd24iLCJlc2NhcGVLZXlDbG9zYWJsZSIsImtleSIsInN0b3BQcm9wYWdhdGlvbiIsIm9uQ2FuY2VsIiwidmlzaWJsZSIsInNldFN0YXRlIiwib25TdGVwQ2FuY2VsIiwib25Db25maXJtIiwib25TdGVwQ29uZmlybSIsIm9uTGVhdmUiLCJhZnRlckNsb3NlIiwiZGVzdHJveUFmdGVyQ2xvc2UiLCJkaXNwbGF5IiwiaGFzRXZlck9wZW5lZCIsImhhbmRsZUVudGVyUHJlcGFyZSIsImludGVudCIsInNldFRpbWVvdXQiLCJtb3Rpb25TdHlsZSIsImluY2x1ZGVzIiwic3R5bGVzIiwiT2JqZWN0IiwiYXNzaWduIiwiaGFuZGxlRW50ZXIiLCJmb2N1cyIsImhhbmRsZUxlYXZlUHJlcGFyZSIsImNsYXNzTmFtZSIsInBhcmVudEVsZW1lbnQiLCJ0YWdOYW1lIiwidG9Mb3dlckNhc2UiLCJnZXRDb21wb25lbnQiLCJvcHRpb25zIiwiYm9keUNsYXNzTmFtZSIsImJvZHlTdHlsZSIsImNoaWxkcmVuIiwiZm9vdGVyQ2xhc3NOYW1lIiwiZm9vdGVyRWxlbWVudCIsImZvb3RlclN0eWxlIiwiaGVhZGVyQ2xhc3NOYW1lIiwiaGVhZGVyQ29udGVudCIsImhlYWRlckVsZW1lbnQiLCJoZWFkZXJTdHlsZSIsIm1hc2tDbG9zYWJsZSIsIm1hc2tNb3Rpb25OYW1lIiwibW90aW9uTmFtZSIsInRpdGxlIiwiekluZGV4UHJvcCIsInpJbmRleCIsIm90aGVyUHJvcHMiLCJyZXN0UHJvcHMiLCJvbWl0IiwiY2xhc3NTZXQiLCJjbGFzc05hbWVzIiwia2V5cyIsInJlZiIsImNscyIsIm1hcmdpbiIsImhhbmRsZUNoaWxkcmVuTW91bnQiLCJjb21wb25lbnREaWRVcGRhdGUiLCJfIiwidmlzaWJsZVByZXYiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsImRlZmF1bHRDdXJyZW50U3RlcCIsImRlZmF1bHRWaXNpYmxlIiwidmlzaWJsZVN0YXRlIiwiY3VycmVudFN0ZXBTdGF0ZSIsImdldENvbnRhaW5lciIsIlJlYWN0IiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiZnVuYyIsInN0cmluZyIsIm9iamVjdCIsImJvb2wiLCJudW1iZXIiLCJvbmVPZiIsImFueSIsImRlZmF1bHRQcm9wcyIsImluZm8iLCJzdWNjZXNzIiwid2FybmluZyIsImRhbmdlciIsImNvbmZpcm0iLCJpbmZvcm0iLCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCJuZXdTdGF0ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL2NvbXBvbmVudHMvZGlhbG9nL0RpYWxvZy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIlxuaW1wb3J0IGdldFNjcm9sbEJhclNpemUgZnJvbSBcInJjLXV0aWwvbGliL2dldFNjcm9sbEJhclNpemVcIlxuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIlxuaW1wb3J0IENTU01vdGlvbiBmcm9tIFwicmMtbW90aW9uXCJcbmltcG9ydCBvbWl0IGZyb20gXCIuLi9fdXRpbC9vbWl0XCJcbmltcG9ydCBQb3J0YWwgZnJvbSBcIi4uL3BvcnRhbFwiXG5pbXBvcnQgQnV0dG9uLCB7IElCdXR0b25Qcm9wcyB9IGZyb20gXCIuLi9idXR0b25cIlxuaW1wb3J0IEljb24gZnJvbSBcIi4uL2ljb25cIlxuaW1wb3J0IFwiLi9zdHlsZVwiXG5cbmNvbnN0IHByZWZpeCA9IFwiYWR1aS1kaWFsb2dcIlxuXG5jb25zdCBtb3Rpb25UeXBlcyA9IHtcbiAgYmFzZToge1xuICAgIGFuaW1hdGlvbk5hbWU6IFwiZGlhbG9nVXBJblwiLFxuICAgIGFuaW1hdGlvbkR1cmF0aW9uOiBcInZhcigtLWFkdWktbW90aW9uLWR1cmF0aW9uLWJhc2UpXCIsXG4gICAgYW5pbWF0aW9uVGltaW5nRnVuY3Rpb246IFwidmFyKC0tYWR1aS1tb3Rpb24tZWFzZS1iYXNlKVwiLFxuICB9LFxuICBib3VuY2U6IHtcbiAgICBhbmltYXRpb25OYW1lOiBcImRpYWxvZ1VwSW5cIixcbiAgICBhbmltYXRpb25EdXJhdGlvbjogXCJ2YXIoLS1hZHVpLW1vdGlvbi1kdXJhdGlvbi1ib3VuY2UpXCIsXG4gICAgYW5pbWF0aW9uVGltaW5nRnVuY3Rpb246IFwidmFyKC0tYWR1aS1tb3Rpb24tZWFzZS1ib3VuY2UpXCIsXG4gIH0sXG59XG5cbmludGVyZmFjZSBJU3RlcFByb3BzIHtcbiAgLyoqXG4gICAqIOWPlua2iOaMiemSrueahCBwcm9wc++8jOWPguiAgyBCdXR0b24gUHJvcHNcbiAgICovXG4gIGNhbmNlbFByb3BzPzogUGFydGlhbDxJQnV0dG9uUHJvcHM+XG4gIC8qKlxuICAgKiDlj5bmtojmjInpkq7nmoQg5paH5a2XXG4gICAqL1xuICBjYW5jZWxUZXh0Pzogc3RyaW5nXG4gIC8qKlxuICAgKiDlrZDoioLngrlcbiAgICovXG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDnoa7orqTmjInpkq7nmoQgcHJvcHPvvIzlj4LogIMgQnV0dG9uIFByb3BzXG4gICAqL1xuICBjb25maXJtUHJvcHM/OiBQYXJ0aWFsPElCdXR0b25Qcm9wcz5cbiAgLyoqXG4gICAqIOehruiupOaMiemSrueahCDmloflrZdcbiAgICovXG4gIGNvbmZpcm1UZXh0Pzogc3RyaW5nXG4gIC8qKlxuICAgKiDngrnlh7vlj5bmtojmjInpkq7jgIHlj7PkuIrop5LlhbPpl63ml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25DYW5jZWw/OiAoKCkgPT4gdm9pZCkgfCBudWxsXG4gIC8qKlxuICAgKiDngrnlh7vnoa7orqTmjInpkq7ml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25Db25maXJtPzogKCgpID0+IHZvaWQpIHwgbnVsbFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEaWFsb2dQcm9wcyBleHRlbmRzIElTdGVwUHJvcHMge1xuICBba2V5OiBzdHJpbmddOiBhbnlcbiAgLyoqXG4gICAqIOWFs+mXreWQju+8iHRyYW5zaXRpb24g57uT5p2f5ZCO77yJ55qEIGhhbmRsZXJcbiAgICovXG4gIGFmdGVyQ2xvc2U/OiAoKCkgPT4gdm9pZCkgfCBudWxsXG4gIC8qKlxuICAgKiDorr7nva4gYm9keSBjbGFzc05hbWVcbiAgICovXG4gIGJvZHlDbGFzc05hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOiuvue9riBib2R5IHN0eWxlXG4gICAqL1xuICBib2R5U3R5bGU/OiBSZWFjdC5DU1NQcm9wZXJ0aWVzXG4gIC8qKlxuICAgKiBkaWFsb2cg5omT5byA5ZKM5YWz6Zet5pe26YO95Lya5pu05pS5IGRvY3VtZW50LmJvZHkuc3R5bGXjgILlj6/ku6Xku6XmraQgcHJvcCDmjqfliLbmmK/lkKbkv67mlLnjgILkvb/nlKjlnLrmma/lpoLvvJrmta7lsYLlhoXlvLnlh7ogZGlhbG9nXG4gICAqL1xuICBjaGFuZ2VCb2R5U3R5bGU/OiBib29sZWFuXG4gIC8qKlxuICAgKiDpmYTliqDnsbvlkI3vvIzms6jmhI8gRGlhbG9nIOaJgOacieeahOWxnuaAp+S8mumZhOWKoOWIsOWGhemDqOeahOWGheWuueWFg+e0oOS4iu+8jOiAjOS4jeaYr+WMheWQqyBtYXNrIOeahOacgOWkluWxguWFg+e0oFxuICAgKi9cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiDmjIflrprlvZPliY3nmoQgc3RlcO+8jOS7heWcqOS9v+eUqCBzdGVwcyBwcm9wIOaXtuacieS9nOeUqFxuICAgKi9cbiAgY3VycmVudFN0ZXA/OiBudWxsIHwgbnVtYmVyXG4gIC8qKlxuICAgKiDmjIflrprpu5jorqTnmoTotbflp4sgc3RlcO+8jOS7heWcqOS9v+eUqCBzdGVwcyBwcm9wIOaXtuacieS9nOeUqFxuICAgKi9cbiAgZGVmYXVsdEN1cnJlbnRTdGVwPzogbnVsbCB8IG51bWJlclxuICAvKipcbiAgICog5YaF6YOo6amx5Yqo77ya5piv5ZCm6buY6K6k5pi+56S6XG4gICAqL1xuICBkZWZhdWx0VmlzaWJsZT86IG51bGwgfCBib29sZWFuXG4gIC8qKlxuICAgKiDmmK/lkKbmr4/mrKEgdmlzaWJsZTogZmFsc2Ug6YO96ZSA5q+BIGRvbVxuICAgKi9cbiAgZGVzdHJveUFmdGVyQ2xvc2U/OiBib29sZWFuXG4gIC8qKlxuICAgKiDmmK/lkKbmlK/mjIEgRVNDIOWFs+mXrVxuICAgKi9cbiAgZXNjYXBlS2V5Q2xvc2FibGU/OiBib29sZWFuXG4gIC8qKlxuICAgKiDlrozlhajoh6rlrprkuYkgZm9vdGVyIOeahOWGheWuue+8jOWmguaenOaDs+imgeaUueWPmCBmb290ZXIg54i257qn55qE5qC35byP77yM5L2/55SoIGZvb3RlclN0eWxlIFByb3BcbiAgICovXG4gIGZvb3RlckVsZW1lbnQ/OiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqXG4gICAqIOiuvue9riBmb290ZXIgY2xhc3NOYW1lXG4gICAqL1xuICBmb290ZXJDbGFzc05hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOiuvue9riBmb290ZXIgc3R5bGVcbiAgICovXG4gIGZvb3RlclN0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllc1xuICAvKipcbiAgICog5oyH5a6a5by55Ye65bGC55qE54i257qn77yM6buY6K6k5Li6IGRvY3VtZW50LmJvZHnvvIznsbvkvLzkuo4gVG9vbHRpcCDnmoQgZ2V0UG9wdXBDb250YWluZXJcbiAgICovXG4gIGdldENvbnRhaW5lcj86ICgpID0+IEhUTUxFbGVtZW50XG4gIC8qKlxuICAgKiBoZWFkZXIg5qCH6aKY5LiL55qE5YaF5a65XG4gICAqL1xuICBoZWFkZXJDb250ZW50PzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDlrozlhajoh6rlrprkuYkgaGVhZGVyIOeahOWGheWuuVxuICAgKi9cbiAgaGVhZGVyRWxlbWVudD86IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICog6K6+572uIGhlYWRlciBjbGFzc05hbWVcbiAgICovXG4gIGhlYWRlckNsYXNzTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICog6K6+572uIGhlYWRlciBzdHlsZVxuICAgKi9cbiAgaGVhZGVyU3R5bGU/OiBSZWFjdC5DU1NQcm9wZXJ0aWVzXG4gIC8qKlxuICAgKiDngrnlh7sgbWFzayDmmK/lkKbop6blj5EgY2FuY2VsIOS6i+S7tlxuICAgKi9cbiAgbWFza0Nsb3NhYmxlPzogYm9vbGVhblxuICAvKipcbiAgICog6K6+572uIG1hc2sg55qEIENTUyBNb3Rpb24gbmFtZVxuICAgKi9cbiAgbWFza01vdGlvbk5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOiuvue9riBkaWFsb2cg55qEIENTUyBNb3Rpb24gbmFtZVxuICAgKi9cbiAgbW90aW9uTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICog5oyH5a6a5q2l6aqk77yM55So5Lul5b+r5o235LiK5LiA5q2l44CB5LiL5LiA5q2l55qE6ZyA5rGC44CCXG4gICAqL1xuICBzdGVwcz86IEFycmF5PElTdGVwUHJvcHM+XG4gIC8qKlxuICAgKiDpmYTliqDmoLflvI/vvIzms6jmhI8gRGlhbG9nIOaJgOacieeahOWxnuaAp+S8mumZhOWKoOWIsOWGhemDqOeahOWGheWuueWFg+e0oOS4iu+8jOiAjOS4jeaYr+WMheWQqyBtYXNrIOeahOacgOWkluWxguWFg+e0oFxuICAgKi9cbiAgc3R5bGU/OiBSZWFjdC5DU1NQcm9wZXJ0aWVzXG4gIC8qKlxuICAgKiDlr7nor53moYbmoIfpophcbiAgICovXG4gIHRpdGxlPzogbnVsbCB8IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICogY29uZmlybSDkuLrlj5bmtojjgIHnoa7orqTmjInpkq7vvJtpbmZvcm0g5Li65Y+q5pyJ56Gu6K6k5oyJ6ZKuXG4gICAqL1xuICB0eXBlPzogXCJjb25maXJtXCIgfCBcImluZm9ybVwiXG4gIC8qKlxuICAgKiDlpJbpg6jmjqfliLbvvJrmmK/lkKbmmL7npLpcbiAgICovXG4gIHZpc2libGU/OiBudWxsIHwgYm9vbGVhblxuICAvKipcbiAgICog6K6+572uIHotaW5kZXgg5bGC57qn77yM6buY6K6k5Li6IHZhcigtLXotaW5kZXgtZGlhbG9nKVxuICAgKi9cbiAgekluZGV4PzogUmVhY3QuUmVhY3ROb2RlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpYWxvZ1N0YXRlIHtcbiAgdmlzaWJsZT86IGJvb2xlYW5cbiAgY3VycmVudFN0ZXA6IG51bWJlclxuICBoYXNFdmVyT3BlbmVkPzogYm9vbGVhblxufVxuXG5sZXQgbGFzdENsaWNrRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbFxuXG5jb25zdCBnZXRDbGlja0VsZW1lbnQgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICBsYXN0Q2xpY2tFbGVtZW50ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnRcbn1cblxuLy8g5Y+q5pyJ54K55Ye75LqL5Lu25pSv5oyB5LuO6byg5qCH5L2N572u5Yqo55S75bGV5byAXG5pZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZ2V0Q2xpY2tFbGVtZW50LCB0cnVlKVxufVxuXG4vKipcbiAqIOWvueivneahhueUqOS6juWFqOWxgOaAp+eahOWPjemmiO+8jOmAmuW4uOWIhuS4uuKAnOehruiupOaTjeS9nOKAneS4juKAnOWRiuefpeS/oeaBr+KAneOAglxuICog56Gu6K6k5pON5L2c55So5LqO6K+i6Zeu55So5oi34oCc5pON5L2c5piv5ZCm57un57ut6L+b6KGM77yf4oCd77yM5aaC5aSn6YOo5YiG55qE5LqM5qyh56Gu6K6k5Y+N6aaI44CC5ZGK55+l5L+h5oGv5YiZ55So5LqO55+l5Lya55So5oi35p+Q5Liq5Y+K5pe25Y+N6aaI77yM5aaC5L+h5oGv5o+Q5Lqk5oiQ5Yqf44CB5aSx6LSl562J44CCXG4gKi9cbmNsYXNzIERpYWxvZyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxJRGlhbG9nUHJvcHMsIElEaWFsb2dTdGF0ZT4ge1xuICBwdWJsaWMgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAvKipcbiAgICAgKiDlhbPpl63lkI7vvIh0cmFuc2l0aW9uIOe7k+adn+WQju+8ieeahCBoYW5kbGVyXG4gICAgICovXG4gICAgYWZ0ZXJDbG9zZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICog6K6+572uIGJvZHkgY2xhc3NOYW1lXG4gICAgICovXG4gICAgYm9keUNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAvKipcbiAgICAgKiDorr7nva4gYm9keSBzdHlsZVxuICAgICAqL1xuICAgIGJvZHlTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAvKipcbiAgICAgKiDlj5bmtojmjInpkq7nmoQgcHJvcHPvvIzlj4LogIMgQnV0dG9uIFByb3BzXG4gICAgICovXG4gICAgY2FuY2VsUHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgLyoqXG4gICAgICog5Y+W5raI5oyJ6ZKu55qEIOaWh+Wtl1xuICAgICAqL1xuICAgIGNhbmNlbFRleHQ6IFByb3BUeXBlcy5ub2RlLFxuICAgIC8qKlxuICAgICAqIGRpYWxvZyDmiZPlvIDlkozlhbPpl63ml7bpg73kvJrmm7TmlLkgZG9jdW1lbnQuYm9keS5zdHlsZeOAguWPr+S7peS7peatpCBwcm9wIOaOp+WItuaYr+WQpuS/ruaUueOAguS9v+eUqOWcuuaZr+Wmgu+8mua1ruWxguWGheW8ueWHuiBkaWFsb2dcbiAgICAgKi9cbiAgICBjaGFuZ2VCb2R5U3R5bGU6IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOWtkOiKgueCuVxuICAgICAqL1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgICAvKipcbiAgICAgKiDpmYTliqDnsbvlkI3vvIzms6jmhI8gRGlhbG9nIOaJgOacieeahOWxnuaAp+S8mumZhOWKoOWIsOWGhemDqOeahOWGheWuueWFg+e0oOS4iu+8jOiAjOS4jeaYr+WMheWQqyBtYXNrIOeahOacgOWkluWxguWFg+e0oFxuICAgICAqL1xuICAgIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAvKipcbiAgICAgKiDnoa7orqTmjInpkq7nmoQgcHJvcHPvvIzlj4LogIMgQnV0dG9uIFByb3BzXG4gICAgICovXG4gICAgY29uZmlybVByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIC8qKlxuICAgICAqIOehruiupOaMiemSrueahCDmloflrZdcbiAgICAgKi9cbiAgICBjb25maXJtVGV4dDogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICog5oyH5a6a5b2T5YmN55qEIHN0ZXDvvIzku4XlnKjkvb/nlKggc3RlcHMgcHJvcCDml7bmnInkvZznlKhcbiAgICAgKi9cbiAgICBjdXJyZW50U3RlcDogUHJvcFR5cGVzLm51bWJlcixcbiAgICAvKipcbiAgICAgKiDmjIflrprpu5jorqTnmoTotbflp4sgc3RlcO+8jOS7heWcqOS9v+eUqCBzdGVwcyBwcm9wIOaXtuacieS9nOeUqFxuICAgICAqL1xuICAgIGRlZmF1bHRDdXJyZW50U3RlcDogUHJvcFR5cGVzLm51bWJlcixcbiAgICAvKipcbiAgICAgKiDlhoXpg6jpqbHliqjvvJrmmK/lkKbpu5jorqTmmL7npLpcbiAgICAgKi9cbiAgICBkZWZhdWx0VmlzaWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgLyoqXG4gICAgICog5piv5ZCm5q+P5qyhIHZpc2libGU6IGZhbHNlIOmDvemUgOavgSBkb21cbiAgICAgKi9cbiAgICBkZXN0cm95QWZ0ZXJDbG9zZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgLyoqXG4gICAgICog5piv5ZCm5pSv5oyBIEVTQyDlhbPpl61cbiAgICAgKi9cbiAgICBlc2NhcGVLZXlDbG9zYWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgLyoqXG4gICAgICog5a6M5YWo6Ieq5a6a5LmJIGZvb3RlciDnmoTlhoXlrrnvvIzlpoLmnpzmg7PopoHmlLnlj5ggZm9vdGVyIOeItue6p+eahOagt+W8j++8jOS9v+eUqCBmb290ZXJTdHlsZSBQcm9wXG4gICAgICovXG4gICAgZm9vdGVyRWxlbWVudDogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICog6K6+572uIGZvb3RlciBjbGFzc05hbWVcbiAgICAgKi9cbiAgICBmb290ZXJDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgLyoqXG4gICAgICog6K6+572uIGZvb3RlciBzdHlsZVxuICAgICAqL1xuICAgIGZvb3RlclN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIC8qKlxuICAgICAqIOaMh+WumuW8ueWHuuWxgueahOeItue6p++8jOm7mOiupOS4uiBkb2N1bWVudC5ib2R577yM57G75Ly85LqOIFRvb2x0aXAg55qEIGdldFBvcHVwQ29udGFpbmVyXG4gICAgICovXG4gICAgZ2V0Q29udGFpbmVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiBoZWFkZXIg5qCH6aKY5LiL55qE5YaF5a65XG4gICAgICovXG4gICAgaGVhZGVyQ29udGVudDogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICog5a6M5YWo6Ieq5a6a5LmJIGhlYWRlciDnmoTlhoXlrrlcbiAgICAgKi9cbiAgICBoZWFkZXJFbGVtZW50OiBQcm9wVHlwZXMubm9kZSxcbiAgICAvKipcbiAgICAgKiDorr7nva4gaGVhZGVyIGNsYXNzTmFtZVxuICAgICAqL1xuICAgIGhlYWRlckNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAvKipcbiAgICAgKiDorr7nva4gaGVhZGVyIHN0eWxlXG4gICAgICovXG4gICAgaGVhZGVyU3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgLyoqXG4gICAgICog54K55Ye7IG1hc2sg5piv5ZCm6Kem5Y+RIGNhbmNlbCDkuovku7ZcbiAgICAgKi9cbiAgICBtYXNrQ2xvc2FibGU6IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOiuvue9riBtYXNrIOeahCBDU1MgTW90aW9uIG5hbWVcbiAgICAgKi9cbiAgICBtYXNrTW90aW9uTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAvKipcbiAgICAgKiDorr7nva4gZGlhbG9nIOeahCBDU1MgTW90aW9uIG5hbWVcbiAgICAgKi9cbiAgICBtb3Rpb25OYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIOeCueWHu+WPlua2iOaMiemSruOAgeWPs+S4iuinkuWFs+mXreaXtueahCBoYW5kbGVyXG4gICAgICovXG4gICAgb25DYW5jZWw6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOeCueWHu+ehruiupOaMiemSruaXtueahCBoYW5kbGVyXG4gICAgICovXG4gICAgb25Db25maXJtOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiDpmYTliqDmoLflvI/vvIzms6jmhI8gRGlhbG9nIOaJgOacieeahOWxnuaAp+S8mumZhOWKoOWIsOWGhemDqOeahOWGheWuueWFg+e0oOS4iu+8jOiAjOS4jeaYr+WMheWQqyBtYXNrIOeahOacgOWkluWxguWFg+e0oFxuICAgICAqL1xuICAgIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIC8qKlxuICAgICAqIOWvueivneahhuagh+mimFxuICAgICAqL1xuICAgIHRpdGxlOiBQcm9wVHlwZXMubm9kZSxcbiAgICAvKipcbiAgICAgKiBjb25maXJtIOS4uuWPlua2iOOAgeehruiupOaMiemSru+8m2luZm9ybSDkuLrlj6rmnInnoa7orqTmjInpkq5cbiAgICAgKi9cbiAgICB0eXBlOiBQcm9wVHlwZXMub25lT2YoW1wiY29uZmlybVwiLCBcImluZm9ybVwiXSksXG4gICAgLyoqXG4gICAgICog5aSW6YOo5o6n5Yi277ya5piv5ZCm5pi+56S6XG4gICAgICovXG4gICAgdmlzaWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgLyoqXG4gICAgICog6K6+572uIHotaW5kZXgg5bGC57qn77yM6buY6K6k5Li6IHZhcigtLXotaW5kZXgtZGlhbG9nKVxuICAgICAqL1xuICAgIHpJbmRleDogUHJvcFR5cGVzLmFueSxcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZGVmYXVsdFByb3BzOiBJRGlhbG9nUHJvcHMgPSB7XG4gICAgYWZ0ZXJDbG9zZTogbnVsbCxcbiAgICBib2R5Q2xhc3NOYW1lOiBcIlwiLFxuICAgIGJvZHlTdHlsZToge30sXG4gICAgY2FuY2VsUHJvcHM6IHt9LFxuICAgIGNhbmNlbFRleHQ6IFwi5Y+W5raIXCIsXG4gICAgY2hhbmdlQm9keVN0eWxlOiB0cnVlLFxuICAgIGNoaWxkcmVuOiBudWxsLFxuICAgIGNsYXNzTmFtZTogdW5kZWZpbmVkLFxuICAgIGNvbmZpcm1Qcm9wczoge30sXG4gICAgY29uZmlybVRleHQ6IFwi56Gu6K6kXCIsXG4gICAgY3VycmVudFN0ZXA6IG51bGwsXG4gICAgZGVmYXVsdEN1cnJlbnRTdGVwOiBudWxsLFxuICAgIGRlZmF1bHRWaXNpYmxlOiBudWxsLFxuICAgIGRlc3Ryb3lBZnRlckNsb3NlOiBmYWxzZSxcbiAgICBlc2NhcGVLZXlDbG9zYWJsZTogdHJ1ZSxcbiAgICBmb290ZXJFbGVtZW50OiB1bmRlZmluZWQsXG4gICAgZm9vdGVyQ2xhc3NOYW1lOiBcIlwiLFxuICAgIGZvb3RlclN0eWxlOiB7fSxcbiAgICBnZXRDb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBoZWFkZXJDb250ZW50OiBudWxsLFxuICAgIGhlYWRlckNsYXNzTmFtZTogXCJcIixcbiAgICBoZWFkZXJFbGVtZW50OiB1bmRlZmluZWQsXG4gICAgaGVhZGVyU3R5bGU6IHt9LFxuICAgIG1hc2tDbG9zYWJsZTogZmFsc2UsXG4gICAgbWFza01vdGlvbk5hbWU6IFwiXCIsXG4gICAgbW90aW9uTmFtZTogXCJcIixcbiAgICBvbkNhbmNlbDogbnVsbCxcbiAgICBvbkNvbmZpcm06IG51bGwsXG4gICAgc3R5bGU6IHt9LFxuICAgIHRpdGxlOiBudWxsLFxuICAgIHR5cGU6IFwiY29uZmlybVwiLFxuICAgIHZpc2libGU6IG51bGwsXG4gICAgekluZGV4OiBcInZhcigtLXotaW5kZXgtZGlhbG9nKVwiLFxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpbmZvOiBhbnlcblxuICBwdWJsaWMgc3RhdGljIHN1Y2Nlc3M6IGFueVxuXG4gIHB1YmxpYyBzdGF0aWMgd2FybmluZzogYW55XG5cbiAgcHVibGljIHN0YXRpYyBkYW5nZXI6IGFueVxuXG4gIHB1YmxpYyBzdGF0aWMgY29uZmlybTogYW55XG5cbiAgcHVibGljIHN0YXRpYyBpbmZvcm06IGFueVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gKFxuICAgIHsgY3VycmVudFN0ZXAsIHZpc2libGUgfTogSURpYWxvZ1Byb3BzLFxuICAgIHsgaGFzRXZlck9wZW5lZCB9OiBJRGlhbG9nU3RhdGVcbiAgKSA9PiB7XG4gICAgY29uc3QgbmV3U3RhdGU6IFBhcnRpYWw8SURpYWxvZ1N0YXRlPiA9IHt9XG4gICAgaWYgKGN1cnJlbnRTdGVwICE9PSBudWxsKSB7XG4gICAgICBuZXdTdGF0ZS5jdXJyZW50U3RlcCA9IGN1cnJlbnRTdGVwXG4gICAgfVxuICAgIGlmICh2aXNpYmxlICE9PSBudWxsKSB7XG4gICAgICBuZXdTdGF0ZS52aXNpYmxlID0gdmlzaWJsZVxuICAgICAgaWYgKCFoYXNFdmVyT3BlbmVkICYmIHZpc2libGUpIHtcbiAgICAgICAgbmV3U3RhdGUuaGFzRXZlck9wZW5lZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG5ld1N0YXRlKS5sZW5ndGggPiAwID8gbmV3U3RhdGUgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICog5L+d5a2Y6IqC54K55oyC6L2955qE5a+56LGhXG4gICAqL1xuICBwdWJsaWMgY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCB8IG51bGxcblxuICAvKipcbiAgICog5L+d5a2Y6aG16Z2i5piv5ZCmIG92ZXJmbG93XG4gICAqL1xuICBwdWJsaWMgYm9keUlzT3ZlcmZsb3dpbmc6IGJvb2xlYW5cblxuICAvKipcbiAgICog5L+d5a2Y5b2T5YmN5rWP6KeI5Zmo55qE5rua5Yqo5p2h5a695bqmXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsYmFyV2lkdGg6IG51bWJlclxuXG4gIHB1YmxpYyBkaWFsb2c6IEhUTUxEaXZFbGVtZW50XG5cbiAgcHVibGljIHdyYXBwZXI6IEhUTUxEaXZFbGVtZW50XG5cbiAgcHVibGljIGRpYWxvZ1JlZjogSFRNTERpdkVsZW1lbnRcblxuICBwdWJsaWMgaXNVbm1vdW50ZWQ6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBJRGlhbG9nUHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICBjb25zdCB7IGN1cnJlbnRTdGVwLCBkZWZhdWx0Q3VycmVudFN0ZXAsIHZpc2libGUsIGRlZmF1bHRWaXNpYmxlIH0gPSBwcm9wc1xuICAgIGNvbnN0IHZpc2libGVTdGF0ZSA9IHZpc2libGUgIT09IG51bGwgPyAhIXZpc2libGUgOiAhIWRlZmF1bHRWaXNpYmxlXG4gICAgY29uc3QgY3VycmVudFN0ZXBTdGF0ZSA9XG4gICAgICBjdXJyZW50U3RlcCAhPT0gbnVsbCA/IGN1cnJlbnRTdGVwIDogZGVmYXVsdEN1cnJlbnRTdGVwXG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgdmlzaWJsZTogdmlzaWJsZVN0YXRlLFxuICAgICAgY3VycmVudFN0ZXA6IGN1cnJlbnRTdGVwU3RhdGUgfHwgMCxcbiAgICAgIGhhc0V2ZXJPcGVuZWQ6IHZpc2libGVTdGF0ZSxcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2F2ZURpYWxvZyA9IChub2RlOiBIVE1MRGl2RWxlbWVudCkgPT4ge1xuICAgIHRoaXMuZGlhbG9nID0gbm9kZVxuICB9XG5cbiAgcHVibGljIHJlc2V0U2Nyb2xsYmFyUGFkZGluZyA9ICgpID0+IHtcbiAgICBjb25zdCB7IGNoYW5nZUJvZHlTdHlsZSB9ID0gdGhpcy5wcm9wc1xuICAgIGlmIChjaGFuZ2VCb2R5U3R5bGUpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSBcIlwiXG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IFwiXCJcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0U2Nyb2xsYmFyUGFkZGluZyA9ICgpID0+IHtcbiAgICBjb25zdCB7IGNoYW5nZUJvZHlTdHlsZSB9ID0gdGhpcy5wcm9wc1xuICAgIGlmIChjaGFuZ2VCb2R5U3R5bGUpIHtcbiAgICAgIGNvbnN0IHsgaW5uZXJXaWR0aCB9ID0gd2luZG93XG4gICAgICB0aGlzLmJvZHlJc092ZXJmbG93aW5nID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCA8IGlubmVyV2lkdGhcbiAgICAgIGlmICh0aGlzLmJvZHlJc092ZXJmbG93aW5nICYmICFkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCkge1xuICAgICAgICB0aGlzLnNjcm9sbGJhcldpZHRoID0gZ2V0U2Nyb2xsQmFyU2l6ZSgpXG4gICAgICAgIGlmICh0aGlzLnNjcm9sbGJhcldpZHRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IGAke3RoaXMuc2Nyb2xsYmFyV2lkdGh9cHhgXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldENhbmNlbEJ1dHRvbiA9ICgpID0+IHtcbiAgICBjb25zdCB7IGNhbmNlbFByb3BzLCBjYW5jZWxUZXh0LCBzdGVwcywgdHlwZSB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgY3VycmVudFN0ZXAgfSA9IHRoaXMuc3RhdGVcbiAgICBjb25zdCBkZWZhdWx0VGV4dCA9IGN1cnJlbnRTdGVwID09PSAwID8gXCLlj5bmtohcIiA6IFwi5LiK5LiA5q2lXCJcbiAgICBjb25zdCBnZW5lcmF0ZUJ1dHRvbiA9IChwcm9wcz86IElCdXR0b25Qcm9wcywgdGV4dCA9IGRlZmF1bHRUZXh0KSA9PiAoXG4gICAgICA8QnV0dG9uIGtleT1cImNhbmNlbFwiIG9uQ2xpY2s9e3RoaXMuaGFuZGxlQ2FuY2VsfSB7Li4ucHJvcHN9PlxuICAgICAgICB7dGV4dH1cbiAgICAgIDwvQnV0dG9uPlxuICAgIClcblxuICAgIGlmIChzdGVwcyAmJiBzdGVwcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHByb3BzID0gc3RlcHNbY3VycmVudFN0ZXBdLmNhbmNlbFByb3BzXG4gICAgICBjb25zdCB0ZXh0ID0gc3RlcHNbY3VycmVudFN0ZXBdLmNhbmNlbFRleHRcbiAgICAgIHJldHVybiBnZW5lcmF0ZUJ1dHRvbihwcm9wcywgdGV4dClcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFwiaW5mb3JtXCIpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIHJldHVybiBnZW5lcmF0ZUJ1dHRvbihjYW5jZWxQcm9wcywgY2FuY2VsVGV4dClcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25maXJtQnV0dG9uID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgY29uZmlybVByb3BzLCBjb25maXJtVGV4dCwgc3RlcHMgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCB7IGN1cnJlbnRTdGVwIH0gPSB0aGlzLnN0YXRlXG4gICAgY29uc3QgZ2VuZXJhdGVCdXR0b24gPSAocHJvcHM/OiBJQnV0dG9uUHJvcHMsIHRleHQ/OiBzdHJpbmcpID0+IChcbiAgICAgIDxCdXR0b25cbiAgICAgICAga2V5PVwicHJpbWFyeVwiXG4gICAgICAgIGludGVudD1cInByaW1hcnlcIlxuICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZUNvbmZpcm19XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgID5cbiAgICAgICAge3RleHR9XG4gICAgICA8L0J1dHRvbj5cbiAgICApXG5cbiAgICBpZiAoc3RlcHMgJiYgc3RlcHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBwcm9wcyA9IHN0ZXBzW2N1cnJlbnRTdGVwXS5jb25maXJtUHJvcHNcbiAgICAgIGNvbnN0IHRleHQgPVxuICAgICAgICBzdGVwc1tjdXJyZW50U3RlcF0uY29uZmlybVRleHQgfHxcbiAgICAgICAgKGN1cnJlbnRTdGVwID09PSBzdGVwcy5sZW5ndGggLSAxID8gXCLlrozmiJBcIiA6IFwi5LiL5LiA5q2lXCIpXG4gICAgICByZXR1cm4gZ2VuZXJhdGVCdXR0b24ocHJvcHMsIHRleHQpXG4gICAgfVxuICAgIHJldHVybiBnZW5lcmF0ZUJ1dHRvbihjb25maXJtUHJvcHMsIGNvbmZpcm1UZXh0IHx8IFwi56Gu6K6kXCIpXG4gIH1cblxuICBwdWJsaWMgaGFuZGxlS2V5RG93biA9IChlOiBSZWFjdC5LZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgY29uc3QgeyBlc2NhcGVLZXlDbG9zYWJsZSB9ID0gdGhpcy5wcm9wc1xuICAgIGlmIChlc2NhcGVLZXlDbG9zYWJsZSAmJiBlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgdGhpcy5oYW5kbGVDYW5jZWwoKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDYW5jZWwgPSAodHlwZT86IGFueSkgPT4ge1xuICAgIGNvbnN0IHsgb25DYW5jZWwsIHN0ZXBzLCB2aXNpYmxlIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgeyBjdXJyZW50U3RlcCB9ID0gdGhpcy5zdGF0ZVxuICAgIGlmICh0eXBlID09PSBcImNsb3NlXCIgfHwgIXN0ZXBzIHx8ICFzdGVwcy5sZW5ndGgpIHtcbiAgICAgIGlmICh2aXNpYmxlID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2aXNpYmxlOiBmYWxzZSB9KVxuICAgICAgfVxuICAgICAgaWYgKG9uQ2FuY2VsKSB7XG4gICAgICAgIG9uQ2FuY2VsKClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyBvbkNhbmNlbDogb25TdGVwQ2FuY2VsIH0gPSBzdGVwc1tjdXJyZW50U3RlcF1cbiAgICAgIGlmIChvblN0ZXBDYW5jZWwpIHtcbiAgICAgICAgb25TdGVwQ2FuY2VsKClcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMCkge1xuICAgICAgICBpZiAodmlzaWJsZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2aXNpYmxlOiBmYWxzZSB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgY3VycmVudFN0ZXA6IGN1cnJlbnRTdGVwIC0gMSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDb25maXJtID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgb25Db25maXJtLCBzdGVwcywgdmlzaWJsZSB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgY3VycmVudFN0ZXAgfSA9IHRoaXMuc3RhdGVcbiAgICBpZiAoc3RlcHMgJiYgc3RlcHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB7IG9uQ29uZmlybTogb25TdGVwQ29uZmlybSB9ID0gc3RlcHNbY3VycmVudFN0ZXBdXG4gICAgICBpZiAob25TdGVwQ29uZmlybSkge1xuICAgICAgICBvblN0ZXBDb25maXJtKClcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50U3RlcCA9PT0gc3RlcHMubGVuZ3RoIC0gMSkge1xuICAgICAgICBpZiAodmlzaWJsZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2aXNpYmxlOiBmYWxzZSB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgY3VycmVudFN0ZXA6IGN1cnJlbnRTdGVwICsgMSB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodmlzaWJsZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmlzaWJsZTogZmFsc2UgfSlcbiAgICAgIH1cbiAgICAgIGlmIChvbkNvbmZpcm0pIHtcbiAgICAgICAgb25Db25maXJtKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25MZWF2ZSA9ICgpID0+IHtcbiAgICBjb25zdCB7IGFmdGVyQ2xvc2UsIGRlc3Ryb3lBZnRlckNsb3NlIH0gPSB0aGlzLnByb3BzXG4gICAgaWYgKHRoaXMud3JhcHBlcikge1xuICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxuICAgIH1cbiAgICB0aGlzLnJlc2V0U2Nyb2xsYmFyUGFkZGluZygpXG5cbiAgICBpZiAoYWZ0ZXJDbG9zZSkge1xuICAgICAgYWZ0ZXJDbG9zZSgpXG4gICAgfVxuXG4gICAgaWYgKGRlc3Ryb3lBZnRlckNsb3NlICYmICF0aGlzLmlzVW5tb3VudGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgaGFzRXZlck9wZW5lZDogZmFsc2UgfSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRW50ZXJQcmVwYXJlID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgaW50ZW50IH0gPSB0aGlzLnByb3BzXG4gICAgdGhpcy5kaWFsb2dSZWYuc3R5bGUuYW5pbWF0aW9uTmFtZSA9IFwiXCJcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgbW90aW9uU3R5bGUgPSBbXCJkYW5nZXJcIiwgXCJ3YXJuaW5nXCJdLmluY2x1ZGVzKGludGVudClcbiAgICAgICAgPyBtb3Rpb25UeXBlcy5ib3VuY2VcbiAgICAgICAgOiBtb3Rpb25UeXBlcy5iYXNlXG5cbiAgICAgIGNvbnN0IHN0eWxlcyA9IHtcbiAgICAgICAgYW5pbWF0aW9uTmFtZTogbW90aW9uU3R5bGUuYW5pbWF0aW9uTmFtZSxcbiAgICAgICAgYW5pbWF0aW9uRHVyYXRpb246IG1vdGlvblN0eWxlLmFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogbW90aW9uU3R5bGUuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb24sXG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5kaWFsb2dSZWYuc3R5bGUsIHN0eWxlcylcbiAgICB9LCAwKVxuICB9XG5cbiAgcHVibGljIGhhbmRsZUVudGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgZXNjYXBlS2V5Q2xvc2FibGUgfSA9IHRoaXMucHJvcHNcbiAgICBpZiAodGhpcy53cmFwcGVyKSB7XG4gICAgICBpZiAoZXNjYXBlS2V5Q2xvc2FibGUpIHtcbiAgICAgICAgdGhpcy53cmFwcGVyLmZvY3VzKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlTGVhdmVQcmVwYXJlID0gKCkgPT4ge1xuICAgIGNvbnN0IHN0eWxlcyA9IHtcbiAgICAgIGFuaW1hdGlvbk5hbWU6IFwiZGlhbG9nVXBPdXRcIixcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBsYXN0Q2xpY2tFbGVtZW50ICYmXG4gICAgICBcImNsYXNzTmFtZVwiIGluIGxhc3RDbGlja0VsZW1lbnQgJiZcbiAgICAgIHR5cGVvZiBsYXN0Q2xpY2tFbGVtZW50LmNsYXNzTmFtZSA9PT0gXCJzdHJpbmdcIlxuICAgICkge1xuICAgICAgaWYgKGxhc3RDbGlja0VsZW1lbnQuY2xhc3NOYW1lLmluY2x1ZGVzKFwiYWR1aS1idXR0b24tY29udGVudFwiKSkge1xuICAgICAgICBsYXN0Q2xpY2tFbGVtZW50ID0gbGFzdENsaWNrRWxlbWVudC5wYXJlbnRFbGVtZW50IGFzIEhUTUxCdXR0b25FbGVtZW50XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGxhc3RDbGlja0VsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImJ1dHRvblwiICYmXG4gICAgICAgIGxhc3RDbGlja0VsZW1lbnQuY2xhc3NOYW1lLmluY2x1ZGVzKFwiYWR1aS1idXR0b24tcHJpbWFyeVwiKVxuICAgICAgKSB7XG4gICAgICAgIHN0eWxlcy5hbmltYXRpb25OYW1lID0gXCJkaWFsb2dEb3duT3V0XCJcbiAgICAgIH1cbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLmRpYWxvZ1JlZi5zdHlsZSwgc3R5bGVzKVxuICB9XG5cbiAgcHVibGljIGdldENvbXBvbmVudCA9IChvcHRpb25zPzogeyB2aXNpYmxlOiBib29sZWFuIH0pID0+IHtcbiAgICBjb25