"use strict"; (self["webpackChunk_core_volunteer_app"] = self["webpackChunk_core_volunteer_app"] || []).push([["vendors-node_modules_rc-textarea_es_index_js-node_modules_rc-tooltip_es_index_js-node_modules-ae4019"],{ /***/ "../../../node_modules/rc-textarea/es/ResizableTextArea.js": /*!*****************************************************************!*\ !*** ../../../node_modules/rc-textarea/es/ResizableTextArea.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ "../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); /* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ "../../../node_modules/@babel/runtime/helpers/esm/typeof.js"); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ "../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var rc_resize_observer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! rc-resize-observer */ "../../../node_modules/rc-resize-observer/es/index.js"); /* harmony import */ var rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! rc-util/es/hooks/useLayoutEffect */ "../../../node_modules/rc-util/es/hooks/useLayoutEffect.js"); /* harmony import */ var rc_util_es_hooks_useMergedState__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! rc-util/es/hooks/useMergedState */ "../../../node_modules/rc-util/es/hooks/useMergedState.js"); /* harmony import */ var rc_util_es_raf__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! rc-util/es/raf */ "../../../node_modules/rc-util/es/raf.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_11__); /* harmony import */ var _calculateNodeHeight__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./calculateNodeHeight */ "../../../node_modules/rc-textarea/es/calculateNodeHeight.js"); var _excluded = ["prefixCls", "defaultValue", "value", "autoSize", "onResize", "className", "style", "disabled", "onChange", "onInternalAutoSize"]; var RESIZE_START = 0; var RESIZE_MEASURING = 1; var RESIZE_STABLE = 2; var ResizableTextArea = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11__.forwardRef(function (props, ref) { var _ref = props, prefixCls = _ref.prefixCls, defaultValue = _ref.defaultValue, value = _ref.value, autoSize = _ref.autoSize, onResize = _ref.onResize, className = _ref.className, style = _ref.style, disabled = _ref.disabled, onChange = _ref.onChange, onInternalAutoSize = _ref.onInternalAutoSize, restProps = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_5__["default"])(_ref, _excluded); // =============================== Value ================================ var _useMergedState = (0,rc_util_es_hooks_useMergedState__WEBPACK_IMPORTED_MODULE_9__["default"])(defaultValue, { value: value, postState: function postState(val) { return val !== null && val !== void 0 ? val : ''; } }), _useMergedState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_useMergedState, 2), mergedValue = _useMergedState2[0], setMergedValue = _useMergedState2[1]; var onInternalChange = function onInternalChange(event) { setMergedValue(event.target.value); onChange === null || onChange === void 0 || onChange(event); }; // ================================ Ref ================================= var textareaRef = react__WEBPACK_IMPORTED_MODULE_11__.useRef(); react__WEBPACK_IMPORTED_MODULE_11__.useImperativeHandle(ref, function () { return { textArea: textareaRef.current }; }); // ============================== AutoSize ============================== var _React$useMemo = react__WEBPACK_IMPORTED_MODULE_11__.useMemo(function () { if (autoSize && (0,_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_3__["default"])(autoSize) === 'object') { return [autoSize.minRows, autoSize.maxRows]; } return []; }, [autoSize]), _React$useMemo2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_React$useMemo, 2), minRows = _React$useMemo2[0], maxRows = _React$useMemo2[1]; var needAutoSize = !!autoSize; // =============================== Scroll =============================== // https://github.com/ant-design/ant-design/issues/21870 var fixFirefoxAutoScroll = function fixFirefoxAutoScroll() { try { // FF has bug with jump of scroll to top. We force back here. if (document.activeElement === textareaRef.current) { var _textareaRef$current = textareaRef.current, selectionStart = _textareaRef$current.selectionStart, selectionEnd = _textareaRef$current.selectionEnd, scrollTop = _textareaRef$current.scrollTop; // Fix Safari bug which not rollback when break line // This makes Chinese IME can't input. Do not fix this // const { value: tmpValue } = textareaRef.current; // textareaRef.current.value = ''; // textareaRef.current.value = tmpValue; textareaRef.current.setSelectionRange(selectionStart, selectionEnd); textareaRef.current.scrollTop = scrollTop; } } catch (e) { // Fix error in Chrome: // Failed to read the 'selectionStart' property from 'HTMLInputElement' // http://stackoverflow.com/q/21177489/3040605 } }; // =============================== Resize =============================== var _React$useState = react__WEBPACK_IMPORTED_MODULE_11__.useState(RESIZE_STABLE), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_React$useState, 2), resizeState = _React$useState2[0], setResizeState = _React$useState2[1]; var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_11__.useState(), _React$useState4 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_React$useState3, 2), autoSizeStyle = _React$useState4[0], setAutoSizeStyle = _React$useState4[1]; var startResize = function startResize() { setResizeState(RESIZE_START); if (false) {} }; // Change to trigger resize measure (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_8__["default"])(function () { if (needAutoSize) { startResize(); } }, [value, minRows, maxRows, needAutoSize]); (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_8__["default"])(function () { if (resizeState === RESIZE_START) { setResizeState(RESIZE_MEASURING); } else if (resizeState === RESIZE_MEASURING) { var textareaStyles = (0,_calculateNodeHeight__WEBPACK_IMPORTED_MODULE_12__["default"])(textareaRef.current, false, minRows, maxRows); // Safari has bug that text will keep break line on text cut when it's prev is break line. // ZombieJ: This not often happen. So we just skip it. // const { selectionStart, selectionEnd, scrollTop } = textareaRef.current; // const { value: tmpValue } = textareaRef.current; // textareaRef.current.value = ''; // textareaRef.current.value = tmpValue; // if (document.activeElement === textareaRef.current) { // textareaRef.current.scrollTop = scrollTop; // textareaRef.current.setSelectionRange(selectionStart, selectionEnd); // } setResizeState(RESIZE_STABLE); setAutoSizeStyle(textareaStyles); } else { fixFirefoxAutoScroll(); } }, [resizeState]); // We lock resize trigger by raf to avoid Safari warning var resizeRafRef = react__WEBPACK_IMPORTED_MODULE_11__.useRef(); var cleanRaf = function cleanRaf() { rc_util_es_raf__WEBPACK_IMPORTED_MODULE_10__["default"].cancel(resizeRafRef.current); }; var onInternalResize = function onInternalResize(size) { if (resizeState === RESIZE_STABLE) { onResize === null || onResize === void 0 || onResize(size); if (autoSize) { cleanRaf(); resizeRafRef.current = (0,rc_util_es_raf__WEBPACK_IMPORTED_MODULE_10__["default"])(function () { startResize(); }); } } }; react__WEBPACK_IMPORTED_MODULE_11__.useEffect(function () { return cleanRaf; }, []); // =============================== Render =============================== var mergedAutoSizeStyle = needAutoSize ? autoSizeStyle : null; var mergedStyle = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, style), mergedAutoSizeStyle); if (resizeState === RESIZE_START || resizeState === RESIZE_MEASURING) { mergedStyle.overflowY = 'hidden'; mergedStyle.overflowX = 'hidden'; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11__.createElement(rc_resize_observer__WEBPACK_IMPORTED_MODULE_7__["default"], { onResize: onInternalResize, disabled: !(autoSize || onResize) }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11__.createElement("textarea", (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, restProps, { ref: textareaRef, style: mergedStyle, className: classnames__WEBPACK_IMPORTED_MODULE_6___default()(prefixCls, className, (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({}, "".concat(prefixCls, "-disabled"), disabled)), disabled: disabled, value: mergedValue, onChange: onInternalChange }))); }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ResizableTextArea); /***/ }), /***/ "../../../node_modules/rc-textarea/es/TextArea.js": /*!********************************************************!*\ !*** ../../../node_modules/rc-textarea/es/TextArea.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ "../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); /* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/esm/toConsumableArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ "../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var rc_input__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! rc-input */ "../../../node_modules/rc-input/es/index.js"); /* harmony import */ var rc_input_es_hooks_useCount__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! rc-input/es/hooks/useCount */ "../../../node_modules/rc-input/es/hooks/useCount.js"); /* harmony import */ var rc_input_es_utils_commonUtils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! rc-input/es/utils/commonUtils */ "../../../node_modules/rc-input/es/utils/commonUtils.js"); /* harmony import */ var rc_util_es_hooks_useMergedState__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! rc-util/es/hooks/useMergedState */ "../../../node_modules/rc-util/es/hooks/useMergedState.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_11__); /* harmony import */ var _ResizableTextArea__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ResizableTextArea */ "../../../node_modules/rc-textarea/es/ResizableTextArea.js"); var _excluded = ["defaultValue", "value", "onFocus", "onBlur", "onChange", "allowClear", "maxLength", "onCompositionStart", "onCompositionEnd", "suffix", "prefixCls", "showCount", "count", "className", "style", "disabled", "hidden", "classNames", "styles", "onResize", "onClear", "onPressEnter", "readOnly", "autoSize", "onKeyDown"]; var TextArea = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11___default().forwardRef(function (_ref, ref) { var _countConfig$max; var defaultValue = _ref.defaultValue, customValue = _ref.value, onFocus = _ref.onFocus, onBlur = _ref.onBlur, onChange = _ref.onChange, allowClear = _ref.allowClear, maxLength = _ref.maxLength, onCompositionStart = _ref.onCompositionStart, onCompositionEnd = _ref.onCompositionEnd, suffix = _ref.suffix, _ref$prefixCls = _ref.prefixCls, prefixCls = _ref$prefixCls === void 0 ? 'rc-textarea' : _ref$prefixCls, showCount = _ref.showCount, count = _ref.count, className = _ref.className, style = _ref.style, disabled = _ref.disabled, hidden = _ref.hidden, classNames = _ref.classNames, styles = _ref.styles, onResize = _ref.onResize, onClear = _ref.onClear, onPressEnter = _ref.onPressEnter, readOnly = _ref.readOnly, autoSize = _ref.autoSize, onKeyDown = _ref.onKeyDown, rest = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_5__["default"])(_ref, _excluded); var _useMergedState = (0,rc_util_es_hooks_useMergedState__WEBPACK_IMPORTED_MODULE_10__["default"])(defaultValue, { value: customValue, defaultValue: defaultValue }), _useMergedState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_useMergedState, 2), value = _useMergedState2[0], setValue = _useMergedState2[1]; var formatValue = value === undefined || value === null ? '' : String(value); var _React$useState = react__WEBPACK_IMPORTED_MODULE_11___default().useState(false), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_React$useState, 2), focused = _React$useState2[0], setFocused = _React$useState2[1]; var compositionRef = react__WEBPACK_IMPORTED_MODULE_11___default().useRef(false); var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_11___default().useState(null), _React$useState4 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_React$useState3, 2), textareaResized = _React$useState4[0], setTextareaResized = _React$useState4[1]; // =============================== Ref ================================ var holderRef = (0,react__WEBPACK_IMPORTED_MODULE_11__.useRef)(null); var resizableTextAreaRef = (0,react__WEBPACK_IMPORTED_MODULE_11__.useRef)(null); var getTextArea = function getTextArea() { var _resizableTextAreaRef; return (_resizableTextAreaRef = resizableTextAreaRef.current) === null || _resizableTextAreaRef === void 0 ? void 0 : _resizableTextAreaRef.textArea; }; var focus = function focus() { getTextArea().focus(); }; (0,react__WEBPACK_IMPORTED_MODULE_11__.useImperativeHandle)(ref, function () { var _holderRef$current; return { resizableTextArea: resizableTextAreaRef.current, focus: focus, blur: function blur() { getTextArea().blur(); }, nativeElement: ((_holderRef$current = holderRef.current) === null || _holderRef$current === void 0 ? void 0 : _holderRef$current.nativeElement) || getTextArea() }; }); (0,react__WEBPACK_IMPORTED_MODULE_11__.useEffect)(function () { setFocused(function (prev) { return !disabled && prev; }); }, [disabled]); // =========================== Select Range =========================== var _React$useState5 = react__WEBPACK_IMPORTED_MODULE_11___default().useState(null), _React$useState6 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_React$useState5, 2), selection = _React$useState6[0], setSelection = _React$useState6[1]; react__WEBPACK_IMPORTED_MODULE_11___default().useEffect(function () { if (selection) { var _getTextArea; (_getTextArea = getTextArea()).setSelectionRange.apply(_getTextArea, (0,_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_3__["default"])(selection)); } }, [selection]); // ============================== Count =============================== var countConfig = (0,rc_input_es_hooks_useCount__WEBPACK_IMPORTED_MODULE_8__["default"])(count, showCount); var mergedMax = (_countConfig$max = countConfig.max) !== null && _countConfig$max !== void 0 ? _countConfig$max : maxLength; // Max length value var hasMaxLength = Number(mergedMax) > 0; var valueLength = countConfig.strategy(formatValue); var isOutOfRange = !!mergedMax && valueLength > mergedMax; // ============================== Change ============================== var triggerChange = function triggerChange(e, currentValue) { var cutValue = currentValue; if (!compositionRef.current && countConfig.exceedFormatter && countConfig.max && countConfig.strategy(currentValue) > countConfig.max) { cutValue = countConfig.exceedFormatter(currentValue, { max: countConfig.max }); if (currentValue !== cutValue) { setSelection([getTextArea().selectionStart || 0, getTextArea().selectionEnd || 0]); } } setValue(cutValue); (0,rc_input_es_utils_commonUtils__WEBPACK_IMPORTED_MODULE_9__.resolveOnChange)(e.currentTarget, e, onChange, cutValue); }; // =========================== Value Update =========================== var onInternalCompositionStart = function onInternalCompositionStart(e) { compositionRef.current = true; onCompositionStart === null || onCompositionStart === void 0 || onCompositionStart(e); }; var onInternalCompositionEnd = function onInternalCompositionEnd(e) { compositionRef.current = false; triggerChange(e, e.currentTarget.value); onCompositionEnd === null || onCompositionEnd === void 0 || onCompositionEnd(e); }; var onInternalChange = function onInternalChange(e) { triggerChange(e, e.target.value); }; var handleKeyDown = function handleKeyDown(e) { if (e.key === 'Enter' && onPressEnter) { onPressEnter(e); } onKeyDown === null || onKeyDown === void 0 || onKeyDown(e); }; var handleFocus = function handleFocus(e) { setFocused(true); onFocus === null || onFocus === void 0 || onFocus(e); }; var handleBlur = function handleBlur(e) { setFocused(false); onBlur === null || onBlur === void 0 || onBlur(e); }; // ============================== Reset =============================== var handleReset = function handleReset(e) { setValue(''); focus(); (0,rc_input_es_utils_commonUtils__WEBPACK_IMPORTED_MODULE_9__.resolveOnChange)(getTextArea(), e, onChange); }; var suffixNode = suffix; var dataCount; if (countConfig.show) { if (countConfig.showFormatter) { dataCount = countConfig.showFormatter({ value: formatValue, count: valueLength, maxLength: mergedMax }); } else { dataCount = "".concat(valueLength).concat(hasMaxLength ? " / ".concat(mergedMax) : ''); } suffixNode = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11___default().createElement((react__WEBPACK_IMPORTED_MODULE_11___default().Fragment), null, suffixNode, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11___default().createElement("span", { className: classnames__WEBPACK_IMPORTED_MODULE_6___default()("".concat(prefixCls, "-data-count"), classNames === null || classNames === void 0 ? void 0 : classNames.count), style: styles === null || styles === void 0 ? void 0 : styles.count }, dataCount)); } var handleResize = function handleResize(size) { var _getTextArea2; onResize === null || onResize === void 0 || onResize(size); if ((_getTextArea2 = getTextArea()) !== null && _getTextArea2 !== void 0 && _getTextArea2.style.height) { setTextareaResized(true); } }; var isPureTextArea = !autoSize && !showCount && !allowClear; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11___default().createElement(rc_input__WEBPACK_IMPORTED_MODULE_7__.BaseInput, { ref: holderRef, value: formatValue, allowClear: allowClear, handleReset: handleReset, suffix: suffixNode, prefixCls: prefixCls, classNames: (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, classNames), {}, { affixWrapper: classnames__WEBPACK_IMPORTED_MODULE_6___default()(classNames === null || classNames === void 0 ? void 0 : classNames.affixWrapper, (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({}, "".concat(prefixCls, "-show-count"), showCount), "".concat(prefixCls, "-textarea-allow-clear"), allowClear)) }), disabled: disabled, focused: focused, className: classnames__WEBPACK_IMPORTED_MODULE_6___default()(className, isOutOfRange && "".concat(prefixCls, "-out-of-range")), style: (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, style), textareaResized && !isPureTextArea ? { height: 'auto' } : {}), dataAttrs: { affixWrapper: { 'data-count': typeof dataCount === 'string' ? dataCount : undefined } }, hidden: hidden, readOnly: readOnly, onClear: onClear }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_ResizableTextArea__WEBPACK_IMPORTED_MODULE_12__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { autoSize: autoSize, maxLength: maxLength, onKeyDown: handleKeyDown, onChange: onInternalChange, onFocus: handleFocus, onBlur: handleBlur, onCompositionStart: onInternalCompositionStart, onCompositionEnd: onInternalCompositionEnd, className: classnames__WEBPACK_IMPORTED_MODULE_6___default()(classNames === null || classNames === void 0 ? void 0 : classNames.textarea), style: (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, styles === null || styles === void 0 ? void 0 : styles.textarea), {}, { resize: style === null || style === void 0 ? void 0 : style.resize }), disabled: disabled, prefixCls: prefixCls, onResize: handleResize, ref: resizableTextAreaRef, readOnly: readOnly }))); }); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TextArea); /***/ }), /***/ "../../../node_modules/rc-textarea/es/calculateNodeHeight.js": /*!*******************************************************************!*\ !*** ../../../node_modules/rc-textarea/es/calculateNodeHeight.js ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ calculateNodeStyling: () => (/* binding */ calculateNodeStyling), /* harmony export */ "default": () => (/* binding */ calculateAutoSizeStyle) /* harmony export */ }); // Thanks to https://github.com/andreypopp/react-textarea-autosize/ /** * calculateNodeHeight(uiTextNode, useCache = false) */ var HIDDEN_TEXTAREA_STYLE = "\n min-height:0 !important;\n max-height:none !important;\n height:0 !important;\n visibility:hidden !important;\n overflow:hidden !important;\n position:absolute !important;\n z-index:-1000 !important;\n top:0 !important;\n right:0 !important;\n pointer-events: none !important;\n"; var SIZING_STYLE = ['letter-spacing', 'line-height', 'padding-top', 'padding-bottom', 'font-family', 'font-weight', 'font-size', 'font-variant', 'text-rendering', 'text-transform', 'width', 'text-indent', 'padding-left', 'padding-right', 'border-width', 'box-sizing', 'word-break', 'white-space']; var computedStyleCache = {}; var hiddenTextarea; function calculateNodeStyling(node) { var useCache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var nodeRef = node.getAttribute('id') || node.getAttribute('data-reactid') || node.getAttribute('name'); if (useCache && computedStyleCache[nodeRef]) { return computedStyleCache[nodeRef]; } var style = window.getComputedStyle(node); var boxSizing = style.getPropertyValue('box-sizing') || style.getPropertyValue('-moz-box-sizing') || style.getPropertyValue('-webkit-box-sizing'); var paddingSize = parseFloat(style.getPropertyValue('padding-bottom')) + parseFloat(style.getPropertyValue('padding-top')); var borderSize = parseFloat(style.getPropertyValue('border-bottom-width')) + parseFloat(style.getPropertyValue('border-top-width')); var sizingStyle = SIZING_STYLE.map(function (name) { return "".concat(name, ":").concat(style.getPropertyValue(name)); }).join(';'); var nodeInfo = { sizingStyle: sizingStyle, paddingSize: paddingSize, borderSize: borderSize, boxSizing: boxSizing }; if (useCache && nodeRef) { computedStyleCache[nodeRef] = nodeInfo; } return nodeInfo; } function calculateAutoSizeStyle(uiTextNode) { var useCache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var minRows = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; var maxRows = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; if (!hiddenTextarea) { hiddenTextarea = document.createElement('textarea'); hiddenTextarea.setAttribute('tab-index', '-1'); hiddenTextarea.setAttribute('aria-hidden', 'true'); // fix: A form field element should have an id or name attribute // A form field element has neither an id nor a name attribute. This might prevent the browser from correctly autofilling the form. // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea hiddenTextarea.setAttribute('name', 'hiddenTextarea'); document.body.appendChild(hiddenTextarea); } // Fix wrap="off" issue // https://github.com/ant-design/ant-design/issues/6577 if (uiTextNode.getAttribute('wrap')) { hiddenTextarea.setAttribute('wrap', uiTextNode.getAttribute('wrap')); } else { hiddenTextarea.removeAttribute('wrap'); } // Copy all CSS properties that have an impact on the height of the content in // the textbox var _calculateNodeStyling = calculateNodeStyling(uiTextNode, useCache), paddingSize = _calculateNodeStyling.paddingSize, borderSize = _calculateNodeStyling.borderSize, boxSizing = _calculateNodeStyling.boxSizing, sizingStyle = _calculateNodeStyling.sizingStyle; // Need to have the overflow attribute to hide the scrollbar otherwise // text-lines will not calculated properly as the shadow will technically be // narrower for content hiddenTextarea.setAttribute('style', "".concat(sizingStyle, ";").concat(HIDDEN_TEXTAREA_STYLE)); hiddenTextarea.value = uiTextNode.value || uiTextNode.placeholder || ''; var minHeight = undefined; var maxHeight = undefined; var overflowY; var height = hiddenTextarea.scrollHeight; if (boxSizing === 'border-box') { // border-box: add border, since height = content + padding + border height += borderSize; } else if (boxSizing === 'content-box') { // remove padding, since height = content height -= paddingSize; } if (minRows !== null || maxRows !== null) { // measure height of a textarea with a single row hiddenTextarea.value = ' '; var singleRowHeight = hiddenTextarea.scrollHeight - paddingSize; if (minRows !== null) { minHeight = singleRowHeight * minRows; if (boxSizing === 'border-box') { minHeight = minHeight + paddingSize + borderSize; } height = Math.max(minHeight, height); } if (maxRows !== null) { maxHeight = singleRowHeight * maxRows; if (boxSizing === 'border-box') { maxHeight = maxHeight + paddingSize + borderSize; } overflowY = height > maxHeight ? '' : 'hidden'; height = Math.min(maxHeight, height); } } var style = { height: height, overflowY: overflowY, resize: 'none' }; if (minHeight) { style.minHeight = minHeight; } if (maxHeight) { style.maxHeight = maxHeight; } return style; } /***/ }), /***/ "../../../node_modules/rc-textarea/es/index.js": /*!*****************************************************!*\ !*** ../../../node_modules/rc-textarea/es/index.js ***! \*****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ResizableTextArea: () => (/* reexport safe */ _ResizableTextArea__WEBPACK_IMPORTED_MODULE_1__["default"]), /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _TextArea__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TextArea */ "../../../node_modules/rc-textarea/es/TextArea.js"); /* harmony import */ var _ResizableTextArea__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ResizableTextArea */ "../../../node_modules/rc-textarea/es/ResizableTextArea.js"); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_TextArea__WEBPACK_IMPORTED_MODULE_0__["default"]); /***/ }), /***/ "../../../node_modules/rc-tooltip/es/Popup.js": /*!****************************************************!*\ !*** ../../../node_modules/rc-tooltip/es/Popup.js ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ Popup) /* harmony export */ }); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); function Popup(props) { var children = props.children, prefixCls = props.prefixCls, id = props.id, innerStyle = props.overlayInnerStyle, bodyClassName = props.bodyClassName, className = props.className, style = props.style; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement("div", { className: classnames__WEBPACK_IMPORTED_MODULE_0___default()("".concat(prefixCls, "-content"), className), style: style }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement("div", { className: classnames__WEBPACK_IMPORTED_MODULE_0___default()("".concat(prefixCls, "-inner"), bodyClassName), id: id, role: "tooltip", style: innerStyle }, typeof children === 'function' ? children() : children)); } /***/ }), /***/ "../../../node_modules/rc-tooltip/es/Tooltip.js": /*!******************************************************!*\ !*** ../../../node_modules/rc-tooltip/es/Tooltip.js ***! \******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ "../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); /* harmony import */ var _rc_component_trigger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @rc-component/trigger */ "../../../node_modules/@rc-component/trigger/es/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _placements__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./placements */ "../../../node_modules/rc-tooltip/es/placements.js"); /* harmony import */ var _Popup__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Popup */ "../../../node_modules/rc-tooltip/es/Popup.js"); /* harmony import */ var rc_util_es_hooks_useId__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! rc-util/es/hooks/useId */ "../../../node_modules/rc-util/es/hooks/useId.js"); var _excluded = ["overlayClassName", "trigger", "mouseEnterDelay", "mouseLeaveDelay", "overlayStyle", "prefixCls", "children", "onVisibleChange", "afterVisibleChange", "transitionName", "animation", "motion", "placement", "align", "destroyTooltipOnHide", "defaultVisible", "getTooltipContainer", "overlayInnerStyle", "arrowContent", "overlay", "id", "showArrow", "classNames", "styles"]; var Tooltip = function Tooltip(props, ref) { var overlayClassName = props.overlayClassName, _props$trigger = props.trigger, trigger = _props$trigger === void 0 ? ['hover'] : _props$trigger, _props$mouseEnterDela = props.mouseEnterDelay, mouseEnterDelay = _props$mouseEnterDela === void 0 ? 0 : _props$mouseEnterDela, _props$mouseLeaveDela = props.mouseLeaveDelay, mouseLeaveDelay = _props$mouseLeaveDela === void 0 ? 0.1 : _props$mouseLeaveDela, overlayStyle = props.overlayStyle, _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? 'rc-tooltip' : _props$prefixCls, children = props.children, onVisibleChange = props.onVisibleChange, afterVisibleChange = props.afterVisibleChange, transitionName = props.transitionName, animation = props.animation, motion = props.motion, _props$placement = props.placement, placement = _props$placement === void 0 ? 'right' : _props$placement, _props$align = props.align, align = _props$align === void 0 ? {} : _props$align, _props$destroyTooltip = props.destroyTooltipOnHide, destroyTooltipOnHide = _props$destroyTooltip === void 0 ? false : _props$destroyTooltip, defaultVisible = props.defaultVisible, getTooltipContainer = props.getTooltipContainer, overlayInnerStyle = props.overlayInnerStyle, arrowContent = props.arrowContent, overlay = props.overlay, id = props.id, _props$showArrow = props.showArrow, showArrow = _props$showArrow === void 0 ? true : _props$showArrow, tooltipClassNames = props.classNames, tooltipStyles = props.styles, restProps = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__["default"])(props, _excluded); var mergedId = (0,rc_util_es_hooks_useId__WEBPACK_IMPORTED_MODULE_8__["default"])(id); var triggerRef = (0,react__WEBPACK_IMPORTED_MODULE_5__.useRef)(null); (0,react__WEBPACK_IMPORTED_MODULE_5__.useImperativeHandle)(ref, function () { return triggerRef.current; }); var extraProps = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])({}, restProps); if ('visible' in props) { extraProps.popupVisible = props.visible; } var getPopupElement = function getPopupElement() { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__.createElement(_Popup__WEBPACK_IMPORTED_MODULE_7__["default"], { key: "content", prefixCls: prefixCls, id: mergedId, bodyClassName: tooltipClassNames === null || tooltipClassNames === void 0 ? void 0 : tooltipClassNames.body, overlayInnerStyle: (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])({}, overlayInnerStyle), tooltipStyles === null || tooltipStyles === void 0 ? void 0 : tooltipStyles.body) }, overlay); }; var getChildren = function getChildren() { var child = react__WEBPACK_IMPORTED_MODULE_5__.Children.only(children); var originalProps = (child === null || child === void 0 ? void 0 : child.props) || {}; var childProps = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])({}, originalProps), {}, { 'aria-describedby': overlay ? mergedId : null }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__.cloneElement(children, childProps); }; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__.createElement(_rc_component_trigger__WEBPACK_IMPORTED_MODULE_3__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ popupClassName: classnames__WEBPACK_IMPORTED_MODULE_4___default()(overlayClassName, tooltipClassNames === null || tooltipClassNames === void 0 ? void 0 : tooltipClassNames.root), prefixCls: prefixCls, popup: getPopupElement, action: trigger, builtinPlacements: _placements__WEBPACK_IMPORTED_MODULE_6__.placements, popupPlacement: placement, ref: triggerRef, popupAlign: align, getPopupContainer: getTooltipContainer, onPopupVisibleChange: onVisibleChange, afterPopupVisibleChange: afterVisibleChange, popupTransitionName: transitionName, popupAnimation: animation, popupMotion: motion, defaultPopupVisible: defaultVisible, autoDestroy: destroyTooltipOnHide, mouseLeaveDelay: mouseLeaveDelay, popupStyle: (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])({}, overlayStyle), tooltipStyles === null || tooltipStyles === void 0 ? void 0 : tooltipStyles.root), mouseEnterDelay: mouseEnterDelay, arrow: showArrow }, extraProps), getChildren()); }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_5__.forwardRef)(Tooltip)); /***/ }), /***/ "../../../node_modules/rc-tooltip/es/index.js": /*!****************************************************!*\ !*** ../../../node_modules/rc-tooltip/es/index.js ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Popup: () => (/* reexport safe */ _Popup__WEBPACK_IMPORTED_MODULE_0__["default"]), /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _Popup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Popup */ "../../../node_modules/rc-tooltip/es/Popup.js"); /* harmony import */ var _Tooltip__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Tooltip */ "../../../node_modules/rc-tooltip/es/Tooltip.js"); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_Tooltip__WEBPACK_IMPORTED_MODULE_1__["default"]); /***/ }), /***/ "../../../node_modules/rc-tooltip/es/placements.js": /*!*********************************************************!*\ !*** ../../../node_modules/rc-tooltip/es/placements.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__), /* harmony export */ placements: () => (/* binding */ placements) /* harmony export */ }); var autoAdjustOverflowTopBottom = { shiftX: 64, adjustY: 1 }; var autoAdjustOverflowLeftRight = { adjustX: 1, shiftY: true }; var targetOffset = [0, 0]; var placements = { left: { points: ['cr', 'cl'], overflow: autoAdjustOverflowLeftRight, offset: [-4, 0], targetOffset: targetOffset }, right: { points: ['cl', 'cr'], overflow: autoAdjustOverflowLeftRight, offset: [4, 0], targetOffset: targetOffset }, top: { points: ['bc', 'tc'], overflow: autoAdjustOverflowTopBottom, offset: [0, -4], targetOffset: targetOffset }, bottom: { points: ['tc', 'bc'], overflow: autoAdjustOverflowTopBottom, offset: [0, 4], targetOffset: targetOffset }, topLeft: { points: ['bl', 'tl'], overflow: autoAdjustOverflowTopBottom, offset: [0, -4], targetOffset: targetOffset }, leftTop: { points: ['tr', 'tl'], overflow: autoAdjustOverflowLeftRight, offset: [-4, 0], targetOffset: targetOffset }, topRight: { points: ['br', 'tr'], overflow: autoAdjustOverflowTopBottom, offset: [0, -4], targetOffset: targetOffset }, rightTop: { points: ['tl', 'tr'], overflow: autoAdjustOverflowLeftRight, offset: [4, 0], targetOffset: targetOffset }, bottomRight: { points: ['tr', 'br'], overflow: autoAdjustOverflowTopBottom, offset: [0, 4], targetOffset: targetOffset }, rightBottom: { points: ['bl', 'br'], overflow: autoAdjustOverflowLeftRight, offset: [4, 0], targetOffset: targetOffset }, bottomLeft: { points: ['tl', 'bl'], overflow: autoAdjustOverflowTopBottom, offset: [0, 4], targetOffset: targetOffset }, leftBottom: { points: ['br', 'bl'], overflow: autoAdjustOverflowLeftRight, offset: [-4, 0], targetOffset: targetOffset } }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (placements); /***/ }), /***/ "../../../node_modules/rc-tree/es/DropIndicator.js": /*!*********************************************************!*\ !*** ../../../node_modules/rc-tree/es/DropIndicator.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); var DropIndicator = function DropIndicator(props) { var dropPosition = props.dropPosition, dropLevelOffset = props.dropLevelOffset, indent = props.indent; var style = { pointerEvents: 'none', position: 'absolute', right: 0, backgroundColor: 'red', height: 2 }; switch (dropPosition) { case -1: style.top = 0; style.left = -dropLevelOffset * indent; break; case 1: style.bottom = 0; style.left = -dropLevelOffset * indent; break; case 0: style.bottom = 0; style.left = indent; break; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { style: style }); }; if (true) { DropIndicator.displayName = 'DropIndicator'; } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DropIndicator); /***/ }), /***/ "../../../node_modules/rc-tree/es/Indent.js": /*!**************************************************!*\ !*** ../../../node_modules/rc-tree/es/Indent.js ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ "../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); var Indent = function Indent(_ref) { var prefixCls = _ref.prefixCls, level = _ref.level, isStart = _ref.isStart, isEnd = _ref.isEnd; var baseClassName = "".concat(prefixCls, "-indent-unit"); var list = []; for (var i = 0; i < level; i += 1) { list.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.createElement("span", { key: i, className: classnames__WEBPACK_IMPORTED_MODULE_1___default()(baseClassName, (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__["default"])({}, "".concat(baseClassName, "-start"), isStart[i]), "".concat(baseClassName, "-end"), isEnd[i])) })); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.createElement("span", { "aria-hidden": "true", className: "".concat(prefixCls, "-indent") }, list); }; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__.memo(Indent)); /***/ }), /***/ "../../../node_modules/rc-tree/es/MotionTreeNode.js": /*!**********************************************************!*\ !*** ../../../node_modules/rc-tree/es/MotionTreeNode.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectDestructuringEmpty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectDestructuringEmpty */ "../../../node_modules/@babel/runtime/helpers/esm/objectDestructuringEmpty.js"); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ "../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var rc_motion__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! rc-motion */ "../../../node_modules/rc-motion/es/index.js"); /* harmony import */ var rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! rc-util/es/hooks/useLayoutEffect */ "../../../node_modules/rc-util/es/hooks/useLayoutEffect.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var _contextTypes__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./contextTypes */ "../../../node_modules/rc-tree/es/contextTypes.js"); /* harmony import */ var _TreeNode__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./TreeNode */ "../../../node_modules/rc-tree/es/TreeNode.js"); /* harmony import */ var _useUnmount__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./useUnmount */ "../../../node_modules/rc-tree/es/useUnmount.js"); /* harmony import */ var _utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utils/treeUtil */ "../../../node_modules/rc-tree/es/utils/treeUtil.js"); var _excluded = ["className", "style", "motion", "motionNodes", "motionType", "onMotionStart", "onMotionEnd", "active", "treeNodeRequiredProps"]; var MotionTreeNode = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7__.forwardRef(function (oriProps, ref) { var className = oriProps.className, style = oriProps.style, motion = oriProps.motion, motionNodes = oriProps.motionNodes, motionType = oriProps.motionType, onOriginMotionStart = oriProps.onMotionStart, onOriginMotionEnd = oriProps.onMotionEnd, active = oriProps.active, treeNodeRequiredProps = oriProps.treeNodeRequiredProps, props = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__["default"])(oriProps, _excluded); var _React$useState = react__WEBPACK_IMPORTED_MODULE_7__.useState(true), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState, 2), visible = _React$useState2[0], setVisible = _React$useState2[1]; var _React$useContext = react__WEBPACK_IMPORTED_MODULE_7__.useContext(_contextTypes__WEBPACK_IMPORTED_MODULE_8__.TreeContext), prefixCls = _React$useContext.prefixCls; // Calculate target visible here. // And apply in effect to make `leave` motion work. var targetVisible = motionNodes && motionType !== 'hide'; (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_6__["default"])(function () { if (motionNodes) { if (targetVisible !== visible) { setVisible(targetVisible); } } }, [motionNodes]); var triggerMotionStart = function triggerMotionStart() { if (motionNodes) { onOriginMotionStart(); } }; // Should only trigger once var triggerMotionEndRef = react__WEBPACK_IMPORTED_MODULE_7__.useRef(false); var triggerMotionEnd = function triggerMotionEnd() { if (motionNodes && !triggerMotionEndRef.current) { triggerMotionEndRef.current = true; onOriginMotionEnd(); } }; // Effect if unmount (0,_useUnmount__WEBPACK_IMPORTED_MODULE_10__["default"])(triggerMotionStart, triggerMotionEnd); // Motion end event var onVisibleChanged = function onVisibleChanged(nextVisible) { if (targetVisible === nextVisible) { triggerMotionEnd(); } }; if (motionNodes) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7__.createElement(rc_motion__WEBPACK_IMPORTED_MODULE_5__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ ref: ref, visible: visible }, motion, { motionAppear: motionType === 'show', onVisibleChanged: onVisibleChanged }), function (_ref, motionRef) { var motionClassName = _ref.className, motionStyle = _ref.style; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7__.createElement("div", { ref: motionRef, className: classnames__WEBPACK_IMPORTED_MODULE_4___default()("".concat(prefixCls, "-treenode-motion"), motionClassName), style: motionStyle }, motionNodes.map(function (treeNode) { var restProps = Object.assign({}, ((0,_babel_runtime_helpers_esm_objectDestructuringEmpty__WEBPACK_IMPORTED_MODULE_1__["default"])(treeNode.data), treeNode.data)), title = treeNode.title, key = treeNode.key, isStart = treeNode.isStart, isEnd = treeNode.isEnd; delete restProps.children; var treeNodeProps = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.getTreeNodeProps)(key, treeNodeRequiredProps); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7__.createElement(_TreeNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, restProps, treeNodeProps, { title: title, active: active, data: treeNode.data, key: key, isStart: isStart, isEnd: isEnd })); })); }); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7__.createElement(_TreeNode__WEBPACK_IMPORTED_MODULE_9__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ domRef: ref, className: className, style: style }, props, { active: active })); }); if (true) { MotionTreeNode.displayName = 'MotionTreeNode'; } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MotionTreeNode); /***/ }), /***/ "../../../node_modules/rc-tree/es/NodeList.js": /*!****************************************************!*\ !*** ../../../node_modules/rc-tree/es/NodeList.js ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MOTION_KEY: () => (/* binding */ MOTION_KEY), /* harmony export */ MotionEntity: () => (/* binding */ MotionEntity), /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__), /* harmony export */ getMinimumRangeTransitionRange: () => (/* binding */ getMinimumRangeTransitionRange) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectDestructuringEmpty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectDestructuringEmpty */ "../../../node_modules/@babel/runtime/helpers/esm/objectDestructuringEmpty.js"); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ "../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); /* harmony import */ var rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! rc-util/es/hooks/useLayoutEffect */ "../../../node_modules/rc-util/es/hooks/useLayoutEffect.js"); /* harmony import */ var rc_virtual_list__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! rc-virtual-list */ "../../../node_modules/rc-virtual-list/es/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _MotionTreeNode__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./MotionTreeNode */ "../../../node_modules/rc-tree/es/MotionTreeNode.js"); /* harmony import */ var _utils_diffUtil__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/diffUtil */ "../../../node_modules/rc-tree/es/utils/diffUtil.js"); /* harmony import */ var _utils_treeUtil__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utils/treeUtil */ "../../../node_modules/rc-tree/es/utils/treeUtil.js"); var _excluded = ["prefixCls", "data", "selectable", "checkable", "expandedKeys", "selectedKeys", "checkedKeys", "loadedKeys", "loadingKeys", "halfCheckedKeys", "keyEntities", "disabled", "dragging", "dragOverNodeKey", "dropPosition", "motion", "height", "itemHeight", "virtual", "scrollWidth", "focusable", "activeItem", "focused", "tabIndex", "onKeyDown", "onFocus", "onBlur", "onActiveChange", "onListChangeStart", "onListChangeEnd"]; /** * Handle virtual list of the TreeNodes. */ var HIDDEN_STYLE = { width: 0, height: 0, display: 'flex', overflow: 'hidden', opacity: 0, border: 0, padding: 0, margin: 0 }; var noop = function noop() {}; var MOTION_KEY = "RC_TREE_MOTION_".concat(Math.random()); var MotionNode = { key: MOTION_KEY }; var MotionEntity = { key: MOTION_KEY, level: 0, index: 0, pos: '0', node: MotionNode, nodes: [MotionNode] }; var MotionFlattenData = { parent: null, children: [], pos: MotionEntity.pos, data: MotionNode, title: null, key: MOTION_KEY, /** Hold empty list here since we do not use it */ isStart: [], isEnd: [] }; /** * We only need get visible content items to play the animation. */ function getMinimumRangeTransitionRange(list, virtual, height, itemHeight) { if (virtual === false || !height) { return list; } return list.slice(0, Math.ceil(height / itemHeight) + 1); } function itemKey(item) { var key = item.key, pos = item.pos; return (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_9__.getKey)(key, pos); } function getAccessibilityPath(item) { var path = String(item.data.key); var current = item; while (current.parent) { current = current.parent; path = "".concat(current.data.key, " > ").concat(path); } return path; } var NodeList = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.forwardRef(function (props, ref) { var prefixCls = props.prefixCls, data = props.data, selectable = props.selectable, checkable = props.checkable, expandedKeys = props.expandedKeys, selectedKeys = props.selectedKeys, checkedKeys = props.checkedKeys, loadedKeys = props.loadedKeys, loadingKeys = props.loadingKeys, halfCheckedKeys = props.halfCheckedKeys, keyEntities = props.keyEntities, disabled = props.disabled, dragging = props.dragging, dragOverNodeKey = props.dragOverNodeKey, dropPosition = props.dropPosition, motion = props.motion, height = props.height, itemHeight = props.itemHeight, virtual = props.virtual, scrollWidth = props.scrollWidth, focusable = props.focusable, activeItem = props.activeItem, focused = props.focused, tabIndex = props.tabIndex, onKeyDown = props.onKeyDown, onFocus = props.onFocus, onBlur = props.onBlur, onActiveChange = props.onActiveChange, onListChangeStart = props.onListChangeStart, onListChangeEnd = props.onListChangeEnd, domProps = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__["default"])(props, _excluded); // =============================== Ref ================================ var listRef = react__WEBPACK_IMPORTED_MODULE_6__.useRef(null); var indentMeasurerRef = react__WEBPACK_IMPORTED_MODULE_6__.useRef(null); react__WEBPACK_IMPORTED_MODULE_6__.useImperativeHandle(ref, function () { return { scrollTo: function scrollTo(scroll) { listRef.current.scrollTo(scroll); }, getIndentWidth: function getIndentWidth() { return indentMeasurerRef.current.offsetWidth; } }; }); // ============================== Motion ============================== var _React$useState = react__WEBPACK_IMPORTED_MODULE_6__.useState(expandedKeys), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState, 2), prevExpandedKeys = _React$useState2[0], setPrevExpandedKeys = _React$useState2[1]; var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_6__.useState(data), _React$useState4 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState3, 2), prevData = _React$useState4[0], setPrevData = _React$useState4[1]; var _React$useState5 = react__WEBPACK_IMPORTED_MODULE_6__.useState(data), _React$useState6 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState5, 2), transitionData = _React$useState6[0], setTransitionData = _React$useState6[1]; var _React$useState7 = react__WEBPACK_IMPORTED_MODULE_6__.useState([]), _React$useState8 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState7, 2), transitionRange = _React$useState8[0], setTransitionRange = _React$useState8[1]; var _React$useState9 = react__WEBPACK_IMPORTED_MODULE_6__.useState(null), _React$useState10 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState9, 2), motionType = _React$useState10[0], setMotionType = _React$useState10[1]; // When motion end but data change, this will makes data back to previous one var dataRef = react__WEBPACK_IMPORTED_MODULE_6__.useRef(data); dataRef.current = data; function onMotionEnd() { var latestData = dataRef.current; setPrevData(latestData); setTransitionData(latestData); setTransitionRange([]); setMotionType(null); onListChangeEnd(); } // Do animation if expanded keys changed // layoutEffect here to avoid blink of node removing (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_4__["default"])(function () { setPrevExpandedKeys(expandedKeys); var diffExpanded = (0,_utils_diffUtil__WEBPACK_IMPORTED_MODULE_8__.findExpandedKeys)(prevExpandedKeys, expandedKeys); if (diffExpanded.key !== null) { if (diffExpanded.add) { var keyIndex = prevData.findIndex(function (_ref) { var key = _ref.key; return key === diffExpanded.key; }); var rangeNodes = getMinimumRangeTransitionRange((0,_utils_diffUtil__WEBPACK_IMPORTED_MODULE_8__.getExpandRange)(prevData, data, diffExpanded.key), virtual, height, itemHeight); var newTransitionData = prevData.slice(); newTransitionData.splice(keyIndex + 1, 0, MotionFlattenData); setTransitionData(newTransitionData); setTransitionRange(rangeNodes); setMotionType('show'); } else { var _keyIndex = data.findIndex(function (_ref2) { var key = _ref2.key; return key === diffExpanded.key; }); var _rangeNodes = getMinimumRangeTransitionRange((0,_utils_diffUtil__WEBPACK_IMPORTED_MODULE_8__.getExpandRange)(data, prevData, diffExpanded.key), virtual, height, itemHeight); var _newTransitionData = data.slice(); _newTransitionData.splice(_keyIndex + 1, 0, MotionFlattenData); setTransitionData(_newTransitionData); setTransitionRange(_rangeNodes); setMotionType('hide'); } } else if (prevData !== data) { // If whole data changed, we just refresh the list setPrevData(data); setTransitionData(data); } }, [expandedKeys, data]); // We should clean up motion if is changed by dragging react__WEBPACK_IMPORTED_MODULE_6__.useEffect(function () { if (!dragging) { onMotionEnd(); } }, [dragging]); var mergedData = motion ? transitionData : data; var treeNodeRequiredProps = { expandedKeys: expandedKeys, selectedKeys: selectedKeys, loadedKeys: loadedKeys, loadingKeys: loadingKeys, checkedKeys: checkedKeys, halfCheckedKeys: halfCheckedKeys, dragOverNodeKey: dragOverNodeKey, dropPosition: dropPosition, keyEntities: keyEntities }; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement(react__WEBPACK_IMPORTED_MODULE_6__.Fragment, null, focused && activeItem && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement("span", { style: HIDDEN_STYLE, "aria-live": "assertive" }, getAccessibilityPath(activeItem)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement("input", { style: HIDDEN_STYLE, disabled: focusable === false || disabled, tabIndex: focusable !== false ? tabIndex : null, onKeyDown: onKeyDown, onFocus: onFocus, onBlur: onBlur, value: "", onChange: noop, "aria-label": "for screen reader" })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement("div", { className: "".concat(prefixCls, "-treenode"), "aria-hidden": true, style: { position: 'absolute', pointerEvents: 'none', visibility: 'hidden', height: 0, overflow: 'hidden', border: 0, padding: 0 } }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement("div", { className: "".concat(prefixCls, "-indent") }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement("div", { ref: indentMeasurerRef, className: "".concat(prefixCls, "-indent-unit") }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement(rc_virtual_list__WEBPACK_IMPORTED_MODULE_5__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, domProps, { data: mergedData, itemKey: itemKey, height: height, fullHeight: false, virtual: virtual, itemHeight: itemHeight, scrollWidth: scrollWidth, prefixCls: "".concat(prefixCls, "-list"), ref: listRef, role: "tree", onVisibleChange: function onVisibleChange(originList) { // The best match is using `fullList` - `originList` = `restList` // and check the `restList` to see if has the MOTION_KEY node // but this will cause performance issue for long list compare // we just check `originList` and repeat trigger `onMotionEnd` if (originList.every(function (item) { return itemKey(item) !== MOTION_KEY; })) { onMotionEnd(); } } }), function (treeNode) { var pos = treeNode.pos, restProps = Object.assign({}, ((0,_babel_runtime_helpers_esm_objectDestructuringEmpty__WEBPACK_IMPORTED_MODULE_1__["default"])(treeNode.data), treeNode.data)), title = treeNode.title, key = treeNode.key, isStart = treeNode.isStart, isEnd = treeNode.isEnd; var mergedKey = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_9__.getKey)(key, pos); delete restProps.key; delete restProps.children; var treeNodeProps = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_9__.getTreeNodeProps)(mergedKey, treeNodeRequiredProps); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6__.createElement(_MotionTreeNode__WEBPACK_IMPORTED_MODULE_7__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, restProps, treeNodeProps, { title: title, active: !!activeItem && key === activeItem.key, pos: pos, data: treeNode.data, isStart: isStart, isEnd: isEnd, motion: motion, motionNodes: key === MOTION_KEY ? transitionRange : null, motionType: motionType, onMotionStart: onListChangeStart, onMotionEnd: onMotionEnd, treeNodeRequiredProps: treeNodeRequiredProps, onMouseMove: function onMouseMove() { onActiveChange(null); } })); })); }); if (true) { NodeList.displayName = 'NodeList'; } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NodeList); /***/ }), /***/ "../../../node_modules/rc-tree/es/Tree.js": /*!************************************************!*\ !*** ../../../node_modules/rc-tree/es/Tree.js ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ "../../../node_modules/@babel/runtime/helpers/esm/typeof.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); /* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/esm/toConsumableArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/esm/classCallCheck */ "../../../node_modules/@babel/runtime/helpers/esm/classCallCheck.js"); /* harmony import */ var _babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/esm/createClass */ "../../../node_modules/@babel/runtime/helpers/esm/createClass.js"); /* harmony import */ var _babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/esm/assertThisInitialized */ "../../../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js"); /* harmony import */ var _babel_runtime_helpers_esm_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inherits */ "../../../node_modules/@babel/runtime/helpers/esm/inherits.js"); /* harmony import */ var _babel_runtime_helpers_esm_createSuper__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/helpers/esm/createSuper */ "../../../node_modules/@babel/runtime/helpers/esm/createSuper.js"); /* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ "../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_10__); /* harmony import */ var rc_util_es_KeyCode__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! rc-util/es/KeyCode */ "../../../node_modules/rc-util/es/KeyCode.js"); /* harmony import */ var rc_util_es_pickAttrs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! rc-util/es/pickAttrs */ "../../../node_modules/rc-util/es/pickAttrs.js"); /* harmony import */ var rc_util_es_warning__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! rc-util/es/warning */ "../../../node_modules/rc-util/es/warning.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_14__); /* harmony import */ var _contextTypes__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./contextTypes */ "../../../node_modules/rc-tree/es/contextTypes.js"); /* harmony import */ var _DropIndicator__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./DropIndicator */ "../../../node_modules/rc-tree/es/DropIndicator.js"); /* harmony import */ var _NodeList__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./NodeList */ "../../../node_modules/rc-tree/es/NodeList.js"); /* harmony import */ var _TreeNode__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./TreeNode */ "../../../node_modules/rc-tree/es/TreeNode.js"); /* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./util */ "../../../node_modules/rc-tree/es/util.js"); /* harmony import */ var _utils_conductUtil__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./utils/conductUtil */ "../../../node_modules/rc-tree/es/utils/conductUtil.js"); /* harmony import */ var _utils_keyUtil__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./utils/keyUtil */ "../../../node_modules/rc-tree/es/utils/keyUtil.js"); /* harmony import */ var _utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./utils/treeUtil */ "../../../node_modules/rc-tree/es/utils/treeUtil.js"); // TODO: https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/treeview/treeview-2/treeview-2a.html // Fully accessibility support var MAX_RETRY_TIMES = 10; var Tree = /*#__PURE__*/function (_React$Component) { (0,_babel_runtime_helpers_esm_inherits__WEBPACK_IMPORTED_MODULE_7__["default"])(Tree, _React$Component); var _super = (0,_babel_runtime_helpers_esm_createSuper__WEBPACK_IMPORTED_MODULE_8__["default"])(Tree); function Tree() { var _this; (0,_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_4__["default"])(this, Tree); for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) { _args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(_args)); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "destroyed", false); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "delayedDragEnterLogic", void 0); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "loadingRetryTimes", {}); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "state", { keyEntities: {}, indent: null, selectedKeys: [], checkedKeys: [], halfCheckedKeys: [], loadedKeys: [], loadingKeys: [], expandedKeys: [], draggingNodeKey: null, dragChildrenKeys: [], // dropTargetKey is the key of abstract-drop-node // the abstract-drop-node is the real drop node when drag and drop // not the DOM drag over node dropTargetKey: null, dropPosition: null, // the drop position of abstract-drop-node, inside 0, top -1, bottom 1 dropContainerKey: null, // the container key of abstract-drop-node if dropPosition is -1 or 1 dropLevelOffset: null, // the drop level offset of abstract-drag-over-node dropTargetPos: null, // the pos of abstract-drop-node dropAllowed: true, // if drop to abstract-drop-node is allowed // the abstract-drag-over-node // if mouse is on the bottom of top dom node or no the top of the bottom dom node // abstract-drag-over-node is the top node dragOverNodeKey: null, treeData: [], flattenNodes: [], focused: false, activeKey: null, listChanging: false, prevProps: null, fieldNames: (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.fillFieldNames)() }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "dragStartMousePosition", null); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "dragNodeProps", null); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "currentMouseOverDroppableNodeKey", null); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "listRef", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_14__.createRef()); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeDragStart", function (event, nodeProps) { var _this$state = _this.state, expandedKeys = _this$state.expandedKeys, keyEntities = _this$state.keyEntities; var onDragStart = _this.props.onDragStart; var eventKey = nodeProps.eventKey; _this.dragNodeProps = nodeProps; _this.dragStartMousePosition = { x: event.clientX, y: event.clientY }; var newExpandedKeys = (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(expandedKeys, eventKey); _this.setState({ draggingNodeKey: eventKey, dragChildrenKeys: (0,_util__WEBPACK_IMPORTED_MODULE_19__.getDragChildrenKeys)(eventKey, keyEntities), indent: _this.listRef.current.getIndentWidth() }); _this.setExpandedKeys(newExpandedKeys); window.addEventListener('dragend', _this.onWindowDragEnd); onDragStart === null || onDragStart === void 0 || onDragStart({ event: event, node: (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)(nodeProps) }); }); /** * [Legacy] Select handler is smaller than node, * so that this will trigger when drag enter node or select handler. * This is a little tricky if customize css without padding. * Better for use mouse move event to refresh drag state. * But let's just keep it to avoid event trigger logic change. */ (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeDragEnter", function (event, nodeProps) { var _this$state2 = _this.state, expandedKeys = _this$state2.expandedKeys, keyEntities = _this$state2.keyEntities, dragChildrenKeys = _this$state2.dragChildrenKeys, flattenNodes = _this$state2.flattenNodes, indent = _this$state2.indent; var _this$props = _this.props, onDragEnter = _this$props.onDragEnter, onExpand = _this$props.onExpand, allowDrop = _this$props.allowDrop, direction = _this$props.direction; var pos = nodeProps.pos, eventKey = nodeProps.eventKey; // record the key of node which is latest entered, used in dragleave event. if (_this.currentMouseOverDroppableNodeKey !== eventKey) { _this.currentMouseOverDroppableNodeKey = eventKey; } if (!_this.dragNodeProps) { _this.resetDragState(); return; } var _calcDropPosition = (0,_util__WEBPACK_IMPORTED_MODULE_19__.calcDropPosition)(event, _this.dragNodeProps, nodeProps, indent, _this.dragStartMousePosition, allowDrop, flattenNodes, keyEntities, expandedKeys, direction), dropPosition = _calcDropPosition.dropPosition, dropLevelOffset = _calcDropPosition.dropLevelOffset, dropTargetKey = _calcDropPosition.dropTargetKey, dropContainerKey = _calcDropPosition.dropContainerKey, dropTargetPos = _calcDropPosition.dropTargetPos, dropAllowed = _calcDropPosition.dropAllowed, dragOverNodeKey = _calcDropPosition.dragOverNodeKey; if ( // don't allow drop inside its children dragChildrenKeys.includes(dropTargetKey) || // don't allow drop when drop is not allowed caculated by calcDropPosition !dropAllowed) { _this.resetDragState(); return; } // Side effect for delay drag if (!_this.delayedDragEnterLogic) { _this.delayedDragEnterLogic = {}; } Object.keys(_this.delayedDragEnterLogic).forEach(function (key) { clearTimeout(_this.delayedDragEnterLogic[key]); }); if (_this.dragNodeProps.eventKey !== nodeProps.eventKey) { // hoist expand logic here // since if logic is on the bottom // it will be blocked by abstract dragover node check // => if you dragenter from top, you mouse will still be consider as in the top node event.persist(); _this.delayedDragEnterLogic[pos] = window.setTimeout(function () { if (_this.state.draggingNodeKey === null) { return; } var newExpandedKeys = (0,_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_3__["default"])(expandedKeys); var entity = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_21__["default"])(keyEntities, nodeProps.eventKey); if (entity && (entity.children || []).length) { newExpandedKeys = (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrAdd)(expandedKeys, nodeProps.eventKey); } if (!_this.props.hasOwnProperty('expandedKeys')) { _this.setExpandedKeys(newExpandedKeys); } onExpand === null || onExpand === void 0 || onExpand(newExpandedKeys, { node: (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)(nodeProps), expanded: true, nativeEvent: event.nativeEvent }); }, 800); } // Skip if drag node is self if (_this.dragNodeProps.eventKey === dropTargetKey && dropLevelOffset === 0) { _this.resetDragState(); return; } // Update drag over node and drag state _this.setState({ dragOverNodeKey: dragOverNodeKey, dropPosition: dropPosition, dropLevelOffset: dropLevelOffset, dropTargetKey: dropTargetKey, dropContainerKey: dropContainerKey, dropTargetPos: dropTargetPos, dropAllowed: dropAllowed }); onDragEnter === null || onDragEnter === void 0 || onDragEnter({ event: event, node: (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)(nodeProps), expandedKeys: expandedKeys }); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeDragOver", function (event, nodeProps) { var _this$state3 = _this.state, dragChildrenKeys = _this$state3.dragChildrenKeys, flattenNodes = _this$state3.flattenNodes, keyEntities = _this$state3.keyEntities, expandedKeys = _this$state3.expandedKeys, indent = _this$state3.indent; var _this$props2 = _this.props, onDragOver = _this$props2.onDragOver, allowDrop = _this$props2.allowDrop, direction = _this$props2.direction; if (!_this.dragNodeProps) { return; } var _calcDropPosition2 = (0,_util__WEBPACK_IMPORTED_MODULE_19__.calcDropPosition)(event, _this.dragNodeProps, nodeProps, indent, _this.dragStartMousePosition, allowDrop, flattenNodes, keyEntities, expandedKeys, direction), dropPosition = _calcDropPosition2.dropPosition, dropLevelOffset = _calcDropPosition2.dropLevelOffset, dropTargetKey = _calcDropPosition2.dropTargetKey, dropContainerKey = _calcDropPosition2.dropContainerKey, dropTargetPos = _calcDropPosition2.dropTargetPos, dropAllowed = _calcDropPosition2.dropAllowed, dragOverNodeKey = _calcDropPosition2.dragOverNodeKey; if (dragChildrenKeys.includes(dropTargetKey) || !dropAllowed) { // don't allow drop inside its children // don't allow drop when drop is not allowed calculated by calcDropPosition return; } // Update drag position if (_this.dragNodeProps.eventKey === dropTargetKey && dropLevelOffset === 0) { if (!(_this.state.dropPosition === null && _this.state.dropLevelOffset === null && _this.state.dropTargetKey === null && _this.state.dropContainerKey === null && _this.state.dropTargetPos === null && _this.state.dropAllowed === false && _this.state.dragOverNodeKey === null)) { _this.resetDragState(); } } else if (!(dropPosition === _this.state.dropPosition && dropLevelOffset === _this.state.dropLevelOffset && dropTargetKey === _this.state.dropTargetKey && dropContainerKey === _this.state.dropContainerKey && dropTargetPos === _this.state.dropTargetPos && dropAllowed === _this.state.dropAllowed && dragOverNodeKey === _this.state.dragOverNodeKey)) { _this.setState({ dropPosition: dropPosition, dropLevelOffset: dropLevelOffset, dropTargetKey: dropTargetKey, dropContainerKey: dropContainerKey, dropTargetPos: dropTargetPos, dropAllowed: dropAllowed, dragOverNodeKey: dragOverNodeKey }); } onDragOver === null || onDragOver === void 0 || onDragOver({ event: event, node: (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)(nodeProps) }); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeDragLeave", function (event, nodeProps) { // if it is outside the droppable area // currentMouseOverDroppableNodeKey will be updated in dragenter event when into another droppable receiver. if (_this.currentMouseOverDroppableNodeKey === nodeProps.eventKey && !event.currentTarget.contains(event.relatedTarget)) { _this.resetDragState(); _this.currentMouseOverDroppableNodeKey = null; } var onDragLeave = _this.props.onDragLeave; onDragLeave === null || onDragLeave === void 0 || onDragLeave({ event: event, node: (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)(nodeProps) }); }); // since stopPropagation() is called in treeNode // if onWindowDrag is called, whice means state is keeped, drag state should be cleared (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onWindowDragEnd", function (event) { _this.onNodeDragEnd(event, null, true); window.removeEventListener('dragend', _this.onWindowDragEnd); }); // if onNodeDragEnd is called, onWindowDragEnd won't be called since stopPropagation() is called (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeDragEnd", function (event, nodeProps) { var onDragEnd = _this.props.onDragEnd; _this.setState({ dragOverNodeKey: null }); _this.cleanDragState(); onDragEnd === null || onDragEnd === void 0 || onDragEnd({ event: event, node: (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)(nodeProps) }); _this.dragNodeProps = null; window.removeEventListener('dragend', _this.onWindowDragEnd); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeDrop", function (event, _) { var _this$getActiveItem; var outsideTree = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var _this$state4 = _this.state, dragChildrenKeys = _this$state4.dragChildrenKeys, dropPosition = _this$state4.dropPosition, dropTargetKey = _this$state4.dropTargetKey, dropTargetPos = _this$state4.dropTargetPos, dropAllowed = _this$state4.dropAllowed; if (!dropAllowed) { return; } var onDrop = _this.props.onDrop; _this.setState({ dragOverNodeKey: null }); _this.cleanDragState(); if (dropTargetKey === null) return; var abstractDropNodeProps = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.getTreeNodeProps)(dropTargetKey, _this.getTreeNodeRequiredProps())), {}, { active: ((_this$getActiveItem = _this.getActiveItem()) === null || _this$getActiveItem === void 0 ? void 0 : _this$getActiveItem.key) === dropTargetKey, data: (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_21__["default"])(_this.state.keyEntities, dropTargetKey).node }); var dropToChild = dragChildrenKeys.includes(dropTargetKey); (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_13__["default"])(!dropToChild, "Can not drop to dragNode's children node. This is a bug of rc-tree. Please report an issue."); var posArr = (0,_util__WEBPACK_IMPORTED_MODULE_19__.posToArr)(dropTargetPos); var dropResult = { event: event, node: (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)(abstractDropNodeProps), dragNode: _this.dragNodeProps ? (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)(_this.dragNodeProps) : null, dragNodesKeys: [_this.dragNodeProps.eventKey].concat(dragChildrenKeys), dropToGap: dropPosition !== 0, dropPosition: dropPosition + Number(posArr[posArr.length - 1]) }; if (!outsideTree) { onDrop === null || onDrop === void 0 || onDrop(dropResult); } _this.dragNodeProps = null; }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "cleanDragState", function () { var draggingNodeKey = _this.state.draggingNodeKey; if (draggingNodeKey !== null) { _this.setState({ draggingNodeKey: null, dropPosition: null, dropContainerKey: null, dropTargetKey: null, dropLevelOffset: null, dropAllowed: true, dragOverNodeKey: null }); } _this.dragStartMousePosition = null; _this.currentMouseOverDroppableNodeKey = null; }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "triggerExpandActionExpand", function (e, treeNode) { var _this$state5 = _this.state, expandedKeys = _this$state5.expandedKeys, flattenNodes = _this$state5.flattenNodes; var expanded = treeNode.expanded, key = treeNode.key, isLeaf = treeNode.isLeaf; if (isLeaf || e.shiftKey || e.metaKey || e.ctrlKey) { return; } var node = flattenNodes.filter(function (nodeItem) { return nodeItem.key === key; })[0]; var eventNode = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.getTreeNodeProps)(key, _this.getTreeNodeRequiredProps())), {}, { data: node.data })); _this.setExpandedKeys(expanded ? (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(expandedKeys, key) : (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrAdd)(expandedKeys, key)); _this.onNodeExpand(e, eventNode); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeClick", function (e, treeNode) { var _this$props3 = _this.props, onClick = _this$props3.onClick, expandAction = _this$props3.expandAction; if (expandAction === 'click') { _this.triggerExpandActionExpand(e, treeNode); } onClick === null || onClick === void 0 || onClick(e, treeNode); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeDoubleClick", function (e, treeNode) { var _this$props4 = _this.props, onDoubleClick = _this$props4.onDoubleClick, expandAction = _this$props4.expandAction; if (expandAction === 'doubleClick') { _this.triggerExpandActionExpand(e, treeNode); } onDoubleClick === null || onDoubleClick === void 0 || onDoubleClick(e, treeNode); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeSelect", function (e, treeNode) { var selectedKeys = _this.state.selectedKeys; var _this$state6 = _this.state, keyEntities = _this$state6.keyEntities, fieldNames = _this$state6.fieldNames; var _this$props5 = _this.props, onSelect = _this$props5.onSelect, multiple = _this$props5.multiple; var selected = treeNode.selected; var key = treeNode[fieldNames.key]; var targetSelected = !selected; // Update selected keys if (!targetSelected) { selectedKeys = (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(selectedKeys, key); } else if (!multiple) { selectedKeys = [key]; } else { selectedKeys = (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrAdd)(selectedKeys, key); } // [Legacy] Not found related usage in doc or upper libs var selectedNodes = selectedKeys.map(function (selectedKey) { var entity = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_21__["default"])(keyEntities, selectedKey); return entity ? entity.node : null; }).filter(Boolean); _this.setUncontrolledState({ selectedKeys: selectedKeys }); onSelect === null || onSelect === void 0 || onSelect(selectedKeys, { event: 'select', selected: targetSelected, node: treeNode, selectedNodes: selectedNodes, nativeEvent: e.nativeEvent }); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeCheck", function (e, treeNode, checked) { var _this$state7 = _this.state, keyEntities = _this$state7.keyEntities, oriCheckedKeys = _this$state7.checkedKeys, oriHalfCheckedKeys = _this$state7.halfCheckedKeys; var _this$props6 = _this.props, checkStrictly = _this$props6.checkStrictly, onCheck = _this$props6.onCheck; var key = treeNode.key; // Prepare trigger arguments var checkedObj; var eventObj = { event: 'check', node: treeNode, checked: checked, nativeEvent: e.nativeEvent }; if (checkStrictly) { var checkedKeys = checked ? (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrAdd)(oriCheckedKeys, key) : (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(oriCheckedKeys, key); var halfCheckedKeys = (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(oriHalfCheckedKeys, key); checkedObj = { checked: checkedKeys, halfChecked: halfCheckedKeys }; eventObj.checkedNodes = checkedKeys.map(function (checkedKey) { return (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_21__["default"])(keyEntities, checkedKey); }).filter(Boolean).map(function (entity) { return entity.node; }); _this.setUncontrolledState({ checkedKeys: checkedKeys }); } else { // Always fill first var _conductCheck = (0,_utils_conductUtil__WEBPACK_IMPORTED_MODULE_20__.conductCheck)([].concat((0,_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_3__["default"])(oriCheckedKeys), [key]), true, keyEntities), _checkedKeys = _conductCheck.checkedKeys, _halfCheckedKeys = _conductCheck.halfCheckedKeys; // If remove, we do it again to correction if (!checked) { var keySet = new Set(_checkedKeys); keySet.delete(key); var _conductCheck2 = (0,_utils_conductUtil__WEBPACK_IMPORTED_MODULE_20__.conductCheck)(Array.from(keySet), { checked: false, halfCheckedKeys: _halfCheckedKeys }, keyEntities); _checkedKeys = _conductCheck2.checkedKeys; _halfCheckedKeys = _conductCheck2.halfCheckedKeys; } checkedObj = _checkedKeys; // [Legacy] This is used for `rc-tree-select` eventObj.checkedNodes = []; eventObj.checkedNodesPositions = []; eventObj.halfCheckedKeys = _halfCheckedKeys; _checkedKeys.forEach(function (checkedKey) { var entity = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_21__["default"])(keyEntities, checkedKey); if (!entity) return; var node = entity.node, pos = entity.pos; eventObj.checkedNodes.push(node); eventObj.checkedNodesPositions.push({ node: node, pos: pos }); }); _this.setUncontrolledState({ checkedKeys: _checkedKeys }, false, { halfCheckedKeys: _halfCheckedKeys }); } onCheck === null || onCheck === void 0 || onCheck(checkedObj, eventObj); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeLoad", function (treeNode) { var _entity$children; var key = treeNode.key; var keyEntities = _this.state.keyEntities; // Skip if has children already var entity = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_21__["default"])(keyEntities, key); if (entity !== null && entity !== void 0 && (_entity$children = entity.children) !== null && _entity$children !== void 0 && _entity$children.length) { return; } var loadPromise = new Promise(function (resolve, reject) { // We need to get the latest state of loading/loaded keys _this.setState(function (_ref) { var _ref$loadedKeys = _ref.loadedKeys, loadedKeys = _ref$loadedKeys === void 0 ? [] : _ref$loadedKeys, _ref$loadingKeys = _ref.loadingKeys, loadingKeys = _ref$loadingKeys === void 0 ? [] : _ref$loadingKeys; var _this$props7 = _this.props, loadData = _this$props7.loadData, onLoad = _this$props7.onLoad; if (!loadData || loadedKeys.includes(key) || loadingKeys.includes(key)) { return null; } // Process load data var promise = loadData(treeNode); promise.then(function () { var currentLoadedKeys = _this.state.loadedKeys; var newLoadedKeys = (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrAdd)(currentLoadedKeys, key); // onLoad should trigger before internal setState to avoid `loadData` trigger twice. // https://github.com/ant-design/ant-design/issues/12464 onLoad === null || onLoad === void 0 || onLoad(newLoadedKeys, { event: 'load', node: treeNode }); _this.setUncontrolledState({ loadedKeys: newLoadedKeys }); _this.setState(function (prevState) { return { loadingKeys: (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(prevState.loadingKeys, key) }; }); resolve(); }).catch(function (e) { _this.setState(function (prevState) { return { loadingKeys: (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(prevState.loadingKeys, key) }; }); // If exceed max retry times, we give up retry _this.loadingRetryTimes[key] = (_this.loadingRetryTimes[key] || 0) + 1; if (_this.loadingRetryTimes[key] >= MAX_RETRY_TIMES) { var currentLoadedKeys = _this.state.loadedKeys; (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_13__["default"])(false, 'Retry for `loadData` many times but still failed. No more retry.'); _this.setUncontrolledState({ loadedKeys: (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrAdd)(currentLoadedKeys, key) }); resolve(); } reject(e); }); return { loadingKeys: (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrAdd)(loadingKeys, key) }; }); }); // Not care warning if we ignore this loadPromise.catch(function () {}); return loadPromise; }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeMouseEnter", function (event, node) { var onMouseEnter = _this.props.onMouseEnter; onMouseEnter === null || onMouseEnter === void 0 || onMouseEnter({ event: event, node: node }); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeMouseLeave", function (event, node) { var onMouseLeave = _this.props.onMouseLeave; onMouseLeave === null || onMouseLeave === void 0 || onMouseLeave({ event: event, node: node }); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeContextMenu", function (event, node) { var onRightClick = _this.props.onRightClick; if (onRightClick) { event.preventDefault(); onRightClick({ event: event, node: node }); } }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onFocus", function () { var onFocus = _this.props.onFocus; _this.setState({ focused: true }); for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } onFocus === null || onFocus === void 0 || onFocus.apply(void 0, args); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onBlur", function () { var onBlur = _this.props.onBlur; _this.setState({ focused: false }); _this.onActiveChange(null); for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } onBlur === null || onBlur === void 0 || onBlur.apply(void 0, args); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "getTreeNodeRequiredProps", function () { var _this$state8 = _this.state, expandedKeys = _this$state8.expandedKeys, selectedKeys = _this$state8.selectedKeys, loadedKeys = _this$state8.loadedKeys, loadingKeys = _this$state8.loadingKeys, checkedKeys = _this$state8.checkedKeys, halfCheckedKeys = _this$state8.halfCheckedKeys, dragOverNodeKey = _this$state8.dragOverNodeKey, dropPosition = _this$state8.dropPosition, keyEntities = _this$state8.keyEntities; return { expandedKeys: expandedKeys || [], selectedKeys: selectedKeys || [], loadedKeys: loadedKeys || [], loadingKeys: loadingKeys || [], checkedKeys: checkedKeys || [], halfCheckedKeys: halfCheckedKeys || [], dragOverNodeKey: dragOverNodeKey, dropPosition: dropPosition, keyEntities: keyEntities }; }); // =========================== Expanded =========================== /** Set uncontrolled `expandedKeys`. This will also auto update `flattenNodes`. */ (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "setExpandedKeys", function (expandedKeys) { var _this$state9 = _this.state, treeData = _this$state9.treeData, fieldNames = _this$state9.fieldNames; var flattenNodes = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.flattenTreeData)(treeData, expandedKeys, fieldNames); _this.setUncontrolledState({ expandedKeys: expandedKeys, flattenNodes: flattenNodes }, true); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onNodeExpand", function (e, treeNode) { var expandedKeys = _this.state.expandedKeys; var _this$state10 = _this.state, listChanging = _this$state10.listChanging, fieldNames = _this$state10.fieldNames; var _this$props8 = _this.props, onExpand = _this$props8.onExpand, loadData = _this$props8.loadData; var expanded = treeNode.expanded; var key = treeNode[fieldNames.key]; // Do nothing when motion is in progress if (listChanging) { return; } // Update selected keys var certain = expandedKeys.includes(key); var targetExpanded = !expanded; (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_13__["default"])(expanded && certain || !expanded && !certain, 'Expand state not sync with index check'); expandedKeys = targetExpanded ? (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrAdd)(expandedKeys, key) : (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(expandedKeys, key); _this.setExpandedKeys(expandedKeys); onExpand === null || onExpand === void 0 || onExpand(expandedKeys, { node: treeNode, expanded: targetExpanded, nativeEvent: e.nativeEvent }); // Async Load data if (targetExpanded && loadData) { var loadPromise = _this.onNodeLoad(treeNode); if (loadPromise) { loadPromise.then(function () { // [Legacy] Refresh logic var newFlattenTreeData = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.flattenTreeData)(_this.state.treeData, expandedKeys, fieldNames); _this.setUncontrolledState({ flattenNodes: newFlattenTreeData }); }).catch(function () { var currentExpandedKeys = _this.state.expandedKeys; var expandedKeysToRestore = (0,_util__WEBPACK_IMPORTED_MODULE_19__.arrDel)(currentExpandedKeys, key); _this.setExpandedKeys(expandedKeysToRestore); }); } } }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onListChangeStart", function () { _this.setUncontrolledState({ listChanging: true }); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onListChangeEnd", function () { setTimeout(function () { _this.setUncontrolledState({ listChanging: false }); }); }); // =========================== Keyboard =========================== (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onActiveChange", function (newActiveKey) { var activeKey = _this.state.activeKey; var _this$props9 = _this.props, onActiveChange = _this$props9.onActiveChange, _this$props9$itemScro = _this$props9.itemScrollOffset, itemScrollOffset = _this$props9$itemScro === void 0 ? 0 : _this$props9$itemScro; if (activeKey === newActiveKey) { return; } _this.setState({ activeKey: newActiveKey }); if (newActiveKey !== null) { _this.scrollTo({ key: newActiveKey, offset: itemScrollOffset }); } onActiveChange === null || onActiveChange === void 0 || onActiveChange(newActiveKey); }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "getActiveItem", function () { var _this$state11 = _this.state, activeKey = _this$state11.activeKey, flattenNodes = _this$state11.flattenNodes; if (activeKey === null) { return null; } return flattenNodes.find(function (_ref2) { var key = _ref2.key; return key === activeKey; }) || null; }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "offsetActiveKey", function (offset) { var _this$state12 = _this.state, flattenNodes = _this$state12.flattenNodes, activeKey = _this$state12.activeKey; var index = flattenNodes.findIndex(function (_ref3) { var key = _ref3.key; return key === activeKey; }); // Align with index if (index === -1 && offset < 0) { index = flattenNodes.length; } index = (index + offset + flattenNodes.length) % flattenNodes.length; var item = flattenNodes[index]; if (item) { var _key4 = item.key; _this.onActiveChange(_key4); } else { _this.onActiveChange(null); } }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "onKeyDown", function (event) { var _this$state13 = _this.state, activeKey = _this$state13.activeKey, expandedKeys = _this$state13.expandedKeys, checkedKeys = _this$state13.checkedKeys, fieldNames = _this$state13.fieldNames; var _this$props10 = _this.props, onKeyDown = _this$props10.onKeyDown, checkable = _this$props10.checkable, selectable = _this$props10.selectable; // >>>>>>>>>> Direction switch (event.which) { case rc_util_es_KeyCode__WEBPACK_IMPORTED_MODULE_11__["default"].UP: { _this.offsetActiveKey(-1); event.preventDefault(); break; } case rc_util_es_KeyCode__WEBPACK_IMPORTED_MODULE_11__["default"].DOWN: { _this.offsetActiveKey(1); event.preventDefault(); break; } } // >>>>>>>>>> Expand & Selection var activeItem = _this.getActiveItem(); if (activeItem && activeItem.data) { var treeNodeRequiredProps = _this.getTreeNodeRequiredProps(); var expandable = activeItem.data.isLeaf === false || !!(activeItem.data[fieldNames.children] || []).length; var eventNode = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertNodePropsToEventData)((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.getTreeNodeProps)(activeKey, treeNodeRequiredProps)), {}, { data: activeItem.data, active: true })); switch (event.which) { // >>> Expand case rc_util_es_KeyCode__WEBPACK_IMPORTED_MODULE_11__["default"].LEFT: { // Collapse if possible if (expandable && expandedKeys.includes(activeKey)) { _this.onNodeExpand({}, eventNode); } else if (activeItem.parent) { _this.onActiveChange(activeItem.parent.key); } event.preventDefault(); break; } case rc_util_es_KeyCode__WEBPACK_IMPORTED_MODULE_11__["default"].RIGHT: { // Expand if possible if (expandable && !expandedKeys.includes(activeKey)) { _this.onNodeExpand({}, eventNode); } else if (activeItem.children && activeItem.children.length) { _this.onActiveChange(activeItem.children[0].key); } event.preventDefault(); break; } // Selection case rc_util_es_KeyCode__WEBPACK_IMPORTED_MODULE_11__["default"].ENTER: case rc_util_es_KeyCode__WEBPACK_IMPORTED_MODULE_11__["default"].SPACE: { if (checkable && !eventNode.disabled && eventNode.checkable !== false && !eventNode.disableCheckbox) { _this.onNodeCheck({}, eventNode, !checkedKeys.includes(activeKey)); } else if (!checkable && selectable && !eventNode.disabled && eventNode.selectable !== false) { _this.onNodeSelect({}, eventNode); } break; } } } onKeyDown === null || onKeyDown === void 0 || onKeyDown(event); }); /** * Only update the value which is not in props */ (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "setUncontrolledState", function (state) { var atomic = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var forceState = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; if (!_this.destroyed) { var needSync = false; var allPassed = true; var newState = {}; Object.keys(state).forEach(function (name) { if (_this.props.hasOwnProperty(name)) { allPassed = false; return; } needSync = true; newState[name] = state[name]; }); if (needSync && (!atomic || allPassed)) { _this.setState((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, newState), forceState)); } } }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__["default"])(_this), "scrollTo", function (scroll) { _this.listRef.current.scrollTo(scroll); }); return _this; } (0,_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_5__["default"])(Tree, [{ key: "componentDidMount", value: function componentDidMount() { this.destroyed = false; this.onUpdated(); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { this.onUpdated(); } }, { key: "onUpdated", value: function onUpdated() { var _this$props11 = this.props, activeKey = _this$props11.activeKey, _this$props11$itemScr = _this$props11.itemScrollOffset, itemScrollOffset = _this$props11$itemScr === void 0 ? 0 : _this$props11$itemScr; if (activeKey !== undefined && activeKey !== this.state.activeKey) { this.setState({ activeKey: activeKey }); if (activeKey !== null) { this.scrollTo({ key: activeKey, offset: itemScrollOffset }); } } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { window.removeEventListener('dragend', this.onWindowDragEnd); this.destroyed = true; } }, { key: "resetDragState", value: function resetDragState() { this.setState({ dragOverNodeKey: null, dropPosition: null, dropLevelOffset: null, dropTargetKey: null, dropContainerKey: null, dropTargetPos: null, dropAllowed: false }); } }, { key: "render", value: function render() { var _this$state14 = this.state, focused = _this$state14.focused, flattenNodes = _this$state14.flattenNodes, keyEntities = _this$state14.keyEntities, draggingNodeKey = _this$state14.draggingNodeKey, activeKey = _this$state14.activeKey, dropLevelOffset = _this$state14.dropLevelOffset, dropContainerKey = _this$state14.dropContainerKey, dropTargetKey = _this$state14.dropTargetKey, dropPosition = _this$state14.dropPosition, dragOverNodeKey = _this$state14.dragOverNodeKey, indent = _this$state14.indent; var _this$props12 = this.props, prefixCls = _this$props12.prefixCls, className = _this$props12.className, style = _this$props12.style, showLine = _this$props12.showLine, focusable = _this$props12.focusable, _this$props12$tabInde = _this$props12.tabIndex, tabIndex = _this$props12$tabInde === void 0 ? 0 : _this$props12$tabInde, selectable = _this$props12.selectable, showIcon = _this$props12.showIcon, icon = _this$props12.icon, switcherIcon = _this$props12.switcherIcon, draggable = _this$props12.draggable, checkable = _this$props12.checkable, checkStrictly = _this$props12.checkStrictly, disabled = _this$props12.disabled, motion = _this$props12.motion, loadData = _this$props12.loadData, filterTreeNode = _this$props12.filterTreeNode, height = _this$props12.height, itemHeight = _this$props12.itemHeight, scrollWidth = _this$props12.scrollWidth, virtual = _this$props12.virtual, titleRender = _this$props12.titleRender, dropIndicatorRender = _this$props12.dropIndicatorRender, onContextMenu = _this$props12.onContextMenu, onScroll = _this$props12.onScroll, direction = _this$props12.direction, rootClassName = _this$props12.rootClassName, rootStyle = _this$props12.rootStyle; var domProps = (0,rc_util_es_pickAttrs__WEBPACK_IMPORTED_MODULE_12__["default"])(this.props, { aria: true, data: true }); // It's better move to hooks but we just simply keep here var draggableConfig; if (draggable) { if ((0,_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__["default"])(draggable) === 'object') { draggableConfig = draggable; } else if (typeof draggable === 'function') { draggableConfig = { nodeDraggable: draggable }; } else { draggableConfig = {}; } } var contextValue = { prefixCls: prefixCls, selectable: selectable, showIcon: showIcon, icon: icon, switcherIcon: switcherIcon, draggable: draggableConfig, draggingNodeKey: draggingNodeKey, checkable: checkable, checkStrictly: checkStrictly, disabled: disabled, keyEntities: keyEntities, dropLevelOffset: dropLevelOffset, dropContainerKey: dropContainerKey, dropTargetKey: dropTargetKey, dropPosition: dropPosition, dragOverNodeKey: dragOverNodeKey, indent: indent, direction: direction, dropIndicatorRender: dropIndicatorRender, loadData: loadData, filterTreeNode: filterTreeNode, titleRender: titleRender, onNodeClick: this.onNodeClick, onNodeDoubleClick: this.onNodeDoubleClick, onNodeExpand: this.onNodeExpand, onNodeSelect: this.onNodeSelect, onNodeCheck: this.onNodeCheck, onNodeLoad: this.onNodeLoad, onNodeMouseEnter: this.onNodeMouseEnter, onNodeMouseLeave: this.onNodeMouseLeave, onNodeContextMenu: this.onNodeContextMenu, onNodeDragStart: this.onNodeDragStart, onNodeDragEnter: this.onNodeDragEnter, onNodeDragOver: this.onNodeDragOver, onNodeDragLeave: this.onNodeDragLeave, onNodeDragEnd: this.onNodeDragEnd, onNodeDrop: this.onNodeDrop }; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_14__.createElement(_contextTypes__WEBPACK_IMPORTED_MODULE_15__.TreeContext.Provider, { value: contextValue }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_14__.createElement("div", { className: classnames__WEBPACK_IMPORTED_MODULE_10___default()(prefixCls, className, rootClassName, (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])({}, "".concat(prefixCls, "-show-line"), showLine), "".concat(prefixCls, "-focused"), focused), "".concat(prefixCls, "-active-focused"), activeKey !== null)), style: rootStyle }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_14__.createElement(_NodeList__WEBPACK_IMPORTED_MODULE_17__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ ref: this.listRef, prefixCls: prefixCls, style: style, data: flattenNodes, disabled: disabled, selectable: selectable, checkable: !!checkable, motion: motion, dragging: draggingNodeKey !== null, height: height, itemHeight: itemHeight, virtual: virtual, focusable: focusable, focused: focused, tabIndex: tabIndex, activeItem: this.getActiveItem(), onFocus: this.onFocus, onBlur: this.onBlur, onKeyDown: this.onKeyDown, onActiveChange: this.onActiveChange, onListChangeStart: this.onListChangeStart, onListChangeEnd: this.onListChangeEnd, onContextMenu: onContextMenu, onScroll: onScroll, scrollWidth: scrollWidth }, this.getTreeNodeRequiredProps(), domProps)))); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(props, prevState) { var prevProps = prevState.prevProps; var newState = { prevProps: props }; function needSync(name) { return !prevProps && props.hasOwnProperty(name) || prevProps && prevProps[name] !== props[name]; } // ================== Tree Node ================== var treeData; // fieldNames var fieldNames = prevState.fieldNames; if (needSync('fieldNames')) { fieldNames = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.fillFieldNames)(props.fieldNames); newState.fieldNames = fieldNames; } // Check if `treeData` or `children` changed and save into the state. if (needSync('treeData')) { treeData = props.treeData; } else if (needSync('children')) { (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_13__["default"])(false, '`children` of Tree is deprecated. Please use `treeData` instead.'); treeData = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertTreeToData)(props.children); } // Save flatten nodes info and convert `treeData` into keyEntities if (treeData) { newState.treeData = treeData; var entitiesMap = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.convertDataToEntities)(treeData, { fieldNames: fieldNames }); newState.keyEntities = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])({}, _NodeList__WEBPACK_IMPORTED_MODULE_17__.MOTION_KEY, _NodeList__WEBPACK_IMPORTED_MODULE_17__.MotionEntity), entitiesMap.keyEntities); // Warning if treeNode not provide key if (true) { (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.warningWithoutKey)(treeData, fieldNames); } } var keyEntities = newState.keyEntities || prevState.keyEntities; // ================ expandedKeys ================= if (needSync('expandedKeys') || prevProps && needSync('autoExpandParent')) { newState.expandedKeys = props.autoExpandParent || !prevProps && props.defaultExpandParent ? (0,_util__WEBPACK_IMPORTED_MODULE_19__.conductExpandParent)(props.expandedKeys, keyEntities) : props.expandedKeys; } else if (!prevProps && props.defaultExpandAll) { var cloneKeyEntities = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, keyEntities); delete cloneKeyEntities[_NodeList__WEBPACK_IMPORTED_MODULE_17__.MOTION_KEY]; // Only take the key who has the children to enhance the performance var nextExpandedKeys = []; Object.keys(cloneKeyEntities).forEach(function (key) { var entity = cloneKeyEntities[key]; if (entity.children && entity.children.length) { nextExpandedKeys.push(entity.key); } }); newState.expandedKeys = nextExpandedKeys; } else if (!prevProps && props.defaultExpandedKeys) { newState.expandedKeys = props.autoExpandParent || props.defaultExpandParent ? (0,_util__WEBPACK_IMPORTED_MODULE_19__.conductExpandParent)(props.defaultExpandedKeys, keyEntities) : props.defaultExpandedKeys; } if (!newState.expandedKeys) { delete newState.expandedKeys; } // ================ flattenNodes ================= if (treeData || newState.expandedKeys) { var flattenNodes = (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_22__.flattenTreeData)(treeData || prevState.treeData, newState.expandedKeys || prevState.expandedKeys, fieldNames); newState.flattenNodes = flattenNodes; } // ================ selectedKeys ================= if (props.selectable) { if (needSync('selectedKeys')) { newState.selectedKeys = (0,_util__WEBPACK_IMPORTED_MODULE_19__.calcSelectedKeys)(props.selectedKeys, props); } else if (!prevProps && props.defaultSelectedKeys) { newState.selectedKeys = (0,_util__WEBPACK_IMPORTED_MODULE_19__.calcSelectedKeys)(props.defaultSelectedKeys, props); } } // ================= checkedKeys ================= if (props.checkable) { var checkedKeyEntity; if (needSync('checkedKeys')) { checkedKeyEntity = (0,_util__WEBPACK_IMPORTED_MODULE_19__.parseCheckedKeys)(props.checkedKeys) || {}; } else if (!prevProps && props.defaultCheckedKeys) { checkedKeyEntity = (0,_util__WEBPACK_IMPORTED_MODULE_19__.parseCheckedKeys)(props.defaultCheckedKeys) || {}; } else if (treeData) { // If `treeData` changed, we also need check it checkedKeyEntity = (0,_util__WEBPACK_IMPORTED_MODULE_19__.parseCheckedKeys)(props.checkedKeys) || { checkedKeys: prevState.checkedKeys, halfCheckedKeys: prevState.halfCheckedKeys }; } if (checkedKeyEntity) { var _checkedKeyEntity = checkedKeyEntity, _checkedKeyEntity$che = _checkedKeyEntity.checkedKeys, checkedKeys = _checkedKeyEntity$che === void 0 ? [] : _checkedKeyEntity$che, _checkedKeyEntity$hal = _checkedKeyEntity.halfCheckedKeys, halfCheckedKeys = _checkedKeyEntity$hal === void 0 ? [] : _checkedKeyEntity$hal; if (!props.checkStrictly) { var conductKeys = (0,_utils_conductUtil__WEBPACK_IMPORTED_MODULE_20__.conductCheck)(checkedKeys, true, keyEntities); checkedKeys = conductKeys.checkedKeys; halfCheckedKeys = conductKeys.halfCheckedKeys; } newState.checkedKeys = checkedKeys; newState.halfCheckedKeys = halfCheckedKeys; } } // ================= loadedKeys ================== if (needSync('loadedKeys')) { newState.loadedKeys = props.loadedKeys; } return newState; } }]); return Tree; }(react__WEBPACK_IMPORTED_MODULE_14__.Component); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])(Tree, "defaultProps", { prefixCls: 'rc-tree', showLine: false, showIcon: true, selectable: true, multiple: false, checkable: false, disabled: false, checkStrictly: false, draggable: false, defaultExpandParent: true, autoExpandParent: false, defaultExpandAll: false, defaultExpandedKeys: [], defaultCheckedKeys: [], defaultSelectedKeys: [], dropIndicatorRender: _DropIndicator__WEBPACK_IMPORTED_MODULE_16__["default"], allowDrop: function allowDrop() { return true; }, expandAction: false }); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_9__["default"])(Tree, "TreeNode", _TreeNode__WEBPACK_IMPORTED_MODULE_18__["default"]); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Tree); /***/ }), /***/ "../../../node_modules/rc-tree/es/TreeNode.js": /*!****************************************************!*\ !*** ../../../node_modules/rc-tree/es/TreeNode.js ***! \****************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ "../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ "../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var rc_util_es_pickAttrs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! rc-util/es/pickAttrs */ "../../../node_modules/rc-util/es/pickAttrs.js"); /* harmony import */ var _contextTypes__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./contextTypes */ "../../../node_modules/rc-tree/es/contextTypes.js"); /* harmony import */ var _Indent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Indent */ "../../../node_modules/rc-tree/es/Indent.js"); /* harmony import */ var _utils_keyUtil__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils/keyUtil */ "../../../node_modules/rc-tree/es/utils/keyUtil.js"); /* harmony import */ var _utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utils/treeUtil */ "../../../node_modules/rc-tree/es/utils/treeUtil.js"); var _excluded = ["eventKey", "className", "style", "dragOver", "dragOverGapTop", "dragOverGapBottom", "isLeaf", "isStart", "isEnd", "expanded", "selected", "checked", "halfChecked", "loading", "domRef", "active", "data", "onMouseMove", "selectable"]; var ICON_OPEN = 'open'; var ICON_CLOSE = 'close'; var defaultTitle = '---'; var TreeNode = function TreeNode(props) { var _unstableContext$node, _context$filterTreeNo, _classNames4; var eventKey = props.eventKey, className = props.className, style = props.style, dragOver = props.dragOver, dragOverGapTop = props.dragOverGapTop, dragOverGapBottom = props.dragOverGapBottom, isLeaf = props.isLeaf, isStart = props.isStart, isEnd = props.isEnd, expanded = props.expanded, selected = props.selected, checked = props.checked, halfChecked = props.halfChecked, loading = props.loading, domRef = props.domRef, active = props.active, data = props.data, onMouseMove = props.onMouseMove, selectable = props.selectable, otherProps = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_4__["default"])(props, _excluded); var context = react__WEBPACK_IMPORTED_MODULE_5___default().useContext(_contextTypes__WEBPACK_IMPORTED_MODULE_8__.TreeContext); var unstableContext = react__WEBPACK_IMPORTED_MODULE_5___default().useContext(_contextTypes__WEBPACK_IMPORTED_MODULE_8__.UnstableContext); var selectHandleRef = react__WEBPACK_IMPORTED_MODULE_5___default().useRef(null); var _React$useState = react__WEBPACK_IMPORTED_MODULE_5___default().useState(false), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_3__["default"])(_React$useState, 2), dragNodeHighlight = _React$useState2[0], setDragNodeHighlight = _React$useState2[1]; // ======= State: Disabled State ======= var isDisabled = !!(context.disabled || props.disabled || (_unstableContext$node = unstableContext.nodeDisabled) !== null && _unstableContext$node !== void 0 && _unstableContext$node.call(unstableContext, data)); var isCheckable = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { // Return false if tree or treeNode is not checkable if (!context.checkable || props.checkable === false) { return false; } return context.checkable; }, [context.checkable, props.checkable]); // ======= Event Handlers: Selection and Check ======= var onSelect = function onSelect(e) { if (isDisabled) { return; } context.onNodeSelect(e, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props)); }; var onCheck = function onCheck(e) { if (isDisabled) { return; } if (!isCheckable || props.disableCheckbox) { return; } context.onNodeCheck(e, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props), !checked); }; // ======= State: Selectable Check ======= var isSelectable = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { // Ignore when selectable is undefined or null if (typeof selectable === 'boolean') { return selectable; } return context.selectable; }, [selectable, context.selectable]); var onSelectorClick = function onSelectorClick(e) { // Click trigger before select/check operation context.onNodeClick(e, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props)); if (isSelectable) { onSelect(e); } else { onCheck(e); } }; var onSelectorDoubleClick = function onSelectorDoubleClick(e) { context.onNodeDoubleClick(e, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props)); }; var onMouseEnter = function onMouseEnter(e) { context.onNodeMouseEnter(e, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props)); }; var onMouseLeave = function onMouseLeave(e) { context.onNodeMouseLeave(e, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props)); }; var onContextMenu = function onContextMenu(e) { context.onNodeContextMenu(e, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props)); }; // ======= Drag: Drag Enabled ======= var isDraggable = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { return !!(context.draggable && (!context.draggable.nodeDraggable || context.draggable.nodeDraggable(data))); }, [context.draggable, data]); // ======= Drag: Drag Event Handlers ======= var onDragStart = function onDragStart(e) { e.stopPropagation(); setDragNodeHighlight(true); context.onNodeDragStart(e, props); try { // ie throw error // firefox-need-it e.dataTransfer.setData('text/plain', ''); } catch (_unused) { // empty } }; var onDragEnter = function onDragEnter(e) { e.preventDefault(); e.stopPropagation(); context.onNodeDragEnter(e, props); }; var onDragOver = function onDragOver(e) { e.preventDefault(); e.stopPropagation(); context.onNodeDragOver(e, props); }; var onDragLeave = function onDragLeave(e) { e.stopPropagation(); context.onNodeDragLeave(e, props); }; var onDragEnd = function onDragEnd(e) { e.stopPropagation(); setDragNodeHighlight(false); context.onNodeDragEnd(e, props); }; var onDrop = function onDrop(e) { e.preventDefault(); e.stopPropagation(); setDragNodeHighlight(false); context.onNodeDrop(e, props); }; // ======= Expand: Node Expansion ======= var onExpand = function onExpand(e) { if (loading) { return; } context.onNodeExpand(e, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props)); }; // ======= State: Has Children ======= var hasChildren = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { var _ref = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_10__["default"])(context.keyEntities, eventKey) || {}, children = _ref.children; return Boolean((children || []).length); }, [context.keyEntities, eventKey]); // ======= State: Leaf Check ======= var memoizedIsLeaf = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { if (isLeaf === false) { return false; } return isLeaf || !context.loadData && !hasChildren || context.loadData && props.loaded && !hasChildren; }, [isLeaf, context.loadData, hasChildren, props.loaded]); // ============== Effect ============== react__WEBPACK_IMPORTED_MODULE_5___default().useEffect(function () { // Load data to avoid default expanded tree without data if (loading) { return; } // read from state to avoid loadData at same time if (typeof context.loadData === 'function' && expanded && !memoizedIsLeaf && !props.loaded) { // We needn't reload data when has children in sync logic // It's only needed in node expanded context.onNodeLoad((0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props)); } }, [loading, context.loadData, context.onNodeLoad, expanded, memoizedIsLeaf, props]); // ==================== Render: Drag Handler ==================== var dragHandlerNode = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { var _context$draggable; if (!((_context$draggable = context.draggable) !== null && _context$draggable !== void 0 && _context$draggable.icon)) { return null; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("span", { className: "".concat(context.prefixCls, "-draggable-icon") }, context.draggable.icon); }, [context.draggable]); // ====================== Render: Switcher ====================== var renderSwitcherIconDom = function renderSwitcherIconDom(isInternalLeaf) { var switcherIcon = props.switcherIcon || context.switcherIcon; // if switcherIconDom is null, no render switcher span if (typeof switcherIcon === 'function') { return switcherIcon((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, props), {}, { isLeaf: isInternalLeaf })); } return switcherIcon; }; // Switcher var renderSwitcher = function renderSwitcher() { if (memoizedIsLeaf) { // if switcherIconDom is null, no render switcher span var _switcherIconDom = renderSwitcherIconDom(true); return _switcherIconDom !== false ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("span", { className: classnames__WEBPACK_IMPORTED_MODULE_6___default()("".concat(context.prefixCls, "-switcher"), "".concat(context.prefixCls, "-switcher-noop")) }, _switcherIconDom) : null; } var switcherIconDom = renderSwitcherIconDom(false); return switcherIconDom !== false ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("span", { onClick: onExpand, className: classnames__WEBPACK_IMPORTED_MODULE_6___default()("".concat(context.prefixCls, "-switcher"), "".concat(context.prefixCls, "-switcher_").concat(expanded ? ICON_OPEN : ICON_CLOSE)) }, switcherIconDom) : null; }; // ====================== Checkbox ====================== var checkboxNode = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { if (!isCheckable) { return null; } // [Legacy] Custom element should be separate with `checkable` in future var $custom = typeof isCheckable !== 'boolean' ? isCheckable : null; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("span", { className: classnames__WEBPACK_IMPORTED_MODULE_6___default()("".concat(context.prefixCls, "-checkbox"), (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({}, "".concat(context.prefixCls, "-checkbox-checked"), checked), "".concat(context.prefixCls, "-checkbox-indeterminate"), !checked && halfChecked), "".concat(context.prefixCls, "-checkbox-disabled"), isDisabled || props.disableCheckbox)), onClick: onCheck, role: "checkbox", "aria-checked": halfChecked ? 'mixed' : checked, "aria-disabled": isDisabled || props.disableCheckbox, "aria-label": "Select ".concat(typeof props.title === 'string' ? props.title : 'tree node') }, $custom); }, [isCheckable, checked, halfChecked, isDisabled, props.disableCheckbox, props.title]); // ============== State: Node State (Open/Close) ============== var nodeState = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { if (memoizedIsLeaf) { return null; } return expanded ? ICON_OPEN : ICON_CLOSE; }, [memoizedIsLeaf, expanded]); // ==================== Render: Title + Icon ==================== var iconNode = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("span", { className: classnames__WEBPACK_IMPORTED_MODULE_6___default()("".concat(context.prefixCls, "-iconEle"), "".concat(context.prefixCls, "-icon__").concat(nodeState || 'docu'), (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({}, "".concat(context.prefixCls, "-icon_loading"), loading)) }); }, [context.prefixCls, nodeState, loading]); // =================== Drop Indicator =================== var dropIndicatorNode = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { var rootDraggable = Boolean(context.draggable); // allowDrop is calculated in Tree.tsx, there is no need for calc it here var showIndicator = !props.disabled && rootDraggable && context.dragOverNodeKey === eventKey; if (!showIndicator) { return null; } return context.dropIndicatorRender({ dropPosition: context.dropPosition, dropLevelOffset: context.dropLevelOffset, indent: context.indent, prefixCls: context.prefixCls, direction: context.direction }); }, [context.dropPosition, context.dropLevelOffset, context.indent, context.prefixCls, context.direction, context.draggable, context.dragOverNodeKey, context.dropIndicatorRender]); // Icon + Title var selectorNode = react__WEBPACK_IMPORTED_MODULE_5___default().useMemo(function () { var _props$title = props.title, title = _props$title === void 0 ? defaultTitle : _props$title; var wrapClass = "".concat(context.prefixCls, "-node-content-wrapper"); // Icon - Still show loading icon when loading without showIcon var $icon; if (context.showIcon) { var currentIcon = props.icon || context.icon; $icon = currentIcon ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("span", { className: classnames__WEBPACK_IMPORTED_MODULE_6___default()("".concat(context.prefixCls, "-iconEle"), "".concat(context.prefixCls, "-icon__customize")) }, typeof currentIcon === 'function' ? currentIcon(props) : currentIcon) : iconNode; } else if (context.loadData && loading) { $icon = iconNode; } // Title var titleNode; if (typeof title === 'function') { titleNode = title(data); } else if (context.titleRender) { titleNode = context.titleRender(data); } else { titleNode = title; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("span", { ref: selectHandleRef, title: typeof title === 'string' ? title : '', className: classnames__WEBPACK_IMPORTED_MODULE_6___default()(wrapClass, "".concat(wrapClass, "-").concat(nodeState || 'normal'), (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({}, "".concat(context.prefixCls, "-node-selected"), !isDisabled && (selected || dragNodeHighlight))), onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, onContextMenu: onContextMenu, onClick: onSelectorClick, onDoubleClick: onSelectorDoubleClick }, $icon, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("span", { className: "".concat(context.prefixCls, "-title") }, titleNode), dropIndicatorNode); }, [context.prefixCls, context.showIcon, props, context.icon, iconNode, context.titleRender, data, nodeState, onMouseEnter, onMouseLeave, onContextMenu, onSelectorClick, onSelectorDoubleClick]); var dataOrAriaAttributeProps = (0,rc_util_es_pickAttrs__WEBPACK_IMPORTED_MODULE_7__["default"])(otherProps, { aria: true, data: true }); var _ref2 = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_10__["default"])(context.keyEntities, eventKey) || {}, level = _ref2.level; var isEndNode = isEnd[isEnd.length - 1]; var draggableWithoutDisabled = !isDisabled && isDraggable; var dragging = context.draggingNodeKey === eventKey; var ariaSelected = selectable !== undefined ? { 'aria-selected': !!selectable } : undefined; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement("div", (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ ref: domRef, role: "treeitem", "aria-expanded": isLeaf ? undefined : expanded, className: classnames__WEBPACK_IMPORTED_MODULE_6___default()(className, "".concat(context.prefixCls, "-treenode"), (_classNames4 = {}, (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])(_classNames4, "".concat(context.prefixCls, "-treenode-disabled"), isDisabled), "".concat(context.prefixCls, "-treenode-switcher-").concat(expanded ? 'open' : 'close'), !isLeaf), "".concat(context.prefixCls, "-treenode-checkbox-checked"), checked), "".concat(context.prefixCls, "-treenode-checkbox-indeterminate"), halfChecked), "".concat(context.prefixCls, "-treenode-selected"), selected), "".concat(context.prefixCls, "-treenode-loading"), loading), "".concat(context.prefixCls, "-treenode-active"), active), "".concat(context.prefixCls, "-treenode-leaf-last"), isEndNode), "".concat(context.prefixCls, "-treenode-draggable"), isDraggable), "dragging", dragging), (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])(_classNames4, 'drop-target', context.dropTargetKey === eventKey), 'drop-container', context.dropContainerKey === eventKey), 'drag-over', !isDisabled && dragOver), 'drag-over-gap-top', !isDisabled && dragOverGapTop), 'drag-over-gap-bottom', !isDisabled && dragOverGapBottom), 'filter-node', (_context$filterTreeNo = context.filterTreeNode) === null || _context$filterTreeNo === void 0 ? void 0 : _context$filterTreeNo.call(context, (0,_utils_treeUtil__WEBPACK_IMPORTED_MODULE_11__.convertNodePropsToEventData)(props))), "".concat(context.prefixCls, "-treenode-leaf"), memoizedIsLeaf))), style: style // Draggable config , draggable: draggableWithoutDisabled, onDragStart: draggableWithoutDisabled ? onDragStart : undefined // Drop config , onDragEnter: isDraggable ? onDragEnter : undefined, onDragOver: isDraggable ? onDragOver : undefined, onDragLeave: isDraggable ? onDragLeave : undefined, onDrop: isDraggable ? onDrop : undefined, onDragEnd: isDraggable ? onDragEnd : undefined, onMouseMove: onMouseMove }, ariaSelected, dataOrAriaAttributeProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement(_Indent__WEBPACK_IMPORTED_MODULE_9__["default"], { prefixCls: context.prefixCls, level: level, isStart: isStart, isEnd: isEnd }), dragHandlerNode, renderSwitcher(), checkboxNode, selectorNode); }; TreeNode.isTreeNode = 1; if (true) { TreeNode.displayName = 'TreeNode'; } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TreeNode); /***/ }), /***/ "../../../node_modules/rc-tree/es/contextTypes.js": /*!********************************************************!*\ !*** ../../../node_modules/rc-tree/es/contextTypes.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ TreeContext: () => (/* binding */ TreeContext), /* harmony export */ UnstableContext: () => (/* binding */ UnstableContext) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /** * Webpack has bug for import loop, which is not the same behavior as ES module. * When util.js imports the TreeNode for tree generate will cause treeContextTypes be empty. */ var TreeContext = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createContext(null); /** Internal usage, safe to remove. Do not use in prod */ var UnstableContext = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createContext({}); /***/ }), /***/ "../../../node_modules/rc-tree/es/index.js": /*!*************************************************!*\ !*** ../../../node_modules/rc-tree/es/index.js ***! \*************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ TreeNode: () => (/* reexport safe */ _TreeNode__WEBPACK_IMPORTED_MODULE_1__["default"]), /* harmony export */ UnstableContext: () => (/* reexport safe */ _contextTypes__WEBPACK_IMPORTED_MODULE_2__.UnstableContext), /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _Tree__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Tree */ "../../../node_modules/rc-tree/es/Tree.js"); /* harmony import */ var _TreeNode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./TreeNode */ "../../../node_modules/rc-tree/es/TreeNode.js"); /* harmony import */ var _contextTypes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./contextTypes */ "../../../node_modules/rc-tree/es/contextTypes.js"); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_Tree__WEBPACK_IMPORTED_MODULE_0__["default"]); /***/ }), /***/ "../../../node_modules/rc-tree/es/useUnmount.js": /*!******************************************************!*\ !*** ../../../node_modules/rc-tree/es/useUnmount.js ***! \******************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rc-util/es/hooks/useLayoutEffect */ "../../../node_modules/rc-util/es/hooks/useLayoutEffect.js"); /** * Trigger only when component unmount */ function useUnmount(triggerStart, triggerEnd) { var _React$useState = react__WEBPACK_IMPORTED_MODULE_1__.useState(false), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__["default"])(_React$useState, 2), firstMount = _React$useState2[0], setFirstMount = _React$useState2[1]; (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_2__["default"])(function () { if (firstMount) { triggerStart(); return function () { triggerEnd(); }; } }, [firstMount]); (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_2__["default"])(function () { setFirstMount(true); return function () { setFirstMount(false); }; }, []); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useUnmount); /***/ }), /***/ "../../../node_modules/rc-tree/es/util.js": /*!************************************************!*\ !*** ../../../node_modules/rc-tree/es/util.js ***! \************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ arrAdd: () => (/* binding */ arrAdd), /* harmony export */ arrDel: () => (/* binding */ arrDel), /* harmony export */ calcDropPosition: () => (/* binding */ calcDropPosition), /* harmony export */ calcSelectedKeys: () => (/* binding */ calcSelectedKeys), /* harmony export */ conductExpandParent: () => (/* binding */ conductExpandParent), /* harmony export */ convertDataToTree: () => (/* binding */ convertDataToTree), /* harmony export */ getDragChildrenKeys: () => (/* binding */ getDragChildrenKeys), /* harmony export */ getPosition: () => (/* reexport safe */ _utils_treeUtil__WEBPACK_IMPORTED_MODULE_8__.getPosition), /* harmony export */ isFirstChild: () => (/* binding */ isFirstChild), /* harmony export */ isLastChild: () => (/* binding */ isLastChild), /* harmony export */ isTreeNode: () => (/* reexport safe */ _utils_treeUtil__WEBPACK_IMPORTED_MODULE_8__.isTreeNode), /* harmony export */ parseCheckedKeys: () => (/* binding */ parseCheckedKeys), /* harmony export */ posToArr: () => (/* binding */ posToArr) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/esm/toConsumableArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ "../../../node_modules/@babel/runtime/helpers/esm/typeof.js"); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ "../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); /* harmony import */ var rc_util_es_warning__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! rc-util/es/warning */ "../../../node_modules/rc-util/es/warning.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _TreeNode__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./TreeNode */ "../../../node_modules/rc-tree/es/TreeNode.js"); /* harmony import */ var _utils_keyUtil__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/keyUtil */ "../../../node_modules/rc-tree/es/utils/keyUtil.js"); /* harmony import */ var _utils_treeUtil__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/treeUtil */ "../../../node_modules/rc-tree/es/utils/treeUtil.js"); var _excluded = ["children"]; /* eslint-disable no-lonely-if */ /** * Legacy code. Should avoid to use if you are new to import these code. */ function arrDel(list, value) { if (!list) return []; var clone = list.slice(); var index = clone.indexOf(value); if (index >= 0) { clone.splice(index, 1); } return clone; } function arrAdd(list, value) { var clone = (list || []).slice(); if (clone.indexOf(value) === -1) { clone.push(value); } return clone; } function posToArr(pos) { return pos.split('-'); } function getDragChildrenKeys(dragNodeKey, keyEntities) { // not contains self // self for left or right drag var dragChildrenKeys = []; var entity = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_7__["default"])(keyEntities, dragNodeKey); function dig() { var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; list.forEach(function (_ref) { var key = _ref.key, children = _ref.children; dragChildrenKeys.push(key); dig(children); }); } dig(entity.children); return dragChildrenKeys; } function isLastChild(treeNodeEntity) { if (treeNodeEntity.parent) { var posArr = posToArr(treeNodeEntity.pos); return Number(posArr[posArr.length - 1]) === treeNodeEntity.parent.children.length - 1; } return false; } function isFirstChild(treeNodeEntity) { var posArr = posToArr(treeNodeEntity.pos); return Number(posArr[posArr.length - 1]) === 0; } // Only used when drag, not affect SSR. function calcDropPosition(event, dragNodeProps, targetNodeProps, indent, startMousePosition, allowDrop, flattenedNodes, keyEntities, expandKeys, direction) { var _abstractDropNodeEnti; var clientX = event.clientX, clientY = event.clientY; var _getBoundingClientRec = event.target.getBoundingClientRect(), top = _getBoundingClientRec.top, height = _getBoundingClientRec.height; // optional chain for testing var horizontalMouseOffset = (direction === 'rtl' ? -1 : 1) * (((startMousePosition === null || startMousePosition === void 0 ? void 0 : startMousePosition.x) || 0) - clientX); var rawDropLevelOffset = (horizontalMouseOffset - 12) / indent; // Filter the expanded keys to exclude the node that not has children currently (like async nodes). var filteredExpandKeys = expandKeys.filter(function (key) { var _keyEntities$key; return (_keyEntities$key = keyEntities[key]) === null || _keyEntities$key === void 0 || (_keyEntities$key = _keyEntities$key.children) === null || _keyEntities$key === void 0 ? void 0 : _keyEntities$key.length; }); // find abstract drop node by horizontal offset var abstractDropNodeEntity = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_7__["default"])(keyEntities, targetNodeProps.eventKey); if (clientY < top + height / 2) { // first half, set abstract drop node to previous node var nodeIndex = flattenedNodes.findIndex(function (flattenedNode) { return flattenedNode.key === abstractDropNodeEntity.key; }); var prevNodeIndex = nodeIndex <= 0 ? 0 : nodeIndex - 1; var prevNodeKey = flattenedNodes[prevNodeIndex].key; abstractDropNodeEntity = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_7__["default"])(keyEntities, prevNodeKey); } var initialAbstractDropNodeKey = abstractDropNodeEntity.key; var abstractDragOverEntity = abstractDropNodeEntity; var dragOverNodeKey = abstractDropNodeEntity.key; var dropPosition = 0; var dropLevelOffset = 0; // Only allow cross level drop when dragging on a non-expanded node if (!filteredExpandKeys.includes(initialAbstractDropNodeKey)) { for (var i = 0; i < rawDropLevelOffset; i += 1) { if (isLastChild(abstractDropNodeEntity)) { abstractDropNodeEntity = abstractDropNodeEntity.parent; dropLevelOffset += 1; } else { break; } } } var abstractDragDataNode = dragNodeProps.data; var abstractDropDataNode = abstractDropNodeEntity.node; var dropAllowed = true; if (isFirstChild(abstractDropNodeEntity) && abstractDropNodeEntity.level === 0 && clientY < top + height / 2 && allowDrop({ dragNode: abstractDragDataNode, dropNode: abstractDropDataNode, dropPosition: -1 }) && abstractDropNodeEntity.key === targetNodeProps.eventKey) { // first half of first node in first level dropPosition = -1; } else if ((abstractDragOverEntity.children || []).length && filteredExpandKeys.includes(dragOverNodeKey)) { // drop on expanded node // only allow drop inside if (allowDrop({ dragNode: abstractDragDataNode, dropNode: abstractDropDataNode, dropPosition: 0 })) { dropPosition = 0; } else { dropAllowed = false; } } else if (dropLevelOffset === 0) { if (rawDropLevelOffset > -1.5) { // | Node | <- abstractDropNode // | -^-===== | <- mousePosition // 1. try drop after // 2. do not allow drop if (allowDrop({ dragNode: abstractDragDataNode, dropNode: abstractDropDataNode, dropPosition: 1 })) { dropPosition = 1; } else { dropAllowed = false; } } else { // | Node | <- abstractDropNode // | ---==^== | <- mousePosition // whether it has children or doesn't has children // always // 1. try drop inside // 2. try drop after // 3. do not allow drop if (allowDrop({ dragNode: abstractDragDataNode, dropNode: abstractDropDataNode, dropPosition: 0 })) { dropPosition = 0; } else if (allowDrop({ dragNode: abstractDragDataNode, dropNode: abstractDropDataNode, dropPosition: 1 })) { dropPosition = 1; } else { dropAllowed = false; } } } else { // | Node1 | <- abstractDropNode // | Node2 | // --^--|----=====| <- mousePosition // 1. try insert after Node1 // 2. do not allow drop if (allowDrop({ dragNode: abstractDragDataNode, dropNode: abstractDropDataNode, dropPosition: 1 })) { dropPosition = 1; } else { dropAllowed = false; } } return { dropPosition: dropPosition, dropLevelOffset: dropLevelOffset, dropTargetKey: abstractDropNodeEntity.key, dropTargetPos: abstractDropNodeEntity.pos, dragOverNodeKey: dragOverNodeKey, dropContainerKey: dropPosition === 0 ? null : ((_abstractDropNodeEnti = abstractDropNodeEntity.parent) === null || _abstractDropNodeEnti === void 0 ? void 0 : _abstractDropNodeEnti.key) || null, dropAllowed: dropAllowed }; } /** * Return selectedKeys according with multiple prop * @param selectedKeys * @param props * @returns [string] */ function calcSelectedKeys(selectedKeys, props) { if (!selectedKeys) return undefined; var multiple = props.multiple; if (multiple) { return selectedKeys.slice(); } if (selectedKeys.length) { return [selectedKeys[0]]; } return selectedKeys; } var internalProcessProps = function internalProcessProps(props) { return props; }; function convertDataToTree(treeData, processor) { if (!treeData) return []; var _ref2 = processor || {}, _ref2$processProps = _ref2.processProps, processProps = _ref2$processProps === void 0 ? internalProcessProps : _ref2$processProps; var list = Array.isArray(treeData) ? treeData : [treeData]; return list.map(function (_ref3) { var children = _ref3.children, props = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__["default"])(_ref3, _excluded); var childrenNodes = convertDataToTree(children, processor); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default().createElement(_TreeNode__WEBPACK_IMPORTED_MODULE_6__["default"], (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__["default"])({ key: props.key }, processProps(props)), childrenNodes); }); } /** * Parse `checkedKeys` to { checkedKeys, halfCheckedKeys } style */ function parseCheckedKeys(keys) { if (!keys) { return null; } // Convert keys to object format var keyProps; if (Array.isArray(keys)) { // [Legacy] Follow the api doc keyProps = { checkedKeys: keys, halfCheckedKeys: undefined }; } else if ((0,_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__["default"])(keys) === 'object') { keyProps = { checkedKeys: keys.checked || undefined, halfCheckedKeys: keys.halfChecked || undefined }; } else { (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_4__["default"])(false, '`checkedKeys` is not an array or an object'); return null; } return keyProps; } /** * If user use `autoExpandParent` we should get the list of parent node * @param keyList * @param keyEntities */ function conductExpandParent(keyList, keyEntities) { var expandedKeys = new Set(); function conductUp(key) { if (expandedKeys.has(key)) return; var entity = (0,_utils_keyUtil__WEBPACK_IMPORTED_MODULE_7__["default"])(keyEntities, key); if (!entity) return; expandedKeys.add(key); var parent = entity.parent, node = entity.node; if (node.disabled) return; if (parent) { conductUp(parent.key); } } (keyList || []).forEach(function (key) { conductUp(key); }); return (0,_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__["default"])(expandedKeys); } /***/ }), /***/ "../../../node_modules/rc-tree/es/utils/conductUtil.js": /*!*************************************************************!*\ !*** ../../../node_modules/rc-tree/es/utils/conductUtil.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ conductCheck: () => (/* binding */ conductCheck), /* harmony export */ isCheckDisabled: () => (/* binding */ isCheckDisabled) /* harmony export */ }); /* harmony import */ var rc_util_es_warning__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! rc-util/es/warning */ "../../../node_modules/rc-util/es/warning.js"); /* harmony import */ var _keyUtil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keyUtil */ "../../../node_modules/rc-tree/es/utils/keyUtil.js"); function removeFromCheckedKeys(halfCheckedKeys, checkedKeys) { var filteredKeys = new Set(); halfCheckedKeys.forEach(function (key) { if (!checkedKeys.has(key)) { filteredKeys.add(key); } }); return filteredKeys; } function isCheckDisabled(node) { var _ref = node || {}, disabled = _ref.disabled, disableCheckbox = _ref.disableCheckbox, checkable = _ref.checkable; return !!(disabled || disableCheckbox) || checkable === false; } // Fill miss keys function fillConductCheck(keys, levelEntities, maxLevel, syntheticGetCheckDisabled) { var checkedKeys = new Set(keys); var halfCheckedKeys = new Set(); // Add checked keys top to bottom for (var level = 0; level <= maxLevel; level += 1) { var entities = levelEntities.get(level) || new Set(); entities.forEach(function (entity) { var key = entity.key, node = entity.node, _entity$children = entity.children, children = _entity$children === void 0 ? [] : _entity$children; if (checkedKeys.has(key) && !syntheticGetCheckDisabled(node)) { children.filter(function (childEntity) { return !syntheticGetCheckDisabled(childEntity.node); }).forEach(function (childEntity) { checkedKeys.add(childEntity.key); }); } }); } // Add checked keys from bottom to top var visitedKeys = new Set(); for (var _level = maxLevel; _level >= 0; _level -= 1) { var _entities = levelEntities.get(_level) || new Set(); _entities.forEach(function (entity) { var parent = entity.parent, node = entity.node; // Skip if no need to check if (syntheticGetCheckDisabled(node) || !entity.parent || visitedKeys.has(entity.parent.key)) { return; } // Skip if parent is disabled if (syntheticGetCheckDisabled(entity.parent.node)) { visitedKeys.add(parent.key); return; } var allChecked = true; var partialChecked = false; (parent.children || []).filter(function (childEntity) { return !syntheticGetCheckDisabled(childEntity.node); }).forEach(function (_ref2) { var key = _ref2.key; var checked = checkedKeys.has(key); if (allChecked && !checked) { allChecked = false; } if (!partialChecked && (checked || halfCheckedKeys.has(key))) { partialChecked = true; } }); if (allChecked) { checkedKeys.add(parent.key); } if (partialChecked) { halfCheckedKeys.add(parent.key); } visitedKeys.add(parent.key); }); } return { checkedKeys: Array.from(checkedKeys), halfCheckedKeys: Array.from(removeFromCheckedKeys(halfCheckedKeys, checkedKeys)) }; } // Remove useless key function cleanConductCheck(keys, halfKeys, levelEntities, maxLevel, syntheticGetCheckDisabled) { var checkedKeys = new Set(keys); var halfCheckedKeys = new Set(halfKeys); // Remove checked keys from top to bottom for (var level = 0; level <= maxLevel; level += 1) { var entities = levelEntities.get(level) || new Set(); entities.forEach(function (entity) { var key = entity.key, node = entity.node, _entity$children2 = entity.children, children = _entity$children2 === void 0 ? [] : _entity$children2; if (!checkedKeys.has(key) && !halfCheckedKeys.has(key) && !syntheticGetCheckDisabled(node)) { children.filter(function (childEntity) { return !syntheticGetCheckDisabled(childEntity.node); }).forEach(function (childEntity) { checkedKeys.delete(childEntity.key); }); } }); } // Remove checked keys form bottom to top halfCheckedKeys = new Set(); var visitedKeys = new Set(); for (var _level2 = maxLevel; _level2 >= 0; _level2 -= 1) { var _entities2 = levelEntities.get(_level2) || new Set(); _entities2.forEach(function (entity) { var parent = entity.parent, node = entity.node; // Skip if no need to check if (syntheticGetCheckDisabled(node) || !entity.parent || visitedKeys.has(entity.parent.key)) { return; } // Skip if parent is disabled if (syntheticGetCheckDisabled(entity.parent.node)) { visitedKeys.add(parent.key); return; } var allChecked = true; var partialChecked = false; (parent.children || []).filter(function (childEntity) { return !syntheticGetCheckDisabled(childEntity.node); }).forEach(function (_ref3) { var key = _ref3.key; var checked = checkedKeys.has(key); if (allChecked && !checked) { allChecked = false; } if (!partialChecked && (checked || halfCheckedKeys.has(key))) { partialChecked = true; } }); if (!allChecked) { checkedKeys.delete(parent.key); } if (partialChecked) { halfCheckedKeys.add(parent.key); } visitedKeys.add(parent.key); }); } return { checkedKeys: Array.from(checkedKeys), halfCheckedKeys: Array.from(removeFromCheckedKeys(halfCheckedKeys, checkedKeys)) }; } /** * Conduct with keys. * @param keyList current key list * @param keyEntities key - dataEntity map * @param mode `fill` to fill missing key, `clean` to remove useless key */ function conductCheck(keyList, checked, keyEntities, getCheckDisabled) { var warningMissKeys = []; var syntheticGetCheckDisabled; if (getCheckDisabled) { syntheticGetCheckDisabled = getCheckDisabled; } else { syntheticGetCheckDisabled = isCheckDisabled; } // We only handle exist keys var keys = new Set(keyList.filter(function (key) { var hasEntity = !!(0,_keyUtil__WEBPACK_IMPORTED_MODULE_1__["default"])(keyEntities, key); if (!hasEntity) { warningMissKeys.push(key); } return hasEntity; })); var levelEntities = new Map(); var maxLevel = 0; // Convert entities by level for calculation Object.keys(keyEntities).forEach(function (key) { var entity = keyEntities[key]; var level = entity.level; var levelSet = levelEntities.get(level); if (!levelSet) { levelSet = new Set(); levelEntities.set(level, levelSet); } levelSet.add(entity); maxLevel = Math.max(maxLevel, level); }); (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_0__["default"])(!warningMissKeys.length, "Tree missing follow keys: ".concat(warningMissKeys.slice(0, 100).map(function (key) { return "'".concat(key, "'"); }).join(', '))); var result; if (checked === true) { result = fillConductCheck(keys, levelEntities, maxLevel, syntheticGetCheckDisabled); } else { result = cleanConductCheck(keys, checked.halfCheckedKeys, levelEntities, maxLevel, syntheticGetCheckDisabled); } return result; } /***/ }), /***/ "../../../node_modules/rc-tree/es/utils/diffUtil.js": /*!**********************************************************!*\ !*** ../../../node_modules/rc-tree/es/utils/diffUtil.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ findExpandedKeys: () => (/* binding */ findExpandedKeys), /* harmony export */ getExpandRange: () => (/* binding */ getExpandRange) /* harmony export */ }); function findExpandedKeys() { var prev = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var next = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var prevLen = prev.length; var nextLen = next.length; if (Math.abs(prevLen - nextLen) !== 1) { return { add: false, key: null }; } function find(shorter, longer) { var cache = new Map(); shorter.forEach(function (key) { cache.set(key, true); }); var keys = longer.filter(function (key) { return !cache.has(key); }); return keys.length === 1 ? keys[0] : null; } if (prevLen < nextLen) { return { add: true, key: find(prev, next) }; } return { add: false, key: find(next, prev) }; } function getExpandRange(shorter, longer, key) { var shorterStartIndex = shorter.findIndex(function (data) { return data.key === key; }); var shorterEndNode = shorter[shorterStartIndex + 1]; var longerStartIndex = longer.findIndex(function (data) { return data.key === key; }); if (shorterEndNode) { var longerEndIndex = longer.findIndex(function (data) { return data.key === shorterEndNode.key; }); return longer.slice(longerStartIndex + 1, longerEndIndex); } return longer.slice(longerStartIndex + 1); } /***/ }), /***/ "../../../node_modules/rc-tree/es/utils/keyUtil.js": /*!*********************************************************!*\ !*** ../../../node_modules/rc-tree/es/utils/keyUtil.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ getEntity) /* harmony export */ }); function getEntity(keyEntities, key) { return keyEntities[key]; } /***/ }), /***/ "../../../node_modules/rc-tree/es/utils/treeUtil.js": /*!**********************************************************!*\ !*** ../../../node_modules/rc-tree/es/utils/treeUtil.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ convertDataToEntities: () => (/* binding */ convertDataToEntities), /* harmony export */ convertNodePropsToEventData: () => (/* binding */ convertNodePropsToEventData), /* harmony export */ convertTreeToData: () => (/* binding */ convertTreeToData), /* harmony export */ fillFieldNames: () => (/* binding */ fillFieldNames), /* harmony export */ flattenTreeData: () => (/* binding */ flattenTreeData), /* harmony export */ getKey: () => (/* binding */ getKey), /* harmony export */ getPosition: () => (/* binding */ getPosition), /* harmony export */ getTreeNodeProps: () => (/* binding */ getTreeNodeProps), /* harmony export */ isTreeNode: () => (/* binding */ isTreeNode), /* harmony export */ traverseDataNodes: () => (/* binding */ traverseDataNodes), /* harmony export */ warningWithoutKey: () => (/* binding */ warningWithoutKey) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ "../../../node_modules/@babel/runtime/helpers/esm/typeof.js"); /* harmony import */ var _babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/esm/toConsumableArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ "../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); /* harmony import */ var rc_util_es_Children_toArray__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! rc-util/es/Children/toArray */ "../../../node_modules/rc-util/es/Children/toArray.js"); /* harmony import */ var rc_util_es_omit__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! rc-util/es/omit */ "../../../node_modules/rc-util/es/omit.js"); /* harmony import */ var rc_util_es_warning__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! rc-util/es/warning */ "../../../node_modules/rc-util/es/warning.js"); /* harmony import */ var _keyUtil__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./keyUtil */ "../../../node_modules/rc-tree/es/utils/keyUtil.js"); var _excluded = ["children"]; function getPosition(level, index) { return "".concat(level, "-").concat(index); } function isTreeNode(node) { return node && node.type && node.type.isTreeNode; } function getKey(key, pos) { if (key !== null && key !== undefined) { return key; } return pos; } function fillFieldNames(fieldNames) { var _ref = fieldNames || {}, title = _ref.title, _title = _ref._title, key = _ref.key, children = _ref.children; var mergedTitle = title || 'title'; return { title: mergedTitle, _title: _title || [mergedTitle], key: key || 'key', children: children || 'children' }; } /** * Warning if TreeNode do not provides key */ function warningWithoutKey(treeData, fieldNames) { var keys = new Map(); function dig(list) { var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; (list || []).forEach(function (treeNode) { var key = treeNode[fieldNames.key]; var children = treeNode[fieldNames.children]; (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_6__["default"])(key !== null && key !== undefined, "Tree node must have a certain key: [".concat(path).concat(key, "]")); var recordKey = String(key); (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_6__["default"])(!keys.has(recordKey) || key === null || key === undefined, "Same 'key' exist in the Tree: ".concat(recordKey)); keys.set(recordKey, true); dig(children, "".concat(path).concat(recordKey, " > ")); }); } dig(treeData); } /** * Convert `children` of Tree into `treeData` structure. */ function convertTreeToData(rootNodes) { function dig(node) { var treeNodes = (0,rc_util_es_Children_toArray__WEBPACK_IMPORTED_MODULE_4__["default"])(node); return treeNodes.map(function (treeNode) { // Filter invalidate node if (!isTreeNode(treeNode)) { (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_6__["default"])(!treeNode, 'Tree/TreeNode can only accept TreeNode as children.'); return null; } var key = treeNode.key; var _treeNode$props = treeNode.props, children = _treeNode$props.children, rest = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_3__["default"])(_treeNode$props, _excluded); var dataNode = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({ key: key }, rest); var parsedChildren = dig(children); if (parsedChildren.length) { dataNode.children = parsedChildren; } return dataNode; }).filter(function (dataNode) { return dataNode; }); } return dig(rootNodes); } /** * Flat nest tree data into flatten list. This is used for virtual list render. * @param treeNodeList Origin data node list * @param expandedKeys * need expanded keys, provides `true` means all expanded (used in `rc-tree-select`). */ function flattenTreeData(treeNodeList, expandedKeys, fieldNames) { var _fillFieldNames = fillFieldNames(fieldNames), fieldTitles = _fillFieldNames._title, fieldKey = _fillFieldNames.key, fieldChildren = _fillFieldNames.children; var expandedKeySet = new Set(expandedKeys === true ? [] : expandedKeys); var flattenList = []; function dig(list) { var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; return list.map(function (treeNode, index) { var pos = getPosition(parent ? parent.pos : '0', index); var mergedKey = getKey(treeNode[fieldKey], pos); // Pick matched title in field title list var mergedTitle; for (var i = 0; i < fieldTitles.length; i += 1) { var fieldTitle = fieldTitles[i]; if (treeNode[fieldTitle] !== undefined) { mergedTitle = treeNode[fieldTitle]; break; } } // Add FlattenDataNode into list // We use `Object.assign` here to save perf since babel's `objectSpread` has perf issue var flattenNode = Object.assign((0,rc_util_es_omit__WEBPACK_IMPORTED_MODULE_5__["default"])(treeNode, [].concat((0,_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__["default"])(fieldTitles), [fieldKey, fieldChildren])), { title: mergedTitle, key: mergedKey, parent: parent, pos: pos, children: null, data: treeNode, isStart: [].concat((0,_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__["default"])(parent ? parent.isStart : []), [index === 0]), isEnd: [].concat((0,_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__["default"])(parent ? parent.isEnd : []), [index === list.length - 1]) }); flattenList.push(flattenNode); // Loop treeNode children if (expandedKeys === true || expandedKeySet.has(mergedKey)) { flattenNode.children = dig(treeNode[fieldChildren] || [], flattenNode); } else { flattenNode.children = []; } return flattenNode; }); } dig(treeNodeList); return flattenList; } /** * Traverse all the data by `treeData`. * Please not use it out of the `rc-tree` since we may refactor this code. */ function traverseDataNodes(dataNodes, callback, // To avoid too many params, let use config instead of origin param config) { var mergedConfig = {}; if ((0,_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__["default"])(config) === 'object') { mergedConfig = config; } else { mergedConfig = { externalGetKey: config }; } mergedConfig = mergedConfig || {}; // Init config var _mergedConfig = mergedConfig, childrenPropName = _mergedConfig.childrenPropName, externalGetKey = _mergedConfig.externalGetKey, fieldNames = _mergedConfig.fieldNames; var _fillFieldNames2 = fillFieldNames(fieldNames), fieldKey = _fillFieldNames2.key, fieldChildren = _fillFieldNames2.children; var mergeChildrenPropName = childrenPropName || fieldChildren; // Get keys var syntheticGetKey; if (externalGetKey) { if (typeof externalGetKey === 'string') { syntheticGetKey = function syntheticGetKey(node) { return node[externalGetKey]; }; } else if (typeof externalGetKey === 'function') { syntheticGetKey = function syntheticGetKey(node) { return externalGetKey(node); }; } } else { syntheticGetKey = function syntheticGetKey(node, pos) { return getKey(node[fieldKey], pos); }; } // Process function processNode(node, index, parent, pathNodes) { var children = node ? node[mergeChildrenPropName] : dataNodes; var pos = node ? getPosition(parent.pos, index) : '0'; var connectNodes = node ? [].concat((0,_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__["default"])(pathNodes), [node]) : []; // Process node if is not root if (node) { var key = syntheticGetKey(node, pos); var _data = { node: node, index: index, pos: pos, key: key, parentPos: parent.node ? parent.pos : null, level: parent.level + 1, nodes: connectNodes }; callback(_data); } // Process children node if (children) { children.forEach(function (subNode, subIndex) { processNode(subNode, subIndex, { node: node, pos: pos, level: parent ? parent.level + 1 : -1 }, connectNodes); }); } } processNode(null); } /** * Convert `treeData` into entity records. */ function convertDataToEntities(dataNodes) { var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, initWrapper = _ref2.initWrapper, processEntity = _ref2.processEntity, onProcessFinished = _ref2.onProcessFinished, externalGetKey = _ref2.externalGetKey, childrenPropName = _ref2.childrenPropName, fieldNames = _ref2.fieldNames; var /** @deprecated Use `config.externalGetKey` instead */ legacyExternalGetKey = arguments.length > 2 ? arguments[2] : undefined; // Init config var mergedExternalGetKey = externalGetKey || legacyExternalGetKey; var posEntities = {}; var keyEntities = {}; var wrapper = { posEntities: posEntities, keyEntities: keyEntities }; if (initWrapper) { wrapper = initWrapper(wrapper) || wrapper; } traverseDataNodes(dataNodes, function (item) { var node = item.node, index = item.index, pos = item.pos, key = item.key, parentPos = item.parentPos, level = item.level, nodes = item.nodes; var entity = { node: node, nodes: nodes, index: index, key: key, pos: pos, level: level }; var mergedKey = getKey(key, pos); posEntities[pos] = entity; keyEntities[mergedKey] = entity; // Fill children entity.parent = posEntities[parentPos]; if (entity.parent) { entity.parent.children = entity.parent.children || []; entity.parent.children.push(entity); } if (processEntity) { processEntity(entity, wrapper); } }, { externalGetKey: mergedExternalGetKey, childrenPropName: childrenPropName, fieldNames: fieldNames }); if (onProcessFinished) { onProcessFinished(wrapper); } return wrapper; } /** * Get TreeNode props with Tree props. */ function getTreeNodeProps(key, _ref3) { var expandedKeys = _ref3.expandedKeys, selectedKeys = _ref3.selectedKeys, loadedKeys = _ref3.loadedKeys, loadingKeys = _ref3.loadingKeys, checkedKeys = _ref3.checkedKeys, halfCheckedKeys = _ref3.halfCheckedKeys, dragOverNodeKey = _ref3.dragOverNodeKey, dropPosition = _ref3.dropPosition, keyEntities = _ref3.keyEntities; var entity = (0,_keyUtil__WEBPACK_IMPORTED_MODULE_7__["default"])(keyEntities, key); var treeNodeProps = { eventKey: key, expanded: expandedKeys.indexOf(key) !== -1, selected: selectedKeys.indexOf(key) !== -1, loaded: loadedKeys.indexOf(key) !== -1, loading: loadingKeys.indexOf(key) !== -1, checked: checkedKeys.indexOf(key) !== -1, halfChecked: halfCheckedKeys.indexOf(key) !== -1, pos: String(entity ? entity.pos : ''), // [Legacy] Drag props // Since the interaction of drag is changed, the semantic of the props are // not accuracy, I think it should be finally removed dragOver: dragOverNodeKey === key && dropPosition === 0, dragOverGapTop: dragOverNodeKey === key && dropPosition === -1, dragOverGapBottom: dragOverNodeKey === key && dropPosition === 1 }; return treeNodeProps; } function convertNodePropsToEventData(props) { var data = props.data, expanded = props.expanded, selected = props.selected, checked = props.checked, loaded = props.loaded, loading = props.loading, halfChecked = props.halfChecked, dragOver = props.dragOver, dragOverGapTop = props.dragOverGapTop, dragOverGapBottom = props.dragOverGapBottom, pos = props.pos, active = props.active, eventKey = props.eventKey; var eventData = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, data), {}, { expanded: expanded, selected: selected, checked: checked, loaded: loaded, loading: loading, halfChecked: halfChecked, dragOver: dragOver, dragOverGapTop: dragOverGapTop, dragOverGapBottom: dragOverGapBottom, pos: pos, active: active, key: eventKey }); if (!('props' in eventData)) { Object.defineProperty(eventData, 'props', { get: function get() { (0,rc_util_es_warning__WEBPACK_IMPORTED_MODULE_6__["default"])(false, 'Second param return from event is node data instead of TreeNode instance. Please read value directly instead of reading from `props`.'); return props; } }); } return eventData; } /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfcmMtdGV4dGFyZWFfZXNfaW5kZXhfanMtbm9kZV9tb2R1bGVzX3JjLXRvb2x0aXBfZXNfaW5kZXhfanMtbm9kZV9tb2R1bGVzLWFlNDAxOS52b2x1bnRlZXJhcGkuOGMwNjM5Mjc0ZjJmYmJhZTIzY2YuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBMEQ7QUFDYztBQUNIO0FBQ2I7QUFDYztBQUNvQjtBQUMxRjtBQUNvQztBQUNZO0FBQ2U7QUFDRjtBQUM1QjtBQUNGO0FBQzRCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyw4Q0FBZ0I7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiw4RkFBd0I7O0FBRXhDO0FBQ0Esd0JBQXdCLDJFQUFjO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLHVCQUF1QixvRkFBYztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IsMENBQVk7QUFDaEMsRUFBRSx1REFBeUI7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLHVCQUF1QiwyQ0FBYTtBQUNwQyxzQkFBc0IsNkVBQU87QUFDN0I7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLHNCQUFzQixvRkFBYztBQUNwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixrQkFBa0I7QUFDckM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3Qiw0Q0FBYztBQUN0Qyx1QkFBdUIsb0ZBQWM7QUFDckM7QUFDQTtBQUNBLHlCQUF5Qiw0Q0FBYztBQUN2Qyx1QkFBdUIs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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asb0ZBQW9GO0FBQ3BGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG9EQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isb0ZBQWEsQ0FBQyxvRkFBYSxHQUFHLFdBQVc7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLFFBQVEsOERBQU87QUFDZjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXRleHRhcmVhL2VzL1Jlc2l6YWJsZVRleHRBcmVhLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXRleHRhcmVhL2VzL1RleHRBcmVhLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXRleHRhcmVhL2VzL2NhbGN1bGF0ZU5vZGVIZWlnaHQuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdGV4dGFyZWEvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdG9vbHRpcC9lcy9Qb3B1cC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy10b29sdGlwL2VzL1Rvb2x0aXAuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdG9vbHRpcC9lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy10b29sdGlwL2VzL3BsYWNlbWVudHMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdHJlZS9lcy9Ecm9wSW5kaWNhdG9yLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvSW5kZW50LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvTW90aW9uVHJlZU5vZGUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdHJlZS9lcy9Ob2RlTGlzdC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy10cmVlL2VzL1RyZWUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdHJlZS9lcy9UcmVlTm9kZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy10cmVlL2VzL2NvbnRleHRUeXBlcy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy10cmVlL2VzL2luZGV4LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvdXNlVW5tb3VudC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy10cmVlL2VzL3V0aWwuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdHJlZS9lcy91dGlscy9jb25kdWN0VXRpbC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy10cmVlL2VzL3V0aWxzL2RpZmZVdGlsLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXRyZWUvZXMvdXRpbHMva2V5VXRpbC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy10cmVlL2VzL3V0aWxzL3RyZWVVdGlsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wicHJlZml4Q2xzXCIsIFwiZGVmYXVsdFZhbHVlXCIsIFwidmFsdWVcIiwgXCJhdXRvU2l6ZVwiLCBcIm9uUmVzaXplXCIsIFwiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJkaXNhYmxlZFwiLCBcIm9uQ2hhbmdlXCIsIFwib25JbnRlcm5hbEF1dG9TaXplXCJdO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmVzaXplT2JzZXJ2ZXIgZnJvbSAncmMtcmVzaXplLW9ic2VydmVyJztcbmltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgdXNlTWVyZ2VkU3RhdGUgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIjtcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2FsY3VsYXRlQXV0b1NpemVTdHlsZSBmcm9tIFwiLi9jYWxjdWxhdGVOb2RlSGVpZ2h0XCI7XG52YXIgUkVTSVpFX1NUQVJUID0gMDtcbnZhciBSRVNJWkVfTUVBU1VSSU5HID0gMTtcbnZhciBSRVNJWkVfU1RBQkxFID0gMjtcbnZhciBSZXNpemFibGVUZXh0QXJlYSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBfcmVmID0gcHJvcHMsXG4gICAgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgZGVmYXVsdFZhbHVlID0gX3JlZi5kZWZhdWx0VmFsdWUsXG4gICAgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgIGF1dG9TaXplID0gX3JlZi5hdXRvU2l6ZSxcbiAgICBvblJlc2l6ZSA9IF9yZWYub25SZXNpemUsXG4gICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBfcmVmLnN0eWxlLFxuICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICBvbkNoYW5nZSA9IF9yZWYub25DaGFuZ2UsXG4gICAgb25JbnRlcm5hbEF1dG9TaXplID0gX3JlZi5vbkludGVybmFsQXV0b1NpemUsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBWYWx1ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUoZGVmYXVsdFZhbHVlLCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBwb3N0U3RhdGU6IGZ1bmN0aW9uIHBvc3RTdGF0ZSh2YWwpIHtcbiAgICAgICAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHZvaWQgMCA/IHZhbCA6ICcnO1xuICAgICAgfVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgIG1lcmdlZFZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICBzZXRNZXJnZWRWYWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG4gIHZhciBvbkludGVybmFsQ2hhbmdlID0gZnVuY3Rpb24gb25JbnRlcm5hbENoYW5nZShldmVudCkge1xuICAgIHNldE1lcmdlZFZhbHVlKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCB8fCBvbkNoYW5nZShldmVudCk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdGV4dGFyZWFSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dEFyZWE6IHRleHRhcmVhUmVmLmN1cnJlbnRcbiAgICB9O1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQXV0b1NpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGF1dG9TaXplICYmIF90eXBlb2YoYXV0b1NpemUpID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gW2F1dG9TaXplLm1pblJvd3MsIGF1dG9TaXplLm1heFJvd3NdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0sIFthdXRvU2l6ZV0pLFxuICAgIF9SZWFjdCR1c2VNZW1vMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VNZW1vLCAyKSxcbiAgICBtaW5Sb3dzID0gX1JlYWN0JHVzZU1lbW8yWzBdLFxuICAgIG1heFJvd3MgPSBfUmVhY3QkdXNlTWVtbzJbMV07XG4gIHZhciBuZWVkQXV0b1NpemUgPSAhIWF1dG9TaXplO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2Nyb2xsID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjE4NzBcbiAgdmFyIGZpeEZpcmVmb3hBdXRvU2Nyb2xsID0gZnVuY3Rpb24gZml4RmlyZWZveEF1dG9TY3JvbGwoKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZGIGhhcyBidWcgd2l0aCBqdW1wIG9mIHNjcm9sbCB0byB0b3AuIFdlIGZvcmNlIGJhY2sgaGVyZS5cbiAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0ZXh0YXJlYVJlZi5jdXJyZW50KSB7XG4gICAgICAgIHZhciBfdGV4dGFyZWFSZWYkY3VycmVudCA9IHRleHRhcmVhUmVmLmN1cnJlbnQsXG4gICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSBfdGV4dGFyZWFSZWYkY3VycmVudC5zZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICBzZWxlY3Rpb25FbmQgPSBfdGV4dGFyZWFSZWYkY3VycmVudC5zZWxlY3Rpb25FbmQsXG4gICAgICAgICAgc2Nyb2xsVG9wID0gX3RleHRhcmVhUmVmJGN1cnJlbnQuc2Nyb2xsVG9wO1xuXG4gICAgICAgIC8vIEZpeCBTYWZhcmkgYnVnIHdoaWNoIG5vdCByb2xsYmFjayB3aGVuIGJyZWFrIGxpbmVcbiAgICAgICAgLy8gVGhpcyBtYWtlcyBDaGluZXNlIElNRSBjYW4ndCBpbnB1dC4gRG8gbm90IGZpeCB0aGlzXG4gICAgICAgIC8vIGNvbnN0IHsgdmFsdWU6IHRtcFZhbHVlIH0gPSB0ZXh0YXJlYVJlZi5jdXJyZW50O1xuICAgICAgICAvLyB0ZXh0YXJlYVJlZi5jdXJyZW50LnZhbHVlID0gJyc7XG4gICAgICAgIC8vIHRleHRhcmVhUmVmLmN1cnJlbnQudmFsdWUgPSB0bXBWYWx1ZTtcblxuICAgICAgICB0ZXh0YXJlYVJlZi5jdXJyZW50LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpO1xuICAgICAgICB0ZXh0YXJlYVJlZi5jdXJyZW50LnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBGaXggZXJyb3IgaW4gQ2hyb21lOlxuICAgICAgLy8gRmFpbGVkIHRvIHJlYWQgdGhlICdzZWxlY3Rpb25TdGFydCcgcHJvcGVydHkgZnJvbSAnSFRNTElucHV0RWxlbWVudCdcbiAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xLzIxMTc3NDg5LzMwNDA2MDVcbiAgICB9XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZXNpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoUkVTSVpFX1NUQUJMRSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgcmVzaXplU3RhdGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFJlc2l6ZVN0YXRlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZSgpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBhdXRvU2l6ZVN0eWxlID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICBzZXRBdXRvU2l6ZVN0eWxlID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgdmFyIHN0YXJ0UmVzaXplID0gZnVuY3Rpb24gc3RhcnRSZXNpemUoKSB7XG4gICAgc2V0UmVzaXplU3RhdGUoUkVTSVpFX1NUQVJUKTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0Jykge1xuICAgICAgb25JbnRlcm5hbEF1dG9TaXplID09PSBudWxsIHx8IG9uSW50ZXJuYWxBdXRvU2l6ZSA9PT0gdm9pZCAwIHx8IG9uSW50ZXJuYWxBdXRvU2l6ZSgpO1xuICAgIH1cbiAgfTtcblxuICAvLyBDaGFuZ2UgdG8gdHJpZ2dlciByZXNpemUgbWVhc3VyZVxuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChuZWVkQXV0b1NpemUpIHtcbiAgICAgIHN0YXJ0UmVzaXplKCk7XG4gICAgfVxuICB9LCBbdmFsdWUsIG1pblJvd3MsIG1heFJvd3MsIG5lZWRBdXRvU2l6ZV0pO1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChyZXNpemVTdGF0ZSA9PT0gUkVTSVpFX1NUQVJUKSB7XG4gICAgICBzZXRSZXNpemVTdGF0ZShSRVNJWkVfTUVBU1VSSU5HKTtcbiAgICB9IGVsc2UgaWYgKHJlc2l6ZVN0YXRlID09PSBSRVNJWkVfTUVBU1VSSU5HKSB7XG4gICAgICB2YXIgdGV4dGFyZWFTdHlsZXMgPSBjYWxjdWxhdGVBdXRvU2l6ZVN0eWxlKHRleHRhcmVhUmVmLmN1cnJlbnQsIGZhbHNlLCBtaW5Sb3dzLCBtYXhSb3dzKTtcblxuICAgICAgLy8gU2FmYXJpIGhhcyBidWcgdGhhdCB0ZXh0IHdpbGwga2VlcCBicmVhayBsaW5lIG9uIHRleHQgY3V0IHdoZW4gaXQncyBwcmV2IGlzIGJyZWFrIGxpbmUuXG4gICAgICAvLyBab21iaWVKOiBUaGlzIG5vdCBvZnRlbiBoYXBwZW4uIFNvIHdlIGp1c3Qgc2tpcCBpdC5cbiAgICAgIC8vIGNvbnN0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCwgc2Nyb2xsVG9wIH0gPSB0ZXh0YXJlYVJlZi5jdXJyZW50O1xuICAgICAgLy8gY29uc3QgeyB2YWx1ZTogdG1wVmFsdWUgfSA9IHRleHRhcmVhUmVmLmN1cnJlbnQ7XG4gICAgICAvLyB0ZXh0YXJlYVJlZi5jdXJyZW50LnZhbHVlID0gJyc7XG4gICAgICAvLyB0ZXh0YXJlYVJlZi5jdXJyZW50LnZhbHVlID0gdG1wVmFsdWU7XG5cbiAgICAgIC8vIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0ZXh0YXJlYVJlZi5jdXJyZW50KSB7XG4gICAgICAvLyAgIHRleHRhcmVhUmVmLmN1cnJlbnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuICAgICAgLy8gICB0ZXh0YXJlYVJlZi5jdXJyZW50LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpO1xuICAgICAgLy8gfVxuXG4gICAgICBzZXRSZXNpemVTdGF0ZShSRVNJWkVfU1RBQkxFKTtcbiAgICAgIHNldEF1dG9TaXplU3R5bGUodGV4dGFyZWFTdHlsZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaXhGaXJlZm94QXV0b1Njcm9sbCgpO1xuICAgIH1cbiAgfSwgW3Jlc2l6ZVN0YXRlXSk7XG5cbiAgLy8gV2UgbG9jayByZXNpemUgdHJpZ2dlciBieSByYWYgdG8gYXZvaWQgU2FmYXJpIHdhcm5pbmdcbiAgdmFyIHJlc2l6ZVJhZlJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgY2xlYW5SYWYgPSBmdW5jdGlvbiBjbGVhblJhZigpIHtcbiAgICByYWYuY2FuY2VsKHJlc2l6ZVJhZlJlZi5jdXJyZW50KTtcbiAgfTtcbiAgdmFyIG9uSW50ZXJuYWxSZXNpemUgPSBmdW5jdGlvbiBvbkludGVybmFsUmVzaXplKHNpemUpIHtcbiAgICBpZiAocmVzaXplU3RhdGUgPT09IFJFU0laRV9TVEFCTEUpIHtcbiAgICAgIG9uUmVzaXplID09PSBudWxsIHx8IG9uUmVzaXplID09PSB2b2lkIDAgfHwgb25SZXNpemUoc2l6ZSk7XG4gICAgICBpZiAoYXV0b1NpemUpIHtcbiAgICAgICAgY2xlYW5SYWYoKTtcbiAgICAgICAgcmVzaXplUmFmUmVmLmN1cnJlbnQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHN0YXJ0UmVzaXplKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY2xlYW5SYWY7XG4gIH0sIFtdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBtZXJnZWRBdXRvU2l6ZVN0eWxlID0gbmVlZEF1dG9TaXplID8gYXV0b1NpemVTdHlsZSA6IG51bGw7XG4gIHZhciBtZXJnZWRTdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCBtZXJnZWRBdXRvU2l6ZVN0eWxlKTtcbiAgaWYgKHJlc2l6ZVN0YXRlID09PSBSRVNJWkVfU1RBUlQgfHwgcmVzaXplU3RhdGUgPT09IFJFU0laRV9NRUFTVVJJTkcpIHtcbiAgICBtZXJnZWRTdHlsZS5vdmVyZmxvd1kgPSAnaGlkZGVuJztcbiAgICBtZXJnZWRTdHlsZS5vdmVyZmxvd1ggPSAnaGlkZGVuJztcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVzaXplT2JzZXJ2ZXIsIHtcbiAgICBvblJlc2l6ZTogb25JbnRlcm5hbFJlc2l6ZSxcbiAgICBkaXNhYmxlZDogIShhdXRvU2l6ZSB8fCBvblJlc2l6ZSlcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiLCBfZXh0ZW5kcyh7fSwgcmVzdFByb3BzLCB7XG4gICAgcmVmOiB0ZXh0YXJlYVJlZixcbiAgICBzdHlsZTogbWVyZ2VkU3R5bGUsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHByZWZpeENscywgY2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItZGlzYWJsZWRcIiksIGRpc2FibGVkKSksXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIHZhbHVlOiBtZXJnZWRWYWx1ZSxcbiAgICBvbkNoYW5nZTogb25JbnRlcm5hbENoYW5nZVxuICB9KSkpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBSZXNpemFibGVUZXh0QXJlYTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJkZWZhdWx0VmFsdWVcIiwgXCJ2YWx1ZVwiLCBcIm9uRm9jdXNcIiwgXCJvbkJsdXJcIiwgXCJvbkNoYW5nZVwiLCBcImFsbG93Q2xlYXJcIiwgXCJtYXhMZW5ndGhcIiwgXCJvbkNvbXBvc2l0aW9uU3RhcnRcIiwgXCJvbkNvbXBvc2l0aW9uRW5kXCIsIFwic3VmZml4XCIsIFwicHJlZml4Q2xzXCIsIFwic2hvd0NvdW50XCIsIFwiY291bnRcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcImRpc2FibGVkXCIsIFwiaGlkZGVuXCIsIFwiY2xhc3NOYW1lc1wiLCBcInN0eWxlc1wiLCBcIm9uUmVzaXplXCIsIFwib25DbGVhclwiLCBcIm9uUHJlc3NFbnRlclwiLCBcInJlYWRPbmx5XCIsIFwiYXV0b1NpemVcIiwgXCJvbktleURvd25cIl07XG5pbXBvcnQgY2xzeCBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IEJhc2VJbnB1dCB9IGZyb20gJ3JjLWlucHV0JztcbmltcG9ydCB1c2VDb3VudCBmcm9tIFwicmMtaW5wdXQvZXMvaG9va3MvdXNlQ291bnRcIjtcbmltcG9ydCB7IHJlc29sdmVPbkNoYW5nZSB9IGZyb20gXCJyYy1pbnB1dC9lcy91dGlscy9jb21tb25VdGlsc1wiO1xuaW1wb3J0IHVzZU1lcmdlZFN0YXRlIGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZU1lcmdlZFN0YXRlXCI7XG5pbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VJbXBlcmF0aXZlSGFuZGxlLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVzaXphYmxlVGV4dEFyZWEgZnJvbSBcIi4vUmVzaXphYmxlVGV4dEFyZWFcIjtcbnZhciBUZXh0QXJlYSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChfcmVmLCByZWYpIHtcbiAgdmFyIF9jb3VudENvbmZpZyRtYXg7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBfcmVmLmRlZmF1bHRWYWx1ZSxcbiAgICBjdXN0b21WYWx1ZSA9IF9yZWYudmFsdWUsXG4gICAgb25Gb2N1cyA9IF9yZWYub25Gb2N1cyxcbiAgICBvbkJsdXIgPSBfcmVmLm9uQmx1cixcbiAgICBvbkNoYW5nZSA9IF9yZWYub25DaGFuZ2UsXG4gICAgYWxsb3dDbGVhciA9IF9yZWYuYWxsb3dDbGVhcixcbiAgICBtYXhMZW5ndGggPSBfcmVmLm1heExlbmd0aCxcbiAgICBvbkNvbXBvc2l0aW9uU3RhcnQgPSBfcmVmLm9uQ29tcG9zaXRpb25TdGFydCxcbiAgICBvbkNvbXBvc2l0aW9uRW5kID0gX3JlZi5vbkNvbXBvc2l0aW9uRW5kLFxuICAgIHN1ZmZpeCA9IF9yZWYuc3VmZml4LFxuICAgIF9yZWYkcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgcHJlZml4Q2xzID0gX3JlZiRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy10ZXh0YXJlYScgOiBfcmVmJHByZWZpeENscyxcbiAgICBzaG93Q291bnQgPSBfcmVmLnNob3dDb3VudCxcbiAgICBjb3VudCA9IF9yZWYuY291bnQsXG4gICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBfcmVmLnN0eWxlLFxuICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICBoaWRkZW4gPSBfcmVmLmhpZGRlbixcbiAgICBjbGFzc05hbWVzID0gX3JlZi5jbGFzc05hbWVzLFxuICAgIHN0eWxlcyA9IF9yZWYuc3R5bGVzLFxuICAgIG9uUmVzaXplID0gX3JlZi5vblJlc2l6ZSxcbiAgICBvbkNsZWFyID0gX3JlZi5vbkNsZWFyLFxuICAgIG9uUHJlc3NFbnRlciA9IF9yZWYub25QcmVzc0VudGVyLFxuICAgIHJlYWRPbmx5ID0gX3JlZi5yZWFkT25seSxcbiAgICBhdXRvU2l6ZSA9IF9yZWYuYXV0b1NpemUsXG4gICAgb25LZXlEb3duID0gX3JlZi5vbktleURvd24sXG4gICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuICB2YXIgX3VzZU1lcmdlZFN0YXRlID0gdXNlTWVyZ2VkU3RhdGUoZGVmYXVsdFZhbHVlLCB7XG4gICAgICB2YWx1ZTogY3VzdG9tVmFsdWUsXG4gICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZVxuICAgIH0pLFxuICAgIF91c2VNZXJnZWRTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlTWVyZ2VkU3RhdGUsIDIpLFxuICAgIHZhbHVlID0gX3VzZU1lcmdlZFN0YXRlMlswXSxcbiAgICBzZXRWYWx1ZSA9IF91c2VNZXJnZWRTdGF0ZTJbMV07XG4gIHZhciBmb3JtYXRWYWx1ZSA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgPyAnJyA6IFN0cmluZyh2YWx1ZSk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgZm9jdXNlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0Rm9jdXNlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBjb21wb3NpdGlvblJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIHRleHRhcmVhUmVzaXplZCA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0VGV4dGFyZWFSZXNpemVkID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaG9sZGVyUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgcmVzaXphYmxlVGV4dEFyZWFSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBnZXRUZXh0QXJlYSA9IGZ1bmN0aW9uIGdldFRleHRBcmVhKCkge1xuICAgIHZhciBfcmVzaXphYmxlVGV4dEFyZWFSZWY7XG4gICAgcmV0dXJuIChfcmVzaXphYmxlVGV4dEFyZWFSZWYgPSByZXNpemFibGVUZXh0QXJlYVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfcmVzaXphYmxlVGV4dEFyZWFSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9yZXNpemFibGVUZXh0QXJlYVJlZi50ZXh0QXJlYTtcbiAgfTtcbiAgdmFyIGZvY3VzID0gZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgZ2V0VGV4dEFyZWEoKS5mb2N1cygpO1xuICB9O1xuICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBfaG9sZGVyUmVmJGN1cnJlbnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc2l6YWJsZVRleHRBcmVhOiByZXNpemFibGVUZXh0QXJlYVJlZi5jdXJyZW50LFxuICAgICAgZm9jdXM6IGZvY3VzLFxuICAgICAgYmx1cjogZnVuY3Rpb24gYmx1cigpIHtcbiAgICAgICAgZ2V0VGV4dEFyZWEoKS5ibHVyKCk7XG4gICAgICB9LFxuICAgICAgbmF0aXZlRWxlbWVudDogKChfaG9sZGVyUmVmJGN1cnJlbnQgPSBob2xkZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2hvbGRlclJlZiRjdXJyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfaG9sZGVyUmVmJGN1cnJlbnQubmF0aXZlRWxlbWVudCkgfHwgZ2V0VGV4dEFyZWEoKVxuICAgIH07XG4gIH0pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHNldEZvY3VzZWQoZnVuY3Rpb24gKHByZXYpIHtcbiAgICAgIHJldHVybiAhZGlzYWJsZWQgJiYgcHJldjtcbiAgICB9KTtcbiAgfSwgW2Rpc2FibGVkXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFNlbGVjdCBSYW5nZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlNSwgMiksXG4gICAgc2VsZWN0aW9uID0gX1JlYWN0JHVzZVN0YXRlNlswXSxcbiAgICBzZXRTZWxlY3Rpb24gPSBfUmVhY3QkdXNlU3RhdGU2WzFdO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgIHZhciBfZ2V0VGV4dEFyZWE7XG4gICAgICAoX2dldFRleHRBcmVhID0gZ2V0VGV4dEFyZWEoKSkuc2V0U2VsZWN0aW9uUmFuZ2UuYXBwbHkoX2dldFRleHRBcmVhLCBfdG9Db25zdW1hYmxlQXJyYXkoc2VsZWN0aW9uKSk7XG4gICAgfVxuICB9LCBbc2VsZWN0aW9uXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENvdW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGNvdW50Q29uZmlnID0gdXNlQ291bnQoY291bnQsIHNob3dDb3VudCk7XG4gIHZhciBtZXJnZWRNYXggPSAoX2NvdW50Q29uZmlnJG1heCA9IGNvdW50Q29uZmlnLm1heCkgIT09IG51bGwgJiYgX2NvdW50Q29uZmlnJG1heCAhPT0gdm9pZCAwID8gX2NvdW50Q29uZmlnJG1heCA6IG1heExlbmd0aDtcblxuICAvLyBNYXggbGVuZ3RoIHZhbHVlXG4gIHZhciBoYXNNYXhMZW5ndGggPSBOdW1iZXIobWVyZ2VkTWF4KSA+IDA7XG4gIHZhciB2YWx1ZUxlbmd0aCA9IGNvdW50Q29uZmlnLnN0cmF0ZWd5KGZvcm1hdFZhbHVlKTtcbiAgdmFyIGlzT3V0T2ZSYW5nZSA9ICEhbWVyZ2VkTWF4ICYmIHZhbHVlTGVuZ3RoID4gbWVyZ2VkTWF4O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDaGFuZ2UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciB0cmlnZ2VyQ2hhbmdlID0gZnVuY3Rpb24gdHJpZ2dlckNoYW5nZShlLCBjdXJyZW50VmFsdWUpIHtcbiAgICB2YXIgY3V0VmFsdWUgPSBjdXJyZW50VmFsdWU7XG4gICAgaWYgKCFjb21wb3NpdGlvblJlZi5jdXJyZW50ICYmIGNvdW50Q29uZmlnLmV4Y2VlZEZvcm1hdHRlciAmJiBjb3VudENvbmZpZy5tYXggJiYgY291bnRDb25maWcuc3RyYXRlZ3koY3VycmVudFZhbHVlKSA+IGNvdW50Q29uZmlnLm1heCkge1xuICAgICAgY3V0VmFsdWUgPSBjb3VudENvbmZpZy5leGNlZWRGb3JtYXR0ZXIoY3VycmVudFZhbHVlLCB7XG4gICAgICAgIG1heDogY291bnRDb25maWcubWF4XG4gICAgICB9KTtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IGN1dFZhbHVlKSB7XG4gICAgICAgIHNldFNlbGVjdGlvbihbZ2V0VGV4dEFyZWEoKS5zZWxlY3Rpb25TdGFydCB8fCAwLCBnZXRUZXh0QXJlYSgpLnNlbGVjdGlvbkVuZCB8fCAwXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHNldFZhbHVlKGN1dFZhbHVlKTtcbiAgICByZXNvbHZlT25DaGFuZ2UoZS5jdXJyZW50VGFyZ2V0LCBlLCBvbkNoYW5nZSwgY3V0VmFsdWUpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBWYWx1ZSBVcGRhdGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBvbkludGVybmFsQ29tcG9zaXRpb25TdGFydCA9IGZ1bmN0aW9uIG9uSW50ZXJuYWxDb21wb3NpdGlvblN0YXJ0KGUpIHtcbiAgICBjb21wb3NpdGlvblJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICBvbkNvbXBvc2l0aW9uU3RhcnQgPT09IG51bGwgfHwgb25Db21wb3NpdGlvblN0YXJ0ID09PSB2b2lkIDAgfHwgb25Db21wb3NpdGlvblN0YXJ0KGUpO1xuICB9O1xuICB2YXIgb25JbnRlcm5hbENvbXBvc2l0aW9uRW5kID0gZnVuY3Rpb24gb25JbnRlcm5hbENvbXBvc2l0aW9uRW5kKGUpIHtcbiAgICBjb21wb3NpdGlvblJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgdHJpZ2dlckNoYW5nZShlLCBlLmN1cnJlbnRUYXJnZXQudmFsdWUpO1xuICAgIG9uQ29tcG9zaXRpb25FbmQgPT09IG51bGwgfHwgb25Db21wb3NpdGlvbkVuZCA9PT0gdm9pZCAwIHx8IG9uQ29tcG9zaXRpb25FbmQoZSk7XG4gIH07XG4gIHZhciBvbkludGVybmFsQ2hhbmdlID0gZnVuY3Rpb24gb25JbnRlcm5hbENoYW5nZShlKSB7XG4gICAgdHJpZ2dlckNoYW5nZShlLCBlLnRhcmdldC52YWx1ZSk7XG4gIH07XG4gIHZhciBoYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gaGFuZGxlS2V5RG93bihlKSB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmIG9uUHJlc3NFbnRlcikge1xuICAgICAgb25QcmVzc0VudGVyKGUpO1xuICAgIH1cbiAgICBvbktleURvd24gPT09IG51bGwgfHwgb25LZXlEb3duID09PSB2b2lkIDAgfHwgb25LZXlEb3duKGUpO1xuICB9O1xuICB2YXIgaGFuZGxlRm9jdXMgPSBmdW5jdGlvbiBoYW5kbGVGb2N1cyhlKSB7XG4gICAgc2V0Rm9jdXNlZCh0cnVlKTtcbiAgICBvbkZvY3VzID09PSBudWxsIHx8IG9uRm9jdXMgPT09IHZvaWQgMCB8fCBvbkZvY3VzKGUpO1xuICB9O1xuICB2YXIgaGFuZGxlQmx1ciA9IGZ1bmN0aW9uIGhhbmRsZUJsdXIoZSkge1xuICAgIHNldEZvY3VzZWQoZmFsc2UpO1xuICAgIG9uQmx1ciA9PT0gbnVsbCB8fCBvbkJsdXIgPT09IHZvaWQgMCB8fCBvbkJsdXIoZSk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlc2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGhhbmRsZVJlc2V0ID0gZnVuY3Rpb24gaGFuZGxlUmVzZXQoZSkge1xuICAgIHNldFZhbHVlKCcnKTtcbiAgICBmb2N1cygpO1xuICAgIHJlc29sdmVPbkNoYW5nZShnZXRUZXh0QXJlYSgpLCBlLCBvbkNoYW5nZSk7XG4gIH07XG4gIHZhciBzdWZmaXhOb2RlID0gc3VmZml4O1xuICB2YXIgZGF0YUNvdW50O1xuICBpZiAoY291bnRDb25maWcuc2hvdykge1xuICAgIGlmIChjb3VudENvbmZpZy5zaG93Rm9ybWF0dGVyKSB7XG4gICAgICBkYXRhQ291bnQgPSBjb3VudENvbmZpZy5zaG93Rm9ybWF0dGVyKHtcbiAgICAgICAgdmFsdWU6IGZvcm1hdFZhbHVlLFxuICAgICAgICBjb3VudDogdmFsdWVMZW5ndGgsXG4gICAgICAgIG1heExlbmd0aDogbWVyZ2VkTWF4XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YUNvdW50ID0gXCJcIi5jb25jYXQodmFsdWVMZW5ndGgpLmNvbmNhdChoYXNNYXhMZW5ndGggPyBcIiAvIFwiLmNvbmNhdChtZXJnZWRNYXgpIDogJycpO1xuICAgIH1cbiAgICBzdWZmaXhOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHN1ZmZpeE5vZGUsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsc3goXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1kYXRhLWNvdW50XCIpLCBjbGFzc05hbWVzID09PSBudWxsIHx8IGNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMuY291bnQpLFxuICAgICAgc3R5bGU6IHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy5jb3VudFxuICAgIH0sIGRhdGFDb3VudCkpO1xuICB9XG4gIHZhciBoYW5kbGVSZXNpemUgPSBmdW5jdGlvbiBoYW5kbGVSZXNpemUoc2l6ZSkge1xuICAgIHZhciBfZ2V0VGV4dEFyZWEyO1xuICAgIG9uUmVzaXplID09PSBudWxsIHx8IG9uUmVzaXplID09PSB2b2lkIDAgfHwgb25SZXNpemUoc2l6ZSk7XG4gICAgaWYgKChfZ2V0VGV4dEFyZWEyID0gZ2V0VGV4dEFyZWEoKSkgIT09IG51bGwgJiYgX2dldFRleHRBcmVhMiAhPT0gdm9pZCAwICYmIF9nZXRUZXh0QXJlYTIuc3R5bGUuaGVpZ2h0KSB7XG4gICAgICBzZXRUZXh0YXJlYVJlc2l6ZWQodHJ1ZSk7XG4gICAgfVxuICB9O1xuICB2YXIgaXNQdXJlVGV4dEFyZWEgPSAhYXV0b1NpemUgJiYgIXNob3dDb3VudCAmJiAhYWxsb3dDbGVhcjtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJhc2VJbnB1dCwge1xuICAgIHJlZjogaG9sZGVyUmVmLFxuICAgIHZhbHVlOiBmb3JtYXRWYWx1ZSxcbiAgICBhbGxvd0NsZWFyOiBhbGxvd0NsZWFyLFxuICAgIGhhbmRsZVJlc2V0OiBoYW5kbGVSZXNldCxcbiAgICBzdWZmaXg6IHN1ZmZpeE5vZGUsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBjbGFzc05hbWVzKSwge30sIHtcbiAgICAgIGFmZml4V3JhcHBlcjogY2xzeChjbGFzc05hbWVzID09PSBudWxsIHx8IGNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMuYWZmaXhXcmFwcGVyLCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNob3ctY291bnRcIiksIHNob3dDb3VudCksIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItdGV4dGFyZWEtYWxsb3ctY2xlYXJcIiksIGFsbG93Q2xlYXIpKVxuICAgIH0pLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBmb2N1c2VkOiBmb2N1c2VkLFxuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc05hbWUsIGlzT3V0T2ZSYW5nZSAmJiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLW91dC1vZi1yYW5nZVwiKSksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB0ZXh0YXJlYVJlc2l6ZWQgJiYgIWlzUHVyZVRleHRBcmVhID8ge1xuICAgICAgaGVpZ2h0OiAnYXV0bydcbiAgICB9IDoge30pLFxuICAgIGRhdGFBdHRyczoge1xuICAgICAgYWZmaXhXcmFwcGVyOiB7XG4gICAgICAgICdkYXRhLWNvdW50JzogdHlwZW9mIGRhdGFDb3VudCA9PT0gJ3N0cmluZycgPyBkYXRhQ291bnQgOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9LFxuICAgIGhpZGRlbjogaGlkZGVuLFxuICAgIHJlYWRPbmx5OiByZWFkT25seSxcbiAgICBvbkNsZWFyOiBvbkNsZWFyXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlc2l6YWJsZVRleHRBcmVhLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGF1dG9TaXplOiBhdXRvU2l6ZSxcbiAgICBtYXhMZW5ndGg6IG1heExlbmd0aCxcbiAgICBvbktleURvd246IGhhbmRsZUtleURvd24sXG4gICAgb25DaGFuZ2U6IG9uSW50ZXJuYWxDaGFuZ2UsXG4gICAgb25Gb2N1czogaGFuZGxlRm9jdXMsXG4gICAgb25CbHVyOiBoYW5kbGVCbHVyLFxuICAgIG9uQ29tcG9zaXRpb25TdGFydDogb25JbnRlcm5hbENvbXBvc2l0aW9uU3RhcnQsXG4gICAgb25Db21wb3NpdGlvbkVuZDogb25JbnRlcm5hbENvbXBvc2l0aW9uRW5kLFxuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc05hbWVzID09PSBudWxsIHx8IGNsYXNzTmFtZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMudGV4dGFyZWEpLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy50ZXh0YXJlYSksIHt9LCB7XG4gICAgICByZXNpemU6IHN0eWxlID09PSBudWxsIHx8IHN0eWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZS5yZXNpemVcbiAgICB9KSxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgb25SZXNpemU6IGhhbmRsZVJlc2l6ZSxcbiAgICByZWY6IHJlc2l6YWJsZVRleHRBcmVhUmVmLFxuICAgIHJlYWRPbmx5OiByZWFkT25seVxuICB9KSkpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBUZXh0QXJlYTsiLCIvLyBUaGFua3MgdG8gaHR0cHM6Ly9naXRodWIuY29tL2FuZHJleXBvcHAvcmVhY3QtdGV4dGFyZWEtYXV0b3NpemUvXG5cbi8qKlxuICogY2FsY3VsYXRlTm9kZUhlaWdodCh1aVRleHROb2RlLCB1c2VDYWNoZSA9IGZhbHNlKVxuICovXG5cbnZhciBISURERU5fVEVYVEFSRUFfU1RZTEUgPSBcIlxcbiAgbWluLWhlaWdodDowICFpbXBvcnRhbnQ7XFxuICBtYXgtaGVpZ2h0Om5vbmUgIWltcG9ydGFudDtcXG4gIGhlaWdodDowICFpbXBvcnRhbnQ7XFxuICB2aXNpYmlsaXR5OmhpZGRlbiAhaW1wb3J0YW50O1xcbiAgb3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnQ7XFxuICBwb3NpdGlvbjphYnNvbHV0ZSAhaW1wb3J0YW50O1xcbiAgei1pbmRleDotMTAwMCAhaW1wb3J0YW50O1xcbiAgdG9wOjAgIWltcG9ydGFudDtcXG4gIHJpZ2h0OjAgIWltcG9ydGFudDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lICFpbXBvcnRhbnQ7XFxuXCI7XG52YXIgU0laSU5HX1NUWUxFID0gWydsZXR0ZXItc3BhY2luZycsICdsaW5lLWhlaWdodCcsICdwYWRkaW5nLXRvcCcsICdwYWRkaW5nLWJvdHRvbScsICdmb250LWZhbWlseScsICdmb250LXdlaWdodCcsICdmb250LXNpemUnLCAnZm9udC12YXJpYW50JywgJ3RleHQtcmVuZGVyaW5nJywgJ3RleHQtdHJhbnNmb3JtJywgJ3dpZHRoJywgJ3RleHQtaW5kZW50JywgJ3BhZGRpbmctbGVmdCcsICdwYWRkaW5nLXJpZ2h0JywgJ2JvcmRlci13aWR0aCcsICdib3gtc2l6aW5nJywgJ3dvcmQtYnJlYWsnLCAnd2hpdGUtc3BhY2UnXTtcbnZhciBjb21wdXRlZFN0eWxlQ2FjaGUgPSB7fTtcbnZhciBoaWRkZW5UZXh0YXJlYTtcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVOb2RlU3R5bGluZyhub2RlKSB7XG4gIHZhciB1c2VDYWNoZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gIHZhciBub2RlUmVmID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2lkJykgfHwgbm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVhY3RpZCcpIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG4gIGlmICh1c2VDYWNoZSAmJiBjb21wdXRlZFN0eWxlQ2FjaGVbbm9kZVJlZl0pIHtcbiAgICByZXR1cm4gY29tcHV0ZWRTdHlsZUNhY2hlW25vZGVSZWZdO1xuICB9XG4gIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICB2YXIgYm94U2l6aW5nID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYm94LXNpemluZycpIHx8IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJy1tb3otYm94LXNpemluZycpIHx8IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJy13ZWJraXQtYm94LXNpemluZycpO1xuICB2YXIgcGFkZGluZ1NpemUgPSBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctYm90dG9tJykpICsgcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXRvcCcpKTtcbiAgdmFyIGJvcmRlclNpemUgPSBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2JvcmRlci1ib3R0b20td2lkdGgnKSkgKyBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2JvcmRlci10b3Atd2lkdGgnKSk7XG4gIHZhciBzaXppbmdTdHlsZSA9IFNJWklOR19TVFlMRS5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQobmFtZSwgXCI6XCIpLmNvbmNhdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpKTtcbiAgfSkuam9pbignOycpO1xuICB2YXIgbm9kZUluZm8gPSB7XG4gICAgc2l6aW5nU3R5bGU6IHNpemluZ1N0eWxlLFxuICAgIHBhZGRpbmdTaXplOiBwYWRkaW5nU2l6ZSxcbiAgICBib3JkZXJTaXplOiBib3JkZXJTaXplLFxuICAgIGJveFNpemluZzogYm94U2l6aW5nXG4gIH07XG4gIGlmICh1c2VDYWNoZSAmJiBub2RlUmVmKSB7XG4gICAgY29tcHV0ZWRTdHlsZUNhY2hlW25vZGVSZWZdID0gbm9kZUluZm87XG4gIH1cbiAgcmV0dXJuIG5vZGVJbmZvO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2FsY3VsYXRlQXV0b1NpemVTdHlsZSh1aVRleHROb2RlKSB7XG4gIHZhciB1c2VDYWNoZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gIHZhciBtaW5Sb3dzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsO1xuICB2YXIgbWF4Um93cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcbiAgaWYgKCFoaWRkZW5UZXh0YXJlYSkge1xuICAgIGhpZGRlblRleHRhcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICBoaWRkZW5UZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ3RhYi1pbmRleCcsICctMScpO1xuICAgIGhpZGRlblRleHRhcmVhLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIC8vIGZpeDogQSBmb3JtIGZpZWxkIGVsZW1lbnQgc2hvdWxkIGhhdmUgYW4gaWQgb3IgbmFtZSBhdHRyaWJ1dGVcbiAgICAvLyBBIGZvcm0gZmllbGQgZWxlbWVudCBoYXMgbmVpdGhlciBhbiBpZCBub3IgYSBuYW1lIGF0dHJpYnV0ZS4gVGhpcyBtaWdodCBwcmV2ZW50IHRoZSBicm93c2VyIGZyb20gY29ycmVjdGx5IGF1dG9maWxsaW5nIHRoZSBmb3JtLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC90ZXh0YXJlYVxuICAgIGhpZGRlblRleHRhcmVhLnNldEF0dHJpYnV0ZSgnbmFtZScsICdoaWRkZW5UZXh0YXJlYScpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaGlkZGVuVGV4dGFyZWEpO1xuICB9XG5cbiAgLy8gRml4IHdyYXA9XCJvZmZcIiBpc3N1ZVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy82NTc3XG4gIGlmICh1aVRleHROb2RlLmdldEF0dHJpYnV0ZSgnd3JhcCcpKSB7XG4gICAgaGlkZGVuVGV4dGFyZWEuc2V0QXR0cmlidXRlKCd3cmFwJywgdWlUZXh0Tm9kZS5nZXRBdHRyaWJ1dGUoJ3dyYXAnKSk7XG4gIH0gZWxzZSB7XG4gICAgaGlkZGVuVGV4dGFyZWEucmVtb3ZlQXR0cmlidXRlKCd3cmFwJyk7XG4gIH1cblxuICAvLyBDb3B5IGFsbCBDU1MgcHJvcGVydGllcyB0aGF0IGhhdmUgYW4gaW1wYWN0IG9uIHRoZSBoZWlnaHQgb2YgdGhlIGNvbnRlbnQgaW5cbiAgLy8gdGhlIHRleHRib3hcbiAgdmFyIF9jYWxjdWxhdGVOb2RlU3R5bGluZyA9IGNhbGN1bGF0ZU5vZGVTdHlsaW5nKHVpVGV4dE5vZGUsIHVzZUNhY2hlKSxcbiAgICBwYWRkaW5nU2l6ZSA9IF9jYWxjdWxhdGVOb2RlU3R5bGluZy5wYWRkaW5nU2l6ZSxcbiAgICBib3JkZXJTaXplID0gX2NhbGN1bGF0ZU5vZGVTdHlsaW5nLmJvcmRlclNpemUsXG4gICAgYm94U2l6aW5nID0gX2NhbGN1bGF0ZU5vZGVTdHlsaW5nLmJveFNpemluZyxcbiAgICBzaXppbmdTdHlsZSA9IF9jYWxjdWxhdGVOb2RlU3R5bGluZy5zaXppbmdTdHlsZTtcblxuICAvLyBOZWVkIHRvIGhhdmUgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB0byBoaWRlIHRoZSBzY3JvbGxiYXIgb3RoZXJ3aXNlXG4gIC8vIHRleHQtbGluZXMgd2lsbCBub3QgY2FsY3VsYXRlZCBwcm9wZXJseSBhcyB0aGUgc2hhZG93IHdpbGwgdGVjaG5pY2FsbHkgYmVcbiAgLy8gbmFycm93ZXIgZm9yIGNvbnRlbnRcbiAgaGlkZGVuVGV4dGFyZWEuc2V0QXR0cmlidXRlKCdzdHlsZScsIFwiXCIuY29uY2F0KHNpemluZ1N0eWxlLCBcIjtcIikuY29uY2F0KEhJRERFTl9URVhUQVJFQV9TVFlMRSkpO1xuICBoaWRkZW5UZXh0YXJlYS52YWx1ZSA9IHVpVGV4dE5vZGUudmFsdWUgfHwgdWlUZXh0Tm9kZS5wbGFjZWhvbGRlciB8fCAnJztcbiAgdmFyIG1pbkhlaWdodCA9IHVuZGVmaW5lZDtcbiAgdmFyIG1heEhlaWdodCA9IHVuZGVmaW5lZDtcbiAgdmFyIG92ZXJmbG93WTtcbiAgdmFyIGhlaWdodCA9IGhpZGRlblRleHRhcmVhLnNjcm9sbEhlaWdodDtcbiAgaWYgKGJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnKSB7XG4gICAgLy8gYm9yZGVyLWJveDogYWRkIGJvcmRlciwgc2luY2UgaGVpZ2h0ID0gY29udGVudCArIHBhZGRpbmcgKyBib3JkZXJcbiAgICBoZWlnaHQgKz0gYm9yZGVyU2l6ZTtcbiAgfSBlbHNlIGlmIChib3hTaXppbmcgPT09ICdjb250ZW50LWJveCcpIHtcbiAgICAvLyByZW1vdmUgcGFkZGluZywgc2luY2UgaGVpZ2h0ID0gY29udGVudFxuICAgIGhlaWdodCAtPSBwYWRkaW5nU2l6ZTtcbiAgfVxuICBpZiAobWluUm93cyAhPT0gbnVsbCB8fCBtYXhSb3dzICE9PSBudWxsKSB7XG4gICAgLy8gbWVhc3VyZSBoZWlnaHQgb2YgYSB0ZXh0YXJlYSB3aXRoIGEgc2luZ2xlIHJvd1xuICAgIGhpZGRlblRleHRhcmVhLnZhbHVlID0gJyAnO1xuICAgIHZhciBzaW5nbGVSb3dIZWlnaHQgPSBoaWRkZW5UZXh0YXJlYS5zY3JvbGxIZWlnaHQgLSBwYWRkaW5nU2l6ZTtcbiAgICBpZiAobWluUm93cyAhPT0gbnVsbCkge1xuICAgICAgbWluSGVpZ2h0ID0gc2luZ2xlUm93SGVpZ2h0ICogbWluUm93cztcbiAgICAgIGlmIChib3hTaXppbmcgPT09ICdib3JkZXItYm94Jykge1xuICAgICAgICBtaW5IZWlnaHQgPSBtaW5IZWlnaHQgKyBwYWRkaW5nU2l6ZSArIGJvcmRlclNpemU7XG4gICAgICB9XG4gICAgICBoZWlnaHQgPSBNYXRoLm1heChtaW5IZWlnaHQsIGhlaWdodCk7XG4gICAgfVxuICAgIGlmIChtYXhSb3dzICE9PSBudWxsKSB7XG4gICAgICBtYXhIZWlnaHQgPSBzaW5nbGVSb3dIZWlnaHQgKiBtYXhSb3dzO1xuICAgICAgaWYgKGJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnKSB7XG4gICAgICAgIG1heEhlaWdodCA9IG1heEhlaWdodCArIHBhZGRpbmdTaXplICsgYm9yZGVyU2l6ZTtcbiAgICAgIH1cbiAgICAgIG92ZXJmbG93WSA9IGhlaWdodCA+IG1heEhlaWdodCA/ICcnIDogJ2hpZGRlbic7XG4gICAgICBoZWlnaHQgPSBNYXRoLm1pbihtYXhIZWlnaHQsIGhlaWdodCk7XG4gICAgfVxuICB9XG4gIHZhciBzdHlsZSA9IHtcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICBvdmVyZmxvd1k6IG92ZXJmbG93WSxcbiAgICByZXNpemU6ICdub25lJ1xuICB9O1xuICBpZiAobWluSGVpZ2h0KSB7XG4gICAgc3R5bGUubWluSGVpZ2h0ID0gbWluSGVpZ2h0O1xuICB9XG4gIGlmIChtYXhIZWlnaHQpIHtcbiAgICBzdHlsZS5tYXhIZWlnaHQgPSBtYXhIZWlnaHQ7XG4gIH1cbiAgcmV0dXJuIHN0eWxlO1xufSIsImltcG9ydCBUZXh0QXJlYSBmcm9tIFwiLi9UZXh0QXJlYVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBSZXNpemFibGVUZXh0QXJlYSB9IGZyb20gXCIuL1Jlc2l6YWJsZVRleHRBcmVhXCI7XG5leHBvcnQgZGVmYXVsdCBUZXh0QXJlYTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFBvcHVwKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBpZCA9IHByb3BzLmlkLFxuICAgIGlubmVyU3R5bGUgPSBwcm9wcy5vdmVybGF5SW5uZXJTdHlsZSxcbiAgICBib2R5Q2xhc3NOYW1lID0gcHJvcHMuYm9keUNsYXNzTmFtZSxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1jb250ZW50XCIpLCBjbGFzc05hbWUpLFxuICAgIHN0eWxlOiBzdHlsZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5uZXJcIiksIGJvZHlDbGFzc05hbWUpLFxuICAgIGlkOiBpZCxcbiAgICByb2xlOiBcInRvb2x0aXBcIixcbiAgICBzdHlsZTogaW5uZXJTdHlsZVxuICB9LCB0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicgPyBjaGlsZHJlbigpIDogY2hpbGRyZW4pKTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcIm92ZXJsYXlDbGFzc05hbWVcIiwgXCJ0cmlnZ2VyXCIsIFwibW91c2VFbnRlckRlbGF5XCIsIFwibW91c2VMZWF2ZURlbGF5XCIsIFwib3ZlcmxheVN0eWxlXCIsIFwicHJlZml4Q2xzXCIsIFwiY2hpbGRyZW5cIiwgXCJvblZpc2libGVDaGFuZ2VcIiwgXCJhZnRlclZpc2libGVDaGFuZ2VcIiwgXCJ0cmFuc2l0aW9uTmFtZVwiLCBcImFuaW1hdGlvblwiLCBcIm1vdGlvblwiLCBcInBsYWNlbWVudFwiLCBcImFsaWduXCIsIFwiZGVzdHJveVRvb2x0aXBPbkhpZGVcIiwgXCJkZWZhdWx0VmlzaWJsZVwiLCBcImdldFRvb2x0aXBDb250YWluZXJcIiwgXCJvdmVybGF5SW5uZXJTdHlsZVwiLCBcImFycm93Q29udGVudFwiLCBcIm92ZXJsYXlcIiwgXCJpZFwiLCBcInNob3dBcnJvd1wiLCBcImNsYXNzTmFtZXNcIiwgXCJzdHlsZXNcIl07XG5pbXBvcnQgVHJpZ2dlciBmcm9tICdAcmMtY29tcG9uZW50L3RyaWdnZXInO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmb3J3YXJkUmVmLCB1c2VJbXBlcmF0aXZlSGFuZGxlLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBwbGFjZW1lbnRzIH0gZnJvbSBcIi4vcGxhY2VtZW50c1wiO1xuaW1wb3J0IFBvcHVwIGZyb20gXCIuL1BvcHVwXCI7XG5pbXBvcnQgdXNlSWQgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlSWRcIjtcbnZhciBUb29sdGlwID0gZnVuY3Rpb24gVG9vbHRpcChwcm9wcywgcmVmKSB7XG4gIHZhciBvdmVybGF5Q2xhc3NOYW1lID0gcHJvcHMub3ZlcmxheUNsYXNzTmFtZSxcbiAgICBfcHJvcHMkdHJpZ2dlciA9IHByb3BzLnRyaWdnZXIsXG4gICAgdHJpZ2dlciA9IF9wcm9wcyR0cmlnZ2VyID09PSB2b2lkIDAgPyBbJ2hvdmVyJ10gOiBfcHJvcHMkdHJpZ2dlcixcbiAgICBfcHJvcHMkbW91c2VFbnRlckRlbGEgPSBwcm9wcy5tb3VzZUVudGVyRGVsYXksXG4gICAgbW91c2VFbnRlckRlbGF5ID0gX3Byb3BzJG1vdXNlRW50ZXJEZWxhID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJG1vdXNlRW50ZXJEZWxhLFxuICAgIF9wcm9wcyRtb3VzZUxlYXZlRGVsYSA9IHByb3BzLm1vdXNlTGVhdmVEZWxheSxcbiAgICBtb3VzZUxlYXZlRGVsYXkgPSBfcHJvcHMkbW91c2VMZWF2ZURlbGEgPT09IHZvaWQgMCA/IDAuMSA6IF9wcm9wcyRtb3VzZUxlYXZlRGVsYSxcbiAgICBvdmVybGF5U3R5bGUgPSBwcm9wcy5vdmVybGF5U3R5bGUsXG4gICAgX3Byb3BzJHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBwcmVmaXhDbHMgPSBfcHJvcHMkcHJlZml4Q2xzID09PSB2b2lkIDAgPyAncmMtdG9vbHRpcCcgOiBfcHJvcHMkcHJlZml4Q2xzLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgb25WaXNpYmxlQ2hhbmdlID0gcHJvcHMub25WaXNpYmxlQ2hhbmdlLFxuICAgIGFmdGVyVmlzaWJsZUNoYW5nZSA9IHByb3BzLmFmdGVyVmlzaWJsZUNoYW5nZSxcbiAgICB0cmFuc2l0aW9uTmFtZSA9IHByb3BzLnRyYW5zaXRpb25OYW1lLFxuICAgIGFuaW1hdGlvbiA9IHByb3BzLmFuaW1hdGlvbixcbiAgICBtb3Rpb24gPSBwcm9wcy5tb3Rpb24sXG4gICAgX3Byb3BzJHBsYWNlbWVudCA9IHByb3BzLnBsYWNlbWVudCxcbiAgICBwbGFjZW1lbnQgPSBfcHJvcHMkcGxhY2VtZW50ID09PSB2b2lkIDAgPyAncmlnaHQnIDogX3Byb3BzJHBsYWNlbWVudCxcbiAgICBfcHJvcHMkYWxpZ24gPSBwcm9wcy5hbGlnbixcbiAgICBhbGlnbiA9IF9wcm9wcyRhbGlnbiA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkYWxpZ24sXG4gICAgX3Byb3BzJGRlc3Ryb3lUb29sdGlwID0gcHJvcHMuZGVzdHJveVRvb2x0aXBPbkhpZGUsXG4gICAgZGVzdHJveVRvb2x0aXBPbkhpZGUgPSBfcHJvcHMkZGVzdHJveVRvb2x0aXAgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRlc3Ryb3lUb29sdGlwLFxuICAgIGRlZmF1bHRWaXNpYmxlID0gcHJvcHMuZGVmYXVsdFZpc2libGUsXG4gICAgZ2V0VG9vbHRpcENvbnRhaW5lciA9IHByb3BzLmdldFRvb2x0aXBDb250YWluZXIsXG4gICAgb3ZlcmxheUlubmVyU3R5bGUgPSBwcm9wcy5vdmVybGF5SW5uZXJTdHlsZSxcbiAgICBhcnJvd0NvbnRlbnQgPSBwcm9wcy5hcnJvd0NvbnRlbnQsXG4gICAgb3ZlcmxheSA9IHByb3BzLm92ZXJsYXksXG4gICAgaWQgPSBwcm9wcy5pZCxcbiAgICBfcHJvcHMkc2hvd0Fycm93ID0gcHJvcHMuc2hvd0Fycm93LFxuICAgIHNob3dBcnJvdyA9IF9wcm9wcyRzaG93QXJyb3cgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkc2hvd0Fycm93LFxuICAgIHRvb2x0aXBDbGFzc05hbWVzID0gcHJvcHMuY2xhc3NOYW1lcyxcbiAgICB0b29sdGlwU3R5bGVzID0gcHJvcHMuc3R5bGVzLFxuICAgIHJlc3RQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIG1lcmdlZElkID0gdXNlSWQoaWQpO1xuICB2YXIgdHJpZ2dlclJlZiA9IHVzZVJlZihudWxsKTtcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHJpZ2dlclJlZi5jdXJyZW50O1xuICB9KTtcbiAgdmFyIGV4dHJhUHJvcHMgPSBfb2JqZWN0U3ByZWFkKHt9LCByZXN0UHJvcHMpO1xuICBpZiAoJ3Zpc2libGUnIGluIHByb3BzKSB7XG4gICAgZXh0cmFQcm9wcy5wb3B1cFZpc2libGUgPSBwcm9wcy52aXNpYmxlO1xuICB9XG4gIHZhciBnZXRQb3B1cEVsZW1lbnQgPSBmdW5jdGlvbiBnZXRQb3B1cEVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcHVwLCB7XG4gICAgICBrZXk6IFwiY29udGVudFwiLFxuICAgICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgICBpZDogbWVyZ2VkSWQsXG4gICAgICBib2R5Q2xhc3NOYW1lOiB0b29sdGlwQ2xhc3NOYW1lcyA9PT0gbnVsbCB8fCB0b29sdGlwQ2xhc3NOYW1lcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9vbHRpcENsYXNzTmFtZXMuYm9keSxcbiAgICAgIG92ZXJsYXlJbm5lclN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG92ZXJsYXlJbm5lclN0eWxlKSwgdG9vbHRpcFN0eWxlcyA9PT0gbnVsbCB8fCB0b29sdGlwU3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b29sdGlwU3R5bGVzLmJvZHkpXG4gICAgfSwgb3ZlcmxheSk7XG4gIH07XG4gIHZhciBnZXRDaGlsZHJlbiA9IGZ1bmN0aW9uIGdldENoaWxkcmVuKCkge1xuICAgIHZhciBjaGlsZCA9IFJlYWN0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pO1xuICAgIHZhciBvcmlnaW5hbFByb3BzID0gKGNoaWxkID09PSBudWxsIHx8IGNoaWxkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjaGlsZC5wcm9wcykgfHwge307XG4gICAgdmFyIGNoaWxkUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG9yaWdpbmFsUHJvcHMpLCB7fSwge1xuICAgICAgJ2FyaWEtZGVzY3JpYmVkYnknOiBvdmVybGF5ID8gbWVyZ2VkSWQgOiBudWxsXG4gICAgfSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIGNoaWxkUHJvcHMpO1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJpZ2dlciwgX2V4dGVuZHMoe1xuICAgIHBvcHVwQ2xhc3NOYW1lOiBjbGFzc05hbWVzKG92ZXJsYXlDbGFzc05hbWUsIHRvb2x0aXBDbGFzc05hbWVzID09PSBudWxsIHx8IHRvb2x0aXBDbGFzc05hbWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0b29sdGlwQ2xhc3NOYW1lcy5yb290KSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBwb3B1cDogZ2V0UG9wdXBFbGVtZW50LFxuICAgIGFjdGlvbjogdHJpZ2dlcixcbiAgICBidWlsdGluUGxhY2VtZW50czogcGxhY2VtZW50cyxcbiAgICBwb3B1cFBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgIHJlZjogdHJpZ2dlclJlZixcbiAgICBwb3B1cEFsaWduOiBhbGlnbixcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0VG9vbHRpcENvbnRhaW5lcixcbiAgICBvblBvcHVwVmlzaWJsZUNoYW5nZTogb25WaXNpYmxlQ2hhbmdlLFxuICAgIGFmdGVyUG9wdXBWaXNpYmxlQ2hhbmdlOiBhZnRlclZpc2libGVDaGFuZ2UsXG4gICAgcG9wdXBUcmFuc2l0aW9uTmFtZTogdHJhbnNpdGlvbk5hbWUsXG4gICAgcG9wdXBBbmltYXRpb246IGFuaW1hdGlvbixcbiAgICBwb3B1cE1vdGlvbjogbW90aW9uLFxuICAgIGRlZmF1bHRQb3B1cFZpc2libGU6IGRlZmF1bHRWaXNpYmxlLFxuICAgIGF1dG9EZXN0cm95OiBkZXN0cm95VG9vbHRpcE9uSGlkZSxcbiAgICBtb3VzZUxlYXZlRGVsYXk6IG1vdXNlTGVhdmVEZWxheSxcbiAgICBwb3B1cFN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIG92ZXJsYXlTdHlsZSksIHRvb2x0aXBTdHlsZXMgPT09IG51bGwgfHwgdG9vbHRpcFN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9vbHRpcFN0eWxlcy5yb290KSxcbiAgICBtb3VzZUVudGVyRGVsYXk6IG1vdXNlRW50ZXJEZWxheSxcbiAgICBhcnJvdzogc2hvd0Fycm93XG4gIH0sIGV4dHJhUHJvcHMpLCBnZXRDaGlsZHJlbigpKTtcbn07XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovZm9yd2FyZFJlZihUb29sdGlwKTsiLCJpbXBvcnQgUG9wdXAgZnJvbSBcIi4vUG9wdXBcIjtcbmltcG9ydCBUb29sdGlwIGZyb20gXCIuL1Rvb2x0aXBcIjtcbmV4cG9ydCB7IFBvcHVwIH07XG5leHBvcnQgZGVmYXVsdCBUb29sdGlwOyIsInZhciBhdXRvQWRqdXN0T3ZlcmZsb3dUb3BCb3R0b20gPSB7XG4gIHNoaWZ0WDogNjQsXG4gIGFkanVzdFk6IDFcbn07XG52YXIgYXV0b0FkanVzdE92ZXJmbG93TGVmdFJpZ2h0ID0ge1xuICBhZGp1c3RYOiAxLFxuICBzaGlmdFk6IHRydWVcbn07XG52YXIgdGFyZ2V0T2Zmc2V0ID0gWzAsIDBdO1xuZXhwb3J0IHZhciBwbGFjZW1lbnRzID0ge1xuICBsZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ2NyJywgJ2NsJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvd0xlZnRSaWdodCxcbiAgICBvZmZzZXQ6IFstNCwgMF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgcmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnY2wnLCAnY3InXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93TGVmdFJpZ2h0LFxuICAgIG9mZnNldDogWzQsIDBdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHRvcDoge1xuICAgIHBvaW50czogWydiYycsICd0YyddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3dUb3BCb3R0b20sXG4gICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGJvdHRvbToge1xuICAgIHBvaW50czogWyd0YycsICdiYyddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3dUb3BCb3R0b20sXG4gICAgb2Zmc2V0OiBbMCwgNF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgdG9wTGVmdDoge1xuICAgIHBvaW50czogWydibCcsICd0bCddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3dUb3BCb3R0b20sXG4gICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGxlZnRUb3A6IHtcbiAgICBwb2ludHM6IFsndHInLCAndGwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93TGVmdFJpZ2h0LFxuICAgIG9mZnNldDogWy00LCAwXSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICB0b3BSaWdodDoge1xuICAgIHBvaW50czogWydicicsICd0ciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3dUb3BCb3R0b20sXG4gICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIHJpZ2h0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ3RyJ10sXG4gICAgb3ZlcmZsb3c6IGF1dG9BZGp1c3RPdmVyZmxvd0xlZnRSaWdodCxcbiAgICBvZmZzZXQ6IFs0LCAwXSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICBib3R0b21SaWdodDoge1xuICAgIHBvaW50czogWyd0cicsICdiciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3dUb3BCb3R0b20sXG4gICAgb2Zmc2V0OiBbMCwgNF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgcmlnaHRCb3R0b206IHtcbiAgICBwb2ludHM6IFsnYmwnLCAnYnInXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93TGVmdFJpZ2h0LFxuICAgIG9mZnNldDogWzQsIDBdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93VG9wQm90dG9tLFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGxlZnRCb3R0b206IHtcbiAgICBwb2ludHM6IFsnYnInLCAnYmwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93TGVmdFJpZ2h0LFxuICAgIG9mZnNldDogWy00LCAwXSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgcGxhY2VtZW50czsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIERyb3BJbmRpY2F0b3IgPSBmdW5jdGlvbiBEcm9wSW5kaWNhdG9yKHByb3BzKSB7XG4gIHZhciBkcm9wUG9zaXRpb24gPSBwcm9wcy5kcm9wUG9zaXRpb24sXG4gICAgZHJvcExldmVsT2Zmc2V0ID0gcHJvcHMuZHJvcExldmVsT2Zmc2V0LFxuICAgIGluZGVudCA9IHByb3BzLmluZGVudDtcbiAgdmFyIHN0eWxlID0ge1xuICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICByaWdodDogMCxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZWQnLFxuICAgIGhlaWdodDogMlxuICB9O1xuICBzd2l0Y2ggKGRyb3BQb3NpdGlvbikge1xuICAgIGNhc2UgLTE6XG4gICAgICBzdHlsZS50b3AgPSAwO1xuICAgICAgc3R5bGUubGVmdCA9IC1kcm9wTGV2ZWxPZmZzZXQgKiBpbmRlbnQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICBzdHlsZS5ib3R0b20gPSAwO1xuICAgICAgc3R5bGUubGVmdCA9IC1kcm9wTGV2ZWxPZmZzZXQgKiBpbmRlbnQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDA6XG4gICAgICBzdHlsZS5ib3R0b20gPSAwO1xuICAgICAgc3R5bGUubGVmdCA9IGluZGVudDtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHN0eWxlXG4gIH0pO1xufTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIERyb3BJbmRpY2F0b3IuZGlzcGxheU5hbWUgPSAnRHJvcEluZGljYXRvcic7XG59XG5leHBvcnQgZGVmYXVsdCBEcm9wSW5kaWNhdG9yOyIsImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBJbmRlbnQgPSBmdW5jdGlvbiBJbmRlbnQoX3JlZikge1xuICB2YXIgcHJlZml4Q2xzID0gX3JlZi5wcmVmaXhDbHMsXG4gICAgbGV2ZWwgPSBfcmVmLmxldmVsLFxuICAgIGlzU3RhcnQgPSBfcmVmLmlzU3RhcnQsXG4gICAgaXNFbmQgPSBfcmVmLmlzRW5kO1xuICB2YXIgYmFzZUNsYXNzTmFtZSA9IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5kZW50LXVuaXRcIik7XG4gIHZhciBsaXN0ID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGV2ZWw7IGkgKz0gMSkge1xuICAgIGxpc3QucHVzaCggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGtleTogaSxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhiYXNlQ2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChiYXNlQ2xhc3NOYW1lLCBcIi1zdGFydFwiKSwgaXNTdGFydFtpXSksIFwiXCIuY29uY2F0KGJhc2VDbGFzc05hbWUsIFwiLWVuZFwiKSwgaXNFbmRbaV0pKVxuICAgIH0pKTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiLFxuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1pbmRlbnRcIilcbiAgfSwgbGlzdCk7XG59O1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL1JlYWN0Lm1lbW8oSW5kZW50KTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0RGVzdHJ1Y3R1cmluZ0VtcHR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3REZXN0cnVjdHVyaW5nRW1wdHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcIm1vdGlvblwiLCBcIm1vdGlvbk5vZGVzXCIsIFwibW90aW9uVHlwZVwiLCBcIm9uTW90aW9uU3RhcnRcIiwgXCJvbk1vdGlvbkVuZFwiLCBcImFjdGl2ZVwiLCBcInRyZWVOb2RlUmVxdWlyZWRQcm9wc1wiXTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IENTU01vdGlvbiBmcm9tICdyYy1tb3Rpb24nO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFRyZWVDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFR5cGVzXCI7XG5pbXBvcnQgVHJlZU5vZGUgZnJvbSBcIi4vVHJlZU5vZGVcIjtcbmltcG9ydCB1c2VVbm1vdW50IGZyb20gXCIuL3VzZVVubW91bnRcIjtcbmltcG9ydCB7IGdldFRyZWVOb2RlUHJvcHMgfSBmcm9tIFwiLi91dGlscy90cmVlVXRpbFwiO1xudmFyIE1vdGlvblRyZWVOb2RlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKG9yaVByb3BzLCByZWYpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IG9yaVByb3BzLmNsYXNzTmFtZSxcbiAgICBzdHlsZSA9IG9yaVByb3BzLnN0eWxlLFxuICAgIG1vdGlvbiA9IG9yaVByb3BzLm1vdGlvbixcbiAgICBtb3Rpb25Ob2RlcyA9IG9yaVByb3BzLm1vdGlvbk5vZGVzLFxuICAgIG1vdGlvblR5cGUgPSBvcmlQcm9wcy5tb3Rpb25UeXBlLFxuICAgIG9uT3JpZ2luTW90aW9uU3RhcnQgPSBvcmlQcm9wcy5vbk1vdGlvblN0YXJ0LFxuICAgIG9uT3JpZ2luTW90aW9uRW5kID0gb3JpUHJvcHMub25Nb3Rpb25FbmQsXG4gICAgYWN0aXZlID0gb3JpUHJvcHMuYWN0aXZlLFxuICAgIHRyZWVOb2RlUmVxdWlyZWRQcm9wcyA9IG9yaVByb3BzLnRyZWVOb2RlUmVxdWlyZWRQcm9wcyxcbiAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvcmlQcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKHRydWUpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFRyZWVDb250ZXh0KSxcbiAgICBwcmVmaXhDbHMgPSBfUmVhY3QkdXNlQ29udGV4dC5wcmVmaXhDbHM7XG5cbiAgLy8gQ2FsY3VsYXRlIHRhcmdldCB2aXNpYmxlIGhlcmUuXG4gIC8vIEFuZCBhcHBseSBpbiBlZmZlY3QgdG8gbWFrZSBgbGVhdmVgIG1vdGlvbiB3b3JrLlxuICB2YXIgdGFyZ2V0VmlzaWJsZSA9IG1vdGlvbk5vZGVzICYmIG1vdGlvblR5cGUgIT09ICdoaWRlJztcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAobW90aW9uTm9kZXMpIHtcbiAgICAgIGlmICh0YXJnZXRWaXNpYmxlICE9PSB2aXNpYmxlKSB7XG4gICAgICAgIHNldFZpc2libGUodGFyZ2V0VmlzaWJsZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbbW90aW9uTm9kZXNdKTtcbiAgdmFyIHRyaWdnZXJNb3Rpb25TdGFydCA9IGZ1bmN0aW9uIHRyaWdnZXJNb3Rpb25TdGFydCgpIHtcbiAgICBpZiAobW90aW9uTm9kZXMpIHtcbiAgICAgIG9uT3JpZ2luTW90aW9uU3RhcnQoKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gU2hvdWxkIG9ubHkgdHJpZ2dlciBvbmNlXG4gIHZhciB0cmlnZ2VyTW90aW9uRW5kUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgdmFyIHRyaWdnZXJNb3Rpb25FbmQgPSBmdW5jdGlvbiB0cmlnZ2VyTW90aW9uRW5kKCkge1xuICAgIGlmIChtb3Rpb25Ob2RlcyAmJiAhdHJpZ2dlck1vdGlvbkVuZFJlZi5jdXJyZW50KSB7XG4gICAgICB0cmlnZ2VyTW90aW9uRW5kUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgb25PcmlnaW5Nb3Rpb25FbmQoKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gRWZmZWN0IGlmIHVubW91bnRcbiAgdXNlVW5tb3VudCh0cmlnZ2VyTW90aW9uU3RhcnQsIHRyaWdnZXJNb3Rpb25FbmQpO1xuXG4gIC8vIE1vdGlvbiBlbmQgZXZlbnRcbiAgdmFyIG9uVmlzaWJsZUNoYW5nZWQgPSBmdW5jdGlvbiBvblZpc2libGVDaGFuZ2VkKG5leHRWaXNpYmxlKSB7XG4gICAgaWYgKHRhcmdldFZpc2libGUgPT09IG5leHRWaXNpYmxlKSB7XG4gICAgICB0cmlnZ2VyTW90aW9uRW5kKCk7XG4gICAgfVxuICB9O1xuICBpZiAobW90aW9uTm9kZXMpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ1NTTW90aW9uLCBfZXh0ZW5kcyh7XG4gICAgICByZWY6IHJlZixcbiAgICAgIHZpc2libGU6IHZpc2libGVcbiAgICB9LCBtb3Rpb24sIHtcbiAgICAgIG1vdGlvbkFwcGVhcjogbW90aW9uVHlwZSA9PT0gJ3Nob3cnLFxuICAgICAgb25WaXNpYmxlQ2hhbmdlZDogb25WaXNpYmxlQ2hhbmdlZFxuICAgIH0pLCBmdW5jdGlvbiAoX3JlZiwgbW90aW9uUmVmKSB7XG4gICAgICB2YXIgbW90aW9uQ2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICAgIG1vdGlvblN0eWxlID0gX3JlZi5zdHlsZTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHJlZjogbW90aW9uUmVmLFxuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmVlbm9kZS1tb3Rpb25cIiksIG1vdGlvbkNsYXNzTmFtZSksXG4gICAgICAgIHN0eWxlOiBtb3Rpb25TdHlsZVxuICAgICAgfSwgbW90aW9uTm9kZXMubWFwKGZ1bmN0aW9uICh0cmVlTm9kZSkge1xuICAgICAgICB2YXIgcmVzdFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgKF9vYmplY3REZXN0cnVjdHVyaW5nRW1wdHkodHJlZU5vZGUuZGF0YSksIHRyZWVOb2RlLmRhdGEpKSxcbiAgICAgICAgICB0aXRsZSA9IHRyZWVOb2RlLnRpdGxlLFxuICAgICAgICAgIGtleSA9IHRyZWVOb2RlLmtleSxcbiAgICAgICAgICBpc1N0YXJ0ID0gdHJlZU5vZGUuaXNTdGFydCxcbiAgICAgICAgICBpc0VuZCA9IHRyZWVOb2RlLmlzRW5kO1xuICAgICAgICBkZWxldGUgcmVzdFByb3BzLmNoaWxkcmVuO1xuICAgICAgICB2YXIgdHJlZU5vZGVQcm9wcyA9IGdldFRyZWVOb2RlUHJvcHMoa2V5LCB0cmVlTm9kZVJlcXVpcmVkUHJvcHMpO1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJlZU5vZGUsIF9leHRlbmRzKHt9LCByZXN0UHJvcHMsIHRyZWVOb2RlUHJvcHMsIHtcbiAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgYWN0aXZlOiBhY3RpdmUsXG4gICAgICAgICAgZGF0YTogdHJlZU5vZGUuZGF0YSxcbiAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICBpc1N0YXJ0OiBpc1N0YXJ0LFxuICAgICAgICAgIGlzRW5kOiBpc0VuZFxuICAgICAgICB9KSk7XG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyZWVOb2RlLCBfZXh0ZW5kcyh7XG4gICAgZG9tUmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0sIHByb3BzLCB7XG4gICAgYWN0aXZlOiBhY3RpdmVcbiAgfSkpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBNb3Rpb25UcmVlTm9kZS5kaXNwbGF5TmFtZSA9ICdNb3Rpb25UcmVlTm9kZSc7XG59XG5leHBvcnQgZGVmYXVsdCBNb3Rpb25UcmVlTm9kZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0RGVzdHJ1Y3R1cmluZ0VtcHR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3REZXN0cnVjdHVyaW5nRW1wdHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJwcmVmaXhDbHNcIiwgXCJkYXRhXCIsIFwic2VsZWN0YWJsZVwiLCBcImNoZWNrYWJsZVwiLCBcImV4cGFuZGVkS2V5c1wiLCBcInNlbGVjdGVkS2V5c1wiLCBcImNoZWNrZWRLZXlzXCIsIFwibG9hZGVkS2V5c1wiLCBcImxvYWRpbmdLZXlzXCIsIFwiaGFsZkNoZWNrZWRLZXlzXCIsIFwia2V5RW50aXRpZXNcIiwgXCJkaXNhYmxlZFwiLCBcImRyYWdnaW5nXCIsIFwiZHJhZ092ZXJOb2RlS2V5XCIsIFwiZHJvcFBvc2l0aW9uXCIsIFwibW90aW9uXCIsIFwiaGVpZ2h0XCIsIFwiaXRlbUhlaWdodFwiLCBcInZpcnR1YWxcIiwgXCJzY3JvbGxXaWR0aFwiLCBcImZvY3VzYWJsZVwiLCBcImFjdGl2ZUl0ZW1cIiwgXCJmb2N1c2VkXCIsIFwidGFiSW5kZXhcIiwgXCJvbktleURvd25cIiwgXCJvbkZvY3VzXCIsIFwib25CbHVyXCIsIFwib25BY3RpdmVDaGFuZ2VcIiwgXCJvbkxpc3RDaGFuZ2VTdGFydFwiLCBcIm9uTGlzdENoYW5nZUVuZFwiXTtcbi8qKlxuICogSGFuZGxlIHZpcnR1YWwgbGlzdCBvZiB0aGUgVHJlZU5vZGVzLlxuICovXG5cbmltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgVmlydHVhbExpc3QgZnJvbSAncmMtdmlydHVhbC1saXN0JztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBNb3Rpb25UcmVlTm9kZSBmcm9tIFwiLi9Nb3Rpb25UcmVlTm9kZVwiO1xuaW1wb3J0IHsgZmluZEV4cGFuZGVkS2V5cywgZ2V0RXhwYW5kUmFuZ2UgfSBmcm9tIFwiLi91dGlscy9kaWZmVXRpbFwiO1xuaW1wb3J0IHsgZ2V0S2V5LCBnZXRUcmVlTm9kZVByb3BzIH0gZnJvbSBcIi4vdXRpbHMvdHJlZVV0aWxcIjtcbnZhciBISURERU5fU1RZTEUgPSB7XG4gIHdpZHRoOiAwLFxuICBoZWlnaHQ6IDAsXG4gIGRpc3BsYXk6ICdmbGV4JyxcbiAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICBvcGFjaXR5OiAwLFxuICBib3JkZXI6IDAsXG4gIHBhZGRpbmc6IDAsXG4gIG1hcmdpbjogMFxufTtcbnZhciBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9O1xuZXhwb3J0IHZhciBNT1RJT05fS0VZID0gXCJSQ19UUkVFX01PVElPTl9cIi5jb25jYXQoTWF0aC5yYW5kb20oKSk7XG52YXIgTW90aW9uTm9kZSA9IHtcbiAga2V5OiBNT1RJT05fS0VZXG59O1xuZXhwb3J0IHZhciBNb3Rpb25FbnRpdHkgPSB7XG4gIGtleTogTU9USU9OX0tFWSxcbiAgbGV2ZWw6IDAsXG4gIGluZGV4OiAwLFxuICBwb3M6ICcwJyxcbiAgbm9kZTogTW90aW9uTm9kZSxcbiAgbm9kZXM6IFtNb3Rpb25Ob2RlXVxufTtcbnZhciBNb3Rpb25GbGF0dGVuRGF0YSA9IHtcbiAgcGFyZW50OiBudWxsLFxuICBjaGlsZHJlbjogW10sXG4gIHBvczogTW90aW9uRW50aXR5LnBvcyxcbiAgZGF0YTogTW90aW9uTm9kZSxcbiAgdGl0bGU6IG51bGwsXG4gIGtleTogTU9USU9OX0tFWSxcbiAgLyoqIEhvbGQgZW1wdHkgbGlzdCBoZXJlIHNpbmNlIHdlIGRvIG5vdCB1c2UgaXQgKi9cbiAgaXNTdGFydDogW10sXG4gIGlzRW5kOiBbXVxufTtcbi8qKlxuICogV2Ugb25seSBuZWVkIGdldCB2aXNpYmxlIGNvbnRlbnQgaXRlbXMgdG8gcGxheSB0aGUgYW5pbWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWluaW11bVJhbmdlVHJhbnNpdGlvblJhbmdlKGxpc3QsIHZpcnR1YWwsIGhlaWdodCwgaXRlbUhlaWdodCkge1xuICBpZiAodmlydHVhbCA9PT0gZmFsc2UgfHwgIWhlaWdodCkge1xuICAgIHJldHVybiBsaXN0O1xuICB9XG4gIHJldHVybiBsaXN0LnNsaWNlKDAsIE1hdGguY2VpbChoZWlnaHQgLyBpdGVtSGVpZ2h0KSArIDEpO1xufVxuZnVuY3Rpb24gaXRlbUtleShpdGVtKSB7XG4gIHZhciBrZXkgPSBpdGVtLmtleSxcbiAgICBwb3MgPSBpdGVtLnBvcztcbiAgcmV0dXJuIGdldEtleShrZXksIHBvcyk7XG59XG5mdW5jdGlvbiBnZXRBY2Nlc3NpYmlsaXR5UGF0aChpdGVtKSB7XG4gIHZhciBwYXRoID0gU3RyaW5nKGl0ZW0uZGF0YS5rZXkpO1xuICB2YXIgY3VycmVudCA9IGl0ZW07XG4gIHdoaWxlIChjdXJyZW50LnBhcmVudCkge1xuICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICBwYXRoID0gXCJcIi5jb25jYXQoY3VycmVudC5kYXRhLmtleSwgXCIgPiBcIikuY29uY2F0KHBhdGgpO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxudmFyIE5vZGVMaXN0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBkYXRhID0gcHJvcHMuZGF0YSxcbiAgICBzZWxlY3RhYmxlID0gcHJvcHMuc2VsZWN0YWJsZSxcbiAgICBjaGVja2FibGUgPSBwcm9wcy5jaGVja2FibGUsXG4gICAgZXhwYW5kZWRLZXlzID0gcHJvcHMuZXhwYW5kZWRLZXlzLFxuICAgIHNlbGVjdGVkS2V5cyA9IHByb3BzLnNlbGVjdGVkS2V5cyxcbiAgICBjaGVja2VkS2V5cyA9IHByb3BzLmNoZWNrZWRLZXlzLFxuICAgIGxvYWRlZEtleXMgPSBwcm9wcy5sb2FkZWRLZXlzLFxuICAgIGxvYWRpbmdLZXlzID0gcHJvcHMubG9hZGluZ0tleXMsXG4gICAgaGFsZkNoZWNrZWRLZXlzID0gcHJvcHMuaGFsZkNoZWNrZWRLZXlzLFxuICAgIGtleUVudGl0aWVzID0gcHJvcHMua2V5RW50aXRpZXMsXG4gICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBkcmFnZ2luZyA9IHByb3BzLmRyYWdnaW5nLFxuICAgIGRyYWdPdmVyTm9kZUtleSA9IHByb3BzLmRyYWdPdmVyTm9kZUtleSxcbiAgICBkcm9wUG9zaXRpb24gPSBwcm9wcy5kcm9wUG9zaXRpb24sXG4gICAgbW90aW9uID0gcHJvcHMubW90aW9uLFxuICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICBpdGVtSGVpZ2h0ID0gcHJvcHMuaXRlbUhlaWdodCxcbiAgICB2aXJ0dWFsID0gcHJvcHMudmlydHVhbCxcbiAgICBzY3JvbGxXaWR0aCA9IHByb3BzLnNjcm9sbFdpZHRoLFxuICAgIGZvY3VzYWJsZSA9IHByb3BzLmZvY3VzYWJsZSxcbiAgICBhY3RpdmVJdGVtID0gcHJvcHMuYWN0aXZlSXRlbSxcbiAgICBmb2N1c2VkID0gcHJvcHMuZm9jdXNlZCxcbiAgICB0YWJJbmRleCA9IHByb3BzLnRhYkluZGV4LFxuICAgIG9uS2V5RG93biA9IHByb3BzLm9uS2V5RG93bixcbiAgICBvbkZvY3VzID0gcHJvcHMub25Gb2N1cyxcbiAgICBvbkJsdXIgPSBwcm9wcy5vbkJsdXIsXG4gICAgb25BY3RpdmVDaGFuZ2UgPSBwcm9wcy5vbkFjdGl2ZUNoYW5nZSxcbiAgICBvbkxpc3RDaGFuZ2VTdGFydCA9IHByb3BzLm9uTGlzdENoYW5nZVN0YXJ0LFxuICAgIG9uTGlzdENoYW5nZUVuZCA9IHByb3BzLm9uTGlzdENoYW5nZUVuZCxcbiAgICBkb21Qcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbGlzdFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIGluZGVudE1lYXN1cmVyUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzY3JvbGxUbzogZnVuY3Rpb24gc2Nyb2xsVG8oc2Nyb2xsKSB7XG4gICAgICAgIGxpc3RSZWYuY3VycmVudC5zY3JvbGxUbyhzY3JvbGwpO1xuICAgICAgfSxcbiAgICAgIGdldEluZGVudFdpZHRoOiBmdW5jdGlvbiBnZXRJbmRlbnRXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIGluZGVudE1lYXN1cmVyUmVmLmN1cnJlbnQub2Zmc2V0V2lkdGg7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1vdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGV4cGFuZGVkS2V5cyksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgcHJldkV4cGFuZGVkS2V5cyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0UHJldkV4cGFuZGVkS2V5cyA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoZGF0YSksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIHByZXZEYXRhID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICBzZXRQcmV2RGF0YSA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHZhciBfUmVhY3QkdXNlU3RhdGU1ID0gUmVhY3QudXNlU3RhdGUoZGF0YSksXG4gICAgX1JlYWN0JHVzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTUsIDIpLFxuICAgIHRyYW5zaXRpb25EYXRhID0gX1JlYWN0JHVzZVN0YXRlNlswXSxcbiAgICBzZXRUcmFuc2l0aW9uRGF0YSA9IF9SZWFjdCR1c2VTdGF0ZTZbMV07XG4gIHZhciBfUmVhY3QkdXNlU3RhdGU3ID0gUmVhY3QudXNlU3RhdGUoW10pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTggPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU3LCAyKSxcbiAgICB0cmFuc2l0aW9uUmFuZ2UgPSBfUmVhY3QkdXNlU3RhdGU4WzBdLFxuICAgIHNldFRyYW5zaXRpb25SYW5nZSA9IF9SZWFjdCR1c2VTdGF0ZThbMV07XG4gIHZhciBfUmVhY3QkdXNlU3RhdGU5ID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgX1JlYWN0JHVzZVN0YXRlMTAgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU5LCAyKSxcbiAgICBtb3Rpb25UeXBlID0gX1JlYWN0JHVzZVN0YXRlMTBbMF0sXG4gICAgc2V0TW90aW9uVHlwZSA9IF9SZWFjdCR1c2VTdGF0ZTEwWzFdO1xuXG4gIC8vIFdoZW4gbW90aW9uIGVuZCBidXQgZGF0YSBjaGFuZ2UsIHRoaXMgd2lsbCBtYWtlcyBkYXRhIGJhY2sgdG8gcHJldmlvdXMgb25lXG4gIHZhciBkYXRhUmVmID0gUmVhY3QudXNlUmVmKGRhdGEpO1xuICBkYXRhUmVmLmN1cnJlbnQgPSBkYXRhO1xuICBmdW5jdGlvbiBvbk1vdGlvbkVuZCgpIHtcbiAgICB2YXIgbGF0ZXN0RGF0YSA9IGRhdGFSZWYuY3VycmVudDtcbiAgICBzZXRQcmV2RGF0YShsYXRlc3REYXRhKTtcbiAgICBzZXRUcmFuc2l0aW9uRGF0YShsYXRlc3REYXRhKTtcbiAgICBzZXRUcmFuc2l0aW9uUmFuZ2UoW10pO1xuICAgIHNldE1vdGlvblR5cGUobnVsbCk7XG4gICAgb25MaXN0Q2hhbmdlRW5kKCk7XG4gIH1cblxuICAvLyBEbyBhbmltYXRpb24gaWYgZXhwYW5kZWQga2V5cyBjaGFuZ2VkXG4gIC8vIGxheW91dEVmZmVjdCBoZXJlIHRvIGF2b2lkIGJsaW5rIG9mIG5vZGUgcmVtb3ZpbmdcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRQcmV2RXhwYW5kZWRLZXlzKGV4cGFuZGVkS2V5cyk7XG4gICAgdmFyIGRpZmZFeHBhbmRlZCA9IGZpbmRFeHBhbmRlZEtleXMocHJldkV4cGFuZGVkS2V5cywgZXhwYW5kZWRLZXlzKTtcbiAgICBpZiAoZGlmZkV4cGFuZGVkLmtleSAhPT0gbnVsbCkge1xuICAgICAgaWYgKGRpZmZFeHBhbmRlZC5hZGQpIHtcbiAgICAgICAgdmFyIGtleUluZGV4ID0gcHJldkRhdGEuZmluZEluZGV4KGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgICAgdmFyIGtleSA9IF9yZWYua2V5O1xuICAgICAgICAgIHJldHVybiBrZXkgPT09IGRpZmZFeHBhbmRlZC5rZXk7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcmFuZ2VOb2RlcyA9IGdldE1pbmltdW1SYW5nZVRyYW5zaXRpb25SYW5nZShnZXRFeHBhbmRSYW5nZShwcmV2RGF0YSwgZGF0YSwgZGlmZkV4cGFuZGVkLmtleSksIHZpcnR1YWwsIGhlaWdodCwgaXRlbUhlaWdodCk7XG4gICAgICAgIHZhciBuZXdUcmFuc2l0aW9uRGF0YSA9IHByZXZEYXRhLnNsaWNlKCk7XG4gICAgICAgIG5ld1RyYW5zaXRpb25EYXRhLnNwbGljZShrZXlJbmRleCArIDEsIDAsIE1vdGlvbkZsYXR0ZW5EYXRhKTtcbiAgICAgICAgc2V0VHJhbnNpdGlvbkRhdGEobmV3VHJhbnNpdGlvbkRhdGEpO1xuICAgICAgICBzZXRUcmFuc2l0aW9uUmFuZ2UocmFuZ2VOb2Rlcyk7XG4gICAgICAgIHNldE1vdGlvblR5cGUoJ3Nob3cnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBfa2V5SW5kZXggPSBkYXRhLmZpbmRJbmRleChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgICB2YXIga2V5ID0gX3JlZjIua2V5O1xuICAgICAgICAgIHJldHVybiBrZXkgPT09IGRpZmZFeHBhbmRlZC5rZXk7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgX3JhbmdlTm9kZXMgPSBnZXRNaW5pbXVtUmFuZ2VUcmFuc2l0aW9uUmFuZ2UoZ2V0RXhwYW5kUmFuZ2UoZGF0YSwgcHJldkRhdGEsIGRpZmZFeHBhbmRlZC5rZXkpLCB2aXJ0dWFsLCBoZWlnaHQsIGl0ZW1IZWlnaHQpO1xuICAgICAgICB2YXIgX25ld1RyYW5zaXRpb25EYXRhID0gZGF0YS5zbGljZSgpO1xuICAgICAgICBfbmV3VHJhbnNpdGlvbkRhdGEuc3BsaWNlKF9rZXlJbmRleCArIDEsIDAsIE1vdGlvbkZsYXR0ZW5EYXRhKTtcbiAgICAgICAgc2V0VHJhbnNpdGlvbkRhdGEoX25ld1RyYW5zaXRpb25EYXRhKTtcbiAgICAgICAgc2V0VHJhbnNpdGlvblJhbmdlKF9yYW5nZU5vZGVzKTtcbiAgICAgICAgc2V0TW90aW9uVHlwZSgnaGlkZScpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJldkRhdGEgIT09IGRhdGEpIHtcbiAgICAgIC8vIElmIHdob2xlIGRhdGEgY2hhbmdlZCwgd2UganVzdCByZWZyZXNoIHRoZSBsaXN0XG4gICAgICBzZXRQcmV2RGF0YShkYXRhKTtcbiAgICAgIHNldFRyYW5zaXRpb25EYXRhKGRhdGEpO1xuICAgIH1cbiAgfSwgW2V4cGFuZGVkS2V5cywgZGF0YV0pO1xuXG4gIC8vIFdlIHNob3VsZCBjbGVhbiB1cCBtb3Rpb24gaWYgaXMgY2hhbmdlZCBieSBkcmFnZ2luZ1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghZHJhZ2dpbmcpIHtcbiAgICAgIG9uTW90aW9uRW5kKCk7XG4gICAgfVxuICB9LCBbZHJhZ2dpbmddKTtcbiAgdmFyIG1lcmdlZERhdGEgPSBtb3Rpb24gPyB0cmFuc2l0aW9uRGF0YSA6IGRhdGE7XG4gIHZhciB0cmVlTm9kZVJlcXVpcmVkUHJvcHMgPSB7XG4gICAgZXhwYW5kZWRLZXlzOiBleHBhbmRlZEtleXMsXG4gICAgc2VsZWN0ZWRLZXlzOiBzZWxlY3RlZEtleXMsXG4gICAgbG9hZGVkS2V5czogbG9hZGVkS2V5cyxcbiAgICBsb2FkaW5nS2V5czogbG9hZGluZ0tleXMsXG4gICAgY2hlY2tlZEtleXM6IGNoZWNrZWRLZXlzLFxuICAgIGhhbGZDaGVja2VkS2V5czogaGFsZkNoZWNrZWRLZXlzLFxuICAgIGRyYWdPdmVyTm9kZUtleTogZHJhZ092ZXJOb2RlS2V5LFxuICAgIGRyb3BQb3NpdGlvbjogZHJvcFBvc2l0aW9uLFxuICAgIGtleUVudGl0aWVzOiBrZXlFbnRpdGllc1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGZvY3VzZWQgJiYgYWN0aXZlSXRlbSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgIHN0eWxlOiBISURERU5fU1RZTEUsXG4gICAgXCJhcmlhLWxpdmVcIjogXCJhc3NlcnRpdmVcIlxuICB9LCBnZXRBY2Nlc3NpYmlsaXR5UGF0aChhY3RpdmVJdGVtKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwge1xuICAgIHN0eWxlOiBISURERU5fU1RZTEUsXG4gICAgZGlzYWJsZWQ6IGZvY3VzYWJsZSA9PT0gZmFsc2UgfHwgZGlzYWJsZWQsXG4gICAgdGFiSW5kZXg6IGZvY3VzYWJsZSAhPT0gZmFsc2UgPyB0YWJJbmRleCA6IG51bGwsXG4gICAgb25LZXlEb3duOiBvbktleURvd24sXG4gICAgb25Gb2N1czogb25Gb2N1cyxcbiAgICBvbkJsdXI6IG9uQmx1cixcbiAgICB2YWx1ZTogXCJcIixcbiAgICBvbkNoYW5nZTogbm9vcCxcbiAgICBcImFyaWEtbGFiZWxcIjogXCJmb3Igc2NyZWVuIHJlYWRlclwiXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi10cmVlbm9kZVwiKSxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWUsXG4gICAgc3R5bGU6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gICAgICBoZWlnaHQ6IDAsXG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICBib3JkZXI6IDAsXG4gICAgICBwYWRkaW5nOiAwXG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWluZGVudFwiKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiBpbmRlbnRNZWFzdXJlclJlZixcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaW5kZW50LXVuaXRcIilcbiAgfSkpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVmlydHVhbExpc3QsIF9leHRlbmRzKHt9LCBkb21Qcm9wcywge1xuICAgIGRhdGE6IG1lcmdlZERhdGEsXG4gICAgaXRlbUtleTogaXRlbUtleSxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICBmdWxsSGVpZ2h0OiBmYWxzZSxcbiAgICB2aXJ0dWFsOiB2aXJ0dWFsLFxuICAgIGl0ZW1IZWlnaHQ6IGl0ZW1IZWlnaHQsXG4gICAgc2Nyb2xsV2lkdGg6IHNjcm9sbFdpZHRoLFxuICAgIHByZWZpeENsczogXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1saXN0XCIpLFxuICAgIHJlZjogbGlzdFJlZixcbiAgICByb2xlOiBcInRyZWVcIixcbiAgICBvblZpc2libGVDaGFuZ2U6IGZ1bmN0aW9uIG9uVmlzaWJsZUNoYW5nZShvcmlnaW5MaXN0KSB7XG4gICAgICAvLyBUaGUgYmVzdCBtYXRjaCBpcyB1c2luZyBgZnVsbExpc3RgIC0gYG9yaWdpbkxpc3RgID0gYHJlc3RMaXN0YFxuICAgICAgLy8gYW5kIGNoZWNrIHRoZSBgcmVzdExpc3RgIHRvIHNlZSBpZiBoYXMgdGhlIE1PVElPTl9LRVkgbm9kZVxuICAgICAgLy8gYnV0IHRoaXMgd2lsbCBjYXVzZSBwZXJmb3JtYW5jZSBpc3N1ZSBmb3IgbG9uZyBsaXN0IGNvbXBhcmVcbiAgICAgIC8vIHdlIGp1c3QgY2hlY2sgYG9yaWdpbkxpc3RgIGFuZCByZXBlYXQgdHJpZ2dlciBgb25Nb3Rpb25FbmRgXG4gICAgICBpZiAob3JpZ2luTGlzdC5ldmVyeShmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbUtleShpdGVtKSAhPT0gTU9USU9OX0tFWTtcbiAgICAgIH0pKSB7XG4gICAgICAgIG9uTW90aW9uRW5kKCk7XG4gICAgICB9XG4gICAgfVxuICB9KSwgZnVuY3Rpb24gKHRyZWVOb2RlKSB7XG4gICAgdmFyIHBvcyA9IHRyZWVOb2RlLnBvcyxcbiAgICAgIHJlc3RQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIChfb2JqZWN0RGVzdHJ1Y3R1cmluZ0VtcHR5KHRyZWVOb2RlLmRhdGEpLCB0cmVlTm9kZS5kYXRhKSksXG4gICAgICB0aXRsZSA9IHRyZWVOb2RlLnRpdGxlLFxuICAgICAga2V5ID0gdHJlZU5vZGUua2V5LFxuICAgICAgaXNTdGFydCA9IHRyZWVOb2RlLmlzU3RhcnQsXG4gICAgICBpc0VuZCA9IHRyZWVOb2RlLmlzRW5kO1xuICAgIHZhciBtZXJnZWRLZXkgPSBnZXRLZXkoa2V5LCBwb3MpO1xuICAgIGRlbGV0ZSByZXN0UHJvcHMua2V5O1xuICAgIGRlbGV0ZSByZXN0UHJvcHMuY2hpbGRyZW47XG4gICAgdmFyIHRyZWVOb2RlUHJvcHMgPSBnZXRUcmVlTm9kZVByb3BzKG1lcmdlZEtleSwgdHJlZU5vZGVSZXF1aXJlZFByb3BzKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTW90aW9uVHJlZU5vZGUsIF9leHRlbmRzKHt9LCByZXN0UHJvcHMsIHRyZWVOb2RlUHJvcHMsIHtcbiAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgIGFjdGl2ZTogISFhY3RpdmVJdGVtICYmIGtleSA9PT0gYWN0aXZlSXRlbS5rZXksXG4gICAgICBwb3M6IHBvcyxcbiAgICAgIGRhdGE6IHRyZWVOb2RlLmRhdGEsXG4gICAgICBpc1N0YXJ0OiBpc1N0YXJ0LFxuICAgICAgaXNFbmQ6IGlzRW5kLFxuICAgICAgbW90aW9uOiBtb3Rpb24sXG4gICAgICBtb3Rpb25Ob2Rlczoga2V5ID09PSBNT1RJT05fS0VZID8gdHJhbnNpdGlvblJhbmdlIDogbnVsbCxcbiAgICAgIG1vdGlvblR5cGU6IG1vdGlvblR5cGUsXG4gICAgICBvbk1vdGlvblN0YXJ0OiBvbkxpc3RDaGFuZ2VTdGFydCxcbiAgICAgIG9uTW90aW9uRW5kOiBvbk1vdGlvbkVuZCxcbiAgICAgIHRyZWVOb2RlUmVxdWlyZWRQcm9wczogdHJlZU5vZGVSZXF1aXJlZFByb3BzLFxuICAgICAgb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIG9uTW91c2VNb3ZlKCkge1xuICAgICAgICBvbkFjdGl2ZUNoYW5nZShudWxsKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH0pKTtcbn0pO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgTm9kZUxpc3QuZGlzcGxheU5hbWUgPSAnTm9kZUxpc3QnO1xufVxuZXhwb3J0IGRlZmF1bHQgTm9kZUxpc3Q7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNcIjtcbmltcG9ydCBfY3JlYXRlU3VwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZVN1cGVyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuLy8gVE9ETzogaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTcvTk9URS13YWktYXJpYS1wcmFjdGljZXMtMS4xLTIwMTcxMjE0L2V4YW1wbGVzL3RyZWV2aWV3L3RyZWV2aWV3LTIvdHJlZXZpZXctMmEuaHRtbFxuLy8gRnVsbHkgYWNjZXNzaWJpbGl0eSBzdXBwb3J0XG5cbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IEtleUNvZGUgZnJvbSBcInJjLXV0aWwvZXMvS2V5Q29kZVwiO1xuaW1wb3J0IHBpY2tBdHRycyBmcm9tIFwicmMtdXRpbC9lcy9waWNrQXR0cnNcIjtcbmltcG9ydCB3YXJuaW5nIGZyb20gXCJyYy11dGlsL2VzL3dhcm5pbmdcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFRyZWVDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFR5cGVzXCI7XG5pbXBvcnQgRHJvcEluZGljYXRvciBmcm9tIFwiLi9Ecm9wSW5kaWNhdG9yXCI7XG5pbXBvcnQgTm9kZUxpc3QsIHsgTU9USU9OX0tFWSwgTW90aW9uRW50aXR5IH0gZnJvbSBcIi4vTm9kZUxpc3RcIjtcbmltcG9ydCBUcmVlTm9kZSBmcm9tIFwiLi9UcmVlTm9kZVwiO1xuaW1wb3J0IHsgYXJyQWRkLCBhcnJEZWwsIGNhbGNEcm9wUG9zaXRpb24sIGNhbGNTZWxlY3RlZEtleXMsIGNvbmR1Y3RFeHBhbmRQYXJlbnQsIGdldERyYWdDaGlsZHJlbktleXMsIHBhcnNlQ2hlY2tlZEtleXMsIHBvc1RvQXJyIH0gZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0IHsgY29uZHVjdENoZWNrIH0gZnJvbSBcIi4vdXRpbHMvY29uZHVjdFV0aWxcIjtcbmltcG9ydCBnZXRFbnRpdHkgZnJvbSBcIi4vdXRpbHMva2V5VXRpbFwiO1xuaW1wb3J0IHsgY29udmVydERhdGFUb0VudGl0aWVzLCBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEsIGNvbnZlcnRUcmVlVG9EYXRhLCBmaWxsRmllbGROYW1lcywgZmxhdHRlblRyZWVEYXRhLCBnZXRUcmVlTm9kZVByb3BzLCB3YXJuaW5nV2l0aG91dEtleSB9IGZyb20gXCIuL3V0aWxzL3RyZWVVdGlsXCI7XG52YXIgTUFYX1JFVFJZX1RJTUVTID0gMTA7XG52YXIgVHJlZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoVHJlZSwgX1JlYWN0JENvbXBvbmVudCk7XG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoVHJlZSk7XG4gIGZ1bmN0aW9uIFRyZWUoKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUcmVlKTtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgX2FyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBfYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoX2FyZ3MpKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZGVzdHJveWVkXCIsIGZhbHNlKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZGVsYXllZERyYWdFbnRlckxvZ2ljXCIsIHZvaWQgMCk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImxvYWRpbmdSZXRyeVRpbWVzXCIsIHt9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwic3RhdGVcIiwge1xuICAgICAga2V5RW50aXRpZXM6IHt9LFxuICAgICAgaW5kZW50OiBudWxsLFxuICAgICAgc2VsZWN0ZWRLZXlzOiBbXSxcbiAgICAgIGNoZWNrZWRLZXlzOiBbXSxcbiAgICAgIGhhbGZDaGVja2VkS2V5czogW10sXG4gICAgICBsb2FkZWRLZXlzOiBbXSxcbiAgICAgIGxvYWRpbmdLZXlzOiBbXSxcbiAgICAgIGV4cGFuZGVkS2V5czogW10sXG4gICAgICBkcmFnZ2luZ05vZGVLZXk6IG51bGwsXG4gICAgICBkcmFnQ2hpbGRyZW5LZXlzOiBbXSxcbiAgICAgIC8vIGRyb3BUYXJnZXRLZXkgaXMgdGhlIGtleSBvZiBhYnN0cmFjdC1kcm9wLW5vZGVcbiAgICAgIC8vIHRoZSBhYnN0cmFjdC1kcm9wLW5vZGUgaXMgdGhlIHJlYWwgZHJvcCBub2RlIHdoZW4gZHJhZyBhbmQgZHJvcFxuICAgICAgLy8gbm90IHRoZSBET00gZHJhZyBvdmVyIG5vZGVcbiAgICAgIGRyb3BUYXJnZXRLZXk6IG51bGwsXG4gICAgICBkcm9wUG9zaXRpb246IG51bGwsXG4gICAgICAvLyB0aGUgZHJvcCBwb3NpdGlvbiBvZiBhYnN0cmFjdC1kcm9wLW5vZGUsIGluc2lkZSAwLCB0b3AgLTEsIGJvdHRvbSAxXG4gICAgICBkcm9wQ29udGFpbmVyS2V5OiBudWxsLFxuICAgICAgLy8gdGhlIGNvbnRhaW5lciBrZXkgb2YgYWJzdHJhY3QtZHJvcC1ub2RlIGlmIGRyb3BQb3NpdGlvbiBpcyAtMSBvciAxXG4gICAgICBkcm9wTGV2ZWxPZmZzZXQ6IG51bGwsXG4gICAgICAvLyB0aGUgZHJvcCBsZXZlbCBvZmZzZXQgb2YgYWJzdHJhY3QtZHJhZy1vdmVyLW5vZGVcbiAgICAgIGRyb3BUYXJnZXRQb3M6IG51bGwsXG4gICAgICAvLyB0aGUgcG9zIG9mIGFic3RyYWN0LWRyb3Atbm9kZVxuICAgICAgZHJvcEFsbG93ZWQ6IHRydWUsXG4gICAgICAvLyBpZiBkcm9wIHRvIGFic3RyYWN0LWRyb3Atbm9kZSBpcyBhbGxvd2VkXG4gICAgICAvLyB0aGUgYWJzdHJhY3QtZHJhZy1vdmVyLW5vZGVcbiAgICAgIC8vIGlmIG1vdXNlIGlzIG9uIHRoZSBib3R0b20gb2YgdG9wIGRvbSBub2RlIG9yIG5vIHRoZSB0b3Agb2YgdGhlIGJvdHRvbSBkb20gbm9kZVxuICAgICAgLy8gYWJzdHJhY3QtZHJhZy1vdmVyLW5vZGUgaXMgdGhlIHRvcCBub2RlXG4gICAgICBkcmFnT3Zlck5vZGVLZXk6IG51bGwsXG4gICAgICB0cmVlRGF0YTogW10sXG4gICAgICBmbGF0dGVuTm9kZXM6IFtdLFxuICAgICAgZm9jdXNlZDogZmFsc2UsXG4gICAgICBhY3RpdmVLZXk6IG51bGwsXG4gICAgICBsaXN0Q2hhbmdpbmc6IGZhbHNlLFxuICAgICAgcHJldlByb3BzOiBudWxsLFxuICAgICAgZmllbGROYW1lczogZmlsbEZpZWxkTmFtZXMoKVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJkcmFnU3RhcnRNb3VzZVBvc2l0aW9uXCIsIG51bGwpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJkcmFnTm9kZVByb3BzXCIsIG51bGwpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjdXJyZW50TW91c2VPdmVyRHJvcHBhYmxlTm9kZUtleVwiLCBudWxsKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwibGlzdFJlZlwiLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCkpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbk5vZGVEcmFnU3RhcnRcIiwgZnVuY3Rpb24gKGV2ZW50LCBub2RlUHJvcHMpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZSA9IF90aGlzLnN0YXRlLFxuICAgICAgICBleHBhbmRlZEtleXMgPSBfdGhpcyRzdGF0ZS5leHBhbmRlZEtleXMsXG4gICAgICAgIGtleUVudGl0aWVzID0gX3RoaXMkc3RhdGUua2V5RW50aXRpZXM7XG4gICAgICB2YXIgb25EcmFnU3RhcnQgPSBfdGhpcy5wcm9wcy5vbkRyYWdTdGFydDtcbiAgICAgIHZhciBldmVudEtleSA9IG5vZGVQcm9wcy5ldmVudEtleTtcbiAgICAgIF90aGlzLmRyYWdOb2RlUHJvcHMgPSBub2RlUHJvcHM7XG4gICAgICBfdGhpcy5kcmFnU3RhcnRNb3VzZVBvc2l0aW9uID0ge1xuICAgICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgICB5OiBldmVudC5jbGllbnRZXG4gICAgICB9O1xuICAgICAgdmFyIG5ld0V4cGFuZGVkS2V5cyA9IGFyckRlbChleHBhbmRlZEtleXMsIGV2ZW50S2V5KTtcbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmdOb2RlS2V5OiBldmVudEtleSxcbiAgICAgICAgZHJhZ0NoaWxkcmVuS2V5czogZ2V0RHJhZ0NoaWxkcmVuS2V5cyhldmVudEtleSwga2V5RW50aXRpZXMpLFxuICAgICAgICBpbmRlbnQ6IF90aGlzLmxpc3RSZWYuY3VycmVudC5nZXRJbmRlbnRXaWR0aCgpXG4gICAgICB9KTtcbiAgICAgIF90aGlzLnNldEV4cGFuZGVkS2V5cyhuZXdFeHBhbmRlZEtleXMpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCBfdGhpcy5vbldpbmRvd0RyYWdFbmQpO1xuICAgICAgb25EcmFnU3RhcnQgPT09IG51bGwgfHwgb25EcmFnU3RhcnQgPT09IHZvaWQgMCB8fCBvbkRyYWdTdGFydCh7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgbm9kZTogY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKG5vZGVQcm9wcylcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIFtMZWdhY3ldIFNlbGVjdCBoYW5kbGVyIGlzIHNtYWxsZXIgdGhhbiBub2RlLFxuICAgICAqIHNvIHRoYXQgdGhpcyB3aWxsIHRyaWdnZXIgd2hlbiBkcmFnIGVudGVyIG5vZGUgb3Igc2VsZWN0IGhhbmRsZXIuXG4gICAgICogVGhpcyBpcyBhIGxpdHRsZSB0cmlja3kgaWYgY3VzdG9taXplIGNzcyB3aXRob3V0IHBhZGRpbmcuXG4gICAgICogQmV0dGVyIGZvciB1c2UgbW91c2UgbW92ZSBldmVudCB0byByZWZyZXNoIGRyYWcgc3RhdGUuXG4gICAgICogQnV0IGxldCdzIGp1c3Qga2VlcCBpdCB0byBhdm9pZCBldmVudCB0cmlnZ2VyIGxvZ2ljIGNoYW5nZS5cbiAgICAgKi9cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Ob2RlRHJhZ0VudGVyXCIsIGZ1bmN0aW9uIChldmVudCwgbm9kZVByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUyID0gX3RoaXMuc3RhdGUsXG4gICAgICAgIGV4cGFuZGVkS2V5cyA9IF90aGlzJHN0YXRlMi5leHBhbmRlZEtleXMsXG4gICAgICAgIGtleUVudGl0aWVzID0gX3RoaXMkc3RhdGUyLmtleUVudGl0aWVzLFxuICAgICAgICBkcmFnQ2hpbGRyZW5LZXlzID0gX3RoaXMkc3RhdGUyLmRyYWdDaGlsZHJlbktleXMsXG4gICAgICAgIGZsYXR0ZW5Ob2RlcyA9IF90aGlzJHN0YXRlMi5mbGF0dGVuTm9kZXMsXG4gICAgICAgIGluZGVudCA9IF90aGlzJHN0YXRlMi5pbmRlbnQ7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgb25EcmFnRW50ZXIgPSBfdGhpcyRwcm9wcy5vbkRyYWdFbnRlcixcbiAgICAgICAgb25FeHBhbmQgPSBfdGhpcyRwcm9wcy5vbkV4cGFuZCxcbiAgICAgICAgYWxsb3dEcm9wID0gX3RoaXMkcHJvcHMuYWxsb3dEcm9wLFxuICAgICAgICBkaXJlY3Rpb24gPSBfdGhpcyRwcm9wcy5kaXJlY3Rpb247XG4gICAgICB2YXIgcG9zID0gbm9kZVByb3BzLnBvcyxcbiAgICAgICAgZXZlbnRLZXkgPSBub2RlUHJvcHMuZXZlbnRLZXk7XG5cbiAgICAgIC8vIHJlY29yZCB0aGUga2V5IG9mIG5vZGUgd2hpY2ggaXMgbGF0ZXN0IGVudGVyZWQsIHVzZWQgaW4gZHJhZ2xlYXZlIGV2ZW50LlxuICAgICAgaWYgKF90aGlzLmN1cnJlbnRNb3VzZU92ZXJEcm9wcGFibGVOb2RlS2V5ICE9PSBldmVudEtleSkge1xuICAgICAgICBfdGhpcy5jdXJyZW50TW91c2VPdmVyRHJvcHBhYmxlTm9kZUtleSA9IGV2ZW50S2V5O1xuICAgICAgfVxuICAgICAgaWYgKCFfdGhpcy5kcmFnTm9kZVByb3BzKSB7XG4gICAgICAgIF90aGlzLnJlc2V0RHJhZ1N0YXRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBfY2FsY0Ryb3BQb3NpdGlvbiA9IGNhbGNEcm9wUG9zaXRpb24oZXZlbnQsIF90aGlzLmRyYWdOb2RlUHJvcHMsIG5vZGVQcm9wcywgaW5kZW50LCBfdGhpcy5kcmFnU3RhcnRNb3VzZVBvc2l0aW9uLCBhbGxvd0Ryb3AsIGZsYXR0ZW5Ob2Rlcywga2V5RW50aXRpZXMsIGV4cGFuZGVkS2V5cywgZGlyZWN0aW9uKSxcbiAgICAgICAgZHJvcFBvc2l0aW9uID0gX2NhbGNEcm9wUG9zaXRpb24uZHJvcFBvc2l0aW9uLFxuICAgICAgICBkcm9wTGV2ZWxPZmZzZXQgPSBfY2FsY0Ryb3BQb3NpdGlvbi5kcm9wTGV2ZWxPZmZzZXQsXG4gICAgICAgIGRyb3BUYXJnZXRLZXkgPSBfY2FsY0Ryb3BQb3NpdGlvbi5kcm9wVGFyZ2V0S2V5LFxuICAgICAgICBkcm9wQ29udGFpbmVyS2V5ID0gX2NhbGNEcm9wUG9zaXRpb24uZHJvcENvbnRhaW5lcktleSxcbiAgICAgICAgZHJvcFRhcmdldFBvcyA9IF9jYWxjRHJvcFBvc2l0aW9uLmRyb3BUYXJnZXRQb3MsXG4gICAgICAgIGRyb3BBbGxvd2VkID0gX2NhbGNEcm9wUG9zaXRpb24uZHJvcEFsbG93ZWQsXG4gICAgICAgIGRyYWdPdmVyTm9kZUtleSA9IF9jYWxjRHJvcFBvc2l0aW9uLmRyYWdPdmVyTm9kZUtleTtcbiAgICAgIGlmIChcbiAgICAgIC8vIGRvbid0IGFsbG93IGRyb3AgaW5zaWRlIGl0cyBjaGlsZHJlblxuICAgICAgZHJhZ0NoaWxkcmVuS2V5cy5pbmNsdWRlcyhkcm9wVGFyZ2V0S2V5KSB8fFxuICAgICAgLy8gZG9uJ3QgYWxsb3cgZHJvcCB3aGVuIGRyb3AgaXMgbm90IGFsbG93ZWQgY2FjdWxhdGVkIGJ5IGNhbGNEcm9wUG9zaXRpb25cbiAgICAgICFkcm9wQWxsb3dlZCkge1xuICAgICAgICBfdGhpcy5yZXNldERyYWdTdGF0ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNpZGUgZWZmZWN0IGZvciBkZWxheSBkcmFnXG4gICAgICBpZiAoIV90aGlzLmRlbGF5ZWREcmFnRW50ZXJMb2dpYykge1xuICAgICAgICBfdGhpcy5kZWxheWVkRHJhZ0VudGVyTG9naWMgPSB7fTtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5rZXlzKF90aGlzLmRlbGF5ZWREcmFnRW50ZXJMb2dpYykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGNsZWFyVGltZW91dChfdGhpcy5kZWxheWVkRHJhZ0VudGVyTG9naWNba2V5XSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChfdGhpcy5kcmFnTm9kZVByb3BzLmV2ZW50S2V5ICE9PSBub2RlUHJvcHMuZXZlbnRLZXkpIHtcbiAgICAgICAgLy8gaG9pc3QgZXhwYW5kIGxvZ2ljIGhlcmVcbiAgICAgICAgLy8gc2luY2UgaWYgbG9naWMgaXMgb24gdGhlIGJvdHRvbVxuICAgICAgICAvLyBpdCB3aWxsIGJlIGJsb2NrZWQgYnkgYWJzdHJhY3QgZHJhZ292ZXIgbm9kZSBjaGVja1xuICAgICAgICAvLyAgID0+IGlmIHlvdSBkcmFnZW50ZXIgZnJvbSB0b3AsIHlvdSBtb3VzZSB3aWxsIHN0aWxsIGJlIGNvbnNpZGVyIGFzIGluIHRoZSB0b3Agbm9kZVxuICAgICAgICBldmVudC5wZXJzaXN0KCk7XG4gICAgICAgIF90aGlzLmRlbGF5ZWREcmFnRW50ZXJMb2dpY1twb3NdID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChfdGhpcy5zdGF0ZS5kcmFnZ2luZ05vZGVLZXkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG5ld0V4cGFuZGVkS2V5cyA9IF90b0NvbnN1bWFibGVBcnJheShleHBhbmRlZEtleXMpO1xuICAgICAgICAgIHZhciBlbnRpdHkgPSBnZXRFbnRpdHkoa2V5RW50aXRpZXMsIG5vZGVQcm9wcy5ldmVudEtleSk7XG4gICAgICAgICAgaWYgKGVudGl0eSAmJiAoZW50aXR5LmNoaWxkcmVuIHx8IFtdKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIG5ld0V4cGFuZGVkS2V5cyA9IGFyckFkZChleHBhbmRlZEtleXMsIG5vZGVQcm9wcy5ldmVudEtleSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghX3RoaXMucHJvcHMuaGFzT3duUHJvcGVydHkoJ2V4cGFuZGVkS2V5cycpKSB7XG4gICAgICAgICAgICBfdGhpcy5zZXRFeHBhbmRlZEtleXMobmV3RXhwYW5kZWRLZXlzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb25FeHBhbmQgPT09IG51bGwgfHwgb25FeHBhbmQgPT09IHZvaWQgMCB8fCBvbkV4cGFuZChuZXdFeHBhbmRlZEtleXMsIHtcbiAgICAgICAgICAgIG5vZGU6IGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShub2RlUHJvcHMpLFxuICAgICAgICAgICAgZXhwYW5kZWQ6IHRydWUsXG4gICAgICAgICAgICBuYXRpdmVFdmVudDogZXZlbnQubmF0aXZlRXZlbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgODAwKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2tpcCBpZiBkcmFnIG5vZGUgaXMgc2VsZlxuICAgICAgaWYgKF90aGlzLmRyYWdOb2RlUHJvcHMuZXZlbnRLZXkgPT09IGRyb3BUYXJnZXRLZXkgJiYgZHJvcExldmVsT2Zmc2V0ID09PSAwKSB7XG4gICAgICAgIF90aGlzLnJlc2V0RHJhZ1N0YXRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGRyYWcgb3ZlciBub2RlIGFuZCBkcmFnIHN0YXRlXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdPdmVyTm9kZUtleTogZHJhZ092ZXJOb2RlS2V5LFxuICAgICAgICBkcm9wUG9zaXRpb246IGRyb3BQb3NpdGlvbixcbiAgICAgICAgZHJvcExldmVsT2Zmc2V0OiBkcm9wTGV2ZWxPZmZzZXQsXG4gICAgICAgIGRyb3BUYXJnZXRLZXk6IGRyb3BUYXJnZXRLZXksXG4gICAgICAgIGRyb3BDb250YWluZXJLZXk6IGRyb3BDb250YWluZXJLZXksXG4gICAgICAgIGRyb3BUYXJnZXRQb3M6IGRyb3BUYXJnZXRQb3MsXG4gICAgICAgIGRyb3BBbGxvd2VkOiBkcm9wQWxsb3dlZFxuICAgICAgfSk7XG4gICAgICBvbkRyYWdFbnRlciA9PT0gbnVsbCB8fCBvbkRyYWdFbnRlciA9PT0gdm9pZCAwIHx8IG9uRHJhZ0VudGVyKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBub2RlOiBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEobm9kZVByb3BzKSxcbiAgICAgICAgZXhwYW5kZWRLZXlzOiBleHBhbmRlZEtleXNcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbk5vZGVEcmFnT3ZlclwiLCBmdW5jdGlvbiAoZXZlbnQsIG5vZGVQcm9wcykge1xuICAgICAgdmFyIF90aGlzJHN0YXRlMyA9IF90aGlzLnN0YXRlLFxuICAgICAgICBkcmFnQ2hpbGRyZW5LZXlzID0gX3RoaXMkc3RhdGUzLmRyYWdDaGlsZHJlbktleXMsXG4gICAgICAgIGZsYXR0ZW5Ob2RlcyA9IF90aGlzJHN0YXRlMy5mbGF0dGVuTm9kZXMsXG4gICAgICAgIGtleUVudGl0aWVzID0gX3RoaXMkc3RhdGUzLmtleUVudGl0aWVzLFxuICAgICAgICBleHBhbmRlZEtleXMgPSBfdGhpcyRzdGF0ZTMuZXhwYW5kZWRLZXlzLFxuICAgICAgICBpbmRlbnQgPSBfdGhpcyRzdGF0ZTMuaW5kZW50O1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IF90aGlzLnByb3BzLFxuICAgICAgICBvbkRyYWdPdmVyID0gX3RoaXMkcHJvcHMyLm9uRHJhZ092ZXIsXG4gICAgICAgIGFsbG93RHJvcCA9IF90aGlzJHByb3BzMi5hbGxvd0Ryb3AsXG4gICAgICAgIGRpcmVjdGlvbiA9IF90aGlzJHByb3BzMi5kaXJlY3Rpb247XG4gICAgICBpZiAoIV90aGlzLmRyYWdOb2RlUHJvcHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIF9jYWxjRHJvcFBvc2l0aW9uMiA9IGNhbGNEcm9wUG9zaXRpb24oZXZlbnQsIF90aGlzLmRyYWdOb2RlUHJvcHMsIG5vZGVQcm9wcywgaW5kZW50LCBfdGhpcy5kcmFnU3RhcnRNb3VzZVBvc2l0aW9uLCBhbGxvd0Ryb3AsIGZsYXR0ZW5Ob2Rlcywga2V5RW50aXRpZXMsIGV4cGFuZGVkS2V5cywgZGlyZWN0aW9uKSxcbiAgICAgICAgZHJvcFBvc2l0aW9uID0gX2NhbGNEcm9wUG9zaXRpb24yLmRyb3BQb3NpdGlvbixcbiAgICAgICAgZHJvcExldmVsT2Zmc2V0ID0gX2NhbGNEcm9wUG9zaXRpb24yLmRyb3BMZXZlbE9mZnNldCxcbiAgICAgICAgZHJvcFRhcmdldEtleSA9IF9jYWxjRHJvcFBvc2l0aW9uMi5kcm9wVGFyZ2V0S2V5LFxuICAgICAgICBkcm9wQ29udGFpbmVyS2V5ID0gX2NhbGNEcm9wUG9zaXRpb24yLmRyb3BDb250YWluZXJLZXksXG4gICAgICAgIGRyb3BUYXJnZXRQb3MgPSBfY2FsY0Ryb3BQb3NpdGlvbjIuZHJvcFRhcmdldFBvcyxcbiAgICAgICAgZHJvcEFsbG93ZWQgPSBfY2FsY0Ryb3BQb3NpdGlvbjIuZHJvcEFsbG93ZWQsXG4gICAgICAgIGRyYWdPdmVyTm9kZUtleSA9IF9jYWxjRHJvcFBvc2l0aW9uMi5kcmFnT3Zlck5vZGVLZXk7XG4gICAgICBpZiAoZHJhZ0NoaWxkcmVuS2V5cy5pbmNsdWRlcyhkcm9wVGFyZ2V0S2V5KSB8fCAhZHJvcEFsbG93ZWQpIHtcbiAgICAgICAgLy8gZG9uJ3QgYWxsb3cgZHJvcCBpbnNpZGUgaXRzIGNoaWxkcmVuXG4gICAgICAgIC8vIGRvbid0IGFsbG93IGRyb3Agd2hlbiBkcm9wIGlzIG5vdCBhbGxvd2VkIGNhbGN1bGF0ZWQgYnkgY2FsY0Ryb3BQb3NpdGlvblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBkcmFnIHBvc2l0aW9uXG5cbiAgICAgIGlmIChfdGhpcy5kcmFnTm9kZVByb3BzLmV2ZW50S2V5ID09PSBkcm9wVGFyZ2V0S2V5ICYmIGRyb3BMZXZlbE9mZnNldCA9PT0gMCkge1xuICAgICAgICBpZiAoIShfdGhpcy5zdGF0ZS5kcm9wUG9zaXRpb24gPT09IG51bGwgJiYgX3RoaXMuc3RhdGUuZHJvcExldmVsT2Zmc2V0ID09PSBudWxsICYmIF90aGlzLnN0YXRlLmRyb3BUYXJnZXRLZXkgPT09IG51bGwgJiYgX3RoaXMuc3RhdGUuZHJvcENvbnRhaW5lcktleSA9PT0gbnVsbCAmJiBfdGhpcy5zdGF0ZS5kcm9wVGFyZ2V0UG9zID09PSBudWxsICYmIF90aGlzLnN0YXRlLmRyb3BBbGxvd2VkID09PSBmYWxzZSAmJiBfdGhpcy5zdGF0ZS5kcmFnT3Zlck5vZGVLZXkgPT09IG51bGwpKSB7XG4gICAgICAgICAgX3RoaXMucmVzZXREcmFnU3RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghKGRyb3BQb3NpdGlvbiA9PT0gX3RoaXMuc3RhdGUuZHJvcFBvc2l0aW9uICYmIGRyb3BMZXZlbE9mZnNldCA9PT0gX3RoaXMuc3RhdGUuZHJvcExldmVsT2Zmc2V0ICYmIGRyb3BUYXJnZXRLZXkgPT09IF90aGlzLnN0YXRlLmRyb3BUYXJnZXRLZXkgJiYgZHJvcENvbnRhaW5lcktleSA9PT0gX3RoaXMuc3RhdGUuZHJvcENvbnRhaW5lcktleSAmJiBkcm9wVGFyZ2V0UG9zID09PSBfdGhpcy5zdGF0ZS5kcm9wVGFyZ2V0UG9zICYmIGRyb3BBbGxvd2VkID09PSBfdGhpcy5zdGF0ZS5kcm9wQWxsb3dlZCAmJiBkcmFnT3Zlck5vZGVLZXkgPT09IF90aGlzLnN0YXRlLmRyYWdPdmVyTm9kZUtleSkpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyb3BQb3NpdGlvbjogZHJvcFBvc2l0aW9uLFxuICAgICAgICAgIGRyb3BMZXZlbE9mZnNldDogZHJvcExldmVsT2Zmc2V0LFxuICAgICAgICAgIGRyb3BUYXJnZXRLZXk6IGRyb3BUYXJnZXRLZXksXG4gICAgICAgICAgZHJvcENvbnRhaW5lcktleTogZHJvcENvbnRhaW5lcktleSxcbiAgICAgICAgICBkcm9wVGFyZ2V0UG9zOiBkcm9wVGFyZ2V0UG9zLFxuICAgICAgICAgIGRyb3BBbGxvd2VkOiBkcm9wQWxsb3dlZCxcbiAgICAgICAgICBkcmFnT3Zlck5vZGVLZXk6IGRyYWdPdmVyTm9kZUtleVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIG9uRHJhZ092ZXIgPT09IG51bGwgfHwgb25EcmFnT3ZlciA9PT0gdm9pZCAwIHx8IG9uRHJhZ092ZXIoe1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIG5vZGU6IGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShub2RlUHJvcHMpXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Ob2RlRHJhZ0xlYXZlXCIsIGZ1bmN0aW9uIChldmVudCwgbm9kZVByb3BzKSB7XG4gICAgICAvLyBpZiBpdCBpcyBvdXRzaWRlIHRoZSBkcm9wcGFibGUgYXJlYVxuICAgICAgLy8gY3VycmVudE1vdXNlT3ZlckRyb3BwYWJsZU5vZGVLZXkgd2lsbCBiZSB1cGRhdGVkIGluIGRyYWdlbnRlciBldmVudCB3aGVuIGludG8gYW5vdGhlciBkcm9wcGFibGUgcmVjZWl2ZXIuXG4gICAgICBpZiAoX3RoaXMuY3VycmVudE1vdXNlT3ZlckRyb3BwYWJsZU5vZGVLZXkgPT09IG5vZGVQcm9wcy5ldmVudEtleSAmJiAhZXZlbnQuY3VycmVudFRhcmdldC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICBfdGhpcy5yZXNldERyYWdTdGF0ZSgpO1xuICAgICAgICBfdGhpcy5jdXJyZW50TW91c2VPdmVyRHJvcHBhYmxlTm9kZUtleSA9IG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgb25EcmFnTGVhdmUgPSBfdGhpcy5wcm9wcy5vbkRyYWdMZWF2ZTtcbiAgICAgIG9uRHJhZ0xlYXZlID09PSBudWxsIHx8IG9uRHJhZ0xlYXZlID09PSB2b2lkIDAgfHwgb25EcmFnTGVhdmUoe1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIG5vZGU6IGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShub2RlUHJvcHMpXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvLyBzaW5jZSBzdG9wUHJvcGFnYXRpb24oKSBpcyBjYWxsZWQgaW4gdHJlZU5vZGVcbiAgICAvLyBpZiBvbldpbmRvd0RyYWcgaXMgY2FsbGVkLCB3aGljZSBtZWFucyBzdGF0ZSBpcyBrZWVwZWQsIGRyYWcgc3RhdGUgc2hvdWxkIGJlIGNsZWFyZWRcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25XaW5kb3dEcmFnRW5kXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgX3RoaXMub25Ob2RlRHJhZ0VuZChldmVudCwgbnVsbCwgdHJ1ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIF90aGlzLm9uV2luZG93RHJhZ0VuZCk7XG4gICAgfSk7XG4gICAgLy8gaWYgb25Ob2RlRHJhZ0VuZCBpcyBjYWxsZWQsIG9uV2luZG93RHJhZ0VuZCB3b24ndCBiZSBjYWxsZWQgc2luY2Ugc3RvcFByb3BhZ2F0aW9uKCkgaXMgY2FsbGVkXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uTm9kZURyYWdFbmRcIiwgZnVuY3Rpb24gKGV2ZW50LCBub2RlUHJvcHMpIHtcbiAgICAgIHZhciBvbkRyYWdFbmQgPSBfdGhpcy5wcm9wcy5vbkRyYWdFbmQ7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdPdmVyTm9kZUtleTogbnVsbFxuICAgICAgfSk7XG4gICAgICBfdGhpcy5jbGVhbkRyYWdTdGF0ZSgpO1xuICAgICAgb25EcmFnRW5kID09PSBudWxsIHx8IG9uRHJhZ0VuZCA9PT0gdm9pZCAwIHx8IG9uRHJhZ0VuZCh7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgbm9kZTogY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKG5vZGVQcm9wcylcbiAgICAgIH0pO1xuICAgICAgX3RoaXMuZHJhZ05vZGVQcm9wcyA9IG51bGw7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIF90aGlzLm9uV2luZG93RHJhZ0VuZCk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uTm9kZURyb3BcIiwgZnVuY3Rpb24gKGV2ZW50LCBfKSB7XG4gICAgICB2YXIgX3RoaXMkZ2V0QWN0aXZlSXRlbTtcbiAgICAgIHZhciBvdXRzaWRlVHJlZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gICAgICB2YXIgX3RoaXMkc3RhdGU0ID0gX3RoaXMuc3RhdGUsXG4gICAgICAgIGRyYWdDaGlsZHJlbktleXMgPSBfdGhpcyRzdGF0ZTQuZHJhZ0NoaWxkcmVuS2V5cyxcbiAgICAgICAgZHJvcFBvc2l0aW9uID0gX3RoaXMkc3RhdGU0LmRyb3BQb3NpdGlvbixcbiAgICAgICAgZHJvcFRhcmdldEtleSA9IF90aGlzJHN0YXRlNC5kcm9wVGFyZ2V0S2V5LFxuICAgICAgICBkcm9wVGFyZ2V0UG9zID0gX3RoaXMkc3RhdGU0LmRyb3BUYXJnZXRQb3MsXG4gICAgICAgIGRyb3BBbGxvd2VkID0gX3RoaXMkc3RhdGU0LmRyb3BBbGxvd2VkO1xuICAgICAgaWYgKCFkcm9wQWxsb3dlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgb25Ecm9wID0gX3RoaXMucHJvcHMub25Ecm9wO1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnT3Zlck5vZGVLZXk6IG51bGxcbiAgICAgIH0pO1xuICAgICAgX3RoaXMuY2xlYW5EcmFnU3RhdGUoKTtcbiAgICAgIGlmIChkcm9wVGFyZ2V0S2V5ID09PSBudWxsKSByZXR1cm47XG4gICAgICB2YXIgYWJzdHJhY3REcm9wTm9kZVByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBnZXRUcmVlTm9kZVByb3BzKGRyb3BUYXJnZXRLZXksIF90aGlzLmdldFRyZWVOb2RlUmVxdWlyZWRQcm9wcygpKSksIHt9LCB7XG4gICAgICAgIGFjdGl2ZTogKChfdGhpcyRnZXRBY3RpdmVJdGVtID0gX3RoaXMuZ2V0QWN0aXZlSXRlbSgpKSA9PT0gbnVsbCB8fCBfdGhpcyRnZXRBY3RpdmVJdGVtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRnZXRBY3RpdmVJdGVtLmtleSkgPT09IGRyb3BUYXJnZXRLZXksXG4gICAgICAgIGRhdGE6IGdldEVudGl0eShfdGhpcy5zdGF0ZS5rZXlFbnRpdGllcywgZHJvcFRhcmdldEtleSkubm9kZVxuICAgICAgfSk7XG4gICAgICB2YXIgZHJvcFRvQ2hpbGQgPSBkcmFnQ2hpbGRyZW5LZXlzLmluY2x1ZGVzKGRyb3BUYXJnZXRLZXkpO1xuICAgICAgd2FybmluZyghZHJvcFRvQ2hpbGQsIFwiQ2FuIG5vdCBkcm9wIHRvIGRyYWdOb2RlJ3MgY2hpbGRyZW4gbm9kZS4gVGhpcyBpcyBhIGJ1ZyBvZiByYy10cmVlLiBQbGVhc2UgcmVwb3J0IGFuIGlzc3VlLlwiKTtcbiAgICAgIHZhciBwb3NBcnIgPSBwb3NUb0Fycihkcm9wVGFyZ2V0UG9zKTtcbiAgICAgIHZhciBkcm9wUmVzdWx0ID0ge1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIG5vZGU6IGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShhYnN0cmFjdERyb3BOb2RlUHJvcHMpLFxuICAgICAgICBkcmFnTm9kZTogX3RoaXMuZHJhZ05vZGVQcm9wcyA/IGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShfdGhpcy5kcmFnTm9kZVByb3BzKSA6IG51bGwsXG4gICAgICAgIGRyYWdOb2Rlc0tleXM6IFtfdGhpcy5kcmFnTm9kZVByb3BzLmV2ZW50S2V5XS5jb25jYXQoZHJhZ0NoaWxkcmVuS2V5cyksXG4gICAgICAgIGRyb3BUb0dhcDogZHJvcFBvc2l0aW9uICE9PSAwLFxuICAgICAgICBkcm9wUG9zaXRpb246IGRyb3BQb3NpdGlvbiArIE51bWJlcihwb3NBcnJbcG9zQXJyLmxlbmd0aCAtIDFdKVxuICAgICAgfTtcbiAgICAgIGlmICghb3V0c2lkZVRyZWUpIHtcbiAgICAgICAgb25Ecm9wID09PSBudWxsIHx8IG9uRHJvcCA9PT0gdm9pZCAwIHx8IG9uRHJvcChkcm9wUmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIF90aGlzLmRyYWdOb2RlUHJvcHMgPSBudWxsO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjbGVhbkRyYWdTdGF0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZHJhZ2dpbmdOb2RlS2V5ID0gX3RoaXMuc3RhdGUuZHJhZ2dpbmdOb2RlS2V5O1xuICAgICAgaWYgKGRyYWdnaW5nTm9kZUtleSAhPT0gbnVsbCkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdOb2RlS2V5OiBudWxsLFxuICAgICAgICAgIGRyb3BQb3NpdGlvbjogbnVsbCxcbiAgICAgICAgICBkcm9wQ29udGFpbmVyS2V5OiBudWxsLFxuICAgICAgICAgIGRyb3BUYXJnZXRLZXk6IG51bGwsXG4gICAgICAgICAgZHJvcExldmVsT2Zmc2V0OiBudWxsLFxuICAgICAgICAgIGRyb3BBbGxvd2VkOiB0cnVlLFxuICAgICAgICAgIGRyYWdPdmVyTm9kZUtleTogbnVsbFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIF90aGlzLmRyYWdTdGFydE1vdXNlUG9zaXRpb24gPSBudWxsO1xuICAgICAgX3RoaXMuY3VycmVudE1vdXNlT3ZlckRyb3BwYWJsZU5vZGVLZXkgPSBudWxsO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJ0cmlnZ2VyRXhwYW5kQWN0aW9uRXhwYW5kXCIsIGZ1bmN0aW9uIChlLCB0cmVlTm9kZSkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlNSA9IF90aGlzLnN0YXRlLFxuICAgICAgICBleHBhbmRlZEtleXMgPSBfdGhpcyRzdGF0ZTUuZXhwYW5kZWRLZXlzLFxuICAgICAgICBmbGF0dGVuTm9kZXMgPSBfdGhpcyRzdGF0ZTUuZmxhdHRlbk5vZGVzO1xuICAgICAgdmFyIGV4cGFuZGVkID0gdHJlZU5vZGUuZXhwYW5kZWQsXG4gICAgICAgIGtleSA9IHRyZWVOb2RlLmtleSxcbiAgICAgICAgaXNMZWFmID0gdHJlZU5vZGUuaXNMZWFmO1xuICAgICAgaWYgKGlzTGVhZiB8fCBlLnNoaWZ0S2V5IHx8IGUubWV0YUtleSB8fCBlLmN0cmxLZXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG5vZGUgPSBmbGF0dGVuTm9kZXMuZmlsdGVyKGZ1bmN0aW9uIChub2RlSXRlbSkge1xuICAgICAgICByZXR1cm4gbm9kZUl0ZW0ua2V5ID09PSBrZXk7XG4gICAgICB9KVswXTtcbiAgICAgIHZhciBldmVudE5vZGUgPSBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBnZXRUcmVlTm9kZVByb3BzKGtleSwgX3RoaXMuZ2V0VHJlZU5vZGVSZXF1aXJlZFByb3BzKCkpKSwge30sIHtcbiAgICAgICAgZGF0YTogbm9kZS5kYXRhXG4gICAgICB9KSk7XG4gICAgICBfdGhpcy5zZXRFeHBhbmRlZEtleXMoZXhwYW5kZWQgPyBhcnJEZWwoZXhwYW5kZWRLZXlzLCBrZXkpIDogYXJyQWRkKGV4cGFuZGVkS2V5cywga2V5KSk7XG4gICAgICBfdGhpcy5vbk5vZGVFeHBhbmQoZSwgZXZlbnROb2RlKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Ob2RlQ2xpY2tcIiwgZnVuY3Rpb24gKGUsIHRyZWVOb2RlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMsXG4gICAgICAgIG9uQ2xpY2sgPSBfdGhpcyRwcm9wczMub25DbGljayxcbiAgICAgICAgZXhwYW5kQWN0aW9uID0gX3RoaXMkcHJvcHMzLmV4cGFuZEFjdGlvbjtcbiAgICAgIGlmIChleHBhbmRBY3Rpb24gPT09ICdjbGljaycpIHtcbiAgICAgICAgX3RoaXMudHJpZ2dlckV4cGFuZEFjdGlvbkV4cGFuZChlLCB0cmVlTm9kZSk7XG4gICAgICB9XG4gICAgICBvbkNsaWNrID09PSBudWxsIHx8IG9uQ2xpY2sgPT09IHZvaWQgMCB8fCBvbkNsaWNrKGUsIHRyZWVOb2RlKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Ob2RlRG91YmxlQ2xpY2tcIiwgZnVuY3Rpb24gKGUsIHRyZWVOb2RlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gX3RoaXMucHJvcHMsXG4gICAgICAgIG9uRG91YmxlQ2xpY2sgPSBfdGhpcyRwcm9wczQub25Eb3VibGVDbGljayxcbiAgICAgICAgZXhwYW5kQWN0aW9uID0gX3RoaXMkcHJvcHM0LmV4cGFuZEFjdGlvbjtcbiAgICAgIGlmIChleHBhbmRBY3Rpb24gPT09ICdkb3VibGVDbGljaycpIHtcbiAgICAgICAgX3RoaXMudHJpZ2dlckV4cGFuZEFjdGlvbkV4cGFuZChlLCB0cmVlTm9kZSk7XG4gICAgICB9XG4gICAgICBvbkRvdWJsZUNsaWNrID09PSBudWxsIHx8IG9uRG91YmxlQ2xpY2sgPT09IHZvaWQgMCB8fCBvbkRvdWJsZUNsaWNrKGUsIHRyZWVOb2RlKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Ob2RlU2VsZWN0XCIsIGZ1bmN0aW9uIChlLCB0cmVlTm9kZSkge1xuICAgICAgdmFyIHNlbGVjdGVkS2V5cyA9IF90aGlzLnN0YXRlLnNlbGVjdGVkS2V5cztcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTYgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAga2V5RW50aXRpZXMgPSBfdGhpcyRzdGF0ZTYua2V5RW50aXRpZXMsXG4gICAgICAgIGZpZWxkTmFtZXMgPSBfdGhpcyRzdGF0ZTYuZmllbGROYW1lcztcbiAgICAgIHZhciBfdGhpcyRwcm9wczUgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgb25TZWxlY3QgPSBfdGhpcyRwcm9wczUub25TZWxlY3QsXG4gICAgICAgIG11bHRpcGxlID0gX3RoaXMkcHJvcHM1Lm11bHRpcGxlO1xuICAgICAgdmFyIHNlbGVjdGVkID0gdHJlZU5vZGUuc2VsZWN0ZWQ7XG4gICAgICB2YXIga2V5ID0gdHJlZU5vZGVbZmllbGROYW1lcy5rZXldO1xuICAgICAgdmFyIHRhcmdldFNlbGVjdGVkID0gIXNlbGVjdGVkO1xuXG4gICAgICAvLyBVcGRhdGUgc2VsZWN0ZWQga2V5c1xuICAgICAgaWYgKCF0YXJnZXRTZWxlY3RlZCkge1xuICAgICAgICBzZWxlY3RlZEtleXMgPSBhcnJEZWwoc2VsZWN0ZWRLZXlzLCBrZXkpO1xuICAgICAgfSBlbHNlIGlmICghbXVsdGlwbGUpIHtcbiAgICAgICAgc2VsZWN0ZWRLZXlzID0gW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZEtleXMgPSBhcnJBZGQoc2VsZWN0ZWRLZXlzLCBrZXkpO1xuICAgICAgfVxuXG4gICAgICAvLyBbTGVnYWN5XSBOb3QgZm91bmQgcmVsYXRlZCB1c2FnZSBpbiBkb2Mgb3IgdXBwZXIgbGlic1xuICAgICAgdmFyIHNlbGVjdGVkTm9kZXMgPSBzZWxlY3RlZEtleXMubWFwKGZ1bmN0aW9uIChzZWxlY3RlZEtleSkge1xuICAgICAgICB2YXIgZW50aXR5ID0gZ2V0RW50aXR5KGtleUVudGl0aWVzLCBzZWxlY3RlZEtleSk7XG4gICAgICAgIHJldHVybiBlbnRpdHkgPyBlbnRpdHkubm9kZSA6IG51bGw7XG4gICAgICB9KS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBfdGhpcy5zZXRVbmNvbnRyb2xsZWRTdGF0ZSh7XG4gICAgICAgIHNlbGVjdGVkS2V5czogc2VsZWN0ZWRLZXlzXG4gICAgICB9KTtcbiAgICAgIG9uU2VsZWN0ID09PSBudWxsIHx8IG9uU2VsZWN0ID09PSB2b2lkIDAgfHwgb25TZWxlY3Qoc2VsZWN0ZWRLZXlzLCB7XG4gICAgICAgIGV2ZW50OiAnc2VsZWN0JyxcbiAgICAgICAgc2VsZWN0ZWQ6IHRhcmdldFNlbGVjdGVkLFxuICAgICAgICBub2RlOiB0cmVlTm9kZSxcbiAgICAgICAgc2VsZWN0ZWROb2Rlczogc2VsZWN0ZWROb2RlcyxcbiAgICAgICAgbmF0aXZlRXZlbnQ6IGUubmF0aXZlRXZlbnRcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbk5vZGVDaGVja1wiLCBmdW5jdGlvbiAoZSwgdHJlZU5vZGUsIGNoZWNrZWQpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTcgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAga2V5RW50aXRpZXMgPSBfdGhpcyRzdGF0ZTcua2V5RW50aXRpZXMsXG4gICAgICAgIG9yaUNoZWNrZWRLZXlzID0gX3RoaXMkc3RhdGU3LmNoZWNrZWRLZXlzLFxuICAgICAgICBvcmlIYWxmQ2hlY2tlZEtleXMgPSBfdGhpcyRzdGF0ZTcuaGFsZkNoZWNrZWRLZXlzO1xuICAgICAgdmFyIF90aGlzJHByb3BzNiA9IF90aGlzLnByb3BzLFxuICAgICAgICBjaGVja1N0cmljdGx5ID0gX3RoaXMkcHJvcHM2LmNoZWNrU3RyaWN0bHksXG4gICAgICAgIG9uQ2hlY2sgPSBfdGhpcyRwcm9wczYub25DaGVjaztcbiAgICAgIHZhciBrZXkgPSB0cmVlTm9kZS5rZXk7XG5cbiAgICAgIC8vIFByZXBhcmUgdHJpZ2dlciBhcmd1bWVudHNcbiAgICAgIHZhciBjaGVja2VkT2JqO1xuICAgICAgdmFyIGV2ZW50T2JqID0ge1xuICAgICAgICBldmVudDogJ2NoZWNrJyxcbiAgICAgICAgbm9kZTogdHJlZU5vZGUsXG4gICAgICAgIGNoZWNrZWQ6IGNoZWNrZWQsXG4gICAgICAgIG5hdGl2ZUV2ZW50OiBlLm5hdGl2ZUV2ZW50XG4gICAgICB9O1xuICAgICAgaWYgKGNoZWNrU3RyaWN0bHkpIHtcbiAgICAgICAgdmFyIGNoZWNrZWRLZXlzID0gY2hlY2tlZCA/IGFyckFkZChvcmlDaGVja2VkS2V5cywga2V5KSA6IGFyckRlbChvcmlDaGVja2VkS2V5cywga2V5KTtcbiAgICAgICAgdmFyIGhhbGZDaGVja2VkS2V5cyA9IGFyckRlbChvcmlIYWxmQ2hlY2tlZEtleXMsIGtleSk7XG4gICAgICAgIGNoZWNrZWRPYmogPSB7XG4gICAgICAgICAgY2hlY2tlZDogY2hlY2tlZEtleXMsXG4gICAgICAgICAgaGFsZkNoZWNrZWQ6IGhhbGZDaGVja2VkS2V5c1xuICAgICAgICB9O1xuICAgICAgICBldmVudE9iai5jaGVja2VkTm9kZXMgPSBjaGVja2VkS2V5cy5tYXAoZnVuY3Rpb24gKGNoZWNrZWRLZXkpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0RW50aXR5KGtleUVudGl0aWVzLCBjaGVja2VkS2V5KTtcbiAgICAgICAgfSkuZmlsdGVyKEJvb2xlYW4pLm1hcChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgICAgcmV0dXJuIGVudGl0eS5ub2RlO1xuICAgICAgICB9KTtcbiAgICAgICAgX3RoaXMuc2V0VW5jb250cm9sbGVkU3RhdGUoe1xuICAgICAgICAgIGNoZWNrZWRLZXlzOiBjaGVja2VkS2V5c1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFsd2F5cyBmaWxsIGZpcnN0XG4gICAgICAgIHZhciBfY29uZHVjdENoZWNrID0gY29uZHVjdENoZWNrKFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkob3JpQ2hlY2tlZEtleXMpLCBba2V5XSksIHRydWUsIGtleUVudGl0aWVzKSxcbiAgICAgICAgICBfY2hlY2tlZEtleXMgPSBfY29uZHVjdENoZWNrLmNoZWNrZWRLZXlzLFxuICAgICAgICAgIF9oYWxmQ2hlY2tlZEtleXMgPSBfY29uZHVjdENoZWNrLmhhbGZDaGVja2VkS2V5cztcblxuICAgICAgICAvLyBJZiByZW1vdmUsIHdlIGRvIGl0IGFnYWluIHRvIGNvcnJlY3Rpb25cbiAgICAgICAgaWYgKCFjaGVja2VkKSB7XG4gICAgICAgICAgdmFyIGtleVNldCA9IG5ldyBTZXQoX2NoZWNrZWRLZXlzKTtcbiAgICAgICAgICBrZXlTZXQuZGVsZXRlKGtleSk7XG4gICAgICAgICAgdmFyIF9jb25kdWN0Q2hlY2syID0gY29uZHVjdENoZWNrKEFycmF5LmZyb20oa2V5U2V0KSwge1xuICAgICAgICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgICAgICAgICBoYWxmQ2hlY2tlZEtleXM6IF9oYWxmQ2hlY2tlZEtleXNcbiAgICAgICAgICB9LCBrZXlFbnRpdGllcyk7XG4gICAgICAgICAgX2NoZWNrZWRLZXlzID0gX2NvbmR1Y3RDaGVjazIuY2hlY2tlZEtleXM7XG4gICAgICAgICAgX2hhbGZDaGVja2VkS2V5cyA9IF9jb25kdWN0Q2hlY2syLmhhbGZDaGVja2VkS2V5cztcbiAgICAgICAgfVxuICAgICAgICBjaGVja2VkT2JqID0gX2NoZWNrZWRLZXlzO1xuXG4gICAgICAgIC8vIFtMZWdhY3ldIFRoaXMgaXMgdXNlZCBmb3IgYHJjLXRyZWUtc2VsZWN0YFxuICAgICAgICBldmVudE9iai5jaGVja2VkTm9kZXMgPSBbXTtcbiAgICAgICAgZXZlbnRPYmouY2hlY2tlZE5vZGVzUG9zaXRpb25zID0gW107XG4gICAgICAgIGV2ZW50T2JqLmhhbGZDaGVja2VkS2V5cyA9IF9oYWxmQ2hlY2tlZEtleXM7XG4gICAgICAgIF9jaGVja2VkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChjaGVja2VkS2V5KSB7XG4gICAgICAgICAgdmFyIGVudGl0eSA9IGdldEVudGl0eShrZXlFbnRpdGllcywgY2hlY2tlZEtleSk7XG4gICAgICAgICAgaWYgKCFlbnRpdHkpIHJldHVybjtcbiAgICAgICAgICB2YXIgbm9kZSA9IGVudGl0eS5ub2RlLFxuICAgICAgICAgICAgcG9zID0gZW50aXR5LnBvcztcbiAgICAgICAgICBldmVudE9iai5jaGVja2VkTm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICBldmVudE9iai5jaGVja2VkTm9kZXNQb3NpdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgcG9zOiBwb3NcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIF90aGlzLnNldFVuY29udHJvbGxlZFN0YXRlKHtcbiAgICAgICAgICBjaGVja2VkS2V5czogX2NoZWNrZWRLZXlzXG4gICAgICAgIH0sIGZhbHNlLCB7XG4gICAgICAgICAgaGFsZkNoZWNrZWRLZXlzOiBfaGFsZkNoZWNrZWRLZXlzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgb25DaGVjayA9PT0gbnVsbCB8fCBvbkNoZWNrID09PSB2b2lkIDAgfHwgb25DaGVjayhjaGVja2VkT2JqLCBldmVudE9iaik7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uTm9kZUxvYWRcIiwgZnVuY3Rpb24gKHRyZWVOb2RlKSB7XG4gICAgICB2YXIgX2VudGl0eSRjaGlsZHJlbjtcbiAgICAgIHZhciBrZXkgPSB0cmVlTm9kZS5rZXk7XG4gICAgICB2YXIga2V5RW50aXRpZXMgPSBfdGhpcy5zdGF0ZS5rZXlFbnRpdGllcztcblxuICAgICAgLy8gU2tpcCBpZiBoYXMgY2hpbGRyZW4gYWxyZWFkeVxuICAgICAgdmFyIGVudGl0eSA9IGdldEVudGl0eShrZXlFbnRpdGllcywga2V5KTtcbiAgICAgIGlmIChlbnRpdHkgIT09IG51bGwgJiYgZW50aXR5ICE9PSB2b2lkIDAgJiYgKF9lbnRpdHkkY2hpbGRyZW4gPSBlbnRpdHkuY2hpbGRyZW4pICE9PSBudWxsICYmIF9lbnRpdHkkY2hpbGRyZW4gIT09IHZvaWQgMCAmJiBfZW50aXR5JGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgbG9hZFByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZ2V0IHRoZSBsYXRlc3Qgc3RhdGUgb2YgbG9hZGluZy9sb2FkZWQga2V5c1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgIHZhciBfcmVmJGxvYWRlZEtleXMgPSBfcmVmLmxvYWRlZEtleXMsXG4gICAgICAgICAgICBsb2FkZWRLZXlzID0gX3JlZiRsb2FkZWRLZXlzID09PSB2b2lkIDAgPyBbXSA6IF9yZWYkbG9hZGVkS2V5cyxcbiAgICAgICAgICAgIF9yZWYkbG9hZGluZ0tleXMgPSBfcmVmLmxvYWRpbmdLZXlzLFxuICAgICAgICAgICAgbG9hZGluZ0tleXMgPSBfcmVmJGxvYWRpbmdLZXlzID09PSB2b2lkIDAgPyBbXSA6IF9yZWYkbG9hZGluZ0tleXM7XG4gICAgICAgICAgdmFyIF90aGlzJHByb3BzNyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgICAgbG9hZERhdGEgPSBfdGhpcyRwcm9wczcubG9hZERhdGEsXG4gICAgICAgICAgICBvbkxvYWQgPSBfdGhpcyRwcm9wczcub25Mb2FkO1xuICAgICAgICAgIGlmICghbG9hZERhdGEgfHwgbG9hZGVkS2V5cy5pbmNsdWRlcyhrZXkpIHx8IGxvYWRpbmdLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFByb2Nlc3MgbG9hZCBkYXRhXG4gICAgICAgICAgdmFyIHByb21pc2UgPSBsb2FkRGF0YSh0cmVlTm9kZSk7XG4gICAgICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50TG9hZGVkS2V5cyA9IF90aGlzLnN0YXRlLmxvYWRlZEtleXM7XG4gICAgICAgICAgICB2YXIgbmV3TG9hZGVkS2V5cyA9IGFyckFkZChjdXJyZW50TG9hZGVkS2V5cywga2V5KTtcblxuICAgICAgICAgICAgLy8gb25Mb2FkIHNob3VsZCB0cmlnZ2VyIGJlZm9yZSBpbnRlcm5hbCBzZXRTdGF0ZSB0byBhdm9pZCBgbG9hZERhdGFgIHRyaWdnZXIgdHdpY2UuXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8xMjQ2NFxuICAgICAgICAgICAgb25Mb2FkID09PSBudWxsIHx8IG9uTG9hZCA9PT0gdm9pZCAwIHx8IG9uTG9hZChuZXdMb2FkZWRLZXlzLCB7XG4gICAgICAgICAgICAgIGV2ZW50OiAnbG9hZCcsXG4gICAgICAgICAgICAgIG5vZGU6IHRyZWVOb2RlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF90aGlzLnNldFVuY29udHJvbGxlZFN0YXRlKHtcbiAgICAgICAgICAgICAgbG9hZGVkS2V5czogbmV3TG9hZGVkS2V5c1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbG9hZGluZ0tleXM6IGFyckRlbChwcmV2U3RhdGUubG9hZGluZ0tleXMsIGtleSlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbG9hZGluZ0tleXM6IGFyckRlbChwcmV2U3RhdGUubG9hZGluZ0tleXMsIGtleSlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBJZiBleGNlZWQgbWF4IHJldHJ5IHRpbWVzLCB3ZSBnaXZlIHVwIHJldHJ5XG4gICAgICAgICAgICBfdGhpcy5sb2FkaW5nUmV0cnlUaW1lc1trZXldID0gKF90aGlzLmxvYWRpbmdSZXRyeVRpbWVzW2tleV0gfHwgMCkgKyAxO1xuICAgICAgICAgICAgaWYgKF90aGlzLmxvYWRpbmdSZXRyeVRpbWVzW2tleV0gPj0gTUFYX1JFVFJZX1RJTUVTKSB7XG4gICAgICAgICAgICAgIHZhciBjdXJyZW50TG9hZGVkS2V5cyA9IF90aGlzLnN0YXRlLmxvYWRlZEtleXM7XG4gICAgICAgICAgICAgIHdhcm5pbmcoZmFsc2UsICdSZXRyeSBmb3IgYGxvYWREYXRhYCBtYW55IHRpbWVzIGJ1dCBzdGlsbCBmYWlsZWQuIE5vIG1vcmUgcmV0cnkuJyk7XG4gICAgICAgICAgICAgIF90aGlzLnNldFVuY29udHJvbGxlZFN0YXRlKHtcbiAgICAgICAgICAgICAgICBsb2FkZWRLZXlzOiBhcnJBZGQoY3VycmVudExvYWRlZEtleXMsIGtleSlcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbG9hZGluZ0tleXM6IGFyckFkZChsb2FkaW5nS2V5cywga2V5KVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIE5vdCBjYXJlIHdhcm5pbmcgaWYgd2UgaWdub3JlIHRoaXNcbiAgICAgIGxvYWRQcm9taXNlLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgIHJldHVybiBsb2FkUHJvbWlzZTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Ob2RlTW91c2VFbnRlclwiLCBmdW5jdGlvbiAoZXZlbnQsIG5vZGUpIHtcbiAgICAgIHZhciBvbk1vdXNlRW50ZXIgPSBfdGhpcy5wcm9wcy5vbk1vdXNlRW50ZXI7XG4gICAgICBvbk1vdXNlRW50ZXIgPT09IG51bGwgfHwgb25Nb3VzZUVudGVyID09PSB2b2lkIDAgfHwgb25Nb3VzZUVudGVyKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBub2RlOiBub2RlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Ob2RlTW91c2VMZWF2ZVwiLCBmdW5jdGlvbiAoZXZlbnQsIG5vZGUpIHtcbiAgICAgIHZhciBvbk1vdXNlTGVhdmUgPSBfdGhpcy5wcm9wcy5vbk1vdXNlTGVhdmU7XG4gICAgICBvbk1vdXNlTGVhdmUgPT09IG51bGwgfHwgb25Nb3VzZUxlYXZlID09PSB2b2lkIDAgfHwgb25Nb3VzZUxlYXZlKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBub2RlOiBub2RlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25Ob2RlQ29udGV4dE1lbnVcIiwgZnVuY3Rpb24gKGV2ZW50LCBub2RlKSB7XG4gICAgICB2YXIgb25SaWdodENsaWNrID0gX3RoaXMucHJvcHMub25SaWdodENsaWNrO1xuICAgICAgaWYgKG9uUmlnaHRDbGljaykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBvblJpZ2h0Q2xpY2soe1xuICAgICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgICBub2RlOiBub2RlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkZvY3VzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBvbkZvY3VzID0gX3RoaXMucHJvcHMub25Gb2N1cztcbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZm9jdXNlZDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuICAgICAgb25Gb2N1cyA9PT0gbnVsbCB8fCBvbkZvY3VzID09PSB2b2lkIDAgfHwgb25Gb2N1cy5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkJsdXJcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9uQmx1ciA9IF90aGlzLnByb3BzLm9uQmx1cjtcbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZm9jdXNlZDogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgX3RoaXMub25BY3RpdmVDaGFuZ2UobnVsbCk7XG4gICAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjMpLCBfa2V5MyA9IDA7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICAgICAgYXJnc1tfa2V5M10gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgICAgfVxuICAgICAgb25CbHVyID09PSBudWxsIHx8IG9uQmx1ciA9PT0gdm9pZCAwIHx8IG9uQmx1ci5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJnZXRUcmVlTm9kZVJlcXVpcmVkUHJvcHNcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlOCA9IF90aGlzLnN0YXRlLFxuICAgICAgICBleHBhbmRlZEtleXMgPSBfdGhpcyRzdGF0ZTguZXhwYW5kZWRLZXlzLFxuICAgICAgICBzZWxlY3RlZEtleXMgPSBfdGhpcyRzdGF0ZTguc2VsZWN0ZWRLZXlzLFxuICAgICAgICBsb2FkZWRLZXlzID0gX3RoaXMkc3RhdGU4LmxvYWRlZEtleXMsXG4gICAgICAgIGxvYWRpbmdLZXlzID0gX3RoaXMkc3RhdGU4LmxvYWRpbmdLZXlzLFxuICAgICAgICBjaGVja2VkS2V5cyA9IF90aGlzJHN0YXRlOC5jaGVja2VkS2V5cyxcbiAgICAgICAgaGFsZkNoZWNrZWRLZXlzID0gX3RoaXMkc3RhdGU4LmhhbGZDaGVja2VkS2V5cyxcbiAgICAgICAgZHJhZ092ZXJOb2RlS2V5ID0gX3RoaXMkc3RhdGU4LmRyYWdPdmVyTm9kZUtleSxcbiAgICAgICAgZHJvcFBvc2l0aW9uID0gX3RoaXMkc3RhdGU4LmRyb3BQb3NpdGlvbixcbiAgICAgICAga2V5RW50aXRpZXMgPSBfdGhpcyRzdGF0ZTgua2V5RW50aXRpZXM7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBleHBhbmRlZEtleXM6IGV4cGFuZGVkS2V5cyB8fCBbXSxcbiAgICAgICAgc2VsZWN0ZWRLZXlzOiBzZWxlY3RlZEtleXMgfHwgW10sXG4gICAgICAgIGxvYWRlZEtleXM6IGxvYWRlZEtleXMgfHwgW10sXG4gICAgICAgIGxvYWRpbmdLZXlzOiBsb2FkaW5nS2V5cyB8fCBbXSxcbiAgICAgICAgY2hlY2tlZEtleXM6IGNoZWNrZWRLZXlzIHx8IFtdLFxuICAgICAgICBoYWxmQ2hlY2tlZEtleXM6IGhhbGZDaGVja2VkS2V5cyB8fCBbXSxcbiAgICAgICAgZHJhZ092ZXJOb2RlS2V5OiBkcmFnT3Zlck5vZGVLZXksXG4gICAgICAgIGRyb3BQb3NpdGlvbjogZHJvcFBvc2l0aW9uLFxuICAgICAgICBrZXlFbnRpdGllczoga2V5RW50aXRpZXNcbiAgICAgIH07XG4gICAgfSk7XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IEV4cGFuZGVkID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8qKiBTZXQgdW5jb250cm9sbGVkIGBleHBhbmRlZEtleXNgLiBUaGlzIHdpbGwgYWxzbyBhdXRvIHVwZGF0ZSBgZmxhdHRlbk5vZGVzYC4gKi9cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwic2V0RXhwYW5kZWRLZXlzXCIsIGZ1bmN0aW9uIChleHBhbmRlZEtleXMpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTkgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgdHJlZURhdGEgPSBfdGhpcyRzdGF0ZTkudHJlZURhdGEsXG4gICAgICAgIGZpZWxkTmFtZXMgPSBfdGhpcyRzdGF0ZTkuZmllbGROYW1lcztcbiAgICAgIHZhciBmbGF0dGVuTm9kZXMgPSBmbGF0dGVuVHJlZURhdGEodHJlZURhdGEsIGV4cGFuZGVkS2V5cywgZmllbGROYW1lcyk7XG4gICAgICBfdGhpcy5zZXRVbmNvbnRyb2xsZWRTdGF0ZSh7XG4gICAgICAgIGV4cGFuZGVkS2V5czogZXhwYW5kZWRLZXlzLFxuICAgICAgICBmbGF0dGVuTm9kZXM6IGZsYXR0ZW5Ob2Rlc1xuICAgICAgfSwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uTm9kZUV4cGFuZFwiLCBmdW5jdGlvbiAoZSwgdHJlZU5vZGUpIHtcbiAgICAgIHZhciBleHBhbmRlZEtleXMgPSBfdGhpcy5zdGF0ZS5leHBhbmRlZEtleXM7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUxMCA9IF90aGlzLnN0YXRlLFxuICAgICAgICBsaXN0Q2hhbmdpbmcgPSBfdGhpcyRzdGF0ZTEwLmxpc3RDaGFuZ2luZyxcbiAgICAgICAgZmllbGROYW1lcyA9IF90aGlzJHN0YXRlMTAuZmllbGROYW1lcztcbiAgICAgIHZhciBfdGhpcyRwcm9wczggPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgb25FeHBhbmQgPSBfdGhpcyRwcm9wczgub25FeHBhbmQsXG4gICAgICAgIGxvYWREYXRhID0gX3RoaXMkcHJvcHM4LmxvYWREYXRhO1xuICAgICAgdmFyIGV4cGFuZGVkID0gdHJlZU5vZGUuZXhwYW5kZWQ7XG4gICAgICB2YXIga2V5ID0gdHJlZU5vZGVbZmllbGROYW1lcy5rZXldO1xuXG4gICAgICAvLyBEbyBub3RoaW5nIHdoZW4gbW90aW9uIGlzIGluIHByb2dyZXNzXG4gICAgICBpZiAobGlzdENoYW5naW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHNlbGVjdGVkIGtleXNcbiAgICAgIHZhciBjZXJ0YWluID0gZXhwYW5kZWRLZXlzLmluY2x1ZGVzKGtleSk7XG4gICAgICB2YXIgdGFyZ2V0RXhwYW5kZWQgPSAhZXhwYW5kZWQ7XG4gICAgICB3YXJuaW5nKGV4cGFuZGVkICYmIGNlcnRhaW4gfHwgIWV4cGFuZGVkICYmICFjZXJ0YWluLCAnRXhwYW5kIHN0YXRlIG5vdCBzeW5jIHdpdGggaW5kZXggY2hlY2snKTtcbiAgICAgIGV4cGFuZGVkS2V5cyA9IHRhcmdldEV4cGFuZGVkID8gYXJyQWRkKGV4cGFuZGVkS2V5cywga2V5KSA6IGFyckRlbChleHBhbmRlZEtleXMsIGtleSk7XG4gICAgICBfdGhpcy5zZXRFeHBhbmRlZEtleXMoZXhwYW5kZWRLZXlzKTtcbiAgICAgIG9uRXhwYW5kID09PSBudWxsIHx8IG9uRXhwYW5kID09PSB2b2lkIDAgfHwgb25FeHBhbmQoZXhwYW5kZWRLZXlzLCB7XG4gICAgICAgIG5vZGU6IHRyZWVOb2RlLFxuICAgICAgICBleHBhbmRlZDogdGFyZ2V0RXhwYW5kZWQsXG4gICAgICAgIG5hdGl2ZUV2ZW50OiBlLm5hdGl2ZUV2ZW50XG4gICAgICB9KTtcblxuICAgICAgLy8gQXN5bmMgTG9hZCBkYXRhXG4gICAgICBpZiAodGFyZ2V0RXhwYW5kZWQgJiYgbG9hZERhdGEpIHtcbiAgICAgICAgdmFyIGxvYWRQcm9taXNlID0gX3RoaXMub25Ob2RlTG9hZCh0cmVlTm9kZSk7XG4gICAgICAgIGlmIChsb2FkUHJvbWlzZSkge1xuICAgICAgICAgIGxvYWRQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gW0xlZ2FjeV0gUmVmcmVzaCBsb2dpY1xuICAgICAgICAgICAgdmFyIG5ld0ZsYXR0ZW5UcmVlRGF0YSA9IGZsYXR0ZW5UcmVlRGF0YShfdGhpcy5zdGF0ZS50cmVlRGF0YSwgZXhwYW5kZWRLZXlzLCBmaWVsZE5hbWVzKTtcbiAgICAgICAgICAgIF90aGlzLnNldFVuY29udHJvbGxlZFN0YXRlKHtcbiAgICAgICAgICAgICAgZmxhdHRlbk5vZGVzOiBuZXdGbGF0dGVuVHJlZURhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50RXhwYW5kZWRLZXlzID0gX3RoaXMuc3RhdGUuZXhwYW5kZWRLZXlzO1xuICAgICAgICAgICAgdmFyIGV4cGFuZGVkS2V5c1RvUmVzdG9yZSA9IGFyckRlbChjdXJyZW50RXhwYW5kZWRLZXlzLCBrZXkpO1xuICAgICAgICAgICAgX3RoaXMuc2V0RXhwYW5kZWRLZXlzKGV4cGFuZGVkS2V5c1RvUmVzdG9yZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25MaXN0Q2hhbmdlU3RhcnRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuc2V0VW5jb250cm9sbGVkU3RhdGUoe1xuICAgICAgICBsaXN0Q2hhbmdpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkxpc3RDaGFuZ2VFbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLnNldFVuY29udHJvbGxlZFN0YXRlKHtcbiAgICAgICAgICBsaXN0Q2hhbmdpbmc6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IEtleWJvYXJkID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkFjdGl2ZUNoYW5nZVwiLCBmdW5jdGlvbiAobmV3QWN0aXZlS2V5KSB7XG4gICAgICB2YXIgYWN0aXZlS2V5ID0gX3RoaXMuc3RhdGUuYWN0aXZlS2V5O1xuICAgICAgdmFyIF90aGlzJHByb3BzOSA9IF90aGlzLnByb3BzLFxuICAgICAgICBvbkFjdGl2ZUNoYW5nZSA9IF90aGlzJHByb3BzOS5vbkFjdGl2ZUNoYW5nZSxcbiAgICAgICAgX3RoaXMkcHJvcHM5JGl0ZW1TY3JvID0gX3RoaXMkcHJvcHM5Lml0ZW1TY3JvbGxPZmZzZXQsXG4gICAgICAgIGl0ZW1TY3JvbGxPZmZzZXQgPSBfdGhpcyRwcm9wczkkaXRlbVNjcm8gPT09IHZvaWQgMCA/IDAgOiBfdGhpcyRwcm9wczkkaXRlbVNjcm87XG4gICAgICBpZiAoYWN0aXZlS2V5ID09PSBuZXdBY3RpdmVLZXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBhY3RpdmVLZXk6IG5ld0FjdGl2ZUtleVxuICAgICAgfSk7XG4gICAgICBpZiAobmV3QWN0aXZlS2V5ICE9PSBudWxsKSB7XG4gICAgICAgIF90aGlzLnNjcm9sbFRvKHtcbiAgICAgICAgICBrZXk6IG5ld0FjdGl2ZUtleSxcbiAgICAgICAgICBvZmZzZXQ6IGl0ZW1TY3JvbGxPZmZzZXRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBvbkFjdGl2ZUNoYW5nZSA9PT0gbnVsbCB8fCBvbkFjdGl2ZUNoYW5nZSA9PT0gdm9pZCAwIHx8IG9uQWN0aXZlQ2hhbmdlKG5ld0FjdGl2ZUtleSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImdldEFjdGl2ZUl0ZW1cIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlMTEgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgYWN0aXZlS2V5ID0gX3RoaXMkc3RhdGUxMS5hY3RpdmVLZXksXG4gICAgICAgIGZsYXR0ZW5Ob2RlcyA9IF90aGlzJHN0YXRlMTEuZmxhdHRlbk5vZGVzO1xuICAgICAgaWYgKGFjdGl2ZUtleSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmbGF0dGVuTm9kZXMuZmluZChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgdmFyIGtleSA9IF9yZWYyLmtleTtcbiAgICAgICAgcmV0dXJuIGtleSA9PT0gYWN0aXZlS2V5O1xuICAgICAgfSkgfHwgbnVsbDtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib2Zmc2V0QWN0aXZlS2V5XCIsIGZ1bmN0aW9uIChvZmZzZXQpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTEyID0gX3RoaXMuc3RhdGUsXG4gICAgICAgIGZsYXR0ZW5Ob2RlcyA9IF90aGlzJHN0YXRlMTIuZmxhdHRlbk5vZGVzLFxuICAgICAgICBhY3RpdmVLZXkgPSBfdGhpcyRzdGF0ZTEyLmFjdGl2ZUtleTtcbiAgICAgIHZhciBpbmRleCA9IGZsYXR0ZW5Ob2Rlcy5maW5kSW5kZXgoZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgIHZhciBrZXkgPSBfcmVmMy5rZXk7XG4gICAgICAgIHJldHVybiBrZXkgPT09IGFjdGl2ZUtleTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBbGlnbiB3aXRoIGluZGV4XG4gICAgICBpZiAoaW5kZXggPT09IC0xICYmIG9mZnNldCA8IDApIHtcbiAgICAgICAgaW5kZXggPSBmbGF0dGVuTm9kZXMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaW5kZXggPSAoaW5kZXggKyBvZmZzZXQgKyBmbGF0dGVuTm9kZXMubGVuZ3RoKSAlIGZsYXR0ZW5Ob2Rlcy5sZW5ndGg7XG4gICAgICB2YXIgaXRlbSA9IGZsYXR0ZW5Ob2Rlc1tpbmRleF07XG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICB2YXIgX2tleTQgPSBpdGVtLmtleTtcbiAgICAgICAgX3RoaXMub25BY3RpdmVDaGFuZ2UoX2tleTQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMub25BY3RpdmVDaGFuZ2UobnVsbCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uS2V5RG93blwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTEzID0gX3RoaXMuc3RhdGUsXG4gICAgICAgIGFjdGl2ZUtleSA9IF90aGlzJHN0YXRlMTMuYWN0aXZlS2V5LFxuICAgICAgICBleHBhbmRlZEtleXMgPSBfdGhpcyRzdGF0ZTEzLmV4cGFuZGVkS2V5cyxcbiAgICAgICAgY2hlY2tlZEtleXMgPSBfdGhpcyRzdGF0ZTEzLmNoZWNrZWRLZXlzLFxuICAgICAgICBmaWVsZE5hbWVzID0gX3RoaXMkc3RhdGUxMy5maWVsZE5hbWVzO1xuICAgICAgdmFyIF90aGlzJHByb3BzMTAgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgb25LZXlEb3duID0gX3RoaXMkcHJvcHMxMC5vbktleURvd24sXG4gICAgICAgIGNoZWNrYWJsZSA9IF90aGlzJHByb3BzMTAuY2hlY2thYmxlLFxuICAgICAgICBzZWxlY3RhYmxlID0gX3RoaXMkcHJvcHMxMC5zZWxlY3RhYmxlO1xuXG4gICAgICAvLyA+Pj4+Pj4+Pj4+IERpcmVjdGlvblxuICAgICAgc3dpdGNoIChldmVudC53aGljaCkge1xuICAgICAgICBjYXNlIEtleUNvZGUuVVA6XG4gICAgICAgICAge1xuICAgICAgICAgICAgX3RoaXMub2Zmc2V0QWN0aXZlS2V5KC0xKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgS2V5Q29kZS5ET1dOOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIF90aGlzLm9mZnNldEFjdGl2ZUtleSgxKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vID4+Pj4+Pj4+Pj4gRXhwYW5kICYgU2VsZWN0aW9uXG4gICAgICB2YXIgYWN0aXZlSXRlbSA9IF90aGlzLmdldEFjdGl2ZUl0ZW0oKTtcbiAgICAgIGlmIChhY3RpdmVJdGVtICYmIGFjdGl2ZUl0ZW0uZGF0YSkge1xuICAgICAgICB2YXIgdHJlZU5vZGVSZXF1aXJlZFByb3BzID0gX3RoaXMuZ2V0VHJlZU5vZGVSZXF1aXJlZFByb3BzKCk7XG4gICAgICAgIHZhciBleHBhbmRhYmxlID0gYWN0aXZlSXRlbS5kYXRhLmlzTGVhZiA9PT0gZmFsc2UgfHwgISEoYWN0aXZlSXRlbS5kYXRhW2ZpZWxkTmFtZXMuY2hpbGRyZW5dIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgIHZhciBldmVudE5vZGUgPSBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBnZXRUcmVlTm9kZVByb3BzKGFjdGl2ZUtleSwgdHJlZU5vZGVSZXF1aXJlZFByb3BzKSksIHt9LCB7XG4gICAgICAgICAgZGF0YTogYWN0aXZlSXRlbS5kYXRhLFxuICAgICAgICAgIGFjdGl2ZTogdHJ1ZVxuICAgICAgICB9KSk7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHtcbiAgICAgICAgICAvLyA+Pj4gRXhwYW5kXG4gICAgICAgICAgY2FzZSBLZXlDb2RlLkxFRlQ6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIENvbGxhcHNlIGlmIHBvc3NpYmxlXG4gICAgICAgICAgICAgIGlmIChleHBhbmRhYmxlICYmIGV4cGFuZGVkS2V5cy5pbmNsdWRlcyhhY3RpdmVLZXkpKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMub25Ob2RlRXhwYW5kKHt9LCBldmVudE5vZGUpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZUl0ZW0ucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgX3RoaXMub25BY3RpdmVDaGFuZ2UoYWN0aXZlSXRlbS5wYXJlbnQua2V5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIEtleUNvZGUuUklHSFQ6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIEV4cGFuZCBpZiBwb3NzaWJsZVxuICAgICAgICAgICAgICBpZiAoZXhwYW5kYWJsZSAmJiAhZXhwYW5kZWRLZXlzLmluY2x1ZGVzKGFjdGl2ZUtleSkpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5vbk5vZGVFeHBhbmQoe30sIGV2ZW50Tm9kZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aXZlSXRlbS5jaGlsZHJlbiAmJiBhY3RpdmVJdGVtLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIF90aGlzLm9uQWN0aXZlQ2hhbmdlKGFjdGl2ZUl0ZW0uY2hpbGRyZW5bMF0ua2V5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNlbGVjdGlvblxuICAgICAgICAgIGNhc2UgS2V5Q29kZS5FTlRFUjpcbiAgICAgICAgICBjYXNlIEtleUNvZGUuU1BBQ0U6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChjaGVja2FibGUgJiYgIWV2ZW50Tm9kZS5kaXNhYmxlZCAmJiBldmVudE5vZGUuY2hlY2thYmxlICE9PSBmYWxzZSAmJiAhZXZlbnROb2RlLmRpc2FibGVDaGVja2JveCkge1xuICAgICAgICAgICAgICAgIF90aGlzLm9uTm9kZUNoZWNrKHt9LCBldmVudE5vZGUsICFjaGVja2VkS2V5cy5pbmNsdWRlcyhhY3RpdmVLZXkpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICghY2hlY2thYmxlICYmIHNlbGVjdGFibGUgJiYgIWV2ZW50Tm9kZS5kaXNhYmxlZCAmJiBldmVudE5vZGUuc2VsZWN0YWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5vbk5vZGVTZWxlY3Qoe30sIGV2ZW50Tm9kZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9uS2V5RG93biA9PT0gbnVsbCB8fCBvbktleURvd24gPT09IHZvaWQgMCB8fCBvbktleURvd24oZXZlbnQpO1xuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIE9ubHkgdXBkYXRlIHRoZSB2YWx1ZSB3aGljaCBpcyBub3QgaW4gcHJvcHNcbiAgICAgKi9cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwic2V0VW5jb250cm9sbGVkU3RhdGVcIiwgZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICB2YXIgYXRvbWljID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICAgIHZhciBmb3JjZVN0YXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsO1xuICAgICAgaWYgKCFfdGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgdmFyIG5lZWRTeW5jID0gZmFsc2U7XG4gICAgICAgIHZhciBhbGxQYXNzZWQgPSB0cnVlO1xuICAgICAgICB2YXIgbmV3U3RhdGUgPSB7fTtcbiAgICAgICAgT2JqZWN0LmtleXMoc3RhdGUpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICBpZiAoX3RoaXMucHJvcHMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgIGFsbFBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZWVkU3luYyA9IHRydWU7XG4gICAgICAgICAgbmV3U3RhdGVbbmFtZV0gPSBzdGF0ZVtuYW1lXTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChuZWVkU3luYyAmJiAoIWF0b21pYyB8fCBhbGxQYXNzZWQpKSB7XG4gICAgICAgICAgX3RoaXMuc2V0U3RhdGUoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBuZXdTdGF0ZSksIGZvcmNlU3RhdGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzY3JvbGxUb1wiLCBmdW5jdGlvbiAoc2Nyb2xsKSB7XG4gICAgICBfdGhpcy5saXN0UmVmLmN1cnJlbnQuc2Nyb2xsVG8oc2Nyb2xsKTtcbiAgICB9KTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKFRyZWUsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMub25VcGRhdGVkKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICB0aGlzLm9uVXBkYXRlZCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvblVwZGF0ZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25VcGRhdGVkKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMTEgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3RpdmVLZXkgPSBfdGhpcyRwcm9wczExLmFjdGl2ZUtleSxcbiAgICAgICAgX3RoaXMkcHJvcHMxMSRpdGVtU2NyID0gX3RoaXMkcHJvcHMxMS5pdGVtU2Nyb2xsT2Zmc2V0LFxuICAgICAgICBpdGVtU2Nyb2xsT2Zmc2V0ID0gX3RoaXMkcHJvcHMxMSRpdGVtU2NyID09PSB2b2lkIDAgPyAwIDogX3RoaXMkcHJvcHMxMSRpdGVtU2NyO1xuICAgICAgaWYgKGFjdGl2ZUtleSAhPT0gdW5kZWZpbmVkICYmIGFjdGl2ZUtleSAhPT0gdGhpcy5zdGF0ZS5hY3RpdmVLZXkpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgYWN0aXZlS2V5OiBhY3RpdmVLZXlcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChhY3RpdmVLZXkgIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnNjcm9sbFRvKHtcbiAgICAgICAgICAgIGtleTogYWN0aXZlS2V5LFxuICAgICAgICAgICAgb2Zmc2V0OiBpdGVtU2Nyb2xsT2Zmc2V0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIHRoaXMub25XaW5kb3dEcmFnRW5kKTtcbiAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXREcmFnU3RhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXREcmFnU3RhdGUoKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ092ZXJOb2RlS2V5OiBudWxsLFxuICAgICAgICBkcm9wUG9zaXRpb246IG51bGwsXG4gICAgICAgIGRyb3BMZXZlbE9mZnNldDogbnVsbCxcbiAgICAgICAgZHJvcFRhcmdldEtleTogbnVsbCxcbiAgICAgICAgZHJvcENvbnRhaW5lcktleTogbnVsbCxcbiAgICAgICAgZHJvcFRhcmdldFBvczogbnVsbCxcbiAgICAgICAgZHJvcEFsbG93ZWQ6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTE0ID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgZm9jdXNlZCA9IF90aGlzJHN0YXRlMTQuZm9jdXNlZCxcbiAgICAgICAgZmxhdHRlbk5vZGVzID0gX3RoaXMkc3RhdGUxNC5mbGF0dGVuTm9kZXMsXG4gICAgICAgIGtleUVudGl0aWVzID0gX3RoaXMkc3RhdGUxNC5rZXlFbnRpdGllcyxcbiAgICAgICAgZHJhZ2dpbmdOb2RlS2V5ID0gX3RoaXMkc3RhdGUxNC5kcmFnZ2luZ05vZGVLZXksXG4gICAgICAgIGFjdGl2ZUtleSA9IF90aGlzJHN0YXRlMTQuYWN0aXZlS2V5LFxuICAgICAgICBkcm9wTGV2ZWxPZmZzZXQgPSBfdGhpcyRzdGF0ZTE0LmRyb3BMZXZlbE9mZnNldCxcbiAgICAgICAgZHJvcENvbnRhaW5lcktleSA9IF90aGlzJHN0YXRlMTQuZHJvcENvbnRhaW5lcktleSxcbiAgICAgICAgZHJvcFRhcmdldEtleSA9IF90aGlzJHN0YXRlMTQuZHJvcFRhcmdldEtleSxcbiAgICAgICAgZHJvcFBvc2l0aW9uID0gX3RoaXMkc3RhdGUxNC5kcm9wUG9zaXRpb24sXG4gICAgICAgIGRyYWdPdmVyTm9kZUtleSA9IF90aGlzJHN0YXRlMTQuZHJhZ092ZXJOb2RlS2V5LFxuICAgICAgICBpbmRlbnQgPSBfdGhpcyRzdGF0ZTE0LmluZGVudDtcbiAgICAgIHZhciBfdGhpcyRwcm9wczEyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgcHJlZml4Q2xzID0gX3RoaXMkcHJvcHMxMi5wcmVmaXhDbHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMTIuY2xhc3NOYW1lLFxuICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzMTIuc3R5bGUsXG4gICAgICAgIHNob3dMaW5lID0gX3RoaXMkcHJvcHMxMi5zaG93TGluZSxcbiAgICAgICAgZm9jdXNhYmxlID0gX3RoaXMkcHJvcHMxMi5mb2N1c2FibGUsXG4gICAgICAgIF90aGlzJHByb3BzMTIkdGFiSW5kZSA9IF90aGlzJHByb3BzMTIudGFiSW5kZXgsXG4gICAgICAgIHRhYkluZGV4ID0gX3RoaXMkcHJvcHMxMiR0YWJJbmRlID09PSB2b2lkIDAgPyAwIDogX3RoaXMkcHJvcHMxMiR0YWJJbmRlLFxuICAgICAgICBzZWxlY3RhYmxlID0gX3RoaXMkcHJvcHMxMi5zZWxlY3RhYmxlLFxuICAgICAgICBzaG93SWNvbiA9IF90aGlzJHByb3BzMTIuc2hvd0ljb24sXG4gICAgICAgIGljb24gPSBfdGhpcyRwcm9wczEyLmljb24sXG4gICAgICAgIHN3aXRjaGVySWNvbiA9IF90aGlzJHByb3BzMTIuc3dpdGNoZXJJY29uLFxuICAgICAgICBkcmFnZ2FibGUgPSBfdGhpcyRwcm9wczEyLmRyYWdnYWJsZSxcbiAgICAgICAgY2hlY2thYmxlID0gX3RoaXMkcHJvcHMxMi5jaGVja2FibGUsXG4gICAgICAgIGNoZWNrU3RyaWN0bHkgPSBfdGhpcyRwcm9wczEyLmNoZWNrU3RyaWN0bHksXG4gICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHMxMi5kaXNhYmxlZCxcbiAgICAgICAgbW90aW9uID0gX3RoaXMkcHJvcHMxMi5tb3Rpb24sXG4gICAgICAgIGxvYWREYXRhID0gX3RoaXMkcHJvcHMxMi5sb2FkRGF0YSxcbiAgICAgICAgZmlsdGVyVHJlZU5vZGUgPSBfdGhpcyRwcm9wczEyLmZpbHRlclRyZWVOb2RlLFxuICAgICAgICBoZWlnaHQgPSBfdGhpcyRwcm9wczEyLmhlaWdodCxcbiAgICAgICAgaXRlbUhlaWdodCA9IF90aGlzJHByb3BzMTIuaXRlbUhlaWdodCxcbiAgICAgICAgc2Nyb2xsV2lkdGggPSBfdGhpcyRwcm9wczEyLnNjcm9sbFdpZHRoLFxuICAgICAgICB2aXJ0dWFsID0gX3RoaXMkcHJvcHMxMi52aXJ0dWFsLFxuICAgICAgICB0aXRsZVJlbmRlciA9IF90aGlzJHByb3BzMTIudGl0bGVSZW5kZXIsXG4gICAgICAgIGRyb3BJbmRpY2F0b3JSZW5kZXIgPSBfdGhpcyRwcm9wczEyLmRyb3BJbmRpY2F0b3JSZW5kZXIsXG4gICAgICAgIG9uQ29udGV4dE1lbnUgPSBfdGhpcyRwcm9wczEyLm9uQ29udGV4dE1lbnUsXG4gICAgICAgIG9uU2Nyb2xsID0gX3RoaXMkcHJvcHMxMi5vblNjcm9sbCxcbiAgICAgICAgZGlyZWN0aW9uID0gX3RoaXMkcHJvcHMxMi5kaXJlY3Rpb24sXG4gICAgICAgIHJvb3RDbGFzc05hbWUgPSBfdGhpcyRwcm9wczEyLnJvb3RDbGFzc05hbWUsXG4gICAgICAgIHJvb3RTdHlsZSA9IF90aGlzJHByb3BzMTIucm9vdFN0eWxlO1xuICAgICAgdmFyIGRvbVByb3BzID0gcGlja0F0dHJzKHRoaXMucHJvcHMsIHtcbiAgICAgICAgYXJpYTogdHJ1ZSxcbiAgICAgICAgZGF0YTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEl0J3MgYmV0dGVyIG1vdmUgdG8gaG9va3MgYnV0IHdlIGp1c3Qgc2ltcGx5IGtlZXAgaGVyZVxuICAgICAgdmFyIGRyYWdnYWJsZUNvbmZpZztcbiAgICAgIGlmIChkcmFnZ2FibGUpIHtcbiAgICAgICAgaWYgKF90eXBlb2YoZHJhZ2dhYmxlKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBkcmFnZ2FibGVDb25maWcgPSBkcmFnZ2FibGU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRyYWdnYWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGRyYWdnYWJsZUNvbmZpZyA9IHtcbiAgICAgICAgICAgIG5vZGVEcmFnZ2FibGU6IGRyYWdnYWJsZVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZHJhZ2dhYmxlQ29uZmlnID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBjb250ZXh0VmFsdWUgPSB7XG4gICAgICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgICAgICBzZWxlY3RhYmxlOiBzZWxlY3RhYmxlLFxuICAgICAgICBzaG93SWNvbjogc2hvd0ljb24sXG4gICAgICAgIGljb246IGljb24sXG4gICAgICAgIHN3aXRjaGVySWNvbjogc3dpdGNoZXJJY29uLFxuICAgICAgICBkcmFnZ2FibGU6IGRyYWdnYWJsZUNvbmZpZyxcbiAgICAgICAgZHJhZ2dpbmdOb2RlS2V5OiBkcmFnZ2luZ05vZGVLZXksXG4gICAgICAgIGNoZWNrYWJsZTogY2hlY2thYmxlLFxuICAgICAgICBjaGVja1N0cmljdGx5OiBjaGVja1N0cmljdGx5LFxuICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgIGtleUVudGl0aWVzOiBrZXlFbnRpdGllcyxcbiAgICAgICAgZHJvcExldmVsT2Zmc2V0OiBkcm9wTGV2ZWxPZmZzZXQsXG4gICAgICAgIGRyb3BDb250YWluZXJLZXk6IGRyb3BDb250YWluZXJLZXksXG4gICAgICAgIGRyb3BUYXJnZXRLZXk6IGRyb3BUYXJnZXRLZXksXG4gICAgICAgIGRyb3BQb3NpdGlvbjogZHJvcFBvc2l0aW9uLFxuICAgICAgICBkcmFnT3Zlck5vZGVLZXk6IGRyYWdPdmVyTm9kZUtleSxcbiAgICAgICAgaW5kZW50OiBpbmRlbnQsXG4gICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgICBkcm9wSW5kaWNhdG9yUmVuZGVyOiBkcm9wSW5kaWNhdG9yUmVuZGVyLFxuICAgICAgICBsb2FkRGF0YTogbG9hZERhdGEsXG4gICAgICAgIGZpbHRlclRyZWVOb2RlOiBmaWx0ZXJUcmVlTm9kZSxcbiAgICAgICAgdGl0bGVSZW5kZXI6IHRpdGxlUmVuZGVyLFxuICAgICAgICBvbk5vZGVDbGljazogdGhpcy5vbk5vZGVDbGljayxcbiAgICAgICAgb25Ob2RlRG91YmxlQ2xpY2s6IHRoaXMub25Ob2RlRG91YmxlQ2xpY2ssXG4gICAgICAgIG9uTm9kZUV4cGFuZDogdGhpcy5vbk5vZGVFeHBhbmQsXG4gICAgICAgIG9uTm9kZVNlbGVjdDogdGhpcy5vbk5vZGVTZWxlY3QsXG4gICAgICAgIG9uTm9kZUNoZWNrOiB0aGlzLm9uTm9kZUNoZWNrLFxuICAgICAgICBvbk5vZGVMb2FkOiB0aGlzLm9uTm9kZUxvYWQsXG4gICAgICAgIG9uTm9kZU1vdXNlRW50ZXI6IHRoaXMub25Ob2RlTW91c2VFbnRlcixcbiAgICAgICAgb25Ob2RlTW91c2VMZWF2ZTogdGhpcy5vbk5vZGVNb3VzZUxlYXZlLFxuICAgICAgICBvbk5vZGVDb250ZXh0TWVudTogdGhpcy5vbk5vZGVDb250ZXh0TWVudSxcbiAgICAgICAgb25Ob2RlRHJhZ1N0YXJ0OiB0aGlzLm9uTm9kZURyYWdTdGFydCxcbiAgICAgICAgb25Ob2RlRHJhZ0VudGVyOiB0aGlzLm9uTm9kZURyYWdFbnRlcixcbiAgICAgICAgb25Ob2RlRHJhZ092ZXI6IHRoaXMub25Ob2RlRHJhZ092ZXIsXG4gICAgICAgIG9uTm9kZURyYWdMZWF2ZTogdGhpcy5vbk5vZGVEcmFnTGVhdmUsXG4gICAgICAgIG9uTm9kZURyYWdFbmQ6IHRoaXMub25Ob2RlRHJhZ0VuZCxcbiAgICAgICAgb25Ob2RlRHJvcDogdGhpcy5vbk5vZGVEcm9wXG4gICAgICB9O1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyZWVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICAgIHZhbHVlOiBjb250ZXh0VmFsdWVcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHByZWZpeENscywgY2xhc3NOYW1lLCByb290Q2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zaG93LWxpbmVcIiksIHNob3dMaW5lKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1mb2N1c2VkXCIpLCBmb2N1c2VkKSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1hY3RpdmUtZm9jdXNlZFwiKSwgYWN0aXZlS2V5ICE9PSBudWxsKSksXG4gICAgICAgIHN0eWxlOiByb290U3R5bGVcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE5vZGVMaXN0LCBfZXh0ZW5kcyh7XG4gICAgICAgIHJlZjogdGhpcy5saXN0UmVmLFxuICAgICAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBkYXRhOiBmbGF0dGVuTm9kZXMsXG4gICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgc2VsZWN0YWJsZTogc2VsZWN0YWJsZSxcbiAgICAgICAgY2hlY2thYmxlOiAhIWNoZWNrYWJsZSxcbiAgICAgICAgbW90aW9uOiBtb3Rpb24sXG4gICAgICAgIGRyYWdnaW5nOiBkcmFnZ2luZ05vZGVLZXkgIT09IG51bGwsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICBpdGVtSGVpZ2h0OiBpdGVtSGVpZ2h0LFxuICAgICAgICB2aXJ0dWFsOiB2aXJ0dWFsLFxuICAgICAgICBmb2N1c2FibGU6IGZvY3VzYWJsZSxcbiAgICAgICAgZm9jdXNlZDogZm9jdXNlZCxcbiAgICAgICAgdGFiSW5kZXg6IHRhYkluZGV4LFxuICAgICAgICBhY3RpdmVJdGVtOiB0aGlzLmdldEFjdGl2ZUl0ZW0oKSxcbiAgICAgICAgb25Gb2N1czogdGhpcy5vbkZvY3VzLFxuICAgICAgICBvbkJsdXI6IHRoaXMub25CbHVyLFxuICAgICAgICBvbktleURvd246IHRoaXMub25LZXlEb3duLFxuICAgICAgICBvbkFjdGl2ZUNoYW5nZTogdGhpcy5vbkFjdGl2ZUNoYW5nZSxcbiAgICAgICAgb25MaXN0Q2hhbmdlU3RhcnQ6IHRoaXMub25MaXN0Q2hhbmdlU3RhcnQsXG4gICAgICAgIG9uTGlzdENoYW5nZUVuZDogdGhpcy5vbkxpc3RDaGFuZ2VFbmQsXG4gICAgICAgIG9uQ29udGV4dE1lbnU6IG9uQ29udGV4dE1lbnUsXG4gICAgICAgIG9uU2Nyb2xsOiBvblNjcm9sbCxcbiAgICAgICAgc2Nyb2xsV2lkdGg6IHNjcm9sbFdpZHRoXG4gICAgICB9LCB0aGlzLmdldFRyZWVOb2RlUmVxdWlyZWRQcm9wcygpLCBkb21Qcm9wcykpKSk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgcHJldlN0YXRlKSB7XG4gICAgICB2YXIgcHJldlByb3BzID0gcHJldlN0YXRlLnByZXZQcm9wcztcbiAgICAgIHZhciBuZXdTdGF0ZSA9IHtcbiAgICAgICAgcHJldlByb3BzOiBwcm9wc1xuICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIG5lZWRTeW5jKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuICFwcmV2UHJvcHMgJiYgcHJvcHMuaGFzT3duUHJvcGVydHkobmFtZSkgfHwgcHJldlByb3BzICYmIHByZXZQcm9wc1tuYW1lXSAhPT0gcHJvcHNbbmFtZV07XG4gICAgICB9XG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PSBUcmVlIE5vZGUgPT09PT09PT09PT09PT09PT09XG4gICAgICB2YXIgdHJlZURhdGE7XG5cbiAgICAgIC8vIGZpZWxkTmFtZXNcbiAgICAgIHZhciBmaWVsZE5hbWVzID0gcHJldlN0YXRlLmZpZWxkTmFtZXM7XG4gICAgICBpZiAobmVlZFN5bmMoJ2ZpZWxkTmFtZXMnKSkge1xuICAgICAgICBmaWVsZE5hbWVzID0gZmlsbEZpZWxkTmFtZXMocHJvcHMuZmllbGROYW1lcyk7XG4gICAgICAgIG5ld1N0YXRlLmZpZWxkTmFtZXMgPSBmaWVsZE5hbWVzO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBgdHJlZURhdGFgIG9yIGBjaGlsZHJlbmAgY2hhbmdlZCBhbmQgc2F2ZSBpbnRvIHRoZSBzdGF0ZS5cbiAgICAgIGlmIChuZWVkU3luYygndHJlZURhdGEnKSkge1xuICAgICAgICB0cmVlRGF0YSA9IHByb3BzLnRyZWVEYXRhO1xuICAgICAgfSBlbHNlIGlmIChuZWVkU3luYygnY2hpbGRyZW4nKSkge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCAnYGNoaWxkcmVuYCBvZiBUcmVlIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYHRyZWVEYXRhYCBpbnN0ZWFkLicpO1xuICAgICAgICB0cmVlRGF0YSA9IGNvbnZlcnRUcmVlVG9EYXRhKHByb3BzLmNoaWxkcmVuKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2F2ZSBmbGF0dGVuIG5vZGVzIGluZm8gYW5kIGNvbnZlcnQgYHRyZWVEYXRhYCBpbnRvIGtleUVudGl0aWVzXG4gICAgICBpZiAodHJlZURhdGEpIHtcbiAgICAgICAgbmV3U3RhdGUudHJlZURhdGEgPSB0cmVlRGF0YTtcbiAgICAgICAgdmFyIGVudGl0aWVzTWFwID0gY29udmVydERhdGFUb0VudGl0aWVzKHRyZWVEYXRhLCB7XG4gICAgICAgICAgZmllbGROYW1lczogZmllbGROYW1lc1xuICAgICAgICB9KTtcbiAgICAgICAgbmV3U3RhdGUua2V5RW50aXRpZXMgPSBfb2JqZWN0U3ByZWFkKF9kZWZpbmVQcm9wZXJ0eSh7fSwgTU9USU9OX0tFWSwgTW90aW9uRW50aXR5KSwgZW50aXRpZXNNYXAua2V5RW50aXRpZXMpO1xuXG4gICAgICAgIC8vIFdhcm5pbmcgaWYgdHJlZU5vZGUgbm90IHByb3ZpZGUga2V5XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgd2FybmluZ1dpdGhvdXRLZXkodHJlZURhdGEsIGZpZWxkTmFtZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIga2V5RW50aXRpZXMgPSBuZXdTdGF0ZS5rZXlFbnRpdGllcyB8fCBwcmV2U3RhdGUua2V5RW50aXRpZXM7XG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT0gZXhwYW5kZWRLZXlzID09PT09PT09PT09PT09PT09XG4gICAgICBpZiAobmVlZFN5bmMoJ2V4cGFuZGVkS2V5cycpIHx8IHByZXZQcm9wcyAmJiBuZWVkU3luYygnYXV0b0V4cGFuZFBhcmVudCcpKSB7XG4gICAgICAgIG5ld1N0YXRlLmV4cGFuZGVkS2V5cyA9IHByb3BzLmF1dG9FeHBhbmRQYXJlbnQgfHwgIXByZXZQcm9wcyAmJiBwcm9wcy5kZWZhdWx0RXhwYW5kUGFyZW50ID8gY29uZHVjdEV4cGFuZFBhcmVudChwcm9wcy5leHBhbmRlZEtleXMsIGtleUVudGl0aWVzKSA6IHByb3BzLmV4cGFuZGVkS2V5cztcbiAgICAgIH0gZWxzZSBpZiAoIXByZXZQcm9wcyAmJiBwcm9wcy5kZWZhdWx0RXhwYW5kQWxsKSB7XG4gICAgICAgIHZhciBjbG9uZUtleUVudGl0aWVzID0gX29iamVjdFNwcmVhZCh7fSwga2V5RW50aXRpZXMpO1xuICAgICAgICBkZWxldGUgY2xvbmVLZXlFbnRpdGllc1tNT1RJT05fS0VZXTtcblxuICAgICAgICAvLyBPbmx5IHRha2UgdGhlIGtleSB3aG8gaGFzIHRoZSBjaGlsZHJlbiB0byBlbmhhbmNlIHRoZSBwZXJmb3JtYW5jZVxuICAgICAgICB2YXIgbmV4dEV4cGFuZGVkS2V5cyA9IFtdO1xuICAgICAgICBPYmplY3Qua2V5cyhjbG9uZUtleUVudGl0aWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICB2YXIgZW50aXR5ID0gY2xvbmVLZXlFbnRpdGllc1trZXldO1xuICAgICAgICAgIGlmIChlbnRpdHkuY2hpbGRyZW4gJiYgZW50aXR5LmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgbmV4dEV4cGFuZGVkS2V5cy5wdXNoKGVudGl0eS5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG5ld1N0YXRlLmV4cGFuZGVkS2V5cyA9IG5leHRFeHBhbmRlZEtleXM7XG4gICAgICB9IGVsc2UgaWYgKCFwcmV2UHJvcHMgJiYgcHJvcHMuZGVmYXVsdEV4cGFuZGVkS2V5cykge1xuICAgICAgICBuZXdTdGF0ZS5leHBhbmRlZEtleXMgPSBwcm9wcy5hdXRvRXhwYW5kUGFyZW50IHx8IHByb3BzLmRlZmF1bHRFeHBhbmRQYXJlbnQgPyBjb25kdWN0RXhwYW5kUGFyZW50KHByb3BzLmRlZmF1bHRFeHBhbmRlZEtleXMsIGtleUVudGl0aWVzKSA6IHByb3BzLmRlZmF1bHRFeHBhbmRlZEtleXM7XG4gICAgICB9XG4gICAgICBpZiAoIW5ld1N0YXRlLmV4cGFuZGVkS2V5cykge1xuICAgICAgICBkZWxldGUgbmV3U3RhdGUuZXhwYW5kZWRLZXlzO1xuICAgICAgfVxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09IGZsYXR0ZW5Ob2RlcyA9PT09PT09PT09PT09PT09PVxuICAgICAgaWYgKHRyZWVEYXRhIHx8IG5ld1N0YXRlLmV4cGFuZGVkS2V5cykge1xuICAgICAgICB2YXIgZmxhdHRlbk5vZGVzID0gZmxhdHRlblRyZWVEYXRhKHRyZWVEYXRhIHx8IHByZXZTdGF0ZS50cmVlRGF0YSwgbmV3U3RhdGUuZXhwYW5kZWRLZXlzIHx8IHByZXZTdGF0ZS5leHBhbmRlZEtleXMsIGZpZWxkTmFtZXMpO1xuICAgICAgICBuZXdTdGF0ZS5mbGF0dGVuTm9kZXMgPSBmbGF0dGVuTm9kZXM7XG4gICAgICB9XG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT0gc2VsZWN0ZWRLZXlzID09PT09PT09PT09PT09PT09XG4gICAgICBpZiAocHJvcHMuc2VsZWN0YWJsZSkge1xuICAgICAgICBpZiAobmVlZFN5bmMoJ3NlbGVjdGVkS2V5cycpKSB7XG4gICAgICAgICAgbmV3U3RhdGUuc2VsZWN0ZWRLZXlzID0gY2FsY1NlbGVjdGVkS2V5cyhwcm9wcy5zZWxlY3RlZEtleXMsIHByb3BzKTtcbiAgICAgICAgfSBlbHNlIGlmICghcHJldlByb3BzICYmIHByb3BzLmRlZmF1bHRTZWxlY3RlZEtleXMpIHtcbiAgICAgICAgICBuZXdTdGF0ZS5zZWxlY3RlZEtleXMgPSBjYWxjU2VsZWN0ZWRLZXlzKHByb3BzLmRlZmF1bHRTZWxlY3RlZEtleXMsIHByb3BzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PSBjaGVja2VkS2V5cyA9PT09PT09PT09PT09PT09PVxuICAgICAgaWYgKHByb3BzLmNoZWNrYWJsZSkge1xuICAgICAgICB2YXIgY2hlY2tlZEtleUVudGl0eTtcbiAgICAgICAgaWYgKG5lZWRTeW5jKCdjaGVja2VkS2V5cycpKSB7XG4gICAgICAgICAgY2hlY2tlZEtleUVudGl0eSA9IHBhcnNlQ2hlY2tlZEtleXMocHJvcHMuY2hlY2tlZEtleXMpIHx8IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKCFwcmV2UHJvcHMgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWRLZXlzKSB7XG4gICAgICAgICAgY2hlY2tlZEtleUVudGl0eSA9IHBhcnNlQ2hlY2tlZEtleXMocHJvcHMuZGVmYXVsdENoZWNrZWRLZXlzKSB8fCB7fTtcbiAgICAgICAgfSBlbHNlIGlmICh0cmVlRGF0YSkge1xuICAgICAgICAgIC8vIElmIGB0cmVlRGF0YWAgY2hhbmdlZCwgd2UgYWxzbyBuZWVkIGNoZWNrIGl0XG4gICAgICAgICAgY2hlY2tlZEtleUVudGl0eSA9IHBhcnNlQ2hlY2tlZEtleXMocHJvcHMuY2hlY2tlZEtleXMpIHx8IHtcbiAgICAgICAgICAgIGNoZWNrZWRLZXlzOiBwcmV2U3RhdGUuY2hlY2tlZEtleXMsXG4gICAgICAgICAgICBoYWxmQ2hlY2tlZEtleXM6IHByZXZTdGF0ZS5oYWxmQ2hlY2tlZEtleXNcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja2VkS2V5RW50aXR5KSB7XG4gICAgICAgICAgdmFyIF9jaGVja2VkS2V5RW50aXR5ID0gY2hlY2tlZEtleUVudGl0eSxcbiAgICAgICAgICAgIF9jaGVja2VkS2V5RW50aXR5JGNoZSA9IF9jaGVja2VkS2V5RW50aXR5LmNoZWNrZWRLZXlzLFxuICAgICAgICAgICAgY2hlY2tlZEtleXMgPSBfY2hlY2tlZEtleUVudGl0eSRjaGUgPT09IHZvaWQgMCA/IFtdIDogX2NoZWNrZWRLZXlFbnRpdHkkY2hlLFxuICAgICAgICAgICAgX2NoZWNrZWRLZXlFbnRpdHkkaGFsID0gX2NoZWNrZWRLZXlFbnRpdHkuaGFsZkNoZWNrZWRLZXlzLFxuICAgICAgICAgICAgaGFsZkNoZWNrZWRLZXlzID0gX2NoZWNrZWRLZXlFbnRpdHkkaGFsID09PSB2b2lkIDAgPyBbXSA6IF9jaGVja2VkS2V5RW50aXR5JGhhbDtcbiAgICAgICAgICBpZiAoIXByb3BzLmNoZWNrU3RyaWN0bHkpIHtcbiAgICAgICAgICAgIHZhciBjb25kdWN0S2V5cyA9IGNvbmR1Y3RDaGVjayhjaGVja2VkS2V5cywgdHJ1ZSwga2V5RW50aXRpZXMpO1xuICAgICAgICAgICAgY2hlY2tlZEtleXMgPSBjb25kdWN0S2V5cy5jaGVja2VkS2V5cztcbiAgICAgICAgICAgIGhhbGZDaGVja2VkS2V5cyA9IGNvbmR1Y3RLZXlzLmhhbGZDaGVja2VkS2V5cztcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV3U3RhdGUuY2hlY2tlZEtleXMgPSBjaGVja2VkS2V5cztcbiAgICAgICAgICBuZXdTdGF0ZS5oYWxmQ2hlY2tlZEtleXMgPSBoYWxmQ2hlY2tlZEtleXM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT0gbG9hZGVkS2V5cyA9PT09PT09PT09PT09PT09PT1cbiAgICAgIGlmIChuZWVkU3luYygnbG9hZGVkS2V5cycpKSB7XG4gICAgICAgIG5ld1N0YXRlLmxvYWRlZEtleXMgPSBwcm9wcy5sb2FkZWRLZXlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gVHJlZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcbl9kZWZpbmVQcm9wZXJ0eShUcmVlLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIHByZWZpeENsczogJ3JjLXRyZWUnLFxuICBzaG93TGluZTogZmFsc2UsXG4gIHNob3dJY29uOiB0cnVlLFxuICBzZWxlY3RhYmxlOiB0cnVlLFxuICBtdWx0aXBsZTogZmFsc2UsXG4gIGNoZWNrYWJsZTogZmFsc2UsXG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgY2hlY2tTdHJpY3RseTogZmFsc2UsXG4gIGRyYWdnYWJsZTogZmFsc2UsXG4gIGRlZmF1bHRFeHBhbmRQYXJlbnQ6IHRydWUsXG4gIGF1dG9FeHBhbmRQYXJlbnQ6IGZhbHNlLFxuICBkZWZhdWx0RXhwYW5kQWxsOiBmYWxzZSxcbiAgZGVmYXVsdEV4cGFuZGVkS2V5czogW10sXG4gIGRlZmF1bHRDaGVja2VkS2V5czogW10sXG4gIGRlZmF1bHRTZWxlY3RlZEtleXM6IFtdLFxuICBkcm9wSW5kaWNhdG9yUmVuZGVyOiBEcm9wSW5kaWNhdG9yLFxuICBhbGxvd0Ryb3A6IGZ1bmN0aW9uIGFsbG93RHJvcCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgZXhwYW5kQWN0aW9uOiBmYWxzZVxufSk7XG5fZGVmaW5lUHJvcGVydHkoVHJlZSwgXCJUcmVlTm9kZVwiLCBUcmVlTm9kZSk7XG5leHBvcnQgZGVmYXVsdCBUcmVlOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZXZlbnRLZXlcIiwgXCJjbGFzc05hbWVcIiwgXCJzdHlsZVwiLCBcImRyYWdPdmVyXCIsIFwiZHJhZ092ZXJHYXBUb3BcIiwgXCJkcmFnT3ZlckdhcEJvdHRvbVwiLCBcImlzTGVhZlwiLCBcImlzU3RhcnRcIiwgXCJpc0VuZFwiLCBcImV4cGFuZGVkXCIsIFwic2VsZWN0ZWRcIiwgXCJjaGVja2VkXCIsIFwiaGFsZkNoZWNrZWRcIiwgXCJsb2FkaW5nXCIsIFwiZG9tUmVmXCIsIFwiYWN0aXZlXCIsIFwiZGF0YVwiLCBcIm9uTW91c2VNb3ZlXCIsIFwic2VsZWN0YWJsZVwiXTtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBwaWNrQXR0cnMgZnJvbSBcInJjLXV0aWwvZXMvcGlja0F0dHJzXCI7XG5pbXBvcnQgeyBUcmVlQ29udGV4dCwgVW5zdGFibGVDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFR5cGVzXCI7XG5pbXBvcnQgSW5kZW50IGZyb20gXCIuL0luZGVudFwiO1xuaW1wb3J0IGdldEVudGl0eSBmcm9tIFwiLi91dGlscy9rZXlVdGlsXCI7XG5pbXBvcnQgeyBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEgfSBmcm9tIFwiLi91dGlscy90cmVlVXRpbFwiO1xudmFyIElDT05fT1BFTiA9ICdvcGVuJztcbnZhciBJQ09OX0NMT1NFID0gJ2Nsb3NlJztcbnZhciBkZWZhdWx0VGl0bGUgPSAnLS0tJztcbnZhciBUcmVlTm9kZSA9IGZ1bmN0aW9uIFRyZWVOb2RlKHByb3BzKSB7XG4gIHZhciBfdW5zdGFibGVDb250ZXh0JG5vZGUsIF9jb250ZXh0JGZpbHRlclRyZWVObywgX2NsYXNzTmFtZXM0O1xuICB2YXIgZXZlbnRLZXkgPSBwcm9wcy5ldmVudEtleSxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBkcmFnT3ZlciA9IHByb3BzLmRyYWdPdmVyLFxuICAgIGRyYWdPdmVyR2FwVG9wID0gcHJvcHMuZHJhZ092ZXJHYXBUb3AsXG4gICAgZHJhZ092ZXJHYXBCb3R0b20gPSBwcm9wcy5kcmFnT3ZlckdhcEJvdHRvbSxcbiAgICBpc0xlYWYgPSBwcm9wcy5pc0xlYWYsXG4gICAgaXNTdGFydCA9IHByb3BzLmlzU3RhcnQsXG4gICAgaXNFbmQgPSBwcm9wcy5pc0VuZCxcbiAgICBleHBhbmRlZCA9IHByb3BzLmV4cGFuZGVkLFxuICAgIHNlbGVjdGVkID0gcHJvcHMuc2VsZWN0ZWQsXG4gICAgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQsXG4gICAgaGFsZkNoZWNrZWQgPSBwcm9wcy5oYWxmQ2hlY2tlZCxcbiAgICBsb2FkaW5nID0gcHJvcHMubG9hZGluZyxcbiAgICBkb21SZWYgPSBwcm9wcy5kb21SZWYsXG4gICAgYWN0aXZlID0gcHJvcHMuYWN0aXZlLFxuICAgIGRhdGEgPSBwcm9wcy5kYXRhLFxuICAgIG9uTW91c2VNb3ZlID0gcHJvcHMub25Nb3VzZU1vdmUsXG4gICAgc2VsZWN0YWJsZSA9IHByb3BzLnNlbGVjdGFibGUsXG4gICAgb3RoZXJQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFRyZWVDb250ZXh0KTtcbiAgdmFyIHVuc3RhYmxlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoVW5zdGFibGVDb250ZXh0KTtcbiAgdmFyIHNlbGVjdEhhbmRsZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBkcmFnTm9kZUhpZ2hsaWdodCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0RHJhZ05vZGVIaWdobGlnaHQgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIC8vID09PT09PT0gU3RhdGU6IERpc2FibGVkIFN0YXRlID09PT09PT1cbiAgdmFyIGlzRGlzYWJsZWQgPSAhIShjb250ZXh0LmRpc2FibGVkIHx8IHByb3BzLmRpc2FibGVkIHx8IChfdW5zdGFibGVDb250ZXh0JG5vZGUgPSB1bnN0YWJsZUNvbnRleHQubm9kZURpc2FibGVkKSAhPT0gbnVsbCAmJiBfdW5zdGFibGVDb250ZXh0JG5vZGUgIT09IHZvaWQgMCAmJiBfdW5zdGFibGVDb250ZXh0JG5vZGUuY2FsbCh1bnN0YWJsZUNvbnRleHQsIGRhdGEpKTtcbiAgdmFyIGlzQ2hlY2thYmxlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gUmV0dXJuIGZhbHNlIGlmIHRyZWUgb3IgdHJlZU5vZGUgaXMgbm90IGNoZWNrYWJsZVxuICAgIGlmICghY29udGV4dC5jaGVja2FibGUgfHwgcHJvcHMuY2hlY2thYmxlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dC5jaGVja2FibGU7XG4gIH0sIFtjb250ZXh0LmNoZWNrYWJsZSwgcHJvcHMuY2hlY2thYmxlXSk7XG5cbiAgLy8gPT09PT09PSBFdmVudCBIYW5kbGVyczogU2VsZWN0aW9uIGFuZCBDaGVjayA9PT09PT09XG4gIHZhciBvblNlbGVjdCA9IGZ1bmN0aW9uIG9uU2VsZWN0KGUpIHtcbiAgICBpZiAoaXNEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb250ZXh0Lm9uTm9kZVNlbGVjdChlLCBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEocHJvcHMpKTtcbiAgfTtcbiAgdmFyIG9uQ2hlY2sgPSBmdW5jdGlvbiBvbkNoZWNrKGUpIHtcbiAgICBpZiAoaXNEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWlzQ2hlY2thYmxlIHx8IHByb3BzLmRpc2FibGVDaGVja2JveCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb250ZXh0Lm9uTm9kZUNoZWNrKGUsIGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShwcm9wcyksICFjaGVja2VkKTtcbiAgfTtcblxuICAvLyA9PT09PT09IFN0YXRlOiBTZWxlY3RhYmxlIENoZWNrID09PT09PT1cbiAgdmFyIGlzU2VsZWN0YWJsZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIC8vIElnbm9yZSB3aGVuIHNlbGVjdGFibGUgaXMgdW5kZWZpbmVkIG9yIG51bGxcbiAgICBpZiAodHlwZW9mIHNlbGVjdGFibGUgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIHNlbGVjdGFibGU7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0LnNlbGVjdGFibGU7XG4gIH0sIFtzZWxlY3RhYmxlLCBjb250ZXh0LnNlbGVjdGFibGVdKTtcbiAgdmFyIG9uU2VsZWN0b3JDbGljayA9IGZ1bmN0aW9uIG9uU2VsZWN0b3JDbGljayhlKSB7XG4gICAgLy8gQ2xpY2sgdHJpZ2dlciBiZWZvcmUgc2VsZWN0L2NoZWNrIG9wZXJhdGlvblxuICAgIGNvbnRleHQub25Ob2RlQ2xpY2soZSwgY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKHByb3BzKSk7XG4gICAgaWYgKGlzU2VsZWN0YWJsZSkge1xuICAgICAgb25TZWxlY3QoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uQ2hlY2soZSk7XG4gICAgfVxuICB9O1xuICB2YXIgb25TZWxlY3RvckRvdWJsZUNsaWNrID0gZnVuY3Rpb24gb25TZWxlY3RvckRvdWJsZUNsaWNrKGUpIHtcbiAgICBjb250ZXh0Lm9uTm9kZURvdWJsZUNsaWNrKGUsIGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShwcm9wcykpO1xuICB9O1xuICB2YXIgb25Nb3VzZUVudGVyID0gZnVuY3Rpb24gb25Nb3VzZUVudGVyKGUpIHtcbiAgICBjb250ZXh0Lm9uTm9kZU1vdXNlRW50ZXIoZSwgY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKHByb3BzKSk7XG4gIH07XG4gIHZhciBvbk1vdXNlTGVhdmUgPSBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoZSkge1xuICAgIGNvbnRleHQub25Ob2RlTW91c2VMZWF2ZShlLCBjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEocHJvcHMpKTtcbiAgfTtcbiAgdmFyIG9uQ29udGV4dE1lbnUgPSBmdW5jdGlvbiBvbkNvbnRleHRNZW51KGUpIHtcbiAgICBjb250ZXh0Lm9uTm9kZUNvbnRleHRNZW51KGUsIGNvbnZlcnROb2RlUHJvcHNUb0V2ZW50RGF0YShwcm9wcykpO1xuICB9O1xuXG4gIC8vID09PT09PT0gRHJhZzogRHJhZyBFbmFibGVkID09PT09PT1cbiAgdmFyIGlzRHJhZ2dhYmxlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICEhKGNvbnRleHQuZHJhZ2dhYmxlICYmICghY29udGV4dC5kcmFnZ2FibGUubm9kZURyYWdnYWJsZSB8fCBjb250ZXh0LmRyYWdnYWJsZS5ub2RlRHJhZ2dhYmxlKGRhdGEpKSk7XG4gIH0sIFtjb250ZXh0LmRyYWdnYWJsZSwgZGF0YV0pO1xuXG4gIC8vID09PT09PT0gRHJhZzogRHJhZyBFdmVudCBIYW5kbGVycyA9PT09PT09XG4gIHZhciBvbkRyYWdTdGFydCA9IGZ1bmN0aW9uIG9uRHJhZ1N0YXJ0KGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHNldERyYWdOb2RlSGlnaGxpZ2h0KHRydWUpO1xuICAgIGNvbnRleHQub25Ob2RlRHJhZ1N0YXJ0KGUsIHByb3BzKTtcbiAgICB0cnkge1xuICAgICAgLy8gaWUgdGhyb3cgZXJyb3JcbiAgICAgIC8vIGZpcmVmb3gtbmVlZC1pdFxuICAgICAgZS5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dC9wbGFpbicsICcnKTtcbiAgICB9IGNhdGNoIChfdW51c2VkKSB7XG4gICAgICAvLyBlbXB0eVxuICAgIH1cbiAgfTtcbiAgdmFyIG9uRHJhZ0VudGVyID0gZnVuY3Rpb24gb25EcmFnRW50ZXIoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnRleHQub25Ob2RlRHJhZ0VudGVyKGUsIHByb3BzKTtcbiAgfTtcbiAgdmFyIG9uRHJhZ092ZXIgPSBmdW5jdGlvbiBvbkRyYWdPdmVyKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb250ZXh0Lm9uTm9kZURyYWdPdmVyKGUsIHByb3BzKTtcbiAgfTtcbiAgdmFyIG9uRHJhZ0xlYXZlID0gZnVuY3Rpb24gb25EcmFnTGVhdmUoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29udGV4dC5vbk5vZGVEcmFnTGVhdmUoZSwgcHJvcHMpO1xuICB9O1xuICB2YXIgb25EcmFnRW5kID0gZnVuY3Rpb24gb25EcmFnRW5kKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHNldERyYWdOb2RlSGlnaGxpZ2h0KGZhbHNlKTtcbiAgICBjb250ZXh0Lm9uTm9kZURyYWdFbmQoZSwgcHJvcHMpO1xuICB9O1xuICB2YXIgb25Ecm9wID0gZnVuY3Rpb24gb25Ecm9wKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZXREcmFnTm9kZUhpZ2hsaWdodChmYWxzZSk7XG4gICAgY29udGV4dC5vbk5vZGVEcm9wKGUsIHByb3BzKTtcbiAgfTtcblxuICAvLyA9PT09PT09IEV4cGFuZDogTm9kZSBFeHBhbnNpb24gPT09PT09PVxuICB2YXIgb25FeHBhbmQgPSBmdW5jdGlvbiBvbkV4cGFuZChlKSB7XG4gICAgaWYgKGxvYWRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29udGV4dC5vbk5vZGVFeHBhbmQoZSwgY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKHByb3BzKSk7XG4gIH07XG5cbiAgLy8gPT09PT09PSBTdGF0ZTogSGFzIENoaWxkcmVuID09PT09PT1cbiAgdmFyIGhhc0NoaWxkcmVuID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYgPSBnZXRFbnRpdHkoY29udGV4dC5rZXlFbnRpdGllcywgZXZlbnRLZXkpIHx8IHt9LFxuICAgICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICAgIHJldHVybiBCb29sZWFuKChjaGlsZHJlbiB8fCBbXSkubGVuZ3RoKTtcbiAgfSwgW2NvbnRleHQua2V5RW50aXRpZXMsIGV2ZW50S2V5XSk7XG5cbiAgLy8gPT09PT09PSBTdGF0ZTogTGVhZiBDaGVjayA9PT09PT09XG4gIHZhciBtZW1vaXplZElzTGVhZiA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc0xlYWYgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBpc0xlYWYgfHwgIWNvbnRleHQubG9hZERhdGEgJiYgIWhhc0NoaWxkcmVuIHx8IGNvbnRleHQubG9hZERhdGEgJiYgcHJvcHMubG9hZGVkICYmICFoYXNDaGlsZHJlbjtcbiAgfSwgW2lzTGVhZiwgY29udGV4dC5sb2FkRGF0YSwgaGFzQ2hpbGRyZW4sIHByb3BzLmxvYWRlZF0pO1xuXG4gIC8vID09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PVxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8vIExvYWQgZGF0YSB0byBhdm9pZCBkZWZhdWx0IGV4cGFuZGVkIHRyZWUgd2l0aG91dCBkYXRhXG4gICAgaWYgKGxvYWRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gcmVhZCBmcm9tIHN0YXRlIHRvIGF2b2lkIGxvYWREYXRhIGF0IHNhbWUgdGltZVxuICAgIGlmICh0eXBlb2YgY29udGV4dC5sb2FkRGF0YSA9PT0gJ2Z1bmN0aW9uJyAmJiBleHBhbmRlZCAmJiAhbWVtb2l6ZWRJc0xlYWYgJiYgIXByb3BzLmxvYWRlZCkge1xuICAgICAgLy8gV2UgbmVlZG4ndCByZWxvYWQgZGF0YSB3aGVuIGhhcyBjaGlsZHJlbiBpbiBzeW5jIGxvZ2ljXG4gICAgICAvLyBJdCdzIG9ubHkgbmVlZGVkIGluIG5vZGUgZXhwYW5kZWRcbiAgICAgIGNvbnRleHQub25Ob2RlTG9hZChjb252ZXJ0Tm9kZVByb3BzVG9FdmVudERhdGEocHJvcHMpKTtcbiAgICB9XG4gIH0sIFtsb2FkaW5nLCBjb250ZXh0LmxvYWREYXRhLCBjb250ZXh0Lm9uTm9kZUxvYWQsIGV4cGFuZGVkLCBtZW1vaXplZElzTGVhZiwgcHJvcHNdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBSZW5kZXI6IERyYWcgSGFuZGxlciA9PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZHJhZ0hhbmRsZXJOb2RlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9jb250ZXh0JGRyYWdnYWJsZTtcbiAgICBpZiAoISgoX2NvbnRleHQkZHJhZ2dhYmxlID0gY29udGV4dC5kcmFnZ2FibGUpICE9PSBudWxsICYmIF9jb250ZXh0JGRyYWdnYWJsZSAhPT0gdm9pZCAwICYmIF9jb250ZXh0JGRyYWdnYWJsZS5pY29uKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjb250ZXh0LnByZWZpeENscywgXCItZHJhZ2dhYmxlLWljb25cIilcbiAgICB9LCBjb250ZXh0LmRyYWdnYWJsZS5pY29uKTtcbiAgfSwgW2NvbnRleHQuZHJhZ2dhYmxlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXI6IFN3aXRjaGVyID09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHJlbmRlclN3aXRjaGVySWNvbkRvbSA9IGZ1bmN0aW9uIHJlbmRlclN3aXRjaGVySWNvbkRvbShpc0ludGVybmFsTGVhZikge1xuICAgIHZhciBzd2l0Y2hlckljb24gPSBwcm9wcy5zd2l0Y2hlckljb24gfHwgY29udGV4dC5zd2l0Y2hlckljb247XG4gICAgLy8gaWYgc3dpdGNoZXJJY29uRG9tIGlzIG51bGwsIG5vIHJlbmRlciBzd2l0Y2hlciBzcGFuXG4gICAgaWYgKHR5cGVvZiBzd2l0Y2hlckljb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBzd2l0Y2hlckljb24oX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcyksIHt9LCB7XG4gICAgICAgIGlzTGVhZjogaXNJbnRlcm5hbExlYWZcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHN3aXRjaGVySWNvbjtcbiAgfTtcblxuICAvLyBTd2l0Y2hlclxuICB2YXIgcmVuZGVyU3dpdGNoZXIgPSBmdW5jdGlvbiByZW5kZXJTd2l0Y2hlcigpIHtcbiAgICBpZiAobWVtb2l6ZWRJc0xlYWYpIHtcbiAgICAgIC8vIGlmIHN3aXRjaGVySWNvbkRvbSBpcyBudWxsLCBubyByZW5kZXIgc3dpdGNoZXIgc3BhblxuICAgICAgdmFyIF9zd2l0Y2hlckljb25Eb20gPSByZW5kZXJTd2l0Y2hlckljb25Eb20odHJ1ZSk7XG4gICAgICByZXR1cm4gX3N3aXRjaGVySWNvbkRvbSAhPT0gZmFsc2UgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLXN3aXRjaGVyXCIpLCBcIlwiLmNvbmNhdChjb250ZXh0LnByZWZpeENscywgXCItc3dpdGNoZXItbm9vcFwiKSlcbiAgICAgIH0sIF9zd2l0Y2hlckljb25Eb20pIDogbnVsbDtcbiAgICB9XG4gICAgdmFyIHN3aXRjaGVySWNvbkRvbSA9IHJlbmRlclN3aXRjaGVySWNvbkRvbShmYWxzZSk7XG4gICAgcmV0dXJuIHN3aXRjaGVySWNvbkRvbSAhPT0gZmFsc2UgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgb25DbGljazogb25FeHBhbmQsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLXN3aXRjaGVyXCIpLCBcIlwiLmNvbmNhdChjb250ZXh0LnByZWZpeENscywgXCItc3dpdGNoZXJfXCIpLmNvbmNhdChleHBhbmRlZCA/IElDT05fT1BFTiA6IElDT05fQ0xPU0UpKVxuICAgIH0sIHN3aXRjaGVySWNvbkRvbSkgOiBudWxsO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gQ2hlY2tib3ggPT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgY2hlY2tib3hOb2RlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFpc0NoZWNrYWJsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gW0xlZ2FjeV0gQ3VzdG9tIGVsZW1lbnQgc2hvdWxkIGJlIHNlcGFyYXRlIHdpdGggYGNoZWNrYWJsZWAgaW4gZnV0dXJlXG4gICAgdmFyICRjdXN0b20gPSB0eXBlb2YgaXNDaGVja2FibGUgIT09ICdib29sZWFuJyA/IGlzQ2hlY2thYmxlIDogbnVsbDtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhcIlwiLmNvbmNhdChjb250ZXh0LnByZWZpeENscywgXCItY2hlY2tib3hcIiksIF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChjb250ZXh0LnByZWZpeENscywgXCItY2hlY2tib3gtY2hlY2tlZFwiKSwgY2hlY2tlZCksIFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi1jaGVja2JveC1pbmRldGVybWluYXRlXCIpLCAhY2hlY2tlZCAmJiBoYWxmQ2hlY2tlZCksIFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi1jaGVja2JveC1kaXNhYmxlZFwiKSwgaXNEaXNhYmxlZCB8fCBwcm9wcy5kaXNhYmxlQ2hlY2tib3gpKSxcbiAgICAgIG9uQ2xpY2s6IG9uQ2hlY2ssXG4gICAgICByb2xlOiBcImNoZWNrYm94XCIsXG4gICAgICBcImFyaWEtY2hlY2tlZFwiOiBoYWxmQ2hlY2tlZCA/ICdtaXhlZCcgOiBjaGVja2VkLFxuICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IGlzRGlzYWJsZWQgfHwgcHJvcHMuZGlzYWJsZUNoZWNrYm94LFxuICAgICAgXCJhcmlhLWxhYmVsXCI6IFwiU2VsZWN0IFwiLmNvbmNhdCh0eXBlb2YgcHJvcHMudGl0bGUgPT09ICdzdHJpbmcnID8gcHJvcHMudGl0bGUgOiAndHJlZSBub2RlJylcbiAgICB9LCAkY3VzdG9tKTtcbiAgfSwgW2lzQ2hlY2thYmxlLCBjaGVja2VkLCBoYWxmQ2hlY2tlZCwgaXNEaXNhYmxlZCwgcHJvcHMuZGlzYWJsZUNoZWNrYm94LCBwcm9wcy50aXRsZV0pO1xuXG4gIC8vID09PT09PT09PT09PT09IFN0YXRlOiBOb2RlIFN0YXRlIChPcGVuL0Nsb3NlKSA9PT09PT09PT09PT09PVxuICB2YXIgbm9kZVN0YXRlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1lbW9pemVkSXNMZWFmKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGV4cGFuZGVkID8gSUNPTl9PUEVOIDogSUNPTl9DTE9TRTtcbiAgfSwgW21lbW9pemVkSXNMZWFmLCBleHBhbmRlZF0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFJlbmRlcjogVGl0bGUgKyBJY29uID09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpY29uTm9kZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi1pY29uRWxlXCIpLCBcIlwiLmNvbmNhdChjb250ZXh0LnByZWZpeENscywgXCItaWNvbl9fXCIpLmNvbmNhdChub2RlU3RhdGUgfHwgJ2RvY3UnKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChjb250ZXh0LnByZWZpeENscywgXCItaWNvbl9sb2FkaW5nXCIpLCBsb2FkaW5nKSlcbiAgICB9KTtcbiAgfSwgW2NvbnRleHQucHJlZml4Q2xzLCBub2RlU3RhdGUsIGxvYWRpbmddKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09IERyb3AgSW5kaWNhdG9yID09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGRyb3BJbmRpY2F0b3JOb2RlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJvb3REcmFnZ2FibGUgPSBCb29sZWFuKGNvbnRleHQuZHJhZ2dhYmxlKTtcbiAgICAvLyBhbGxvd0Ryb3AgaXMgY2FsY3VsYXRlZCBpbiBUcmVlLnRzeCwgdGhlcmUgaXMgbm8gbmVlZCBmb3IgY2FsYyBpdCBoZXJlXG4gICAgdmFyIHNob3dJbmRpY2F0b3IgPSAhcHJvcHMuZGlzYWJsZWQgJiYgcm9vdERyYWdnYWJsZSAmJiBjb250ZXh0LmRyYWdPdmVyTm9kZUtleSA9PT0gZXZlbnRLZXk7XG4gICAgaWYgKCFzaG93SW5kaWNhdG9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQuZHJvcEluZGljYXRvclJlbmRlcih7XG4gICAgICBkcm9wUG9zaXRpb246IGNvbnRleHQuZHJvcFBvc2l0aW9uLFxuICAgICAgZHJvcExldmVsT2Zmc2V0OiBjb250ZXh0LmRyb3BMZXZlbE9mZnNldCxcbiAgICAgIGluZGVudDogY29udGV4dC5pbmRlbnQsXG4gICAgICBwcmVmaXhDbHM6IGNvbnRleHQucHJlZml4Q2xzLFxuICAgICAgZGlyZWN0aW9uOiBjb250ZXh0LmRpcmVjdGlvblxuICAgIH0pO1xuICB9LCBbY29udGV4dC5kcm9wUG9zaXRpb24sIGNvbnRleHQuZHJvcExldmVsT2Zmc2V0LCBjb250ZXh0LmluZGVudCwgY29udGV4dC5wcmVmaXhDbHMsIGNvbnRleHQuZGlyZWN0aW9uLCBjb250ZXh0LmRyYWdnYWJsZSwgY29udGV4dC5kcmFnT3Zlck5vZGVLZXksIGNvbnRleHQuZHJvcEluZGljYXRvclJlbmRlcl0pO1xuXG4gIC8vIEljb24gKyBUaXRsZVxuICB2YXIgc2VsZWN0b3JOb2RlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9wcm9wcyR0aXRsZSA9IHByb3BzLnRpdGxlLFxuICAgICAgdGl0bGUgPSBfcHJvcHMkdGl0bGUgPT09IHZvaWQgMCA/IGRlZmF1bHRUaXRsZSA6IF9wcm9wcyR0aXRsZTtcbiAgICB2YXIgd3JhcENsYXNzID0gXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLW5vZGUtY29udGVudC13cmFwcGVyXCIpO1xuXG4gICAgLy8gSWNvbiAtIFN0aWxsIHNob3cgbG9hZGluZyBpY29uIHdoZW4gbG9hZGluZyB3aXRob3V0IHNob3dJY29uXG4gICAgdmFyICRpY29uO1xuICAgIGlmIChjb250ZXh0LnNob3dJY29uKSB7XG4gICAgICB2YXIgY3VycmVudEljb24gPSBwcm9wcy5pY29uIHx8IGNvbnRleHQuaWNvbjtcbiAgICAgICRpY29uID0gY3VycmVudEljb24gPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLWljb25FbGVcIiksIFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi1pY29uX19jdXN0b21pemVcIikpXG4gICAgICB9LCB0eXBlb2YgY3VycmVudEljb24gPT09ICdmdW5jdGlvbicgPyBjdXJyZW50SWNvbihwcm9wcykgOiBjdXJyZW50SWNvbikgOiBpY29uTm9kZTtcbiAgICB9IGVsc2UgaWYgKGNvbnRleHQubG9hZERhdGEgJiYgbG9hZGluZykge1xuICAgICAgJGljb24gPSBpY29uTm9kZTtcbiAgICB9XG5cbiAgICAvLyBUaXRsZVxuICAgIHZhciB0aXRsZU5vZGU7XG4gICAgaWYgKHR5cGVvZiB0aXRsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGl0bGVOb2RlID0gdGl0bGUoZGF0YSk7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0LnRpdGxlUmVuZGVyKSB7XG4gICAgICB0aXRsZU5vZGUgPSBjb250ZXh0LnRpdGxlUmVuZGVyKGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aXRsZU5vZGUgPSB0aXRsZTtcbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICByZWY6IHNlbGVjdEhhbmRsZVJlZixcbiAgICAgIHRpdGxlOiB0eXBlb2YgdGl0bGUgPT09ICdzdHJpbmcnID8gdGl0bGUgOiAnJyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyh3cmFwQ2xhc3MsIFwiXCIuY29uY2F0KHdyYXBDbGFzcywgXCItXCIpLmNvbmNhdChub2RlU3RhdGUgfHwgJ25vcm1hbCcpLCBfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi1ub2RlLXNlbGVjdGVkXCIpLCAhaXNEaXNhYmxlZCAmJiAoc2VsZWN0ZWQgfHwgZHJhZ05vZGVIaWdobGlnaHQpKSksXG4gICAgICBvbk1vdXNlRW50ZXI6IG9uTW91c2VFbnRlcixcbiAgICAgIG9uTW91c2VMZWF2ZTogb25Nb3VzZUxlYXZlLFxuICAgICAgb25Db250ZXh0TWVudTogb25Db250ZXh0TWVudSxcbiAgICAgIG9uQ2xpY2s6IG9uU2VsZWN0b3JDbGljayxcbiAgICAgIG9uRG91YmxlQ2xpY2s6IG9uU2VsZWN0b3JEb3VibGVDbGlja1xuICAgIH0sICRpY29uLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChjb250ZXh0LnByZWZpeENscywgXCItdGl0bGVcIilcbiAgICB9LCB0aXRsZU5vZGUpLCBkcm9wSW5kaWNhdG9yTm9kZSk7XG4gIH0sIFtjb250ZXh0LnByZWZpeENscywgY29udGV4dC5zaG93SWNvbiwgcHJvcHMsIGNvbnRleHQuaWNvbiwgaWNvbk5vZGUsIGNvbnRleHQudGl0bGVSZW5kZXIsIGRhdGEsIG5vZGVTdGF0ZSwgb25Nb3VzZUVudGVyLCBvbk1vdXNlTGVhdmUsIG9uQ29udGV4dE1lbnUsIG9uU2VsZWN0b3JDbGljaywgb25TZWxlY3RvckRvdWJsZUNsaWNrXSk7XG4gIHZhciBkYXRhT3JBcmlhQXR0cmlidXRlUHJvcHMgPSBwaWNrQXR0cnMob3RoZXJQcm9wcywge1xuICAgIGFyaWE6IHRydWUsXG4gICAgZGF0YTogdHJ1ZVxuICB9KTtcbiAgdmFyIF9yZWYyID0gZ2V0RW50aXR5KGNvbnRleHQua2V5RW50aXRpZXMsIGV2ZW50S2V5KSB8fCB7fSxcbiAgICBsZXZlbCA9IF9yZWYyLmxldmVsO1xuICB2YXIgaXNFbmROb2RlID0gaXNFbmRbaXNFbmQubGVuZ3RoIC0gMV07XG4gIHZhciBkcmFnZ2FibGVXaXRob3V0RGlzYWJsZWQgPSAhaXNEaXNhYmxlZCAmJiBpc0RyYWdnYWJsZTtcbiAgdmFyIGRyYWdnaW5nID0gY29udGV4dC5kcmFnZ2luZ05vZGVLZXkgPT09IGV2ZW50S2V5O1xuICB2YXIgYXJpYVNlbGVjdGVkID0gc2VsZWN0YWJsZSAhPT0gdW5kZWZpbmVkID8ge1xuICAgICdhcmlhLXNlbGVjdGVkJzogISFzZWxlY3RhYmxlXG4gIH0gOiB1bmRlZmluZWQ7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgcmVmOiBkb21SZWYsXG4gICAgcm9sZTogXCJ0cmVlaXRlbVwiLFxuICAgIFwiYXJpYS1leHBhbmRlZFwiOiBpc0xlYWYgPyB1bmRlZmluZWQgOiBleHBhbmRlZCxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBcIlwiLmNvbmNhdChjb250ZXh0LnByZWZpeENscywgXCItdHJlZW5vZGVcIiksIChfY2xhc3NOYW1lczQgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzNCwgXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLXRyZWVub2RlLWRpc2FibGVkXCIpLCBpc0Rpc2FibGVkKSwgXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLXRyZWVub2RlLXN3aXRjaGVyLVwiKS5jb25jYXQoZXhwYW5kZWQgPyAnb3BlbicgOiAnY2xvc2UnKSwgIWlzTGVhZiksIFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi10cmVlbm9kZS1jaGVja2JveC1jaGVja2VkXCIpLCBjaGVja2VkKSwgXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLXRyZWVub2RlLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVcIiksIGhhbGZDaGVja2VkKSwgXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLXRyZWVub2RlLXNlbGVjdGVkXCIpLCBzZWxlY3RlZCksIFwiXCIuY29uY2F0KGNvbnRleHQucHJlZml4Q2xzLCBcIi10cmVlbm9kZS1sb2FkaW5nXCIpLCBsb2FkaW5nKSwgXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLXRyZWVub2RlLWFjdGl2ZVwiKSwgYWN0aXZlKSwgXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLXRyZWVub2RlLWxlYWYtbGFzdFwiKSwgaXNFbmROb2RlKSwgXCJcIi5jb25jYXQoY29udGV4dC5wcmVmaXhDbHMsIFwiLXRyZWVub2RlLWRyYWdnYWJsZVwiKSwgaXNEcmFnZ2FibGUpLCBcImRyYWdnaW5nXCIsIGRyYWdnaW5nKSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9jbGFzc05hbWVzNCwgJ2Ryb3AtdGFyZ2V0JywgY29udGV4dC5kcm9wVGFyZ2V0S2V5ID09PSBldmVudEtleSksICdkcm9wLWNvbnRhaW5lcicsIGNvbnRleHQuZHJvcENvbnRhaW5lcktleSA9PT0gZXZlbnRLZXkpLCAnZHJhZy1vdmVyJywgIWlzRGlzYWJsZWQgJiYgZHJhZ092ZXIpLCAnZHJhZy1vdmVyLWdhcC10b3AnLCAhaXNEaXNhYmxlZCAmJiBkcmFnT3ZlckdhcFRvcCksICdkcmFnLW92ZXItZ2FwLWJvdHRvbScsICFpc0Rpc2FibGVkICYmIGRyYWdPdmVyR2FwQm90dG9tKSwgJ2ZpbHRlci1ub2RlJywgKF9jb250ZXh0JGZpbHRlclRyZWVObyA9IGNvbnRleHQuZmlsdGVyVHJlZU5vZGUpID09PSBudWxsIHx8IF9jb250ZXh0JGZpbHRlclRyZWVObyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NvbnRleHQkZmlsdGVyVHJlZU5vLmNhbGwoY29udGV4dCwgY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKHByb3BzKSkpLCBcIlwiLmNvbmNhdChjb250ZXh0LnByZWZpeENscywgXCItdHJlZW5vZGUtbGVhZlwiKSwgbWVtb2l6ZWRJc0xlYWYpKSksXG4gICAgc3R5bGU6IHN0eWxlXG4gICAgLy8gRHJhZ2dhYmxlIGNvbmZpZ1xuICAgICxcbiAgICBkcmFnZ2FibGU6IGRyYWdnYWJsZVdpdGhvdXREaXNhYmxlZCxcbiAgICBvbkRyYWdTdGFydDogZHJhZ2dhYmxlV2l0aG91dERpc2FibGVkID8gb25EcmFnU3RhcnQgOiB1bmRlZmluZWRcbiAgICAvLyBEcm9wIGNvbmZpZ1xuICAgICxcbiAgICBvbkRyYWdFbnRlcjogaXNEcmFnZ2FibGUgPyBvbkRyYWdFbnRlciA6IHVuZGVmaW5lZCxcbiAgICBvbkRyYWdPdmVyOiBpc0RyYWdnYWJsZSA/IG9uRHJhZ092ZXIgOiB1bmRlZmluZWQsXG4gICAgb25EcmFnTGVhdmU6IGlzRHJhZ2dhYmxlID8gb25EcmFnTGVhdmUgOiB1bmRlZmluZWQsXG4gICAgb25Ecm9wOiBpc0RyYWdnYWJsZSA/IG9uRHJvcCA6IHVuZGVmaW5lZCxcbiAgICBvbkRyYWdFbmQ6IGlzRHJhZ2dhYmxlID8gb25EcmFnRW5kIDogdW5kZWZpbmVkLFxuICAgIG9uTW91c2VNb3ZlOiBvbk1vdXNlTW92ZVxuICB9LCBhcmlhU2VsZWN0ZWQsIGRhdGFPckFyaWFBdHRyaWJ1dGVQcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEluZGVudCwge1xuICAgIHByZWZpeENsczogY29udGV4dC5wcmVmaXhDbHMsXG4gICAgbGV2ZWw6IGxldmVsLFxuICAgIGlzU3RhcnQ6IGlzU3RhcnQsXG4gICAgaXNFbmQ6IGlzRW5kXG4gIH0pLCBkcmFnSGFuZGxlck5vZGUsIHJlbmRlclN3aXRjaGVyKCksIGNoZWNrYm94Tm9kZSwgc2VsZWN0b3JOb2RlKTtcbn07XG5UcmVlTm9kZS5pc1RyZWVOb2RlID0gMTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFRyZWVOb2RlLmRpc3BsYXlOYW1lID0gJ1RyZWVOb2RlJztcbn1cbmV4cG9ydCBkZWZhdWx0IFRyZWVOb2RlOyIsIi8qKlxuICogV2VicGFjayBoYXMgYnVnIGZvciBpbXBvcnQgbG9vcCwgd2hpY2ggaXMgbm90IHRoZSBzYW1lIGJlaGF2aW9yIGFzIEVTIG1vZHVsZS5cbiAqIFdoZW4gdXRpbC5qcyBpbXBvcnRzIHRoZSBUcmVlTm9kZSBmb3IgdHJlZSBnZW5lcmF0ZSB3aWxsIGNhdXNlIHRyZWVDb250ZXh0VHlwZXMgYmUgZW1wdHkuXG4gKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgVHJlZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcblxuLyoqIEludGVybmFsIHVzYWdlLCBzYWZlIHRvIHJlbW92ZS4gRG8gbm90IHVzZSBpbiBwcm9kICovXG5leHBvcnQgdmFyIFVuc3RhYmxlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KTsiLCJpbXBvcnQgVHJlZSBmcm9tIFwiLi9UcmVlXCI7XG5pbXBvcnQgVHJlZU5vZGUgZnJvbSBcIi4vVHJlZU5vZGVcIjtcbmltcG9ydCB7IFVuc3RhYmxlQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRUeXBlc1wiO1xuZXhwb3J0IHsgVHJlZU5vZGUsIFVuc3RhYmxlQ29udGV4dCB9O1xuZXhwb3J0IGRlZmF1bHQgVHJlZTsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5cbi8qKlxuICogVHJpZ2dlciBvbmx5IHdoZW4gY29tcG9uZW50IHVubW91bnRcbiAqL1xuZnVuY3Rpb24gdXNlVW5tb3VudCh0cmlnZ2VyU3RhcnQsIHRyaWdnZXJFbmQpIHtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBmaXJzdE1vdW50ID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRGaXJzdE1vdW50ID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZmlyc3RNb3VudCkge1xuICAgICAgdHJpZ2dlclN0YXJ0KCk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB0cmlnZ2VyRW5kKCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2ZpcnN0TW91bnRdKTtcbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzZXRGaXJzdE1vdW50KHRydWUpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRGaXJzdE1vdW50KGZhbHNlKTtcbiAgICB9O1xuICB9LCBbXSk7XG59XG5leHBvcnQgZGVmYXVsdCB1c2VVbm1vdW50OyIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiY2hpbGRyZW5cIl07XG4vKiBlc2xpbnQtZGlzYWJsZSBuby1sb25lbHktaWYgKi9cbi8qKlxuICogTGVnYWN5IGNvZGUuIFNob3VsZCBhdm9pZCB0byB1c2UgaWYgeW91IGFyZSBuZXcgdG8gaW1wb3J0IHRoZXNlIGNvZGUuXG4gKi9cblxuaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBUcmVlTm9kZSBmcm9tIFwiLi9UcmVlTm9kZVwiO1xuaW1wb3J0IGdldEVudGl0eSBmcm9tIFwiLi91dGlscy9rZXlVdGlsXCI7XG5leHBvcnQgeyBnZXRQb3NpdGlvbiwgaXNUcmVlTm9kZSB9IGZyb20gXCIuL3V0aWxzL3RyZWVVdGlsXCI7XG5leHBvcnQgZnVuY3Rpb24gYXJyRGVsKGxpc3QsIHZhbHVlKSB7XG4gIGlmICghbGlzdCkgcmV0dXJuIFtdO1xuICB2YXIgY2xvbmUgPSBsaXN0LnNsaWNlKCk7XG4gIHZhciBpbmRleCA9IGNsb25lLmluZGV4T2YodmFsdWUpO1xuICBpZiAoaW5kZXggPj0gMCkge1xuICAgIGNsb25lLnNwbGljZShpbmRleCwgMSk7XG4gIH1cbiAgcmV0dXJuIGNsb25lO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFyckFkZChsaXN0LCB2YWx1ZSkge1xuICB2YXIgY2xvbmUgPSAobGlzdCB8fCBbXSkuc2xpY2UoKTtcbiAgaWYgKGNsb25lLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuICAgIGNsb25lLnB1c2godmFsdWUpO1xuICB9XG4gIHJldHVybiBjbG9uZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwb3NUb0Fycihwb3MpIHtcbiAgcmV0dXJuIHBvcy5zcGxpdCgnLScpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldERyYWdDaGlsZHJlbktleXMoZHJhZ05vZGVLZXksIGtleUVudGl0aWVzKSB7XG4gIC8vIG5vdCBjb250YWlucyBzZWxmXG4gIC8vIHNlbGYgZm9yIGxlZnQgb3IgcmlnaHQgZHJhZ1xuICB2YXIgZHJhZ0NoaWxkcmVuS2V5cyA9IFtdO1xuICB2YXIgZW50aXR5ID0gZ2V0RW50aXR5KGtleUVudGl0aWVzLCBkcmFnTm9kZUtleSk7XG4gIGZ1bmN0aW9uIGRpZygpIHtcbiAgICB2YXIgbGlzdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gICAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIga2V5ID0gX3JlZi5rZXksXG4gICAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgICAgIGRyYWdDaGlsZHJlbktleXMucHVzaChrZXkpO1xuICAgICAgZGlnKGNoaWxkcmVuKTtcbiAgICB9KTtcbiAgfVxuICBkaWcoZW50aXR5LmNoaWxkcmVuKTtcbiAgcmV0dXJuIGRyYWdDaGlsZHJlbktleXM7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNMYXN0Q2hpbGQodHJlZU5vZGVFbnRpdHkpIHtcbiAgaWYgKHRyZWVOb2RlRW50aXR5LnBhcmVudCkge1xuICAgIHZhciBwb3NBcnIgPSBwb3NUb0Fycih0cmVlTm9kZUVudGl0eS5wb3MpO1xuICAgIHJldHVybiBOdW1iZXIocG9zQXJyW3Bvc0Fyci5sZW5ndGggLSAxXSkgPT09IHRyZWVOb2RlRW50aXR5LnBhcmVudC5jaGlsZHJlbi5sZW5ndGggLSAxO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpcnN0Q2hpbGQodHJlZU5vZGVFbnRpdHkpIHtcbiAgdmFyIHBvc0FyciA9IHBvc1RvQXJyKHRyZWVOb2RlRW50aXR5LnBvcyk7XG4gIHJldHVybiBOdW1iZXIocG9zQXJyW3Bvc0Fyci5sZW5ndGggLSAxXSkgPT09IDA7XG59XG5cbi8vIE9ubHkgdXNlZCB3aGVuIGRyYWcsIG5vdCBhZmZlY3QgU1NSLlxuZXhwb3J0IGZ1bmN0aW9uIGNhbGNEcm9wUG9zaXRpb24oZXZlbnQsIGRyYWdOb2RlUHJvcHMsIHRhcmdldE5vZGVQcm9wcywgaW5kZW50LCBzdGFydE1vdXNlUG9zaXRpb24sIGFsbG93RHJvcCwgZmxhdHRlbmVkTm9kZXMsIGtleUVudGl0aWVzLCBleHBhbmRLZXlzLCBkaXJlY3Rpb24pIHtcbiAgdmFyIF9hYnN0cmFjdERyb3BOb2RlRW50aTtcbiAgdmFyIGNsaWVudFggPSBldmVudC5jbGllbnRYLFxuICAgIGNsaWVudFkgPSBldmVudC5jbGllbnRZO1xuICB2YXIgX2dldEJvdW5kaW5nQ2xpZW50UmVjID0gZXZlbnQudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgIHRvcCA9IF9nZXRCb3VuZGluZ0NsaWVudFJlYy50b3AsXG4gICAgaGVpZ2h0ID0gX2dldEJvdW5kaW5nQ2xpZW50UmVjLmhlaWdodDtcbiAgLy8gb3B0aW9uYWwgY2hhaW4gZm9yIHRlc3RpbmdcbiAgdmFyIGhvcml6b250YWxNb3VzZU9mZnNldCA9IChkaXJlY3Rpb24gPT09ICdydGwnID8gLTEgOiAxKSAqICgoKHN0YXJ0TW91c2VQb3NpdGlvbiA9PT0gbnVsbCB8fCBzdGFydE1vdXNlUG9zaXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0YXJ0TW91c2VQb3NpdGlvbi54KSB8fCAwKSAtIGNsaWVudFgpO1xuICB2YXIgcmF3RHJvcExldmVsT2Zmc2V0ID0gKGhvcml6b250YWxNb3VzZU9mZnNldCAtIDEyKSAvIGluZGVudDtcblxuICAvLyBGaWx0ZXIgdGhlIGV4cGFuZGVkIGtleXMgdG8gZXhjbHVkZSB0aGUgbm9kZSB0aGF0IG5vdCBoYXMgY2hpbGRyZW4gY3VycmVudGx5IChsaWtlIGFzeW5jIG5vZGVzKS5cbiAgdmFyIGZpbHRlcmVkRXhwYW5kS2V5cyA9IGV4cGFuZEtleXMuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgX2tleUVudGl0aWVzJGtleTtcbiAgICByZXR1cm4gKF9rZXlFbnRpdGllcyRrZXkgPSBrZXlFbnRpdGllc1trZXldKSA9PT0gbnVsbCB8fCBfa2V5RW50aXRpZXMka2V5ID09PSB2b2lkIDAgfHwgKF9rZXlFbnRpdGllcyRrZXkgPSBfa2V5RW50aXRpZXMka2V5LmNoaWxkcmVuKSA9PT0gbnVsbCB8fCBfa2V5RW50aXRpZXMka2V5ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfa2V5RW50aXRpZXMka2V5Lmxlbmd0aDtcbiAgfSk7XG5cbiAgLy8gZmluZCBhYnN0cmFjdCBkcm9wIG5vZGUgYnkgaG9yaXpvbnRhbCBvZmZzZXRcbiAgdmFyIGFic3RyYWN0RHJvcE5vZGVFbnRpdHkgPSBnZXRFbnRpdHkoa2V5RW50aXRpZXMsIHRhcmdldE5vZGVQcm9wcy5ldmVudEtleSk7XG4gIGlmIChjbGllbnRZIDwgdG9wICsgaGVpZ2h0IC8gMikge1xuICAgIC8vIGZpcnN0IGhhbGYsIHNldCBhYnN0cmFjdCBkcm9wIG5vZGUgdG8gcHJldmlvdXMgbm9kZVxuICAgIHZhciBub2RlSW5kZXggPSBmbGF0dGVuZWROb2Rlcy5maW5kSW5kZXgoZnVuY3Rpb24gKGZsYXR0ZW5lZE5vZGUpIHtcbiAgICAgIHJldHVybiBmbGF0dGVuZWROb2RlLmtleSA9PT0gYWJzdHJhY3REcm9wTm9kZUVudGl0eS5rZXk7XG4gICAgfSk7XG4gICAgdmFyIHByZXZOb2RlSW5kZXggPSBub2RlSW5kZXggPD0gMCA/IDAgOiBub2RlSW5kZXggLSAxO1xuICAgIHZhciBwcmV2Tm9kZUtleSA9IGZsYXR0ZW5lZE5vZGVzW3ByZXZOb2RlSW5kZXhdLmtleTtcbiAgICBhYnN0cmFjdERyb3BOb2RlRW50aXR5ID0gZ2V0RW50aXR5KGtleUVudGl0aWVzLCBwcmV2Tm9kZUtleSk7XG4gIH1cbiAgdmFyIGluaXRpYWxBYnN0cmFjdERyb3BOb2RlS2V5ID0gYWJzdHJhY3REcm9wTm9kZUVudGl0eS5rZXk7XG4gIHZhciBhYnN0cmFjdERyYWdPdmVyRW50aXR5ID0gYWJzdHJhY3REcm9wTm9kZUVudGl0eTtcbiAgdmFyIGRyYWdPdmVyTm9kZUtleSA9IGFic3RyYWN0RHJvcE5vZGVFbnRpdHkua2V5O1xuICB2YXIgZHJvcFBvc2l0aW9uID0gMDtcbiAgdmFyIGRyb3BMZXZlbE9mZnNldCA9IDA7XG5cbiAgLy8gT25seSBhbGxvdyBjcm9zcyBsZXZlbCBkcm9wIHdoZW4gZHJhZ2dpbmcgb24gYSBub24tZXhwYW5kZWQgbm9kZVxuICBpZiAoIWZpbHRlcmVkRXhwYW5kS2V5cy5pbmNsdWRlcyhpbml0aWFsQWJzdHJhY3REcm9wTm9kZUtleSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhd0Ryb3BMZXZlbE9mZnNldDsgaSArPSAxKSB7XG4gICAgICBpZiAoaXNMYXN0Q2hpbGQoYWJzdHJhY3REcm9wTm9kZUVudGl0eSkpIHtcbiAgICAgICAgYWJzdHJhY3REcm9wTm9kZUVudGl0eSA9IGFic3RyYWN0RHJvcE5vZGVFbnRpdHkucGFyZW50O1xuICAgICAgICBkcm9wTGV2ZWxPZmZzZXQgKz0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgYWJzdHJhY3REcmFnRGF0YU5vZGUgPSBkcmFnTm9kZVByb3BzLmRhdGE7XG4gIHZhciBhYnN0cmFjdERyb3BEYXRhTm9kZSA9IGFic3RyYWN0RHJvcE5vZGVFbnRpdHkubm9kZTtcbiAgdmFyIGRyb3BBbGxvd2VkID0gdHJ1ZTtcbiAgaWYgKGlzRmlyc3RDaGlsZChhYnN0cmFjdERyb3BOb2RlRW50aXR5KSAmJiBhYnN0cmFjdERyb3BOb2RlRW50aXR5LmxldmVsID09PSAwICYmIGNsaWVudFkgPCB0b3AgKyBoZWlnaHQgLyAyICYmIGFsbG93RHJvcCh7XG4gICAgZHJhZ05vZGU6IGFic3RyYWN0RHJhZ0RhdGFOb2RlLFxuICAgIGRyb3BOb2RlOiBhYnN0cmFjdERyb3BEYXRhTm9kZSxcbiAgICBkcm9wUG9zaXRpb246IC0xXG4gIH0pICYmIGFic3RyYWN0RHJvcE5vZGVFbnRpdHkua2V5ID09PSB0YXJnZXROb2RlUHJvcHMuZXZlbnRLZXkpIHtcbiAgICAvLyBmaXJzdCBoYWxmIG9mIGZpcnN0IG5vZGUgaW4gZmlyc3QgbGV2ZWxcbiAgICBkcm9wUG9zaXRpb24gPSAtMTtcbiAgfSBlbHNlIGlmICgoYWJzdHJhY3REcmFnT3ZlckVudGl0eS5jaGlsZHJlbiB8fCBbXSkubGVuZ3RoICYmIGZpbHRlcmVkRXhwYW5kS2V5cy5pbmNsdWRlcyhkcmFnT3Zlck5vZGVLZXkpKSB7XG4gICAgLy8gZHJvcCBvbiBleHBhbmRlZCBub2RlXG4gICAgLy8gb25seSBhbGxvdyBkcm9wIGluc2lkZVxuICAgIGlmIChhbGxvd0Ryb3Aoe1xuICAgICAgZHJhZ05vZGU6IGFic3RyYWN0RHJhZ0RhdGFOb2RlLFxuICAgICAgZHJvcE5vZGU6IGFic3RyYWN0RHJvcERhdGFOb2RlLFxuICAgICAgZHJvcFBvc2l0aW9uOiAwXG4gICAgfSkpIHtcbiAgICAgIGRyb3BQb3NpdGlvbiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRyb3BBbGxvd2VkID0gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKGRyb3BMZXZlbE9mZnNldCA9PT0gMCkge1xuICAgIGlmIChyYXdEcm9wTGV2ZWxPZmZzZXQgPiAtMS41KSB7XG4gICAgICAvLyB8IE5vZGUgICAgIHwgPC0gYWJzdHJhY3REcm9wTm9kZVxuICAgICAgLy8gfCAtXi09PT09PSB8IDwtIG1vdXNlUG9zaXRpb25cbiAgICAgIC8vIDEuIHRyeSBkcm9wIGFmdGVyXG4gICAgICAvLyAyLiBkbyBub3QgYWxsb3cgZHJvcFxuICAgICAgaWYgKGFsbG93RHJvcCh7XG4gICAgICAgIGRyYWdOb2RlOiBhYnN0cmFjdERyYWdEYXRhTm9kZSxcbiAgICAgICAgZHJvcE5vZGU6IGFic3RyYWN0RHJvcERhdGFOb2RlLFxuICAgICAgICBkcm9wUG9zaXRpb246IDFcbiAgICAgIH0pKSB7XG4gICAgICAgIGRyb3BQb3NpdGlvbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcm9wQWxsb3dlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB8IE5vZGUgICAgIHwgPC0gYWJzdHJhY3REcm9wTm9kZVxuICAgICAgLy8gfCAtLS09PV49PSB8IDwtIG1vdXNlUG9zaXRpb25cbiAgICAgIC8vIHdoZXRoZXIgaXQgaGFzIGNoaWxkcmVuIG9yIGRvZXNuJ3QgaGFzIGNoaWxkcmVuXG4gICAgICAvLyBhbHdheXNcbiAgICAgIC8vIDEuIHRyeSBkcm9wIGluc2lkZVxuICAgICAgLy8gMi4gdHJ5IGRyb3AgYWZ0ZXJcbiAgICAgIC8vIDMuIGRvIG5vdCBhbGxvdyBkcm9wXG4gICAgICBpZiAoYWxsb3dEcm9wKHtcbiAgICAgICAgZHJhZ05vZGU6IGFic3RyYWN0RHJhZ0RhdGFOb2RlLFxuICAgICAgICBkcm9wTm9kZTogYWJzdHJhY3REcm9wRGF0YU5vZGUsXG4gICAgICAgIGRyb3BQb3NpdGlvbjogMFxuICAgICAgfSkpIHtcbiAgICAgICAgZHJvcFBvc2l0aW9uID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoYWxsb3dEcm9wKHtcbiAgICAgICAgZHJhZ05vZGU6IGFic3RyYWN0RHJhZ0RhdGFOb2RlLFxuICAgICAgICBkcm9wTm9kZTogYWJzdHJhY3REcm9wRGF0YU5vZGUsXG4gICAgICAgIGRyb3BQb3NpdGlvbjogMVxuICAgICAgfSkpIHtcbiAgICAgICAgZHJvcFBvc2l0aW9uID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyb3BBbGxvd2VkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIHwgTm9kZTEgfCA8LSBhYnN0cmFjdERyb3BOb2RlXG4gICAgLy8gICAgICB8ICBOb2RlMiAgfFxuICAgIC8vIC0tXi0tfC0tLS09PT09PXwgPC0gbW91c2VQb3NpdGlvblxuICAgIC8vIDEuIHRyeSBpbnNlcnQgYWZ0ZXIgTm9kZTFcbiAgICAvLyAyLiBkbyBub3QgYWxsb3cgZHJvcFxuICAgIGlmIChhbGxvd0Ryb3Aoe1xuICAgICAgZHJhZ05vZGU6IGFic3RyYWN0RHJhZ0RhdGFOb2RlLFxuICAgICAgZHJvcE5vZGU6IGFic3RyYWN0RHJvcERhdGFOb2RlLFxuICAgICAgZHJvcFBvc2l0aW9uOiAxXG4gICAgfSkpIHtcbiAgICAgIGRyb3BQb3NpdGlvbiA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRyb3BBbGxvd2VkID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgZHJvcFBvc2l0aW9uOiBkcm9wUG9zaXRpb24sXG4gICAgZHJvcExldmVsT2Zmc2V0OiBkcm9wTGV2ZWxPZmZzZXQsXG4gICAgZHJvcFRhcmdldEtleTogYWJzdHJhY3REcm9wTm9kZUVudGl0eS5rZXksXG4gICAgZHJvcFRhcmdldFBvczogYWJzdHJhY3REcm9wTm9kZUVudGl0eS5wb3MsXG4gICAgZHJhZ092ZXJOb2RlS2V5OiBkcmFnT3Zlck5vZGVLZXksXG4gICAgZHJvcENvbnRhaW5lcktleTogZHJvcFBvc2l0aW9uID09PSAwID8gbnVsbCA6ICgoX2Fic3RyYWN0RHJvcE5vZGVFbnRpID0gYWJzdHJhY3REcm9wTm9kZUVudGl0eS5wYXJlbnQpID09PSBudWxsIHx8IF9hYnN0cmFjdERyb3BOb2RlRW50aSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Fic3RyYWN0RHJvcE5vZGVFbnRpLmtleSkgfHwgbnVsbCxcbiAgICBkcm9wQWxsb3dlZDogZHJvcEFsbG93ZWRcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gc2VsZWN0ZWRLZXlzIGFjY29yZGluZyB3aXRoIG11bHRpcGxlIHByb3BcbiAqIEBwYXJhbSBzZWxlY3RlZEtleXNcbiAqIEBwYXJhbSBwcm9wc1xuICogQHJldHVybnMgW3N0cmluZ11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGNTZWxlY3RlZEtleXMoc2VsZWN0ZWRLZXlzLCBwcm9wcykge1xuICBpZiAoIXNlbGVjdGVkS2V5cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdmFyIG11bHRpcGxlID0gcHJvcHMubXVsdGlwbGU7XG4gIGlmIChtdWx0aXBsZSkge1xuICAgIHJldHVybiBzZWxlY3RlZEtleXMuc2xpY2UoKTtcbiAgfVxuICBpZiAoc2VsZWN0ZWRLZXlzLmxlbmd0aCkge1xuICAgIHJldHVybiBbc2VsZWN0ZWRLZXlzWzBdXTtcbiAgfVxuICByZXR1cm4gc2VsZWN0ZWRLZXlzO1xufVxudmFyIGludGVybmFsUHJvY2Vzc1Byb3BzID0gZnVuY3Rpb24gaW50ZXJuYWxQcm9jZXNzUHJvcHMocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RGF0YVRvVHJlZSh0cmVlRGF0YSwgcHJvY2Vzc29yKSB7XG4gIGlmICghdHJlZURhdGEpIHJldHVybiBbXTtcbiAgdmFyIF9yZWYyID0gcHJvY2Vzc29yIHx8IHt9LFxuICAgIF9yZWYyJHByb2Nlc3NQcm9wcyA9IF9yZWYyLnByb2Nlc3NQcm9wcyxcbiAgICBwcm9jZXNzUHJvcHMgPSBfcmVmMiRwcm9jZXNzUHJvcHMgPT09IHZvaWQgMCA/IGludGVybmFsUHJvY2Vzc1Byb3BzIDogX3JlZjIkcHJvY2Vzc1Byb3BzO1xuICB2YXIgbGlzdCA9IEFycmF5LmlzQXJyYXkodHJlZURhdGEpID8gdHJlZURhdGEgOiBbdHJlZURhdGFdO1xuICByZXR1cm4gbGlzdC5tYXAoZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX3JlZjMuY2hpbGRyZW4sXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmMywgX2V4Y2x1ZGVkKTtcbiAgICB2YXIgY2hpbGRyZW5Ob2RlcyA9IGNvbnZlcnREYXRhVG9UcmVlKGNoaWxkcmVuLCBwcm9jZXNzb3IpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmVlTm9kZSwgX2V4dGVuZHMoe1xuICAgICAga2V5OiBwcm9wcy5rZXlcbiAgICB9LCBwcm9jZXNzUHJvcHMocHJvcHMpKSwgY2hpbGRyZW5Ob2Rlcyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlIGBjaGVja2VkS2V5c2AgdG8geyBjaGVja2VkS2V5cywgaGFsZkNoZWNrZWRLZXlzIH0gc3R5bGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ2hlY2tlZEtleXMoa2V5cykge1xuICBpZiAoIWtleXMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIENvbnZlcnQga2V5cyB0byBvYmplY3QgZm9ybWF0XG4gIHZhciBrZXlQcm9wcztcbiAgaWYgKEFycmF5LmlzQXJyYXkoa2V5cykpIHtcbiAgICAvLyBbTGVnYWN5XSBGb2xsb3cgdGhlIGFwaSBkb2NcbiAgICBrZXlQcm9wcyA9IHtcbiAgICAgIGNoZWNrZWRLZXlzOiBrZXlzLFxuICAgICAgaGFsZkNoZWNrZWRLZXlzOiB1bmRlZmluZWRcbiAgICB9O1xuICB9IGVsc2UgaWYgKF90eXBlb2Yoa2V5cykgPT09ICdvYmplY3QnKSB7XG4gICAga2V5UHJvcHMgPSB7XG4gICAgICBjaGVja2VkS2V5czoga2V5cy5jaGVja2VkIHx8IHVuZGVmaW5lZCxcbiAgICAgIGhhbGZDaGVja2VkS2V5czoga2V5cy5oYWxmQ2hlY2tlZCB8fCB1bmRlZmluZWRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHdhcm5pbmcoZmFsc2UsICdgY2hlY2tlZEtleXNgIGlzIG5vdCBhbiBhcnJheSBvciBhbiBvYmplY3QnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ga2V5UHJvcHM7XG59XG5cbi8qKlxuICogSWYgdXNlciB1c2UgYGF1dG9FeHBhbmRQYXJlbnRgIHdlIHNob3VsZCBnZXQgdGhlIGxpc3Qgb2YgcGFyZW50IG5vZGVcbiAqIEBwYXJhbSBrZXlMaXN0XG4gKiBAcGFyYW0ga2V5RW50aXRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmR1Y3RFeHBhbmRQYXJlbnQoa2V5TGlzdCwga2V5RW50aXRpZXMpIHtcbiAgdmFyIGV4cGFuZGVkS2V5cyA9IG5ldyBTZXQoKTtcbiAgZnVuY3Rpb24gY29uZHVjdFVwKGtleSkge1xuICAgIGlmIChleHBhbmRlZEtleXMuaGFzKGtleSkpIHJldHVybjtcbiAgICB2YXIgZW50aXR5ID0gZ2V0RW50aXR5KGtleUVudGl0aWVzLCBrZXkpO1xuICAgIGlmICghZW50aXR5KSByZXR1cm47XG4gICAgZXhwYW5kZWRLZXlzLmFkZChrZXkpO1xuICAgIHZhciBwYXJlbnQgPSBlbnRpdHkucGFyZW50LFxuICAgICAgbm9kZSA9IGVudGl0eS5ub2RlO1xuICAgIGlmIChub2RlLmRpc2FibGVkKSByZXR1cm47XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgY29uZHVjdFVwKHBhcmVudC5rZXkpO1xuICAgIH1cbiAgfVxuICAoa2V5TGlzdCB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgY29uZHVjdFVwKGtleSk7XG4gIH0pO1xuICByZXR1cm4gX3RvQ29uc3VtYWJsZUFycmF5KGV4cGFuZGVkS2V5cyk7XG59IiwiaW1wb3J0IHdhcm5pbmcgZnJvbSBcInJjLXV0aWwvZXMvd2FybmluZ1wiO1xuaW1wb3J0IGdldEVudGl0eSBmcm9tIFwiLi9rZXlVdGlsXCI7XG5mdW5jdGlvbiByZW1vdmVGcm9tQ2hlY2tlZEtleXMoaGFsZkNoZWNrZWRLZXlzLCBjaGVja2VkS2V5cykge1xuICB2YXIgZmlsdGVyZWRLZXlzID0gbmV3IFNldCgpO1xuICBoYWxmQ2hlY2tlZEtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFjaGVja2VkS2V5cy5oYXMoa2V5KSkge1xuICAgICAgZmlsdGVyZWRLZXlzLmFkZChrZXkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmaWx0ZXJlZEtleXM7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDaGVja0Rpc2FibGVkKG5vZGUpIHtcbiAgdmFyIF9yZWYgPSBub2RlIHx8IHt9LFxuICAgIGRpc2FibGVkID0gX3JlZi5kaXNhYmxlZCxcbiAgICBkaXNhYmxlQ2hlY2tib3ggPSBfcmVmLmRpc2FibGVDaGVja2JveCxcbiAgICBjaGVja2FibGUgPSBfcmVmLmNoZWNrYWJsZTtcbiAgcmV0dXJuICEhKGRpc2FibGVkIHx8IGRpc2FibGVDaGVja2JveCkgfHwgY2hlY2thYmxlID09PSBmYWxzZTtcbn1cblxuLy8gRmlsbCBtaXNzIGtleXNcbmZ1bmN0aW9uIGZpbGxDb25kdWN0Q2hlY2soa2V5cywgbGV2ZWxFbnRpdGllcywgbWF4TGV2ZWwsIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQpIHtcbiAgdmFyIGNoZWNrZWRLZXlzID0gbmV3IFNldChrZXlzKTtcbiAgdmFyIGhhbGZDaGVja2VkS2V5cyA9IG5ldyBTZXQoKTtcblxuICAvLyBBZGQgY2hlY2tlZCBrZXlzIHRvcCB0byBib3R0b21cbiAgZm9yICh2YXIgbGV2ZWwgPSAwOyBsZXZlbCA8PSBtYXhMZXZlbDsgbGV2ZWwgKz0gMSkge1xuICAgIHZhciBlbnRpdGllcyA9IGxldmVsRW50aXRpZXMuZ2V0KGxldmVsKSB8fCBuZXcgU2V0KCk7XG4gICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICB2YXIga2V5ID0gZW50aXR5LmtleSxcbiAgICAgICAgbm9kZSA9IGVudGl0eS5ub2RlLFxuICAgICAgICBfZW50aXR5JGNoaWxkcmVuID0gZW50aXR5LmNoaWxkcmVuLFxuICAgICAgICBjaGlsZHJlbiA9IF9lbnRpdHkkY2hpbGRyZW4gPT09IHZvaWQgMCA/IFtdIDogX2VudGl0eSRjaGlsZHJlbjtcbiAgICAgIGlmIChjaGVja2VkS2V5cy5oYXMoa2V5KSAmJiAhc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZChub2RlKSkge1xuICAgICAgICBjaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24gKGNoaWxkRW50aXR5KSB7XG4gICAgICAgICAgcmV0dXJuICFzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKGNoaWxkRW50aXR5Lm5vZGUpO1xuICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZEVudGl0eSkge1xuICAgICAgICAgIGNoZWNrZWRLZXlzLmFkZChjaGlsZEVudGl0eS5rZXkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIEFkZCBjaGVja2VkIGtleXMgZnJvbSBib3R0b20gdG8gdG9wXG4gIHZhciB2aXNpdGVkS2V5cyA9IG5ldyBTZXQoKTtcbiAgZm9yICh2YXIgX2xldmVsID0gbWF4TGV2ZWw7IF9sZXZlbCA+PSAwOyBfbGV2ZWwgLT0gMSkge1xuICAgIHZhciBfZW50aXRpZXMgPSBsZXZlbEVudGl0aWVzLmdldChfbGV2ZWwpIHx8IG5ldyBTZXQoKTtcbiAgICBfZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICB2YXIgcGFyZW50ID0gZW50aXR5LnBhcmVudCxcbiAgICAgICAgbm9kZSA9IGVudGl0eS5ub2RlO1xuXG4gICAgICAvLyBTa2lwIGlmIG5vIG5lZWQgdG8gY2hlY2tcbiAgICAgIGlmIChzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKG5vZGUpIHx8ICFlbnRpdHkucGFyZW50IHx8IHZpc2l0ZWRLZXlzLmhhcyhlbnRpdHkucGFyZW50LmtleSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTa2lwIGlmIHBhcmVudCBpcyBkaXNhYmxlZFxuICAgICAgaWYgKHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQoZW50aXR5LnBhcmVudC5ub2RlKSkge1xuICAgICAgICB2aXNpdGVkS2V5cy5hZGQocGFyZW50LmtleSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBhbGxDaGVja2VkID0gdHJ1ZTtcbiAgICAgIHZhciBwYXJ0aWFsQ2hlY2tlZCA9IGZhbHNlO1xuICAgICAgKHBhcmVudC5jaGlsZHJlbiB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZEVudGl0eSkge1xuICAgICAgICByZXR1cm4gIXN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQoY2hpbGRFbnRpdHkubm9kZSk7XG4gICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICB2YXIga2V5ID0gX3JlZjIua2V5O1xuICAgICAgICB2YXIgY2hlY2tlZCA9IGNoZWNrZWRLZXlzLmhhcyhrZXkpO1xuICAgICAgICBpZiAoYWxsQ2hlY2tlZCAmJiAhY2hlY2tlZCkge1xuICAgICAgICAgIGFsbENoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhcnRpYWxDaGVja2VkICYmIChjaGVja2VkIHx8IGhhbGZDaGVja2VkS2V5cy5oYXMoa2V5KSkpIHtcbiAgICAgICAgICBwYXJ0aWFsQ2hlY2tlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGFsbENoZWNrZWQpIHtcbiAgICAgICAgY2hlY2tlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcnRpYWxDaGVja2VkKSB7XG4gICAgICAgIGhhbGZDaGVja2VkS2V5cy5hZGQocGFyZW50LmtleSk7XG4gICAgICB9XG4gICAgICB2aXNpdGVkS2V5cy5hZGQocGFyZW50LmtleSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjaGVja2VkS2V5czogQXJyYXkuZnJvbShjaGVja2VkS2V5cyksXG4gICAgaGFsZkNoZWNrZWRLZXlzOiBBcnJheS5mcm9tKHJlbW92ZUZyb21DaGVja2VkS2V5cyhoYWxmQ2hlY2tlZEtleXMsIGNoZWNrZWRLZXlzKSlcbiAgfTtcbn1cblxuLy8gUmVtb3ZlIHVzZWxlc3Mga2V5XG5mdW5jdGlvbiBjbGVhbkNvbmR1Y3RDaGVjayhrZXlzLCBoYWxmS2V5cywgbGV2ZWxFbnRpdGllcywgbWF4TGV2ZWwsIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQpIHtcbiAgdmFyIGNoZWNrZWRLZXlzID0gbmV3IFNldChrZXlzKTtcbiAgdmFyIGhhbGZDaGVja2VkS2V5cyA9IG5ldyBTZXQoaGFsZktleXMpO1xuXG4gIC8vIFJlbW92ZSBjaGVja2VkIGtleXMgZnJvbSB0b3AgdG8gYm90dG9tXG4gIGZvciAodmFyIGxldmVsID0gMDsgbGV2ZWwgPD0gbWF4TGV2ZWw7IGxldmVsICs9IDEpIHtcbiAgICB2YXIgZW50aXRpZXMgPSBsZXZlbEVudGl0aWVzLmdldChsZXZlbCkgfHwgbmV3IFNldCgpO1xuICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgdmFyIGtleSA9IGVudGl0eS5rZXksXG4gICAgICAgIG5vZGUgPSBlbnRpdHkubm9kZSxcbiAgICAgICAgX2VudGl0eSRjaGlsZHJlbjIgPSBlbnRpdHkuY2hpbGRyZW4sXG4gICAgICAgIGNoaWxkcmVuID0gX2VudGl0eSRjaGlsZHJlbjIgPT09IHZvaWQgMCA/IFtdIDogX2VudGl0eSRjaGlsZHJlbjI7XG4gICAgICBpZiAoIWNoZWNrZWRLZXlzLmhhcyhrZXkpICYmICFoYWxmQ2hlY2tlZEtleXMuaGFzKGtleSkgJiYgIXN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQobm9kZSkpIHtcbiAgICAgICAgY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjaGlsZEVudGl0eSkge1xuICAgICAgICAgIHJldHVybiAhc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZChjaGlsZEVudGl0eS5ub2RlKTtcbiAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGRFbnRpdHkpIHtcbiAgICAgICAgICBjaGVja2VkS2V5cy5kZWxldGUoY2hpbGRFbnRpdHkua2V5KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBSZW1vdmUgY2hlY2tlZCBrZXlzIGZvcm0gYm90dG9tIHRvIHRvcFxuICBoYWxmQ2hlY2tlZEtleXMgPSBuZXcgU2V0KCk7XG4gIHZhciB2aXNpdGVkS2V5cyA9IG5ldyBTZXQoKTtcbiAgZm9yICh2YXIgX2xldmVsMiA9IG1heExldmVsOyBfbGV2ZWwyID49IDA7IF9sZXZlbDIgLT0gMSkge1xuICAgIHZhciBfZW50aXRpZXMyID0gbGV2ZWxFbnRpdGllcy5nZXQoX2xldmVsMikgfHwgbmV3IFNldCgpO1xuICAgIF9lbnRpdGllczIuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICB2YXIgcGFyZW50ID0gZW50aXR5LnBhcmVudCxcbiAgICAgICAgbm9kZSA9IGVudGl0eS5ub2RlO1xuXG4gICAgICAvLyBTa2lwIGlmIG5vIG5lZWQgdG8gY2hlY2tcbiAgICAgIGlmIChzeW50aGV0aWNHZXRDaGVja0Rpc2FibGVkKG5vZGUpIHx8ICFlbnRpdHkucGFyZW50IHx8IHZpc2l0ZWRLZXlzLmhhcyhlbnRpdHkucGFyZW50LmtleSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTa2lwIGlmIHBhcmVudCBpcyBkaXNhYmxlZFxuICAgICAgaWYgKHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQoZW50aXR5LnBhcmVudC5ub2RlKSkge1xuICAgICAgICB2aXNpdGVkS2V5cy5hZGQocGFyZW50LmtleSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBhbGxDaGVja2VkID0gdHJ1ZTtcbiAgICAgIHZhciBwYXJ0aWFsQ2hlY2tlZCA9IGZhbHNlO1xuICAgICAgKHBhcmVudC5jaGlsZHJlbiB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZEVudGl0eSkge1xuICAgICAgICByZXR1cm4gIXN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQoY2hpbGRFbnRpdHkubm9kZSk7XG4gICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICB2YXIga2V5ID0gX3JlZjMua2V5O1xuICAgICAgICB2YXIgY2hlY2tlZCA9IGNoZWNrZWRLZXlzLmhhcyhrZXkpO1xuICAgICAgICBpZiAoYWxsQ2hlY2tlZCAmJiAhY2hlY2tlZCkge1xuICAgICAgICAgIGFsbENoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhcnRpYWxDaGVja2VkICYmIChjaGVja2VkIHx8IGhhbGZDaGVja2VkS2V5cy5oYXMoa2V5KSkpIHtcbiAgICAgICAgICBwYXJ0aWFsQ2hlY2tlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCFhbGxDaGVja2VkKSB7XG4gICAgICAgIGNoZWNrZWRLZXlzLmRlbGV0ZShwYXJlbnQua2V5KTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJ0aWFsQ2hlY2tlZCkge1xuICAgICAgICBoYWxmQ2hlY2tlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgICAgfVxuICAgICAgdmlzaXRlZEtleXMuYWRkKHBhcmVudC5rZXkpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgY2hlY2tlZEtleXM6IEFycmF5LmZyb20oY2hlY2tlZEtleXMpLFxuICAgIGhhbGZDaGVja2VkS2V5czogQXJyYXkuZnJvbShyZW1vdmVGcm9tQ2hlY2tlZEtleXMoaGFsZkNoZWNrZWRLZXlzLCBjaGVja2VkS2V5cykpXG4gIH07XG59XG5cbi8qKlxuICogQ29uZHVjdCB3aXRoIGtleXMuXG4gKiBAcGFyYW0ga2V5TGlzdCBjdXJyZW50IGtleSBsaXN0XG4gKiBAcGFyYW0ga2V5RW50aXRpZXMga2V5IC0gZGF0YUVudGl0eSBtYXBcbiAqIEBwYXJhbSBtb2RlIGBmaWxsYCB0byBmaWxsIG1pc3Npbmcga2V5LCBgY2xlYW5gIHRvIHJlbW92ZSB1c2VsZXNzIGtleVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZHVjdENoZWNrKGtleUxpc3QsIGNoZWNrZWQsIGtleUVudGl0aWVzLCBnZXRDaGVja0Rpc2FibGVkKSB7XG4gIHZhciB3YXJuaW5nTWlzc0tleXMgPSBbXTtcbiAgdmFyIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQ7XG4gIGlmIChnZXRDaGVja0Rpc2FibGVkKSB7XG4gICAgc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZCA9IGdldENoZWNrRGlzYWJsZWQ7XG4gIH0gZWxzZSB7XG4gICAgc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZCA9IGlzQ2hlY2tEaXNhYmxlZDtcbiAgfVxuXG4gIC8vIFdlIG9ubHkgaGFuZGxlIGV4aXN0IGtleXNcbiAgdmFyIGtleXMgPSBuZXcgU2V0KGtleUxpc3QuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgaGFzRW50aXR5ID0gISFnZXRFbnRpdHkoa2V5RW50aXRpZXMsIGtleSk7XG4gICAgaWYgKCFoYXNFbnRpdHkpIHtcbiAgICAgIHdhcm5pbmdNaXNzS2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiBoYXNFbnRpdHk7XG4gIH0pKTtcbiAgdmFyIGxldmVsRW50aXRpZXMgPSBuZXcgTWFwKCk7XG4gIHZhciBtYXhMZXZlbCA9IDA7XG5cbiAgLy8gQ29udmVydCBlbnRpdGllcyBieSBsZXZlbCBmb3IgY2FsY3VsYXRpb25cbiAgT2JqZWN0LmtleXMoa2V5RW50aXRpZXMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBlbnRpdHkgPSBrZXlFbnRpdGllc1trZXldO1xuICAgIHZhciBsZXZlbCA9IGVudGl0eS5sZXZlbDtcbiAgICB2YXIgbGV2ZWxTZXQgPSBsZXZlbEVudGl0aWVzLmdldChsZXZlbCk7XG4gICAgaWYgKCFsZXZlbFNldCkge1xuICAgICAgbGV2ZWxTZXQgPSBuZXcgU2V0KCk7XG4gICAgICBsZXZlbEVudGl0aWVzLnNldChsZXZlbCwgbGV2ZWxTZXQpO1xuICAgIH1cbiAgICBsZXZlbFNldC5hZGQoZW50aXR5KTtcbiAgICBtYXhMZXZlbCA9IE1hdGgubWF4KG1heExldmVsLCBsZXZlbCk7XG4gIH0pO1xuICB3YXJuaW5nKCF3YXJuaW5nTWlzc0tleXMubGVuZ3RoLCBcIlRyZWUgbWlzc2luZyBmb2xsb3cga2V5czogXCIuY29uY2F0KHdhcm5pbmdNaXNzS2V5cy5zbGljZSgwLCAxMDApLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIFwiJ1wiLmNvbmNhdChrZXksIFwiJ1wiKTtcbiAgfSkuam9pbignLCAnKSkpO1xuICB2YXIgcmVzdWx0O1xuICBpZiAoY2hlY2tlZCA9PT0gdHJ1ZSkge1xuICAgIHJlc3VsdCA9IGZpbGxDb25kdWN0Q2hlY2soa2V5cywgbGV2ZWxFbnRpdGllcywgbWF4TGV2ZWwsIHN5bnRoZXRpY0dldENoZWNrRGlzYWJsZWQpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IGNsZWFuQ29uZHVjdENoZWNrKGtleXMsIGNoZWNrZWQuaGFsZkNoZWNrZWRLZXlzLCBsZXZlbEVudGl0aWVzLCBtYXhMZXZlbCwgc3ludGhldGljR2V0Q2hlY2tEaXNhYmxlZCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJleHBvcnQgZnVuY3Rpb24gZmluZEV4cGFuZGVkS2V5cygpIHtcbiAgdmFyIHByZXYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuICB2YXIgbmV4dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogW107XG4gIHZhciBwcmV2TGVuID0gcHJldi5sZW5ndGg7XG4gIHZhciBuZXh0TGVuID0gbmV4dC5sZW5ndGg7XG4gIGlmIChNYXRoLmFicyhwcmV2TGVuIC0gbmV4dExlbikgIT09IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWRkOiBmYWxzZSxcbiAgICAgIGtleTogbnVsbFxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZmluZChzaG9ydGVyLCBsb25nZXIpIHtcbiAgICB2YXIgY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgc2hvcnRlci5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGNhY2hlLnNldChrZXksIHRydWUpO1xuICAgIH0pO1xuICAgIHZhciBrZXlzID0gbG9uZ2VyLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZXR1cm4gIWNhY2hlLmhhcyhrZXkpO1xuICAgIH0pO1xuICAgIHJldHVybiBrZXlzLmxlbmd0aCA9PT0gMSA/IGtleXNbMF0gOiBudWxsO1xuICB9XG4gIGlmIChwcmV2TGVuIDwgbmV4dExlbikge1xuICAgIHJldHVybiB7XG4gICAgICBhZGQ6IHRydWUsXG4gICAgICBrZXk6IGZpbmQocHJldiwgbmV4dClcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgYWRkOiBmYWxzZSxcbiAgICBrZXk6IGZpbmQobmV4dCwgcHJldilcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBhbmRSYW5nZShzaG9ydGVyLCBsb25nZXIsIGtleSkge1xuICB2YXIgc2hvcnRlclN0YXJ0SW5kZXggPSBzaG9ydGVyLmZpbmRJbmRleChmdW5jdGlvbiAoZGF0YSkge1xuICAgIHJldHVybiBkYXRhLmtleSA9PT0ga2V5O1xuICB9KTtcbiAgdmFyIHNob3J0ZXJFbmROb2RlID0gc2hvcnRlcltzaG9ydGVyU3RhcnRJbmRleCArIDFdO1xuICB2YXIgbG9uZ2VyU3RhcnRJbmRleCA9IGxvbmdlci5maW5kSW5kZXgoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YS5rZXkgPT09IGtleTtcbiAgfSk7XG4gIGlmIChzaG9ydGVyRW5kTm9kZSkge1xuICAgIHZhciBsb25nZXJFbmRJbmRleCA9IGxvbmdlci5maW5kSW5kZXgoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHJldHVybiBkYXRhLmtleSA9PT0gc2hvcnRlckVuZE5vZGUua2V5O1xuICAgIH0pO1xuICAgIHJldHVybiBsb25nZXIuc2xpY2UobG9uZ2VyU3RhcnRJbmRleCArIDEsIGxvbmdlckVuZEluZGV4KTtcbiAgfVxuICByZXR1cm4gbG9uZ2VyLnNsaWNlKGxvbmdlclN0YXJ0SW5kZXggKyAxKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRFbnRpdHkoa2V5RW50aXRpZXMsIGtleSkge1xuICByZXR1cm4ga2V5RW50aXRpZXNba2V5XTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiY2hpbGRyZW5cIl07XG5pbXBvcnQgdG9BcnJheSBmcm9tIFwicmMtdXRpbC9lcy9DaGlsZHJlbi90b0FycmF5XCI7XG5pbXBvcnQgb21pdCBmcm9tIFwicmMtdXRpbC9lcy9vbWl0XCI7XG5pbXBvcnQgd2FybmluZyBmcm9tIFwicmMtdXRpbC9lcy93YXJuaW5nXCI7XG5pbXBvcnQgZ2V0RW50aXR5IGZyb20gXCIuL2tleVV0aWxcIjtcbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3NpdGlvbihsZXZlbCwgaW5kZXgpIHtcbiAgcmV0dXJuIFwiXCIuY29uY2F0KGxldmVsLCBcIi1cIikuY29uY2F0KGluZGV4KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1RyZWVOb2RlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS50eXBlICYmIG5vZGUudHlwZS5pc1RyZWVOb2RlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEtleShrZXksIHBvcykge1xuICBpZiAoa2V5ICE9PSBudWxsICYmIGtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuICByZXR1cm4gcG9zO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbGxGaWVsZE5hbWVzKGZpZWxkTmFtZXMpIHtcbiAgdmFyIF9yZWYgPSBmaWVsZE5hbWVzIHx8IHt9LFxuICAgIHRpdGxlID0gX3JlZi50aXRsZSxcbiAgICBfdGl0bGUgPSBfcmVmLl90aXRsZSxcbiAgICBrZXkgPSBfcmVmLmtleSxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHZhciBtZXJnZWRUaXRsZSA9IHRpdGxlIHx8ICd0aXRsZSc7XG4gIHJldHVybiB7XG4gICAgdGl0bGU6IG1lcmdlZFRpdGxlLFxuICAgIF90aXRsZTogX3RpdGxlIHx8IFttZXJnZWRUaXRsZV0sXG4gICAga2V5OiBrZXkgfHwgJ2tleScsXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuIHx8ICdjaGlsZHJlbidcbiAgfTtcbn1cblxuLyoqXG4gKiBXYXJuaW5nIGlmIFRyZWVOb2RlIGRvIG5vdCBwcm92aWRlcyBrZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm5pbmdXaXRob3V0S2V5KHRyZWVEYXRhLCBmaWVsZE5hbWVzKSB7XG4gIHZhciBrZXlzID0gbmV3IE1hcCgpO1xuICBmdW5jdGlvbiBkaWcobGlzdCkge1xuICAgIHZhciBwYXRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnJztcbiAgICAobGlzdCB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAodHJlZU5vZGUpIHtcbiAgICAgIHZhciBrZXkgPSB0cmVlTm9kZVtmaWVsZE5hbWVzLmtleV07XG4gICAgICB2YXIgY2hpbGRyZW4gPSB0cmVlTm9kZVtmaWVsZE5hbWVzLmNoaWxkcmVuXTtcbiAgICAgIHdhcm5pbmcoa2V5ICE9PSBudWxsICYmIGtleSAhPT0gdW5kZWZpbmVkLCBcIlRyZWUgbm9kZSBtdXN0IGhhdmUgYSBjZXJ0YWluIGtleTogW1wiLmNvbmNhdChwYXRoKS5jb25jYXQoa2V5LCBcIl1cIikpO1xuICAgICAgdmFyIHJlY29yZEtleSA9IFN0cmluZyhrZXkpO1xuICAgICAgd2FybmluZygha2V5cy5oYXMocmVjb3JkS2V5KSB8fCBrZXkgPT09IG51bGwgfHwga2V5ID09PSB1bmRlZmluZWQsIFwiU2FtZSAna2V5JyBleGlzdCBpbiB0aGUgVHJlZTogXCIuY29uY2F0KHJlY29yZEtleSkpO1xuICAgICAga2V5cy5zZXQocmVjb3JkS2V5LCB0cnVlKTtcbiAgICAgIGRpZyhjaGlsZHJlbiwgXCJcIi5jb25jYXQocGF0aCkuY29uY2F0KHJlY29yZEtleSwgXCIgPiBcIikpO1xuICAgIH0pO1xuICB9XG4gIGRpZyh0cmVlRGF0YSk7XG59XG5cbi8qKlxuICogQ29udmVydCBgY2hpbGRyZW5gIG9mIFRyZWUgaW50byBgdHJlZURhdGFgIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUcmVlVG9EYXRhKHJvb3ROb2Rlcykge1xuICBmdW5jdGlvbiBkaWcobm9kZSkge1xuICAgIHZhciB0cmVlTm9kZXMgPSB0b0FycmF5KG5vZGUpO1xuICAgIHJldHVybiB0cmVlTm9kZXMubWFwKGZ1bmN0aW9uICh0cmVlTm9kZSkge1xuICAgICAgLy8gRmlsdGVyIGludmFsaWRhdGUgbm9kZVxuICAgICAgaWYgKCFpc1RyZWVOb2RlKHRyZWVOb2RlKSkge1xuICAgICAgICB3YXJuaW5nKCF0cmVlTm9kZSwgJ1RyZWUvVHJlZU5vZGUgY2FuIG9ubHkgYWNjZXB0IFRyZWVOb2RlIGFzIGNoaWxkcmVuLicpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBrZXkgPSB0cmVlTm9kZS5rZXk7XG4gICAgICB2YXIgX3RyZWVOb2RlJHByb3BzID0gdHJlZU5vZGUucHJvcHMsXG4gICAgICAgIGNoaWxkcmVuID0gX3RyZWVOb2RlJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF90cmVlTm9kZSRwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgICAgIHZhciBkYXRhTm9kZSA9IF9vYmplY3RTcHJlYWQoe1xuICAgICAgICBrZXk6IGtleVxuICAgICAgfSwgcmVzdCk7XG4gICAgICB2YXIgcGFyc2VkQ2hpbGRyZW4gPSBkaWcoY2hpbGRyZW4pO1xuICAgICAgaWYgKHBhcnNlZENoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICBkYXRhTm9kZS5jaGlsZHJlbiA9IHBhcnNlZENoaWxkcmVuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGFOb2RlO1xuICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoZGF0YU5vZGUpIHtcbiAgICAgIHJldHVybiBkYXRhTm9kZTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZGlnKHJvb3ROb2Rlcyk7XG59XG5cbi8qKlxuICogRmxhdCBuZXN0IHRyZWUgZGF0YSBpbnRvIGZsYXR0ZW4gbGlzdC4gVGhpcyBpcyB1c2VkIGZvciB2aXJ0dWFsIGxpc3QgcmVuZGVyLlxuICogQHBhcmFtIHRyZWVOb2RlTGlzdCBPcmlnaW4gZGF0YSBub2RlIGxpc3RcbiAqIEBwYXJhbSBleHBhbmRlZEtleXNcbiAqIG5lZWQgZXhwYW5kZWQga2V5cywgcHJvdmlkZXMgYHRydWVgIG1lYW5zIGFsbCBleHBhbmRlZCAodXNlZCBpbiBgcmMtdHJlZS1zZWxlY3RgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5UcmVlRGF0YSh0cmVlTm9kZUxpc3QsIGV4cGFuZGVkS2V5cywgZmllbGROYW1lcykge1xuICB2YXIgX2ZpbGxGaWVsZE5hbWVzID0gZmlsbEZpZWxkTmFtZXMoZmllbGROYW1lcyksXG4gICAgZmllbGRUaXRsZXMgPSBfZmlsbEZpZWxkTmFtZXMuX3RpdGxlLFxuICAgIGZpZWxkS2V5ID0gX2ZpbGxGaWVsZE5hbWVzLmtleSxcbiAgICBmaWVsZENoaWxkcmVuID0gX2ZpbGxGaWVsZE5hbWVzLmNoaWxkcmVuO1xuICB2YXIgZXhwYW5kZWRLZXlTZXQgPSBuZXcgU2V0KGV4cGFuZGVkS2V5cyA9PT0gdHJ1ZSA/IFtdIDogZXhwYW5kZWRLZXlzKTtcbiAgdmFyIGZsYXR0ZW5MaXN0ID0gW107XG4gIGZ1bmN0aW9uIGRpZyhsaXN0KSB7XG4gICAgdmFyIHBhcmVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICByZXR1cm4gbGlzdC5tYXAoZnVuY3Rpb24gKHRyZWVOb2RlLCBpbmRleCkge1xuICAgICAgdmFyIHBvcyA9IGdldFBvc2l0aW9uKHBhcmVudCA/IHBhcmVudC5wb3MgOiAnMCcsIGluZGV4KTtcbiAgICAgIHZhciBtZXJnZWRLZXkgPSBnZXRLZXkodHJlZU5vZGVbZmllbGRLZXldLCBwb3MpO1xuXG4gICAgICAvLyBQaWNrIG1hdGNoZWQgdGl0bGUgaW4gZmllbGQgdGl0bGUgbGlzdFxuICAgICAgdmFyIG1lcmdlZFRpdGxlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZFRpdGxlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgZmllbGRUaXRsZSA9IGZpZWxkVGl0bGVzW2ldO1xuICAgICAgICBpZiAodHJlZU5vZGVbZmllbGRUaXRsZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG1lcmdlZFRpdGxlID0gdHJlZU5vZGVbZmllbGRUaXRsZV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQWRkIEZsYXR0ZW5EYXRhTm9kZSBpbnRvIGxpc3RcbiAgICAgIC8vIFdlIHVzZSBgT2JqZWN0LmFzc2lnbmAgaGVyZSB0byBzYXZlIHBlcmYgc2luY2UgYmFiZWwncyBgb2JqZWN0U3ByZWFkYCBoYXMgcGVyZiBpc3N1ZVxuICAgICAgdmFyIGZsYXR0ZW5Ob2RlID0gT2JqZWN0LmFzc2lnbihvbWl0KHRyZWVOb2RlLCBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGZpZWxkVGl0bGVzKSwgW2ZpZWxkS2V5LCBmaWVsZENoaWxkcmVuXSkpLCB7XG4gICAgICAgIHRpdGxlOiBtZXJnZWRUaXRsZSxcbiAgICAgICAga2V5OiBtZXJnZWRLZXksXG4gICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICBwb3M6IHBvcyxcbiAgICAgICAgY2hpbGRyZW46IG51bGwsXG4gICAgICAgIGRhdGE6IHRyZWVOb2RlLFxuICAgICAgICBpc1N0YXJ0OiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHBhcmVudCA/IHBhcmVudC5pc1N0YXJ0IDogW10pLCBbaW5kZXggPT09IDBdKSxcbiAgICAgICAgaXNFbmQ6IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocGFyZW50ID8gcGFyZW50LmlzRW5kIDogW10pLCBbaW5kZXggPT09IGxpc3QubGVuZ3RoIC0gMV0pXG4gICAgICB9KTtcbiAgICAgIGZsYXR0ZW5MaXN0LnB1c2goZmxhdHRlbk5vZGUpO1xuXG4gICAgICAvLyBMb29wIHRyZWVOb2RlIGNoaWxkcmVuXG4gICAgICBpZiAoZXhwYW5kZWRLZXlzID09PSB0cnVlIHx8IGV4cGFuZGVkS2V5U2V0LmhhcyhtZXJnZWRLZXkpKSB7XG4gICAgICAgIGZsYXR0ZW5Ob2RlLmNoaWxkcmVuID0gZGlnKHRyZWVOb2RlW2ZpZWxkQ2hpbGRyZW5dIHx8IFtdLCBmbGF0dGVuTm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmbGF0dGVuTm9kZS5jaGlsZHJlbiA9IFtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZsYXR0ZW5Ob2RlO1xuICAgIH0pO1xuICB9XG4gIGRpZyh0cmVlTm9kZUxpc3QpO1xuICByZXR1cm4gZmxhdHRlbkxpc3Q7XG59XG4vKipcbiAqIFRyYXZlcnNlIGFsbCB0aGUgZGF0YSBieSBgdHJlZURhdGFgLlxuICogUGxlYXNlIG5vdCB1c2UgaXQgb3V0IG9mIHRoZSBgcmMtdHJlZWAgc2luY2Ugd2UgbWF5IHJlZmFjdG9yIHRoaXMgY29kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYXZlcnNlRGF0YU5vZGVzKGRhdGFOb2RlcywgY2FsbGJhY2ssXG4vLyBUbyBhdm9pZCB0b28gbWFueSBwYXJhbXMsIGxldCB1c2UgY29uZmlnIGluc3RlYWQgb2Ygb3JpZ2luIHBhcmFtXG5jb25maWcpIHtcbiAgdmFyIG1lcmdlZENvbmZpZyA9IHt9O1xuICBpZiAoX3R5cGVvZihjb25maWcpID09PSAnb2JqZWN0Jykge1xuICAgIG1lcmdlZENvbmZpZyA9IGNvbmZpZztcbiAgfSBlbHNlIHtcbiAgICBtZXJnZWRDb25maWcgPSB7XG4gICAgICBleHRlcm5hbEdldEtleTogY29uZmlnXG4gICAgfTtcbiAgfVxuICBtZXJnZWRDb25maWcgPSBtZXJnZWRDb25maWcgfHwge307XG5cbiAgLy8gSW5pdCBjb25maWdcbiAgdmFyIF9tZXJnZWRDb25maWcgPSBtZXJnZWRDb25maWcsXG4gICAgY2hpbGRyZW5Qcm9wTmFtZSA9IF9tZXJnZWRDb25maWcuY2hpbGRyZW5Qcm9wTmFtZSxcbiAgICBleHRlcm5hbEdldEtleSA9IF9tZXJnZWRDb25maWcuZXh0ZXJuYWxHZXRLZXksXG4gICAgZmllbGROYW1lcyA9IF9tZXJnZWRDb25maWcuZmllbGROYW1lcztcbiAgdmFyIF9maWxsRmllbGROYW1lczIgPSBmaWxsRmllbGROYW1lcyhmaWVsZE5hbWVzKSxcbiAgICBmaWVsZEtleSA9IF9maWxsRmllbGROYW1lczIua2V5LFxuICAgIGZpZWxkQ2hpbGRyZW4gPSBfZmlsbEZpZWxkTmFtZXMyLmNoaWxkcmVuO1xuICB2YXIgbWVyZ2VDaGlsZHJlblByb3BOYW1lID0gY2hpbGRyZW5Qcm9wTmFtZSB8fCBmaWVsZENoaWxkcmVuO1xuXG4gIC8vIEdldCBrZXlzXG4gIHZhciBzeW50aGV0aWNHZXRLZXk7XG4gIGlmIChleHRlcm5hbEdldEtleSkge1xuICAgIGlmICh0eXBlb2YgZXh0ZXJuYWxHZXRLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzeW50aGV0aWNHZXRLZXkgPSBmdW5jdGlvbiBzeW50aGV0aWNHZXRLZXkobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZVtleHRlcm5hbEdldEtleV07XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4dGVybmFsR2V0S2V5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzeW50aGV0aWNHZXRLZXkgPSBmdW5jdGlvbiBzeW50aGV0aWNHZXRLZXkobm9kZSkge1xuICAgICAgICByZXR1cm4gZXh0ZXJuYWxHZXRLZXkobm9kZSk7XG4gICAgICB9O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzeW50aGV0aWNHZXRLZXkgPSBmdW5jdGlvbiBzeW50aGV0aWNHZXRLZXkobm9kZSwgcG9zKSB7XG4gICAgICByZXR1cm4gZ2V0S2V5KG5vZGVbZmllbGRLZXldLCBwb3MpO1xuICAgIH07XG4gIH1cblxuICAvLyBQcm9jZXNzXG4gIGZ1bmN0aW9uIHByb2Nlc3NOb2RlKG5vZGUsIGluZGV4LCBwYXJlbnQsIHBhdGhOb2Rlcykge1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUgPyBub2RlW21lcmdlQ2hpbGRyZW5Qcm9wTmFtZV0gOiBkYXRhTm9kZXM7XG4gICAgdmFyIHBvcyA9IG5vZGUgPyBnZXRQb3NpdGlvbihwYXJlbnQucG9zLCBpbmRleCkgOiAnMCc7XG4gICAgdmFyIGNvbm5lY3ROb2RlcyA9IG5vZGUgPyBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHBhdGhOb2RlcyksIFtub2RlXSkgOiBbXTtcblxuICAgIC8vIFByb2Nlc3Mgbm9kZSBpZiBpcyBub3Qgcm9vdFxuICAgIGlmIChub2RlKSB7XG4gICAgICB2YXIga2V5ID0gc3ludGhldGljR2V0S2V5KG5vZGUsIHBvcyk7XG4gICAgICB2YXIgX2RhdGEgPSB7XG4gICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgcG9zOiBwb3MsXG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBwYXJlbnRQb3M6IHBhcmVudC5ub2RlID8gcGFyZW50LnBvcyA6IG51bGwsXG4gICAgICAgIGxldmVsOiBwYXJlbnQubGV2ZWwgKyAxLFxuICAgICAgICBub2RlczogY29ubmVjdE5vZGVzXG4gICAgICB9O1xuICAgICAgY2FsbGJhY2soX2RhdGEpO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgY2hpbGRyZW4gbm9kZVxuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoc3ViTm9kZSwgc3ViSW5kZXgpIHtcbiAgICAgICAgcHJvY2Vzc05vZGUoc3ViTm9kZSwgc3ViSW5kZXgsIHtcbiAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgIHBvczogcG9zLFxuICAgICAgICAgIGxldmVsOiBwYXJlbnQgPyBwYXJlbnQubGV2ZWwgKyAxIDogLTFcbiAgICAgICAgfSwgY29ubmVjdE5vZGVzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBwcm9jZXNzTm9kZShudWxsKTtcbn1cbi8qKlxuICogQ29udmVydCBgdHJlZURhdGFgIGludG8gZW50aXR5IHJlY29yZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RGF0YVRvRW50aXRpZXMoZGF0YU5vZGVzKSB7XG4gIHZhciBfcmVmMiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG4gICAgaW5pdFdyYXBwZXIgPSBfcmVmMi5pbml0V3JhcHBlcixcbiAgICBwcm9jZXNzRW50aXR5ID0gX3JlZjIucHJvY2Vzc0VudGl0eSxcbiAgICBvblByb2Nlc3NGaW5pc2hlZCA9IF9yZWYyLm9uUHJvY2Vzc0ZpbmlzaGVkLFxuICAgIGV4dGVybmFsR2V0S2V5ID0gX3JlZjIuZXh0ZXJuYWxHZXRLZXksXG4gICAgY2hpbGRyZW5Qcm9wTmFtZSA9IF9yZWYyLmNoaWxkcmVuUHJvcE5hbWUsXG4gICAgZmllbGROYW1lcyA9IF9yZWYyLmZpZWxkTmFtZXM7XG4gIHZhciAvKiogQGRlcHJlY2F0ZWQgVXNlIGBjb25maWcuZXh0ZXJuYWxHZXRLZXlgIGluc3RlYWQgKi9cbiAgbGVnYWN5RXh0ZXJuYWxHZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgLy8gSW5pdCBjb25maWdcbiAgdmFyIG1lcmdlZEV4dGVybmFsR2V0S2V5ID0gZXh0ZXJuYWxHZXRLZXkgfHwgbGVnYWN5RXh0ZXJuYWxHZXRLZXk7XG4gIHZhciBwb3NFbnRpdGllcyA9IHt9O1xuICB2YXIga2V5RW50aXRpZXMgPSB7fTtcbiAgdmFyIHdyYXBwZXIgPSB7XG4gICAgcG9zRW50aXRpZXM6IHBvc0VudGl0aWVzLFxuICAgIGtleUVudGl0aWVzOiBrZXlFbnRpdGllc1xuICB9O1xuICBpZiAoaW5pdFdyYXBwZXIpIHtcbiAgICB3cmFwcGVyID0gaW5pdFdyYXBwZXIod3JhcHBlcikgfHwgd3JhcHBlcjtcbiAgfVxuICB0cmF2ZXJzZURhdGFOb2RlcyhkYXRhTm9kZXMsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgdmFyIG5vZGUgPSBpdGVtLm5vZGUsXG4gICAgICBpbmRleCA9IGl0ZW0uaW5kZXgsXG4gICAgICBwb3MgPSBpdGVtLnBvcyxcbiAgICAgIGtleSA9IGl0ZW0ua2V5LFxuICAgICAgcGFyZW50UG9zID0gaXRlbS5wYXJlbnRQb3MsXG4gICAgICBsZXZlbCA9IGl0ZW0ubGV2ZWwsXG4gICAgICBub2RlcyA9IGl0ZW0ubm9kZXM7XG4gICAgdmFyIGVudGl0eSA9IHtcbiAgICAgIG5vZGU6IG5vZGUsXG4gICAgICBub2Rlczogbm9kZXMsXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBrZXk6IGtleSxcbiAgICAgIHBvczogcG9zLFxuICAgICAgbGV2ZWw6IGxldmVsXG4gICAgfTtcbiAgICB2YXIgbWVyZ2VkS2V5ID0gZ2V0S2V5KGtleSwgcG9zKTtcbiAgICBwb3NFbnRpdGllc1twb3NdID0gZW50aXR5O1xuICAgIGtleUVudGl0aWVzW21lcmdlZEtleV0gPSBlbnRpdHk7XG5cbiAgICAvLyBGaWxsIGNoaWxkcmVuXG4gICAgZW50aXR5LnBhcmVudCA9IHBvc0VudGl0aWVzW3BhcmVudFBvc107XG4gICAgaWYgKGVudGl0eS5wYXJlbnQpIHtcbiAgICAgIGVudGl0eS5wYXJlbnQuY2hpbGRyZW4gPSBlbnRpdHkucGFyZW50LmNoaWxkcmVuIHx8IFtdO1xuICAgICAgZW50aXR5LnBhcmVudC5jaGlsZHJlbi5wdXNoKGVudGl0eSk7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzRW50aXR5KSB7XG4gICAgICBwcm9jZXNzRW50aXR5KGVudGl0eSwgd3JhcHBlcik7XG4gICAgfVxuICB9LCB7XG4gICAgZXh0ZXJuYWxHZXRLZXk6IG1lcmdlZEV4dGVybmFsR2V0S2V5LFxuICAgIGNoaWxkcmVuUHJvcE5hbWU6IGNoaWxkcmVuUHJvcE5hbWUsXG4gICAgZmllbGROYW1lczogZmllbGROYW1lc1xuICB9KTtcbiAgaWYgKG9uUHJvY2Vzc0ZpbmlzaGVkKSB7XG4gICAgb25Qcm9jZXNzRmluaXNoZWQod3JhcHBlcik7XG4gIH1cbiAgcmV0dXJuIHdyYXBwZXI7XG59XG4vKipcbiAqIEdldCBUcmVlTm9kZSBwcm9wcyB3aXRoIFRyZWUgcHJvcHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmVlTm9kZVByb3BzKGtleSwgX3JlZjMpIHtcbiAgdmFyIGV4cGFuZGVkS2V5cyA9IF9yZWYzLmV4cGFuZGVkS2V5cyxcbiAgICBzZWxlY3RlZEtleXMgPSBfcmVmMy5zZWxlY3RlZEtleXMsXG4gICAgbG9hZGVkS2V5cyA9IF9yZWYzLmxvYWRlZEtleXMsXG4gICAgbG9hZGluZ0tleXMgPSBfcmVmMy5sb2FkaW5nS2V5cyxcbiAgICBjaGVja2VkS2V5cyA9IF9yZWYzLmNoZWNrZWRLZXlzLFxuICAgIGhhbGZDaGVja2VkS2V5cyA9IF9yZWYzLmhhbGZDaGVja2VkS2V5cyxcbiAgICBkcmFnT3Zlck5vZGVLZXkgPSBfcmVmMy5kcmFnT3Zlck5vZGVLZXksXG4gICAgZHJvcFBvc2l0aW9uID0gX3JlZjMuZHJvcFBvc2l0aW9uLFxuICAgIGtleUVudGl0aWVzID0gX3JlZjMua2V5RW50aXRpZXM7XG4gIHZhciBlbnRpdHkgPSBnZXRFbnRpdHkoa2V5RW50aXRpZXMsIGtleSk7XG4gIHZhciB0cmVlTm9kZVByb3BzID0ge1xuICAgIGV2ZW50S2V5OiBrZXksXG4gICAgZXhwYW5kZWQ6IGV4cGFuZGVkS2V5cy5pbmRleE9mKGtleSkgIT09IC0xLFxuICAgIHNlbGVjdGVkOiBzZWxlY3RlZEtleXMuaW5kZXhPZihrZXkpICE9PSAtMSxcbiAgICBsb2FkZWQ6IGxvYWRlZEtleXMuaW5kZXhPZihrZXkpICE9PSAtMSxcbiAgICBsb2FkaW5nOiBsb2FkaW5nS2V5cy5pbmRleE9mKGtleSkgIT09IC0xLFxuICAgIGNoZWNrZWQ6IGNoZWNrZWRLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEsXG4gICAgaGFsZkNoZWNrZWQ6IGhhbGZDaGVja2VkS2V5cy5pbmRleE9mKGtleSkgIT09IC0xLFxuICAgIHBvczogU3RyaW5nKGVudGl0eSA/IGVudGl0eS5wb3MgOiAnJyksXG4gICAgLy8gW0xlZ2FjeV0gRHJhZyBwcm9wc1xuICAgIC8vIFNpbmNlIHRoZSBpbnRlcmFjdGlvbiBvZiBkcmFnIGlzIGNoYW5nZWQsIHRoZSBzZW1hbnRpYyBvZiB0aGUgcHJvcHMgYXJlXG4gICAgLy8gbm90IGFjY3VyYWN5LCBJIHRoaW5rIGl0IHNob3VsZCBiZSBmaW5hbGx5IHJlbW92ZWRcbiAgICBkcmFnT3ZlcjogZHJhZ092ZXJOb2RlS2V5ID09PSBrZXkgJiYgZHJvcFBvc2l0aW9uID09PSAwLFxuICAgIGRyYWdPdmVyR2FwVG9wOiBkcmFnT3Zlck5vZGVLZXkgPT09IGtleSAmJiBkcm9wUG9zaXRpb24gPT09IC0xLFxuICAgIGRyYWdPdmVyR2FwQm90dG9tOiBkcmFnT3Zlck5vZGVLZXkgPT09IGtleSAmJiBkcm9wUG9zaXRpb24gPT09IDFcbiAgfTtcbiAgcmV0dXJuIHRyZWVOb2RlUHJvcHM7XG59XG5leHBvcnQgZnVuY3Rpb24gY29udmVydE5vZGVQcm9wc1RvRXZlbnREYXRhKHByb3BzKSB7XG4gIHZhciBkYXRhID0gcHJvcHMuZGF0YSxcbiAgICBleHBhbmRlZCA9IHByb3BzLmV4cGFuZGVkLFxuICAgIHNlbGVjdGVkID0gcHJvcHMuc2VsZWN0ZWQsXG4gICAgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQsXG4gICAgbG9hZGVkID0gcHJvcHMubG9hZGVkLFxuICAgIGxvYWRpbmcgPSBwcm9wcy5sb2FkaW5nLFxuICAgIGhhbGZDaGVja2VkID0gcHJvcHMuaGFsZkNoZWNrZWQsXG4gICAgZHJhZ092ZXIgPSBwcm9wcy5kcmFnT3ZlcixcbiAgICBkcmFnT3ZlckdhcFRvcCA9IHByb3BzLmRyYWdPdmVyR2FwVG9wLFxuICAgIGRyYWdPdmVyR2FwQm90dG9tID0gcHJvcHMuZHJhZ092ZXJHYXBCb3R0b20sXG4gICAgcG9zID0gcHJvcHMucG9zLFxuICAgIGFjdGl2ZSA9IHByb3BzLmFjdGl2ZSxcbiAgICBldmVudEtleSA9IHByb3BzLmV2ZW50S2V5O1xuICB2YXIgZXZlbnREYXRhID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBkYXRhKSwge30sIHtcbiAgICBleHBhbmRlZDogZXhwYW5kZWQsXG4gICAgc2VsZWN0ZWQ6IHNlbGVjdGVkLFxuICAgIGNoZWNrZWQ6IGNoZWNrZWQsXG4gICAgbG9hZGVkOiBsb2FkZWQsXG4gICAgbG9hZGluZzogbG9hZGluZyxcbiAgICBoYWxmQ2hlY2tlZDogaGFsZkNoZWNrZWQsXG4gICAgZHJhZ092ZXI6IGRyYWdPdmVyLFxuICAgIGRyYWdPdmVyR2FwVG9wOiBkcmFnT3ZlckdhcFRvcCxcbiAgICBkcmFnT3ZlckdhcEJvdHRvbTogZHJhZ092ZXJHYXBCb3R0b20sXG4gICAgcG9zOiBwb3MsXG4gICAgYWN0aXZlOiBhY3RpdmUsXG4gICAga2V5OiBldmVudEtleVxuICB9KTtcbiAgaWYgKCEoJ3Byb3BzJyBpbiBldmVudERhdGEpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV2ZW50RGF0YSwgJ3Byb3BzJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHdhcm5pbmcoZmFsc2UsICdTZWNvbmQgcGFyYW0gcmV0dXJuIGZyb20gZXZlbnQgaXMgbm9kZSBkYXRhIGluc3RlYWQgb2YgVHJlZU5vZGUgaW5zdGFuY2UuIFBsZWFzZSByZWFkIHZhbHVlIGRpcmVjdGx5IGluc3RlYWQgb2YgcmVhZGluZyBmcm9tIGBwcm9wc2AuJyk7XG4gICAgICAgIHJldHVybiBwcm9wcztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZXZlbnREYXRhO1xufSJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==