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>
463 lines (462 loc) • 78.9 kB
JavaScript
"use strict";
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
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 _channelsButton = _interopRequireDefault(require("../channels-button"));
var _icon = _interopRequireDefault(require("../icon"));
require("./style");
var _excluded = ["bodyClassName", "bodyStyle", "children", "className", "destroyAfterClose", "footerClassName", "footerElement", "footerStyle", "headerClassName", "headerContent", "headerElement", "headerStyle", "maskClosable", "steps", "style", "title", "zIndex"];
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }
function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
var prefix = "adui-channels-dialog";
var Dialog = function (_React$Component) {
function Dialog(_props) {
var _this;
_classCallCheck(this, Dialog);
_this = _callSuper(this, Dialog, [_props]);
_this.container = void 0;
_this.bodyIsOverflowing = void 0;
_this.scrollbarWidth = void 0;
_this.dialog = void 0;
_this.wrapper = 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(_channelsButton["default"], _extends({
key: "cancel",
theme: "light",
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(_channelsButton["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.handleEnter = function () {
var escapeKeyClosable = _this.props.escapeKeyClosable;
if (_this.wrapper) {
if (escapeKeyClosable) {
_this.wrapper.focus();
}
}
};
_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,
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: "".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"], {
onAppearStart: _this.handleEnter,
onEnterStart: _this.handleEnter,
onLeaveEnd: _this.onLeave,
motionName: prefix,
visible: visible,
removeOnLeave: destroyAfterClose
}, 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;
}
_inherits(Dialog, _React$Component);
return _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());
}
}]);
}(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,
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,
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 = exports["default"] = Dialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl9wcm9wVHlwZXMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2dldFNjcm9sbEJhclNpemUiLCJfY2xhc3NuYW1lcyIsIl9yY01vdGlvbiIsIl9vbWl0IiwiX3BvcnRhbCIsIl9jaGFubmVsc0J1dHRvbiIsIl9pY29uIiwiX2V4Y2x1ZGVkIiwiZSIsIl9fZXNNb2R1bGUiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJXZWFrTWFwIiwiciIsInQiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfdG9Qcm9wZXJ0eUtleSIsInZhbHVlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSIsInMiLCJpbmNsdWRlcyIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJiaW5kIiwiX2NsYXNzQ2FsbENoZWNrIiwiVHlwZUVycm9yIiwiX2RlZmluZVByb3BlcnRpZXMiLCJrZXkiLCJfY3JlYXRlQ2xhc3MiLCJwcm90b3R5cGUiLCJfdG9QcmltaXRpdmUiLCJTeW1ib2wiLCJ0b1ByaW1pdGl2ZSIsIlN0cmluZyIsIk51bWJlciIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJfYXNzZXJ0VGhpc0luaXRpYWxpemVkIiwiUmVmZXJlbmNlRXJyb3IiLCJCb29sZWFuIiwidmFsdWVPZiIsInNldFByb3RvdHlwZU9mIiwiZ2V0UHJvdG90eXBlT2YiLCJfaW5oZXJpdHMiLCJjcmVhdGUiLCJfc2V0UHJvdG90eXBlT2YiLCJwcmVmaXgiLCJEaWFsb2ciLCJfUmVhY3QkQ29tcG9uZW50IiwicHJvcHMiLCJfdGhpcyIsImNvbnRhaW5lciIsImJvZHlJc092ZXJmbG93aW5nIiwic2Nyb2xsYmFyV2lkdGgiLCJkaWFsb2ciLCJ3cmFwcGVyIiwiaXNVbm1vdW50ZWQiLCJzYXZlRGlhbG9nIiwibm9kZSIsInJlc2V0U2Nyb2xsYmFyUGFkZGluZyIsImNoYW5nZUJvZHlTdHlsZSIsImRvY3VtZW50IiwiYm9keSIsInN0eWxlIiwib3ZlcmZsb3ciLCJwYWRkaW5nUmlnaHQiLCJzZXRTY3JvbGxiYXJQYWRkaW5nIiwiX3dpbmRvdyIsIndpbmRvdyIsImlubmVyV2lkdGgiLCJjbGllbnRXaWR0aCIsImdldFNjcm9sbEJhclNpemUiLCJ1bmRlZmluZWQiLCJjb25jYXQiLCJnZXRDYW5jZWxCdXR0b24iLCJfdGhpcyRwcm9wcyIsImNhbmNlbFByb3BzIiwiY2FuY2VsVGV4dCIsInN0ZXBzIiwidHlwZSIsImN1cnJlbnRTdGVwIiwic3RhdGUiLCJkZWZhdWx0VGV4dCIsImdlbmVyYXRlQnV0dG9uIiwidGV4dCIsImNyZWF0ZUVsZW1lbnQiLCJ0aGVtZSIsIm9uQ2xpY2siLCJoYW5kbGVDYW5jZWwiLCJnZXRDb25maXJtQnV0dG9uIiwiX3RoaXMkcHJvcHMyIiwiY29uZmlybVByb3BzIiwiY29uZmlybVRleHQiLCJpbnRlbnQiLCJoYW5kbGVDb25maXJtIiwiaGFuZGxlS2V5RG93biIsImVzY2FwZUtleUNsb3NhYmxlIiwic3RvcFByb3BhZ2F0aW9uIiwiX3RoaXMkcHJvcHMzIiwib25DYW5jZWwiLCJ2aXNpYmxlIiwic2V0U3RhdGUiLCJvblN0ZXBDYW5jZWwiLCJfdGhpcyRwcm9wczQiLCJvbkNvbmZpcm0iLCJvblN0ZXBDb25maXJtIiwib25MZWF2ZSIsIl90aGlzJHByb3BzNSIsImFmdGVyQ2xvc2UiLCJkZXN0cm95QWZ0ZXJDbG9zZSIsImRpc3BsYXkiLCJoYXNFdmVyT3BlbmVkIiwiaGFuZGxlRW50ZXIiLCJmb2N1cyIsImdldENvbXBvbmVudCIsIm9wdGlvbnMiLCJfdGhpcyRwcm9wczYiLCJib2R5Q2xhc3NOYW1lIiwiYm9keVN0eWxlIiwiY2hpbGRyZW4iLCJjbGFzc05hbWUiLCJmb290ZXJDbGFzc05hbWUiLCJmb290ZXJFbGVtZW50IiwiZm9vdGVyU3R5bGUiLCJoZWFkZXJDbGFzc05hbWUiLCJoZWFkZXJDb250ZW50IiwiaGVhZGVyRWxlbWVudCIsImhlYWRlclN0eWxlIiwibWFza0Nsb3NhYmxlIiwidGl0bGUiLCJ6SW5kZXhQcm9wIiwiekluZGV4Iiwib3RoZXJQcm9wcyIsInJlc3RQcm9wcyIsIm9taXQiLCJjbGFzc1NldCIsImNsYXNzTmFtZXMiLCJyZWYiLCJ0YWJJbmRleCIsInJvbGUiLCJvbktleURvd24iLCJtb3Rpb25OYW1lIiwicmVtb3ZlT25MZWF2ZSIsIl9yZWYiLCJjbHMiLCJvbkFwcGVhclN0YXJ0Iiwib25FbnRlclN0YXJ0Iiwib25MZWF2ZUVuZCIsIl9yZWYyIiwibWFyZ2luIiwic2l6ZSIsImljb24iLCJoYW5kbGVDaGlsZHJlbk1vdW50IiwiY29tcG9uZW50RGlkVXBkYXRlIiwiXyIsIl9yZWYzIiwidmlzaWJsZVByZXYiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsImRlZmF1bHRDdXJyZW50U3RlcCIsImRlZmF1bHRWaXNpYmxlIiwidmlzaWJsZVN0YXRlIiwiY3VycmVudFN0ZXBTdGF0ZSIsInJlbmRlciIsImdldENvbnRhaW5lciIsIm9uQ2hpbGRyZW5Nb3VudCIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsImZ1bmMiLCJzdHJpbmciLCJvYmplY3QiLCJib29sIiwibnVtYmVyIiwib25lT2YiLCJhbnkiLCJkZWZhdWx0UHJvcHMiLCJpbmZvIiwic3VjY2VzcyIsIndhcm5pbmciLCJkYW5nZXIiLCJjb25maXJtIiwiaW5mb3JtIiwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIiwiX3JlZjQiLCJfcmVmNSIsIm5ld1N0YXRlIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vY29tcG9uZW50cy9jaGFubmVscy1kaWFsb2cvRGlhbG9nLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgZ2V0U2Nyb2xsQmFyU2l6ZSBmcm9tIFwicmMtdXRpbC9saWIvZ2V0U2Nyb2xsQmFyU2l6ZVwiXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiXG5pbXBvcnQgQ1NTTW90aW9uIGZyb20gXCJyYy1tb3Rpb25cIlxuaW1wb3J0IG9taXQgZnJvbSBcIi4uL191dGlsL29taXRcIlxuaW1wb3J0IFBvcnRhbCBmcm9tIFwiLi4vcG9ydGFsXCJcbmltcG9ydCBCdXR0b24sIHsgSUJ1dHRvblByb3BzIH0gZnJvbSBcIi4uL2NoYW5uZWxzLWJ1dHRvblwiXG5pbXBvcnQgSWNvbiBmcm9tIFwiLi4vaWNvblwiXG5pbXBvcnQgXCIuL3N0eWxlXCJcblxuY29uc3QgcHJlZml4ID0gXCJhZHVpLWNoYW5uZWxzLWRpYWxvZ1wiXG5cbmludGVyZmFjZSBJU3RlcFByb3BzIHtcbiAgLyoqXG4gICAqIOWPlua2iOaMiemSrueahCBwcm9wc++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+S7tlxuICAgKi9cbiAgbWFza0Nsb3NhYmxlPzogYm9vbGVhblxuICAvKipcbiAgICog5oyH5a6a5q2l6aqk77yM55So5Lul5b+r5o235LiK5LiA5q2l44CB5LiL5LiA5q2l55qE6ZyA5rGC44CCXG4gICAqL1xuICBzdGVwcz86IEFycmF5PElTdGVwUHJvcHM+XG4gIC8qKlxuICAgKiDpmYTliqDmoLflvI/vvIzms6jmhI8gRGlhbG9nIOaJgOacieeahOWxnuaAp+S8mumZhOWKoOWIsOWGhemDqOeahOWGheWuueWFg+e0oOS4iu+8jOiAjOS4jeaYr+WMheWQqyBtYXNrIOeahOacgOWkluWxguWFg+e0oFxuICAgKi9cbiAgc3R5bGU/OiBSZWFjdC5DU1NQcm9wZXJ0aWVzXG4gIC8qKlxuICAgKiDlr7nor53moYbmoIfpophcbiAgICovXG4gIHRpdGxlPzogbnVsbCB8IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICogY29uZmlybSDkuLrlj5bmtojjgIHnoa7orqTmjInpkq7vvJtpbmZvcm0g5Li65Y+q5pyJ56Gu6K6k5oyJ6ZKuXG4gICAqL1xuICB0eXBlPzogXCJjb25maXJtXCIgfCBcImluZm9ybVwiXG4gIC8qKlxuICAgKiDlpJbpg6jmjqfliLbvvJrmmK/lkKbmmL7npLpcbiAgICovXG4gIHZpc2libGU/OiBudWxsIHwgYm9vbGVhblxuICAvKipcbiAgICog6K6+572uIHotaW5kZXgg5bGC57qn77yM6buY6K6k5Li6IHZhcigtLXotaW5kZXgtZGlhbG9nKVxuICAgKi9cbiAgekluZGV4PzogUmVhY3QuUmVhY3ROb2RlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpYWxvZ1N0YXRlIHtcbiAgdmlzaWJsZT86IGJvb2xlYW5cbiAgY3VycmVudFN0ZXA6IG51bWJlclxuICBoYXNFdmVyT3BlbmVkPzogYm9vbGVhblxufVxuXG4vKipcbiAqIOWvueivneahhueUqOS6juWFqOWxgOaAp+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+RIGNhbmNlbCDkuovku7ZcbiAgICAgKi9cbiAgICBtYXNrQ2xvc2FibGU6IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOeCueWHu+WPlua2iOaMiemSruOAgeWPs+S4iuinkuWFs+mXreaXtueahCBoYW5kbGVyXG4gICAgICovXG4gICAgb25DYW5jZWw6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOeCueWHu+ehruiupOaMiemSruaXtueahCBoYW5kbGVyXG4gICAgICovXG4gICAgb25Db25maXJtOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiDpmYTliqDmoLflvI/vvIzms6jmhI8gRGlhbG9nIOaJgOacieeahOWxnuaAp+S8mumZhOWKoOWIsOWGhemDqOeahOWGheWuueWFg+e0oOS4iu+8jOiAjOS4jeaYr+WMheWQqyBtYXNrIOeahOacgOWkluWxguWFg+e0oFxuICAgICAqL1xuICAgIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIC8qKlxuICAgICAqIOWvueivneahhuagh+mimFxuICAgICAqL1xuICAgIHRpdGxlOiBQcm9wVHlwZXMubm9kZSxcbiAgICAvKipcbiAgICAgKiBjb25maXJtIOS4uuWPlua2iOOAgeehruiupOaMiemSru+8m2luZm9ybSDkuLrlj6rmnInnoa7orqTmjInpkq5cbiAgICAgKi9cbiAgICB0eXBlOiBQcm9wVHlwZXMub25lT2YoW1wiY29uZmlybVwiLCBcImluZm9ybVwiXSksXG4gICAgLyoqXG4gICAgICog5aSW6YOo5o6n5Yi277ya5piv5ZCm5pi+56S6XG4gICAgICovXG4gICAgdmlzaWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgLyoqXG4gICAgICog6K6+572uIHotaW5kZXgg5bGC57qn77yM6buY6K6k5Li6IHZhcigtLXotaW5kZXgtZGlhbG9nKVxuICAgICAqL1xuICAgIHpJbmRleDogUHJvcFR5cGVzLmFueSxcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZGVmYXVsdFByb3BzOiBJRGlhbG9nUHJvcHMgPSB7XG4gICAgYWZ0ZXJDbG9zZTogbnVsbCxcbiAgICBib2R5Q2xhc3NOYW1lOiBcIlwiLFxuICAgIGJvZHlTdHlsZToge30sXG4gICAgY2FuY2VsUHJvcHM6IHt9LFxuICAgIGNhbmNlbFRleHQ6IFwi5Y+W5raIXCIsXG4gICAgY2hhbmdlQm9keVN0eWxlOiB0cnVlLFxuICAgIGNoaWxkcmVuOiBudWxsLFxuICAgIGNsYXNzTmFtZTogdW5kZWZpbmVkLFxuICAgIGNvbmZpcm1Qcm9wczoge30sXG4gICAgY29uZmlybVRleHQ6IFwi56Gu6K6kXCIsXG4gICAgY3VycmVudFN0ZXA6IG51bGwsXG4gICAgZGVmYXVsdEN1cnJlbnRTdGVwOiBudWxsLFxuICAgIGRlZmF1bHRWaXNpYmxlOiBudWxsLFxuICAgIGRlc3Ryb3lBZnRlckNsb3NlOiBmYWxzZSxcbiAgICBlc2NhcGVLZXlDbG9zYWJsZTogdHJ1ZSxcbiAgICBmb290ZXJFbGVtZW50OiB1bmRlZmluZWQsXG4gICAgZm9vdGVyQ2xhc3NOYW1lOiBcIlwiLFxuICAgIGZvb3RlclN0eWxlOiB7fSxcbiAgICBnZXRDb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBoZWFkZXJDb250ZW50OiBudWxsLFxuICAgIGhlYWRlckNsYXNzTmFtZTogXCJcIixcbiAgICBoZWFkZXJFbGVtZW50OiB1bmRlZmluZWQsXG4gICAgaGVhZGVyU3R5bGU6IHt9LFxuICAgIG1hc2tDbG9zYWJsZTogZmFsc2UsXG4gICAgb25DYW5jZWw6IG51bGwsXG4gICAgb25Db25maXJtOiBudWxsLFxuICAgIHN0eWxlOiB7fSxcbiAgICB0aXRsZTogbnVsbCxcbiAgICB0eXBlOiBcImNvbmZpcm1cIixcbiAgICB2aXNpYmxlOiBudWxsLFxuICAgIHpJbmRleDogXCJ2YXIoLS16LWluZGV4LWRpYWxvZylcIixcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaW5mbzogYW55XG5cbiAgcHVibGljIHN0YXRpYyBzdWNjZXNzOiBhbnlcblxuICBwdWJsaWMgc3RhdGljIHdhcm5pbmc6IGFueVxuXG4gIHB1YmxpYyBzdGF0aWMgZGFuZ2VyOiBhbnlcblxuICBwdWJsaWMgc3RhdGljIGNvbmZpcm06IGFueVxuXG4gIHB1YmxpYyBzdGF0aWMgaW5mb3JtOiBhbnlcblxuICBwdWJsaWMgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IChcbiAgICB7IGN1cnJlbnRTdGVwLCB2aXNpYmxlIH06IElEaWFsb2dQcm9wcyxcbiAgICB7IGhhc0V2ZXJPcGVuZWQgfTogSURpYWxvZ1N0YXRlXG4gICkgPT4ge1xuICAgIGNvbnN0IG5ld1N0YXRlOiBQYXJ0aWFsPElEaWFsb2dTdGF0ZT4gPSB7fVxuICAgIGlmIChjdXJyZW50U3RlcCAhPT0gbnVsbCkge1xuICAgICAgbmV3U3RhdGUuY3VycmVudFN0ZXAgPSBjdXJyZW50U3RlcFxuICAgIH1cbiAgICBpZiAodmlzaWJsZSAhPT0gbnVsbCkge1xuICAgICAgbmV3U3RhdGUudmlzaWJsZSA9IHZpc2libGVcbiAgICAgIGlmICghaGFzRXZlck9wZW5lZCAmJiB2aXNpYmxlKSB7XG4gICAgICAgIG5ld1N0YXRlLmhhc0V2ZXJPcGVuZWQgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhuZXdTdGF0ZSkubGVuZ3RoID4gMCA/IG5ld1N0YXRlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIOS/neWtmOiKgueCueaMgui9veeahOWvueixoVxuICAgKi9cbiAgcHVibGljIGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsXG5cbiAgLyoqXG4gICAqIOS/neWtmOmhtemdouaYr+WQpiBvdmVyZmxvd1xuICAgKi9cbiAgcHVibGljIGJvZHlJc092ZXJmbG93aW5nOiBib29sZWFuXG5cbiAgLyoqXG4gICAqIOS/neWtmOW9k+WJjea1j+iniOWZqOeahOa7muWKqOadoeWuveW6plxuICAgKi9cbiAgcHVibGljIHNjcm9sbGJhcldpZHRoOiBudW1iZXJcblxuICBwdWJsaWMgZGlhbG9nOiBIVE1MRGl2RWxlbWVudFxuXG4gIHB1YmxpYyB3cmFwcGVyOiBIVE1MRGl2RWxlbWVudFxuXG4gIHB1YmxpYyBpc1VubW91bnRlZDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IElEaWFsb2dQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuICAgIGNvbnN0IHsgY3VycmVudFN0ZXAsIGRlZmF1bHRDdXJyZW50U3RlcCwgdmlzaWJsZSwgZGVmYXVsdFZpc2libGUgfSA9IHByb3BzXG4gICAgY29uc3QgdmlzaWJsZVN0YXRlID0gdmlzaWJsZSAhPT0gbnVsbCA/ICEhdmlzaWJsZSA6ICEhZGVmYXVsdFZpc2libGVcbiAgICBjb25zdCBjdXJyZW50U3RlcFN0YXRlID1cbiAgICAgIGN1cnJlbnRTdGVwICE9PSBudWxsID8gY3VycmVudFN0ZXAgOiBkZWZhdWx0Q3VycmVudFN0ZXBcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICB2aXNpYmxlOiB2aXNpYmxlU3RhdGUsXG4gICAgICBjdXJyZW50U3RlcDogY3VycmVudFN0ZXBTdGF0ZSB8fCAwLFxuICAgICAgaGFzRXZlck9wZW5lZDogdmlzaWJsZVN0YXRlLFxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzYXZlRGlhbG9nID0gKG5vZGU6IEhUTUxEaXZFbGVtZW50KSA9PiB7XG4gICAgdGhpcy5kaWFsb2cgPSBub2RlXG4gIH1cblxuICBwdWJsaWMgcmVzZXRTY3JvbGxiYXJQYWRkaW5nID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgY2hhbmdlQm9keVN0eWxlIH0gPSB0aGlzLnByb3BzXG4gICAgaWYgKGNoYW5nZUJvZHlTdHlsZSkge1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9IFwiXCJcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gXCJcIlxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRTY3JvbGxiYXJQYWRkaW5nID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgY2hhbmdlQm9keVN0eWxlIH0gPSB0aGlzLnByb3BzXG4gICAgaWYgKGNoYW5nZUJvZHlTdHlsZSkge1xuICAgICAgY29uc3QgeyBpbm5lcldpZHRoIH0gPSB3aW5kb3dcbiAgICAgIHRoaXMuYm9keUlzT3ZlcmZsb3dpbmcgPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDwgaW5uZXJXaWR0aFxuICAgICAgaWYgKHRoaXMuYm9keUlzT3ZlcmZsb3dpbmcgJiYgIWRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0KSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsYmFyV2lkdGggPSBnZXRTY3JvbGxCYXJTaXplKClcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsYmFyV2lkdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gYCR7dGhpcy5zY3JvbGxiYXJXaWR0aH1weGBcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCJcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2FuY2VsQnV0dG9uID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgY2FuY2VsUHJvcHMsIGNhbmNlbFRleHQsIHN0ZXBzLCB0eXBlIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgeyBjdXJyZW50U3RlcCB9ID0gdGhpcy5zdGF0ZVxuICAgIGNvbnN0IGRlZmF1bHRUZXh0ID0gY3VycmVudFN0ZXAgPT09IDAgPyBcIuWPlua2iFwiIDogXCLkuIrkuIDmraVcIlxuICAgIGNvbnN0IGdlbmVyYXRlQnV0dG9uID0gKHByb3BzPzogSUJ1dHRvblByb3BzLCB0ZXh0ID0gZGVmYXVsdFRleHQpID0+IChcbiAgICAgIDxCdXR0b24ga2V5PVwiY2FuY2VsXCIgdGhlbWU9XCJsaWdodFwiIG9uQ2xpY2s9e3RoaXMuaGFuZGxlQ2FuY2VsfSB7Li4ucHJvcHN9PlxuICAgICAgICB7dGV4dH1cbiAgICAgIDwvQnV0dG9uPlxuICAgIClcblxuICAgIGlmIChzdGVwcyAmJiBzdGVwcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHByb3BzID0gc3RlcHNbY3VycmVudFN0ZXBdLmNhbmNlbFByb3BzXG4gICAgICBjb25zdCB0ZXh0ID0gc3RlcHNbY3VycmVudFN0ZXBdLmNhbmNlbFRleHRcbiAgICAgIHJldHVybiBnZW5lcmF0ZUJ1dHRvbihwcm9wcywgdGV4dClcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFwiaW5mb3JtXCIpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIHJldHVybiBnZW5lcmF0ZUJ1dHRvbihjYW5jZWxQcm9wcywgY2FuY2VsVGV4dClcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25maXJtQnV0dG9uID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgY29uZmlybVByb3BzLCBjb25maXJtVGV4dCwgc3RlcHMgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCB7IGN1cnJlbnRTdGVwIH0gPSB0aGlzLnN0YXRlXG4gICAgY29uc3QgZ2VuZXJhdGVCdXR0b24gPSAocHJvcHM/OiBJQnV0dG9uUHJvcHMsIHRleHQ/OiBzdHJpbmcpID0+IChcbiAgICAgIDxCdXR0b25cbiAgICAgICAga2V5PVwicHJpbWFyeVwiXG4gICAgICAgIGludGVudD1cInByaW1hcnlcIlxuICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZUNvbmZpcm19XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgID5cbiAgICAgICAge3RleHR9XG4gICAgICA8L0J1dHRvbj5cbiAgICApXG5cbiAgICBpZiAoc3RlcHMgJiYgc3RlcHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBwcm9wcyA9IHN0ZXBzW2N1cnJlbnRTdGVwXS5jb25maXJtUHJvcHNcbiAgICAgIGNvbnN0IHRleHQgPVxuICAgICAgICBzdGVwc1tjdXJyZW50U3RlcF0uY29uZmlybVRleHQgfHxcbiAgICAgICAgKGN1cnJlbnRTdGVwID09PSBzdGVwcy5sZW5ndGggLSAxID8gXCLlrozmiJBcIiA6IFwi5LiL5LiA5q2lXCIpXG4gICAgICByZXR1cm4gZ2VuZXJhdGVCdXR0b24ocHJvcHMsIHRleHQpXG4gICAgfVxuICAgIHJldHVybiBnZW5lcmF0ZUJ1dHRvbihjb25maXJtUHJvcHMsIGNvbmZpcm1UZXh0IHx8IFwi56Gu6K6kXCIpXG4gIH1cblxuICBwdWJsaWMgaGFuZGxlS2V5RG93biA9IChlOiBSZWFjdC5LZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgY29uc3QgeyBlc2NhcGVLZXlDbG9zYWJsZSB9ID0gdGhpcy5wcm9wc1xuICAgIGlmIChlc2NhcGVLZXlDbG9zYWJsZSAmJiBlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgdGhpcy5oYW5kbGVDYW5jZWwoKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDYW5jZWwgPSAodHlwZT86IGFueSkgPT4ge1xuICAgIGNvbnN0IHsgb25DYW5jZWwsIHN0ZXBzLCB2aXNpYmxlIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgeyBjdXJyZW50U3RlcCB9ID0gdGhpcy5zdGF0ZVxuICAgIGlmICh0eXBlID09PSBcImNsb3NlXCIgfHwgIXN0ZXBzIHx8ICFzdGVwcy5sZW5ndGgpIHtcbiAgICAgIGlmICh2aXNpYmxlID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2aXNpYmxlOiBmYWxzZSB9KVxuICAgICAgfVxuICAgICAgaWYgKG9uQ2FuY2VsKSB7XG4gICAgICAgIG9uQ2FuY2VsKClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyBvbkNhbmNlbDogb25TdGVwQ2FuY2VsIH0gPSBzdGVwc1tjdXJyZW50U3RlcF1cbiAgICAgIGlmIChvblN0ZXBDYW5jZWwpIHtcbiAgICAgICAgb25TdGVwQ2FuY2VsKClcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMCkge1xuICAgICAgICBpZiAodmlzaWJsZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2aXNpYmxlOiBmYWxzZSB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgY3VycmVudFN0ZXA6IGN1cnJlbnRTdGVwIC0gMSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDb25maXJtID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgb25Db25maXJtLCBzdGVwcywgdmlzaWJsZSB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgY3VycmVudFN0ZXAgfSA9IHRoaXMuc3RhdGVcbiAgICBpZiAoc3RlcHMgJiYgc3RlcHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB7IG9uQ29uZmlybTogb25TdGVwQ29uZmlybSB9ID0gc3RlcHNbY3VycmVudFN0ZXBdXG4gICAgICBpZiAob25TdGVwQ29uZmlybSkge1xuICAgICAgICBvblN0ZXBDb25maXJtKClcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50U3RlcCA9PT0gc3RlcHMubGVuZ3RoIC0gMSkge1xuICAgICAgICBpZiAodmlzaWJsZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2aXNpYmxlOiBmYWxzZSB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgY3VycmVudFN0ZXA6IGN1cnJlbnRTdGVwICsgMSB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodmlzaWJsZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmlzaWJsZTogZmFsc2UgfSlcbiAgICAgIH1cbiAgICAgIGlmIChvbkNvbmZpcm0pIHtcbiAgICAgICAgb25Db25maXJtKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25MZWF2ZSA9ICgpID0+IHtcbiAgICBjb25zdCB7IGFmdGVyQ2xvc2UsIGRlc3Ryb3lBZnRlckNsb3NlIH0gPSB0aGlzLnByb3BzXG4gICAgaWYgKHRoaXMud3JhcHBlcikge1xuICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxuICAgIH1cbiAgICB0aGlzLnJlc2V0U2Nyb2xsYmFyUGFkZGluZygpXG5cbiAgICBpZiAoYWZ0ZXJDbG9zZSkge1xuICAgICAgYWZ0ZXJDbG9zZSgpXG4gICAgfVxuXG4gICAgaWYgKGRlc3Ryb3lBZnRlckNsb3NlICYmICF0aGlzLmlzVW5tb3VudGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgaGFzRXZlck9wZW5lZDogZmFsc2UgfSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRW50ZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBlc2NhcGVLZXlDbG9zYWJsZSB9ID0gdGhpcy5wcm9wc1xuICAgIGlmICh0aGlzLndyYXBwZXIpIHtcbiAgICAgIGlmIChlc2NhcGVLZXlDbG9zYWJsZSkge1xuICAgICAgICB0aGlzLndyYXBwZXIuZm9jdXMoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRDb21wb25lbnQgPSAob3B0aW9ucz86IHsgdmlzaWJsZTogYm9vbGVhbiB9KSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgYm9keUNsYXNzTmFtZSxcbiAgICAgIGJvZHlTdHlsZSxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgZGVzdHJveUFmdGVyQ2xvc2UsXG4gICAgICBmb290ZXJDbGFzc05hbWUsXG4gICAgICBmb290ZXJFbGVtZW50LFxuICAgICAgZm9vdGVyU3R5bGUsXG4gICAgICBoZWFkZXJDbGFzc05hbWUsXG4gICAgICBoZWFkZXJDb250ZW50LFxuICAgICAgaGVhZGVyRWxlbWVudCxcbiAgICAgIGhlYWRlclN0eWxlLFxuICAgICAgbWFza0Nsb3NhYmxlLFxuICAgICAgc3RlcHMsXG4gICAgICBzdHlsZSxcbiAgICAgIHRpdGxlLFxuICAgICAgekluZGV4OiB6SW5kZXhQcm9wLFxuICAgICAgLi4ub3RoZXJQcm9wc1xuICAgIH0gPSB0aGlzLnByb3BzXG5cbiAgICBjb25zdCB6SW5kZXggPSB6SW5kZXhQcm9wIGFzIFJlYWN0LkNTU1Byb3BlcnRpZXNbXCJ6SW5kZXhcIl1cblxuICAgIGNvbnN0IHJlc3RQcm9wcyA9IG9taXQob3RoZXJQcm9wcywgW1xuICAgICAgXCJhZnRlckNsb3NlXCIsXG4gICAgICBcImNhbmNlbFByb3BzXCIsXG4gICAgICBcImNhbmNlbFRleHRcIixcbiAgICAgIFwiY2hhbmdlQm9keVN0eWxlXCIsXG4gICAgICBcImNvbmZpcm1Qcm9wc1wiLFxuICAgICAgXCJjb25maXJtVGV4dFwiLFxuICAgICAgXCJjdXJyZW50U3RlcFwiLFxuICAgICAgXCJkZWZhdWx0Q3VycmVudFN0ZXBcIixcbiAgICAgIFwiZGVmYXVsdFZpc2libGVcIixcbiAgICAgIFwiZXNjYXBlS2V5Q2xvc2FibGVcIixcbiAgICAgIFwiZ2V0Q29udGFpbmVyXCIsXG4gICAgICBcIm9uQ2FuY2VsXCIsXG4gICAgICBcIm9uQ29uZmlybVwiLFxuICAgICAgXCJ0eXBlXCIsXG4gICAgICBcInZpc2libGVcIixcbiAgICBdKVxuXG4gICAgY29uc3QgY2xhc3NTZXQgPSBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYCR7cHJlZml4fS1pbm5lcmApXG4gICAgY29uc3QgeyBjdXJyZW50U3RlcCB9ID0gdGhpcy5zdGF0ZVxuICAgIGxldCB7IHZpc2libGUgfSA9IHRoaXMuc3RhdGVcbiAgICBpZiAob3B0aW9ucyAmJiBPYmplY3Qua2V5cyhvcHRpb25zKS5pbmNsdWRlcyhcInZpc2libGVcIikpIHtcbiAgICAgIDsoeyB2aXNpYmxlIH0gPSBvcHRpb25zKVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHJlZj17dGhpcy5zYXZlRGlhbG9nfT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT17YCR7cHJlZml4fS13cmFwcGVyYH1cbiAgICAgICAgICByZWY9eyh3cmFwcGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAod3JhcHBlcikge1xuICAgICAgICAgICAgICB0aGlzLndyYXBwZXIgPSB3cmFwcGVyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfX1cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZGlzcGxheTogdmlzaWJsZSA/IFwiZmxleFwiIDogXCJcIixcbiAgICAgICAgICAgIHpJbmRleCxcbiAgICAgICAgICB9fVxuICAgICAgICAgIHRhYkluZGV4PXswfVxuICAgICAgICAgIHJvbGU9XCJub25lXCJcbiAgICAgICAgICBvbktleURvd249e3RoaXMuaGFuZGxlS2V5RG93bn1cbiAgICAgICAgPlxuICAgICAgICAgIDxDU1NNb3Rpb25cbiAgICAgICAgICAgIG1vdGlvbk5hbWU9e2Ake3ByZWZpeH0tbWFza2B9XG4gICAgICAgICAgICB2aXNpYmxlPXt2aXNpYmxlfVxuICAgICAgICAgICAgcmVtb3ZlT25MZWF2ZT17ZGVzdHJveUFmdGVyQ2xvc2V9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgeyh7IGNsYXNzTmFtZTogY2xzIH0sIHJlZikgPT4gKFxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKGAke3ByZWZpeH0tbWFza2AsIGNscyl9XG4gICAgICAgICAgICAgICAgcm9sZT1cIm5vbmVcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChtYXNrQ2xvc2FibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDYW5jZWwoXCJjbG9zZVwiKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvQ1NTTW90aW9uPlxuICAgICAgICAgIHsvKipcbiAgICAgICAgICAgKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzM0NTUzNDJcbiAgICAgICAgICAgKiAxLiDmnIDlpJblsYIgbWFyZ2luOiBhdXRvIOmdnuW4uOmHjeimgeOAglxuICAgICAgICAgICAqIERpYWxvZyDnmoTlrr3luqbmmK/oh6rpgILlupTnmoTvvIzlm6DmraTkvb/nlKjkuoYgZGlzcGxheTogZmxleCDlpITnkIblsYXkuK3vvIzov5nkvb/lvpflrZDlhYPntKDlhbfmnInljIXoo7nmgKfvvIzlm6DmraTlrr3luqbmiY3og73nlLHlhoXlrrnmiYDlhrPlrprvvJtcbiAgICAgICAgICAgKiBtYXJnaW46IGF1dG87IOaYr+S4uuS6huWujOWWhCBmbGV4Ym94IG92ZXJmbG93IOeahOagt+W8j+OAglxuICAgICAgICAgICAqIDIuIHpJbmRleDogMSDmmK/kuLrkuobopobnm5blnKggbWFzayDkuIrjgIJcbiAgICAgICAgICAgKi99XG4gICAgICAgICAgPENTU01vdGlvblxuICAgICAgICAgICAgb25BcHBlYXJTdGFydD17dGhpcy5oYW5kbGVFbnRlcn1cbiAgICAgICAgICAgIG9uRW50ZXJTdGFydD17dGhpcy5oYW5kbGVFbnRlcn1cbiAgICAgICAgICAgIG9uTGVhdmVFbmQ9e3RoaXMub25MZWF2ZX1cbiAgICAgICAgICAgIG1vdGlvbk5hbWU9e3ByZWZpeH1cbiAgICAgICAgICAgIHZpc2libGU9e3Zpc2libGV9XG4gICAgICAgICAgICByZW1vdmVPbkxlYXZlPXtkZXN0cm95QWZ0ZXJDbG9zZX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7KHsgY2xhc3NOYW1lOiBjbHMgfSwgcmVmKSA9PiAoXG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICByZWY9e3JlZn1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoY2xhc3NTZXQsIGNscyl9XG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgIG1hcmdpbjogXCJhdXRvXCIsXG4gICAgICAgICAgICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgICAgICAgICAgICAuLi5zdHlsZSxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIHsuLi5yZXN0UHJvcHN9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7aGVhZGVyRWxlbWVudCA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICA6IGhlYWRlckVsZW1lbnQgfHwgKFxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7cHJlZml4fS1oZWFkZXIgJHtoZWFkZXJDbGFzc05hbWV9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXtoZWFkZXJTdHlsZX1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7W1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGtleT17MH0gY2xhc3NOYW1lPXtgJHtwcmVmaXh9LXRpdGxlYH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3RpdGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXsxfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aGVhZGVyQ29udGVudCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cHJlZml4fS1oZWFkZXJDb250ZW50YH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtoZWFkZXJDb250ZW50fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8SWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17Mn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ak