"use strict"; (self["webpackChunk_core_volunteer_app"] = self["webpackChunk_core_volunteer_app"] || []).push([["vendors-node_modules_rc-virtual-list_es_index_js"],{ /***/ "../../../node_modules/rc-virtual-list/es/Filler.js": /*!**********************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/Filler.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 react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var rc_resize_observer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! rc-resize-observer */ "../../../node_modules/rc-resize-observer/es/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_5__); /** * Fill component to provided the scroll content real height. */ var Filler = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.forwardRef(function (_ref, ref) { var height = _ref.height, offsetY = _ref.offsetY, offsetX = _ref.offsetX, children = _ref.children, prefixCls = _ref.prefixCls, onInnerResize = _ref.onInnerResize, innerProps = _ref.innerProps, rtl = _ref.rtl, extra = _ref.extra; var outerStyle = {}; var innerStyle = { display: 'flex', flexDirection: 'column' }; if (offsetY !== undefined) { // Not set `width` since this will break `sticky: right` outerStyle = { height: height, position: 'relative', overflow: 'hidden' }; innerStyle = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, innerStyle), {}, (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"])({ transform: "translateY(".concat(offsetY, "px)") }, rtl ? 'marginRight' : 'marginLeft', -offsetX), "position", 'absolute'), "left", 0), "right", 0), "top", 0)); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement("div", { style: outerStyle }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(rc_resize_observer__WEBPACK_IMPORTED_MODULE_4__["default"], { onResize: function onResize(_ref2) { var offsetHeight = _ref2.offsetHeight; if (offsetHeight && onInnerResize) { onInnerResize(); } } }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement("div", (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ style: innerStyle, className: classnames__WEBPACK_IMPORTED_MODULE_5___default()((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({}, "".concat(prefixCls, "-holder-inner"), prefixCls)), ref: ref }, innerProps), children, extra))); }); Filler.displayName = 'Filler'; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Filler); /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/Item.js": /*!********************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/Item.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Item: () => (/* binding */ Item) /* 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__); function Item(_ref) { var children = _ref.children, setRef = _ref.setRef; var refFunc = react__WEBPACK_IMPORTED_MODULE_0__.useCallback(function (node) { setRef(node); }, []); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.cloneElement(children, { ref: refFunc }); } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/List.js": /*!********************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/List.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ RawList: () => (/* binding */ RawList), /* 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_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ "../../../node_modules/@babel/runtime/helpers/esm/defineProperty.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__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! rc-util */ "../../../node_modules/rc-util/es/index.js"); /* harmony import */ var rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! rc-util/es/hooks/useLayoutEffect */ "../../../node_modules/rc-util/es/hooks/useLayoutEffect.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_10__); /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react-dom */ "../../../node_modules/react-dom/index.js"); /* harmony import */ var _Filler__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Filler */ "../../../node_modules/rc-virtual-list/es/Filler.js"); /* harmony import */ var _hooks_useChildren__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./hooks/useChildren */ "../../../node_modules/rc-virtual-list/es/hooks/useChildren.js"); /* harmony import */ var _hooks_useDiffItem__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./hooks/useDiffItem */ "../../../node_modules/rc-virtual-list/es/hooks/useDiffItem.js"); /* harmony import */ var _hooks_useFrameWheel__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./hooks/useFrameWheel */ "../../../node_modules/rc-virtual-list/es/hooks/useFrameWheel.js"); /* harmony import */ var _hooks_useGetSize__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./hooks/useGetSize */ "../../../node_modules/rc-virtual-list/es/hooks/useGetSize.js"); /* harmony import */ var _hooks_useHeights__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./hooks/useHeights */ "../../../node_modules/rc-virtual-list/es/hooks/useHeights.js"); /* harmony import */ var _hooks_useMobileTouchMove__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./hooks/useMobileTouchMove */ "../../../node_modules/rc-virtual-list/es/hooks/useMobileTouchMove.js"); /* harmony import */ var _hooks_useOriginScroll__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./hooks/useOriginScroll */ "../../../node_modules/rc-virtual-list/es/hooks/useOriginScroll.js"); /* harmony import */ var _hooks_useScrollDrag__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./hooks/useScrollDrag */ "../../../node_modules/rc-virtual-list/es/hooks/useScrollDrag.js"); /* harmony import */ var _hooks_useScrollTo__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./hooks/useScrollTo */ "../../../node_modules/rc-virtual-list/es/hooks/useScrollTo.js"); /* harmony import */ var _ScrollBar__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./ScrollBar */ "../../../node_modules/rc-virtual-list/es/ScrollBar.js"); /* harmony import */ var _utils_scrollbarUtil__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./utils/scrollbarUtil */ "../../../node_modules/rc-virtual-list/es/utils/scrollbarUtil.js"); var _excluded = ["prefixCls", "className", "height", "itemHeight", "fullHeight", "style", "data", "children", "itemKey", "virtual", "direction", "scrollWidth", "component", "onScroll", "onVirtualScroll", "onVisibleChange", "innerProps", "extraRender", "styles", "showScrollBar"]; var EMPTY_DATA = []; var ScrollStyle = { overflowY: 'auto', overflowAnchor: 'none' }; function RawList(props, ref) { var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? 'rc-virtual-list' : _props$prefixCls, className = props.className, height = props.height, itemHeight = props.itemHeight, _props$fullHeight = props.fullHeight, fullHeight = _props$fullHeight === void 0 ? true : _props$fullHeight, style = props.style, data = props.data, children = props.children, itemKey = props.itemKey, virtual = props.virtual, direction = props.direction, scrollWidth = props.scrollWidth, _props$component = props.component, Component = _props$component === void 0 ? 'div' : _props$component, onScroll = props.onScroll, onVirtualScroll = props.onVirtualScroll, onVisibleChange = props.onVisibleChange, innerProps = props.innerProps, extraRender = props.extraRender, styles = props.styles, _props$showScrollBar = props.showScrollBar, showScrollBar = _props$showScrollBar === void 0 ? 'optional' : _props$showScrollBar, restProps = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_5__["default"])(props, _excluded); // =============================== Item Key =============================== var getKey = react__WEBPACK_IMPORTED_MODULE_10__.useCallback(function (item) { if (typeof itemKey === 'function') { return itemKey(item); } return item === null || item === void 0 ? void 0 : item[itemKey]; }, [itemKey]); // ================================ Height ================================ var _useHeights = (0,_hooks_useHeights__WEBPACK_IMPORTED_MODULE_17__["default"])(getKey, null, null), _useHeights2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_useHeights, 4), setInstanceRef = _useHeights2[0], collectHeight = _useHeights2[1], heights = _useHeights2[2], heightUpdatedMark = _useHeights2[3]; // ================================= MISC ================================= var useVirtual = !!(virtual !== false && height && itemHeight); var containerHeight = react__WEBPACK_IMPORTED_MODULE_10__.useMemo(function () { return Object.values(heights.maps).reduce(function (total, curr) { return total + curr; }, 0); }, [heights.id, heights.maps]); var inVirtual = useVirtual && data && (Math.max(itemHeight * data.length, containerHeight) > height || !!scrollWidth); var isRTL = direction === 'rtl'; var mergedClassName = classnames__WEBPACK_IMPORTED_MODULE_6___default()(prefixCls, (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_3__["default"])({}, "".concat(prefixCls, "-rtl"), isRTL), className); var mergedData = data || EMPTY_DATA; var componentRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)(); var fillerInnerRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)(); var containerRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)(); // =============================== Item Key =============================== var _useState = (0,react__WEBPACK_IMPORTED_MODULE_10__.useState)(0), _useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_useState, 2), offsetTop = _useState2[0], setOffsetTop = _useState2[1]; var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_10__.useState)(0), _useState4 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_useState3, 2), offsetLeft = _useState4[0], setOffsetLeft = _useState4[1]; var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_10__.useState)(false), _useState6 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_useState5, 2), scrollMoving = _useState6[0], setScrollMoving = _useState6[1]; var onScrollbarStartMove = function onScrollbarStartMove() { setScrollMoving(true); }; var onScrollbarStopMove = function onScrollbarStopMove() { setScrollMoving(false); }; var sharedConfig = { getKey: getKey }; // ================================ Scroll ================================ function syncScrollTop(newTop) { setOffsetTop(function (origin) { var value; if (typeof newTop === 'function') { value = newTop(origin); } else { value = newTop; } var alignedTop = keepInRange(value); componentRef.current.scrollTop = alignedTop; return alignedTop; }); } // ================================ Legacy ================================ // Put ref here since the range is generate by follow var rangeRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)({ start: 0, end: mergedData.length }); var diffItemRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)(); var _useDiffItem = (0,_hooks_useDiffItem__WEBPACK_IMPORTED_MODULE_14__["default"])(mergedData, getKey), _useDiffItem2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_useDiffItem, 1), diffItem = _useDiffItem2[0]; diffItemRef.current = diffItem; // ========================== Visible Calculation ========================= var _React$useMemo = react__WEBPACK_IMPORTED_MODULE_10__.useMemo(function () { if (!useVirtual) { return { scrollHeight: undefined, start: 0, end: mergedData.length - 1, offset: undefined }; } // Always use virtual scroll bar in avoid shaking if (!inVirtual) { var _fillerInnerRef$curre; return { scrollHeight: ((_fillerInnerRef$curre = fillerInnerRef.current) === null || _fillerInnerRef$curre === void 0 ? void 0 : _fillerInnerRef$curre.offsetHeight) || 0, start: 0, end: mergedData.length - 1, offset: undefined }; } var itemTop = 0; var startIndex; var startOffset; var endIndex; var dataLen = mergedData.length; for (var i = 0; i < dataLen; i += 1) { var _item = mergedData[i]; var key = getKey(_item); var cacheHeight = heights.get(key); var currentItemBottom = itemTop + (cacheHeight === undefined ? itemHeight : cacheHeight); // Check item top in the range if (currentItemBottom >= offsetTop && startIndex === undefined) { startIndex = i; startOffset = itemTop; } // Check item bottom in the range. We will render additional one item for motion usage if (currentItemBottom > offsetTop + height && endIndex === undefined) { endIndex = i; } itemTop = currentItemBottom; } // When scrollTop at the end but data cut to small count will reach this if (startIndex === undefined) { startIndex = 0; startOffset = 0; endIndex = Math.ceil(height / itemHeight); } if (endIndex === undefined) { endIndex = mergedData.length - 1; } // Give cache to improve scroll experience endIndex = Math.min(endIndex + 1, mergedData.length - 1); return { scrollHeight: itemTop, start: startIndex, end: endIndex, offset: startOffset }; }, [inVirtual, useVirtual, offsetTop, mergedData, heightUpdatedMark, height]), scrollHeight = _React$useMemo.scrollHeight, start = _React$useMemo.start, end = _React$useMemo.end, fillerOffset = _React$useMemo.offset; rangeRef.current.start = start; rangeRef.current.end = end; // When scroll up, first visible item get real height may not same as `itemHeight`, // Which will make scroll jump. // Let's sync scroll top to avoid jump react__WEBPACK_IMPORTED_MODULE_10__.useLayoutEffect(function () { var changedRecord = heights.getRecord(); if (changedRecord.size === 1) { var recordKey = Array.from(changedRecord.keys())[0]; var prevCacheHeight = changedRecord.get(recordKey); // Quick switch data may cause `start` not in `mergedData` anymore var startItem = mergedData[start]; if (startItem && prevCacheHeight === undefined) { var startIndexKey = getKey(startItem); if (startIndexKey === recordKey) { var realStartHeight = heights.get(recordKey); var diffHeight = realStartHeight - itemHeight; syncScrollTop(function (ori) { return ori + diffHeight; }); } } } heights.resetRecord(); }, [scrollHeight]); // ================================= Size ================================= var _React$useState = react__WEBPACK_IMPORTED_MODULE_10__.useState({ width: 0, height: height }), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_React$useState, 2), size = _React$useState2[0], setSize = _React$useState2[1]; var onHolderResize = function onHolderResize(sizeInfo) { setSize({ width: sizeInfo.offsetWidth, height: sizeInfo.offsetHeight }); }; // Hack on scrollbar to enable flash call var verticalScrollBarRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)(); var horizontalScrollBarRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)(); var horizontalScrollBarSpinSize = react__WEBPACK_IMPORTED_MODULE_10__.useMemo(function () { return (0,_utils_scrollbarUtil__WEBPACK_IMPORTED_MODULE_23__.getSpinSize)(size.width, scrollWidth); }, [size.width, scrollWidth]); var verticalScrollBarSpinSize = react__WEBPACK_IMPORTED_MODULE_10__.useMemo(function () { return (0,_utils_scrollbarUtil__WEBPACK_IMPORTED_MODULE_23__.getSpinSize)(size.height, scrollHeight); }, [size.height, scrollHeight]); // =============================== In Range =============================== var maxScrollHeight = scrollHeight - height; var maxScrollHeightRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)(maxScrollHeight); maxScrollHeightRef.current = maxScrollHeight; function keepInRange(newScrollTop) { var newTop = newScrollTop; if (!Number.isNaN(maxScrollHeightRef.current)) { newTop = Math.min(newTop, maxScrollHeightRef.current); } newTop = Math.max(newTop, 0); return newTop; } var isScrollAtTop = offsetTop <= 0; var isScrollAtBottom = offsetTop >= maxScrollHeight; var isScrollAtLeft = offsetLeft <= 0; var isScrollAtRight = offsetLeft >= scrollWidth; var originScroll = (0,_hooks_useOriginScroll__WEBPACK_IMPORTED_MODULE_19__["default"])(isScrollAtTop, isScrollAtBottom, isScrollAtLeft, isScrollAtRight); // ================================ Scroll ================================ var getVirtualScrollInfo = function getVirtualScrollInfo() { return { x: isRTL ? -offsetLeft : offsetLeft, y: offsetTop }; }; var lastVirtualScrollInfoRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)(getVirtualScrollInfo()); var triggerScroll = (0,rc_util__WEBPACK_IMPORTED_MODULE_8__.useEvent)(function (params) { if (onVirtualScroll) { var nextInfo = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, getVirtualScrollInfo()), params); // Trigger when offset changed if (lastVirtualScrollInfoRef.current.x !== nextInfo.x || lastVirtualScrollInfoRef.current.y !== nextInfo.y) { onVirtualScroll(nextInfo); lastVirtualScrollInfoRef.current = nextInfo; } } }); function onScrollBar(newScrollOffset, horizontal) { var newOffset = newScrollOffset; if (horizontal) { (0,react_dom__WEBPACK_IMPORTED_MODULE_11__.flushSync)(function () { setOffsetLeft(newOffset); }); triggerScroll(); } else { syncScrollTop(newOffset); } } // When data size reduce. It may trigger native scroll event back to fit scroll position function onFallbackScroll(e) { var newScrollTop = e.currentTarget.scrollTop; if (newScrollTop !== offsetTop) { syncScrollTop(newScrollTop); } // Trigger origin onScroll onScroll === null || onScroll === void 0 || onScroll(e); triggerScroll(); } var keepInHorizontalRange = function keepInHorizontalRange(nextOffsetLeft) { var tmpOffsetLeft = nextOffsetLeft; var max = !!scrollWidth ? scrollWidth - size.width : 0; tmpOffsetLeft = Math.max(tmpOffsetLeft, 0); tmpOffsetLeft = Math.min(tmpOffsetLeft, max); return tmpOffsetLeft; }; var onWheelDelta = (0,rc_util__WEBPACK_IMPORTED_MODULE_8__.useEvent)(function (offsetXY, fromHorizontal) { if (fromHorizontal) { (0,react_dom__WEBPACK_IMPORTED_MODULE_11__.flushSync)(function () { setOffsetLeft(function (left) { var nextOffsetLeft = left + (isRTL ? -offsetXY : offsetXY); return keepInHorizontalRange(nextOffsetLeft); }); }); triggerScroll(); } else { syncScrollTop(function (top) { var newTop = top + offsetXY; return newTop; }); } }); // Since this added in global,should use ref to keep update var _useFrameWheel = (0,_hooks_useFrameWheel__WEBPACK_IMPORTED_MODULE_15__["default"])(useVirtual, isScrollAtTop, isScrollAtBottom, isScrollAtLeft, isScrollAtRight, !!scrollWidth, onWheelDelta), _useFrameWheel2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_useFrameWheel, 2), onRawWheel = _useFrameWheel2[0], onFireFoxScroll = _useFrameWheel2[1]; // Mobile touch move (0,_hooks_useMobileTouchMove__WEBPACK_IMPORTED_MODULE_18__["default"])(useVirtual, componentRef, function (isHorizontal, delta, smoothOffset, e) { var event = e; if (originScroll(isHorizontal, delta, smoothOffset)) { return false; } // Fix nest List trigger TouchMove event if (!event || !event._virtualHandled) { if (event) { event._virtualHandled = true; } onRawWheel({ preventDefault: function preventDefault() {}, deltaX: isHorizontal ? delta : 0, deltaY: isHorizontal ? 0 : delta }); return true; } return false; }); // MouseDown drag for scroll (0,_hooks_useScrollDrag__WEBPACK_IMPORTED_MODULE_20__["default"])(inVirtual, componentRef, function (offset) { syncScrollTop(function (top) { return top + offset; }); }); (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_9__["default"])(function () { // Firefox only function onMozMousePixelScroll(e) { // scrolling at top/bottom limit var scrollingUpAtTop = isScrollAtTop && e.detail < 0; var scrollingDownAtBottom = isScrollAtBottom && e.detail > 0; if (useVirtual && !scrollingUpAtTop && !scrollingDownAtBottom) { e.preventDefault(); } } var componentEle = componentRef.current; componentEle.addEventListener('wheel', onRawWheel, { passive: false }); componentEle.addEventListener('DOMMouseScroll', onFireFoxScroll, { passive: true }); componentEle.addEventListener('MozMousePixelScroll', onMozMousePixelScroll, { passive: false }); return function () { componentEle.removeEventListener('wheel', onRawWheel); componentEle.removeEventListener('DOMMouseScroll', onFireFoxScroll); componentEle.removeEventListener('MozMousePixelScroll', onMozMousePixelScroll); }; }, [useVirtual, isScrollAtTop, isScrollAtBottom]); // Sync scroll left (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_9__["default"])(function () { if (scrollWidth) { var newOffsetLeft = keepInHorizontalRange(offsetLeft); setOffsetLeft(newOffsetLeft); triggerScroll({ x: newOffsetLeft }); } }, [size.width, scrollWidth]); // ================================= Ref ================================== var delayHideScrollBar = function delayHideScrollBar() { var _verticalScrollBarRef, _horizontalScrollBarR; (_verticalScrollBarRef = verticalScrollBarRef.current) === null || _verticalScrollBarRef === void 0 || _verticalScrollBarRef.delayHidden(); (_horizontalScrollBarR = horizontalScrollBarRef.current) === null || _horizontalScrollBarR === void 0 || _horizontalScrollBarR.delayHidden(); }; var _scrollTo = (0,_hooks_useScrollTo__WEBPACK_IMPORTED_MODULE_21__["default"])(componentRef, mergedData, heights, itemHeight, getKey, function () { return collectHeight(true); }, syncScrollTop, delayHideScrollBar); react__WEBPACK_IMPORTED_MODULE_10__.useImperativeHandle(ref, function () { return { nativeElement: containerRef.current, getScrollInfo: getVirtualScrollInfo, scrollTo: function scrollTo(config) { function isPosScroll(arg) { return arg && (0,_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__["default"])(arg) === 'object' && ('left' in arg || 'top' in arg); } if (isPosScroll(config)) { // Scroll X if (config.left !== undefined) { setOffsetLeft(keepInHorizontalRange(config.left)); } // Scroll Y _scrollTo(config.top); } else { _scrollTo(config); } } }; }); // ================================ Effect ================================ /** We need told outside that some list not rendered */ (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_9__["default"])(function () { if (onVisibleChange) { var renderList = mergedData.slice(start, end + 1); onVisibleChange(renderList, mergedData); } }, [start, end, mergedData]); // ================================ Extra ================================= var getSize = (0,_hooks_useGetSize__WEBPACK_IMPORTED_MODULE_16__.useGetSize)(mergedData, getKey, heights, itemHeight); var extraContent = extraRender === null || extraRender === void 0 ? void 0 : extraRender({ start: start, end: end, virtual: inVirtual, offsetX: offsetLeft, offsetY: fillerOffset, rtl: isRTL, getSize: getSize }); // ================================ Render ================================ var listChildren = (0,_hooks_useChildren__WEBPACK_IMPORTED_MODULE_13__["default"])(mergedData, start, end, scrollWidth, offsetLeft, setInstanceRef, children, sharedConfig); var componentStyle = null; if (height) { componentStyle = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_3__["default"])({}, fullHeight ? 'height' : 'maxHeight', height), ScrollStyle); if (useVirtual) { componentStyle.overflowY = 'hidden'; if (scrollWidth) { componentStyle.overflowX = 'hidden'; } if (scrollMoving) { componentStyle.pointerEvents = 'none'; } } } var containerProps = {}; if (isRTL) { containerProps.dir = 'rtl'; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10__.createElement("div", (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ ref: containerRef, style: (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, style), {}, { position: 'relative' }), className: mergedClassName }, containerProps, restProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10__.createElement(rc_resize_observer__WEBPACK_IMPORTED_MODULE_7__["default"], { onResize: onHolderResize }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10__.createElement(Component, { className: "".concat(prefixCls, "-holder"), style: componentStyle, ref: componentRef, onScroll: onFallbackScroll, onMouseEnter: delayHideScrollBar }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10__.createElement(_Filler__WEBPACK_IMPORTED_MODULE_12__["default"], { prefixCls: prefixCls, height: scrollHeight, offsetX: offsetLeft, offsetY: fillerOffset, scrollWidth: scrollWidth, onInnerResize: collectHeight, ref: fillerInnerRef, innerProps: innerProps, rtl: isRTL, extra: extraContent }, listChildren))), inVirtual && scrollHeight > height && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10__.createElement(_ScrollBar__WEBPACK_IMPORTED_MODULE_22__["default"], { ref: verticalScrollBarRef, prefixCls: prefixCls, scrollOffset: offsetTop, scrollRange: scrollHeight, rtl: isRTL, onScroll: onScrollBar, onStartMove: onScrollbarStartMove, onStopMove: onScrollbarStopMove, spinSize: verticalScrollBarSpinSize, containerSize: size.height, style: styles === null || styles === void 0 ? void 0 : styles.verticalScrollBar, thumbStyle: styles === null || styles === void 0 ? void 0 : styles.verticalScrollBarThumb, showScrollBar: showScrollBar }), inVirtual && scrollWidth > size.width && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10__.createElement(_ScrollBar__WEBPACK_IMPORTED_MODULE_22__["default"], { ref: horizontalScrollBarRef, prefixCls: prefixCls, scrollOffset: offsetLeft, scrollRange: scrollWidth, rtl: isRTL, onScroll: onScrollBar, onStartMove: onScrollbarStartMove, onStopMove: onScrollbarStopMove, spinSize: horizontalScrollBarSpinSize, containerSize: size.width, horizontal: true, style: styles === null || styles === void 0 ? void 0 : styles.horizontalScrollBar, thumbStyle: styles === null || styles === void 0 ? void 0 : styles.horizontalScrollBarThumb, showScrollBar: showScrollBar })); } var List = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10__.forwardRef(RawList); List.displayName = 'List'; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (List); /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/ScrollBar.js": /*!*************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/ScrollBar.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_objectSpread2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.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_slicedToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var rc_util_es_raf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! rc-util/es/raf */ "../../../node_modules/rc-util/es/raf.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 _hooks_useScrollDrag__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./hooks/useScrollDrag */ "../../../node_modules/rc-virtual-list/es/hooks/useScrollDrag.js"); var ScrollBar = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__.forwardRef(function (props, ref) { var prefixCls = props.prefixCls, rtl = props.rtl, scrollOffset = props.scrollOffset, scrollRange = props.scrollRange, onStartMove = props.onStartMove, onStopMove = props.onStopMove, onScroll = props.onScroll, horizontal = props.horizontal, spinSize = props.spinSize, containerSize = props.containerSize, style = props.style, propsThumbStyle = props.thumbStyle, showScrollBar = props.showScrollBar; var _React$useState = react__WEBPACK_IMPORTED_MODULE_5__.useState(false), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState, 2), dragging = _React$useState2[0], setDragging = _React$useState2[1]; var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_5__.useState(null), _React$useState4 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState3, 2), pageXY = _React$useState4[0], setPageXY = _React$useState4[1]; var _React$useState5 = react__WEBPACK_IMPORTED_MODULE_5__.useState(null), _React$useState6 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState5, 2), startTop = _React$useState6[0], setStartTop = _React$useState6[1]; var isLTR = !rtl; // ========================= Refs ========================= var scrollbarRef = react__WEBPACK_IMPORTED_MODULE_5__.useRef(); var thumbRef = react__WEBPACK_IMPORTED_MODULE_5__.useRef(); // ======================= Visible ======================== var _React$useState7 = react__WEBPACK_IMPORTED_MODULE_5__.useState(showScrollBar), _React$useState8 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState7, 2), visible = _React$useState8[0], setVisible = _React$useState8[1]; var visibleTimeoutRef = react__WEBPACK_IMPORTED_MODULE_5__.useRef(); var delayHidden = function delayHidden() { if (showScrollBar === true || showScrollBar === false) return; clearTimeout(visibleTimeoutRef.current); setVisible(true); visibleTimeoutRef.current = setTimeout(function () { setVisible(false); }, 3000); }; // ======================== Range ========================= var enableScrollRange = scrollRange - containerSize || 0; var enableOffsetRange = containerSize - spinSize || 0; // ========================= Top ========================== var top = react__WEBPACK_IMPORTED_MODULE_5__.useMemo(function () { if (scrollOffset === 0 || enableScrollRange === 0) { return 0; } var ptg = scrollOffset / enableScrollRange; return ptg * enableOffsetRange; }, [scrollOffset, enableScrollRange, enableOffsetRange]); // ====================== Container ======================= var onContainerMouseDown = function onContainerMouseDown(e) { e.stopPropagation(); e.preventDefault(); }; // ======================== Thumb ========================= var stateRef = react__WEBPACK_IMPORTED_MODULE_5__.useRef({ top: top, dragging: dragging, pageY: pageXY, startTop: startTop }); stateRef.current = { top: top, dragging: dragging, pageY: pageXY, startTop: startTop }; var onThumbMouseDown = function onThumbMouseDown(e) { setDragging(true); setPageXY((0,_hooks_useScrollDrag__WEBPACK_IMPORTED_MODULE_6__.getPageXY)(e, horizontal)); setStartTop(stateRef.current.top); onStartMove(); e.stopPropagation(); e.preventDefault(); }; // ======================== Effect ======================== // React make event as passive, but we need to preventDefault // Add event on dom directly instead. // ref: https://github.com/facebook/react/issues/9809 react__WEBPACK_IMPORTED_MODULE_5__.useEffect(function () { var onScrollbarTouchStart = function onScrollbarTouchStart(e) { e.preventDefault(); }; var scrollbarEle = scrollbarRef.current; var thumbEle = thumbRef.current; scrollbarEle.addEventListener('touchstart', onScrollbarTouchStart, { passive: false }); thumbEle.addEventListener('touchstart', onThumbMouseDown, { passive: false }); return function () { scrollbarEle.removeEventListener('touchstart', onScrollbarTouchStart); thumbEle.removeEventListener('touchstart', onThumbMouseDown); }; }, []); // Pass to effect var enableScrollRangeRef = react__WEBPACK_IMPORTED_MODULE_5__.useRef(); enableScrollRangeRef.current = enableScrollRange; var enableOffsetRangeRef = react__WEBPACK_IMPORTED_MODULE_5__.useRef(); enableOffsetRangeRef.current = enableOffsetRange; react__WEBPACK_IMPORTED_MODULE_5__.useEffect(function () { if (dragging) { var moveRafId; var onMouseMove = function onMouseMove(e) { var _stateRef$current = stateRef.current, stateDragging = _stateRef$current.dragging, statePageY = _stateRef$current.pageY, stateStartTop = _stateRef$current.startTop; rc_util_es_raf__WEBPACK_IMPORTED_MODULE_4__["default"].cancel(moveRafId); var rect = scrollbarRef.current.getBoundingClientRect(); var scale = containerSize / (horizontal ? rect.width : rect.height); if (stateDragging) { var offset = ((0,_hooks_useScrollDrag__WEBPACK_IMPORTED_MODULE_6__.getPageXY)(e, horizontal) - statePageY) * scale; var newTop = stateStartTop; if (!isLTR && horizontal) { newTop -= offset; } else { newTop += offset; } var tmpEnableScrollRange = enableScrollRangeRef.current; var tmpEnableOffsetRange = enableOffsetRangeRef.current; var ptg = tmpEnableOffsetRange ? newTop / tmpEnableOffsetRange : 0; var newScrollTop = Math.ceil(ptg * tmpEnableScrollRange); newScrollTop = Math.max(newScrollTop, 0); newScrollTop = Math.min(newScrollTop, tmpEnableScrollRange); moveRafId = (0,rc_util_es_raf__WEBPACK_IMPORTED_MODULE_4__["default"])(function () { onScroll(newScrollTop, horizontal); }); } }; var onMouseUp = function onMouseUp() { setDragging(false); onStopMove(); }; window.addEventListener('mousemove', onMouseMove, { passive: true }); window.addEventListener('touchmove', onMouseMove, { passive: true }); window.addEventListener('mouseup', onMouseUp, { passive: true }); window.addEventListener('touchend', onMouseUp, { passive: true }); return function () { window.removeEventListener('mousemove', onMouseMove); window.removeEventListener('touchmove', onMouseMove); window.removeEventListener('mouseup', onMouseUp); window.removeEventListener('touchend', onMouseUp); rc_util_es_raf__WEBPACK_IMPORTED_MODULE_4__["default"].cancel(moveRafId); }; } }, [dragging]); react__WEBPACK_IMPORTED_MODULE_5__.useEffect(function () { delayHidden(); return function () { clearTimeout(visibleTimeoutRef.current); }; }, [scrollOffset]); // ====================== Imperative ====================== react__WEBPACK_IMPORTED_MODULE_5__.useImperativeHandle(ref, function () { return { delayHidden: delayHidden }; }); // ======================== Render ======================== var scrollbarPrefixCls = "".concat(prefixCls, "-scrollbar"); var containerStyle = { position: 'absolute', visibility: visible ? null : 'hidden' }; var thumbStyle = { position: 'absolute', borderRadius: 99, background: 'var(--rc-virtual-list-scrollbar-bg, rgba(0, 0, 0, 0.5))', cursor: 'pointer', userSelect: 'none' }; if (horizontal) { Object.assign(containerStyle, { height: 8, left: 0, right: 0, bottom: 0 }); Object.assign(thumbStyle, (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({ height: '100%', width: spinSize }, isLTR ? 'left' : 'right', top)); } else { Object.assign(containerStyle, (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({ width: 8, top: 0, bottom: 0 }, isLTR ? 'right' : 'left', 0)); Object.assign(thumbStyle, { width: '100%', height: spinSize, top: top }); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__.createElement("div", { ref: scrollbarRef, className: classnames__WEBPACK_IMPORTED_MODULE_3___default()(scrollbarPrefixCls, (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(scrollbarPrefixCls, "-horizontal"), horizontal), "".concat(scrollbarPrefixCls, "-vertical"), !horizontal), "".concat(scrollbarPrefixCls, "-visible"), visible)), style: (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__["default"])({}, containerStyle), style), onMouseDown: onContainerMouseDown, onMouseMove: delayHidden }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__.createElement("div", { ref: thumbRef, className: classnames__WEBPACK_IMPORTED_MODULE_3___default()("".concat(scrollbarPrefixCls, "-thumb"), (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({}, "".concat(scrollbarPrefixCls, "-thumb-moving"), dragging)), style: (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__["default"])({}, thumbStyle), propsThumbStyle), onMouseDown: onThumbMouseDown })); }); if (true) { ScrollBar.displayName = 'ScrollBar'; } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ScrollBar); /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useChildren.js": /*!*********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useChildren.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ useChildren) /* 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__); /* harmony import */ var _Item__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Item */ "../../../node_modules/rc-virtual-list/es/Item.js"); function useChildren(list, startIndex, endIndex, scrollWidth, offsetX, setNodeRef, renderFunc, _ref) { var getKey = _ref.getKey; return list.slice(startIndex, endIndex + 1).map(function (item, index) { var eleIndex = startIndex + index; var node = renderFunc(item, eleIndex, { style: { width: scrollWidth }, offsetX: offsetX }); var key = getKey(item); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_Item__WEBPACK_IMPORTED_MODULE_1__.Item, { key: key, setRef: function setRef(ele) { return setNodeRef(item, ele); } }, node); }); } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useDiffItem.js": /*!*********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useDiffItem.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ useDiffItem) /* 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 _utils_algorithmUtil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/algorithmUtil */ "../../../node_modules/rc-virtual-list/es/utils/algorithmUtil.js"); function useDiffItem(data, getKey, onDiff) { var _React$useState = react__WEBPACK_IMPORTED_MODULE_1__.useState(data), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__["default"])(_React$useState, 2), prevData = _React$useState2[0], setPrevData = _React$useState2[1]; var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_1__.useState(null), _React$useState4 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__["default"])(_React$useState3, 2), diffItem = _React$useState4[0], setDiffItem = _React$useState4[1]; react__WEBPACK_IMPORTED_MODULE_1__.useEffect(function () { var diff = (0,_utils_algorithmUtil__WEBPACK_IMPORTED_MODULE_2__.findListDiffIndex)(prevData || [], data || [], getKey); if ((diff === null || diff === void 0 ? void 0 : diff.index) !== undefined) { onDiff === null || onDiff === void 0 || onDiff(diff.index); setDiffItem(data[diff.index]); } setPrevData(data); }, [data]); return [diffItem]; } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useFrameWheel.js": /*!***********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useFrameWheel.js ***! \***********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ useFrameWheel) /* harmony export */ }); /* harmony import */ var rc_util_es_raf__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! rc-util/es/raf */ "../../../node_modules/rc-util/es/raf.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 _utils_isFirefox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/isFirefox */ "../../../node_modules/rc-virtual-list/es/utils/isFirefox.js"); /* harmony import */ var _useOriginScroll__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./useOriginScroll */ "../../../node_modules/rc-virtual-list/es/hooks/useOriginScroll.js"); function useFrameWheel(inVirtual, isScrollAtTop, isScrollAtBottom, isScrollAtLeft, isScrollAtRight, horizontalScroll, /*** * Return `true` when you need to prevent default event */ onWheelDelta) { var offsetRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(0); var nextFrameRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); // Firefox patch var wheelValueRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); var isMouseScrollRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(false); // Scroll status sync var originScroll = (0,_useOriginScroll__WEBPACK_IMPORTED_MODULE_3__["default"])(isScrollAtTop, isScrollAtBottom, isScrollAtLeft, isScrollAtRight); function onWheelY(e, deltaY) { rc_util_es_raf__WEBPACK_IMPORTED_MODULE_0__["default"].cancel(nextFrameRef.current); // Do nothing when scroll at the edge, Skip check when is in scroll if (originScroll(false, deltaY)) return; // Skip if nest List has handled this event var event = e; if (!event._virtualHandled) { event._virtualHandled = true; } else { return; } offsetRef.current += deltaY; wheelValueRef.current = deltaY; // Proxy of scroll events if (!_utils_isFirefox__WEBPACK_IMPORTED_MODULE_2__["default"]) { event.preventDefault(); } nextFrameRef.current = (0,rc_util_es_raf__WEBPACK_IMPORTED_MODULE_0__["default"])(function () { // Patch a multiple for Firefox to fix wheel number too small // ref: https://github.com/ant-design/ant-design/issues/26372#issuecomment-679460266 var patchMultiple = isMouseScrollRef.current ? 10 : 1; onWheelDelta(offsetRef.current * patchMultiple, false); offsetRef.current = 0; }); } function onWheelX(event, deltaX) { onWheelDelta(deltaX, true); if (!_utils_isFirefox__WEBPACK_IMPORTED_MODULE_2__["default"]) { event.preventDefault(); } } // Check for which direction does wheel do. `sx` means `shift + wheel` var wheelDirectionRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); var wheelDirectionCleanRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); function onWheel(event) { if (!inVirtual) return; // Wait for 2 frame to clean direction rc_util_es_raf__WEBPACK_IMPORTED_MODULE_0__["default"].cancel(wheelDirectionCleanRef.current); wheelDirectionCleanRef.current = (0,rc_util_es_raf__WEBPACK_IMPORTED_MODULE_0__["default"])(function () { wheelDirectionRef.current = null; }, 2); var deltaX = event.deltaX, deltaY = event.deltaY, shiftKey = event.shiftKey; var mergedDeltaX = deltaX; var mergedDeltaY = deltaY; if (wheelDirectionRef.current === 'sx' || !wheelDirectionRef.current && (shiftKey || false) && deltaY && !deltaX) { mergedDeltaX = deltaY; mergedDeltaY = 0; wheelDirectionRef.current = 'sx'; } var absX = Math.abs(mergedDeltaX); var absY = Math.abs(mergedDeltaY); if (wheelDirectionRef.current === null) { wheelDirectionRef.current = horizontalScroll && absX > absY ? 'x' : 'y'; } if (wheelDirectionRef.current === 'y') { onWheelY(event, mergedDeltaY); } else { onWheelX(event, mergedDeltaX); } } // A patch for firefox function onFireFoxScroll(event) { if (!inVirtual) return; isMouseScrollRef.current = event.detail === wheelValueRef.current; } return [onWheel, onFireFoxScroll]; } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useGetSize.js": /*!********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useGetSize.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ useGetSize: () => (/* binding */ useGetSize) /* 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__); /** * Size info need loop query for the `heights` which will has the perf issue. * Let cache result for each render phase. */ function useGetSize(mergedData, getKey, heights, itemHeight) { var _React$useMemo = react__WEBPACK_IMPORTED_MODULE_1__.useMemo(function () { return [new Map(), []]; }, [mergedData, heights.id, itemHeight]), _React$useMemo2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__["default"])(_React$useMemo, 2), key2Index = _React$useMemo2[0], bottomList = _React$useMemo2[1]; var getSize = function getSize(startKey) { var endKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startKey; // Get from cache first var startIndex = key2Index.get(startKey); var endIndex = key2Index.get(endKey); // Loop to fill the cache if (startIndex === undefined || endIndex === undefined) { var dataLen = mergedData.length; for (var i = bottomList.length; i < dataLen; i += 1) { var _heights$get; var item = mergedData[i]; var key = getKey(item); key2Index.set(key, i); var cacheHeight = (_heights$get = heights.get(key)) !== null && _heights$get !== void 0 ? _heights$get : itemHeight; bottomList[i] = (bottomList[i - 1] || 0) + cacheHeight; if (key === startKey) { startIndex = i; } if (key === endKey) { endIndex = i; } if (startIndex !== undefined && endIndex !== undefined) { break; } } } return { top: bottomList[startIndex - 1] || 0, bottom: bottomList[endIndex] }; }; return getSize; } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useHeights.js": /*!********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useHeights.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ useHeights) /* 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 _utils_CacheMap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/CacheMap */ "../../../node_modules/rc-virtual-list/es/utils/CacheMap.js"); function parseNumber(value) { var num = parseFloat(value); return isNaN(num) ? 0 : num; } function useHeights(getKey, onItemAdd, onItemRemove) { var _React$useState = react__WEBPACK_IMPORTED_MODULE_1__.useState(0), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__["default"])(_React$useState, 2), updatedMark = _React$useState2[0], setUpdatedMark = _React$useState2[1]; var instanceRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(new Map()); var heightsRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(new _utils_CacheMap__WEBPACK_IMPORTED_MODULE_2__["default"]()); var promiseIdRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(0); function cancelRaf() { promiseIdRef.current += 1; } function collectHeight() { var sync = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; cancelRaf(); var doCollect = function doCollect() { var changed = false; instanceRef.current.forEach(function (element, key) { if (element && element.offsetParent) { var offsetHeight = element.offsetHeight; var _getComputedStyle = getComputedStyle(element), marginTop = _getComputedStyle.marginTop, marginBottom = _getComputedStyle.marginBottom; var marginTopNum = parseNumber(marginTop); var marginBottomNum = parseNumber(marginBottom); var totalHeight = offsetHeight + marginTopNum + marginBottomNum; if (heightsRef.current.get(key) !== totalHeight) { heightsRef.current.set(key, totalHeight); changed = true; } } }); // Always trigger update mark to tell parent that should re-calculate heights when resized if (changed) { setUpdatedMark(function (c) { return c + 1; }); } }; if (sync) { doCollect(); } else { promiseIdRef.current += 1; var id = promiseIdRef.current; Promise.resolve().then(function () { if (id === promiseIdRef.current) { doCollect(); } }); } } function setInstanceRef(item, instance) { var key = getKey(item); var origin = instanceRef.current.get(key); if (instance) { instanceRef.current.set(key, instance); collectHeight(); } else { instanceRef.current.delete(key); } // Instance changed if (!origin !== !instance) { if (instance) { onItemAdd === null || onItemAdd === void 0 || onItemAdd(item); } else { onItemRemove === null || onItemRemove === void 0 || onItemRemove(item); } } } (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { return cancelRaf; }, []); return [setInstanceRef, collectHeight, heightsRef.current, updatedMark]; } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useMobileTouchMove.js": /*!****************************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useMobileTouchMove.js ***! \****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ useMobileTouchMove) /* harmony export */ }); /* harmony import */ var rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! rc-util/es/hooks/useLayoutEffect */ "../../../node_modules/rc-util/es/hooks/useLayoutEffect.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__); var SMOOTH_PTG = 14 / 15; function useMobileTouchMove(inVirtual, listRef, callback) { var touchedRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(false); var touchXRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(0); var touchYRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(0); var elementRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); // Smooth scroll var intervalRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); /* eslint-disable prefer-const */ var cleanUpEvents; var onTouchMove = function onTouchMove(e) { if (touchedRef.current) { var currentX = Math.ceil(e.touches[0].pageX); var currentY = Math.ceil(e.touches[0].pageY); var offsetX = touchXRef.current - currentX; var offsetY = touchYRef.current - currentY; var _isHorizontal = Math.abs(offsetX) > Math.abs(offsetY); if (_isHorizontal) { touchXRef.current = currentX; } else { touchYRef.current = currentY; } var scrollHandled = callback(_isHorizontal, _isHorizontal ? offsetX : offsetY, false, e); if (scrollHandled) { e.preventDefault(); } // Smooth interval clearInterval(intervalRef.current); if (scrollHandled) { intervalRef.current = setInterval(function () { if (_isHorizontal) { offsetX *= SMOOTH_PTG; } else { offsetY *= SMOOTH_PTG; } var offset = Math.floor(_isHorizontal ? offsetX : offsetY); if (!callback(_isHorizontal, offset, true) || Math.abs(offset) <= 0.1) { clearInterval(intervalRef.current); } }, 16); } } }; var onTouchEnd = function onTouchEnd() { touchedRef.current = false; cleanUpEvents(); }; var onTouchStart = function onTouchStart(e) { cleanUpEvents(); if (e.touches.length === 1 && !touchedRef.current) { touchedRef.current = true; touchXRef.current = Math.ceil(e.touches[0].pageX); touchYRef.current = Math.ceil(e.touches[0].pageY); elementRef.current = e.target; elementRef.current.addEventListener('touchmove', onTouchMove, { passive: false }); elementRef.current.addEventListener('touchend', onTouchEnd, { passive: true }); } }; cleanUpEvents = function cleanUpEvents() { if (elementRef.current) { elementRef.current.removeEventListener('touchmove', onTouchMove); elementRef.current.removeEventListener('touchend', onTouchEnd); } }; (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_0__["default"])(function () { if (inVirtual) { listRef.current.addEventListener('touchstart', onTouchStart, { passive: true }); } return function () { var _listRef$current; (_listRef$current = listRef.current) === null || _listRef$current === void 0 || _listRef$current.removeEventListener('touchstart', onTouchStart); cleanUpEvents(); clearInterval(intervalRef.current); }; }, [inVirtual]); } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useOriginScroll.js": /*!*************************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useOriginScroll.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__); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (function (isScrollAtTop, isScrollAtBottom, isScrollAtLeft, isScrollAtRight) { // Do lock for a wheel when scrolling var lockRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(false); var lockTimeoutRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null); function lockScroll() { clearTimeout(lockTimeoutRef.current); lockRef.current = true; lockTimeoutRef.current = setTimeout(function () { lockRef.current = false; }, 50); } // Pass to ref since global add is in closure var scrollPingRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)({ top: isScrollAtTop, bottom: isScrollAtBottom, left: isScrollAtLeft, right: isScrollAtRight }); scrollPingRef.current.top = isScrollAtTop; scrollPingRef.current.bottom = isScrollAtBottom; scrollPingRef.current.left = isScrollAtLeft; scrollPingRef.current.right = isScrollAtRight; return function (isHorizontal, delta) { var smoothOffset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var originScroll = isHorizontal ? // Pass origin wheel when on the left delta < 0 && scrollPingRef.current.left || // Pass origin wheel when on the right delta > 0 && scrollPingRef.current.right // Pass origin wheel when on the top : delta < 0 && scrollPingRef.current.top || // Pass origin wheel when on the bottom delta > 0 && scrollPingRef.current.bottom; if (smoothOffset && originScroll) { // No need lock anymore when it's smooth offset from touchMove interval clearTimeout(lockTimeoutRef.current); lockRef.current = false; } else if (!originScroll || lockRef.current) { lockScroll(); } return !lockRef.current && originScroll; }; }); /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useScrollDrag.js": /*!***********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useScrollDrag.js ***! \***********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ useScrollDrag), /* harmony export */ getPageXY: () => (/* binding */ getPageXY) /* harmony export */ }); /* harmony import */ var rc_util_es_raf__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! rc-util/es/raf */ "../../../node_modules/rc-util/es/raf.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__); function smoothScrollOffset(offset) { return Math.floor(Math.pow(offset, 0.5)); } function getPageXY(e, horizontal) { var obj = 'touches' in e ? e.touches[0] : e; return obj[horizontal ? 'pageX' : 'pageY'] - window[horizontal ? 'scrollX' : 'scrollY']; } function useScrollDrag(inVirtual, componentRef, onScrollOffset) { react__WEBPACK_IMPORTED_MODULE_1__.useEffect(function () { var ele = componentRef.current; if (inVirtual && ele) { var mouseDownLock = false; var rafId; var _offset; var stopScroll = function stopScroll() { rc_util_es_raf__WEBPACK_IMPORTED_MODULE_0__["default"].cancel(rafId); }; var continueScroll = function continueScroll() { stopScroll(); rafId = (0,rc_util_es_raf__WEBPACK_IMPORTED_MODULE_0__["default"])(function () { onScrollOffset(_offset); continueScroll(); }); }; var onMouseDown = function onMouseDown(e) { // Skip if element set draggable if (e.target.draggable || e.button !== 0) { return; } // Skip if nest List has handled this event var event = e; if (!event._virtualHandled) { event._virtualHandled = true; mouseDownLock = true; } }; var onMouseUp = function onMouseUp() { mouseDownLock = false; stopScroll(); }; var onMouseMove = function onMouseMove(e) { if (mouseDownLock) { var mouseY = getPageXY(e, false); var _ele$getBoundingClien = ele.getBoundingClientRect(), top = _ele$getBoundingClien.top, bottom = _ele$getBoundingClien.bottom; if (mouseY <= top) { var diff = top - mouseY; _offset = -smoothScrollOffset(diff); continueScroll(); } else if (mouseY >= bottom) { var _diff = mouseY - bottom; _offset = smoothScrollOffset(_diff); continueScroll(); } else { stopScroll(); } } }; ele.addEventListener('mousedown', onMouseDown); ele.ownerDocument.addEventListener('mouseup', onMouseUp); ele.ownerDocument.addEventListener('mousemove', onMouseMove); return function () { ele.removeEventListener('mousedown', onMouseDown); ele.ownerDocument.removeEventListener('mouseup', onMouseUp); ele.ownerDocument.removeEventListener('mousemove', onMouseMove); stopScroll(); }; } }, [inVirtual]); } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useScrollTo.js": /*!*********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useScrollTo.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ useScrollTo) /* 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_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_slicedToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var rc_util_es_raf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! rc-util/es/raf */ "../../../node_modules/rc-util/es/raf.js"); /* harmony import */ var rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! rc-util/es/hooks/useLayoutEffect */ "../../../node_modules/rc-util/es/hooks/useLayoutEffect.js"); /* harmony import */ var rc_util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! rc-util */ "../../../node_modules/rc-util/es/index.js"); /* eslint-disable no-param-reassign */ var MAX_TIMES = 10; function useScrollTo(containerRef, data, heights, itemHeight, getKey, collectHeight, syncScrollTop, triggerFlash) { var scrollRef = react__WEBPACK_IMPORTED_MODULE_3__.useRef(); var _React$useState = react__WEBPACK_IMPORTED_MODULE_3__.useState(null), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState, 2), syncState = _React$useState2[0], setSyncState = _React$useState2[1]; // ========================== Sync Scroll ========================== (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_5__["default"])(function () { if (syncState && syncState.times < MAX_TIMES) { // Never reach if (!containerRef.current) { setSyncState(function (ori) { return (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])({}, ori); }); return; } collectHeight(); var targetAlign = syncState.targetAlign, originAlign = syncState.originAlign, index = syncState.index, offset = syncState.offset; var height = containerRef.current.clientHeight; var needCollectHeight = false; var newTargetAlign = targetAlign; var targetTop = null; // Go to next frame if height not exist if (height) { var mergedAlign = targetAlign || originAlign; // Get top & bottom var stackTop = 0; var itemTop = 0; var itemBottom = 0; var maxLen = Math.min(data.length - 1, index); for (var i = 0; i <= maxLen; i += 1) { var key = getKey(data[i]); itemTop = stackTop; var cacheHeight = heights.get(key); itemBottom = itemTop + (cacheHeight === undefined ? itemHeight : cacheHeight); stackTop = itemBottom; } // Check if need sync height (visible range has item not record height) var leftHeight = mergedAlign === 'top' ? offset : height - offset; for (var _i = maxLen; _i >= 0; _i -= 1) { var _key = getKey(data[_i]); var _cacheHeight = heights.get(_key); if (_cacheHeight === undefined) { needCollectHeight = true; break; } leftHeight -= _cacheHeight; if (leftHeight <= 0) { break; } } // Scroll to switch (mergedAlign) { case 'top': targetTop = itemTop - offset; break; case 'bottom': targetTop = itemBottom - height + offset; break; default: { var scrollTop = containerRef.current.scrollTop; var scrollBottom = scrollTop + height; if (itemTop < scrollTop) { newTargetAlign = 'top'; } else if (itemBottom > scrollBottom) { newTargetAlign = 'bottom'; } } } if (targetTop !== null) { syncScrollTop(targetTop); } // One more time for sync if (targetTop !== syncState.lastTop) { needCollectHeight = true; } } // Trigger next effect if (needCollectHeight) { setSyncState((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])({}, syncState), {}, { times: syncState.times + 1, targetAlign: newTargetAlign, lastTop: targetTop })); } } else if ( true && (syncState === null || syncState === void 0 ? void 0 : syncState.times) === MAX_TIMES) { (0,rc_util__WEBPACK_IMPORTED_MODULE_6__.warning)(false, 'Seems `scrollTo` with `rc-virtual-list` reach the max limitation. Please fire issue for us. Thanks.'); } }, [syncState, containerRef.current]); // =========================== Scroll To =========================== return function (arg) { // When not argument provided, we think dev may want to show the scrollbar if (arg === null || arg === undefined) { triggerFlash(); return; } // Normal scroll logic rc_util_es_raf__WEBPACK_IMPORTED_MODULE_4__["default"].cancel(scrollRef.current); if (typeof arg === 'number') { syncScrollTop(arg); } else if (arg && (0,_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__["default"])(arg) === 'object') { var index; var align = arg.align; if ('index' in arg) { index = arg.index; } else { index = data.findIndex(function (item) { return getKey(item) === arg.key; }); } var _arg$offset = arg.offset, offset = _arg$offset === void 0 ? 0 : _arg$offset; setSyncState({ times: 0, index: index, offset: offset, originAlign: align }); } }; } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/index.js": /*!*********************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/index.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 _List__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./List */ "../../../node_modules/rc-virtual-list/es/List.js"); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_List__WEBPACK_IMPORTED_MODULE_0__["default"]); /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/utils/CacheMap.js": /*!******************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/utils/CacheMap.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_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __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_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/createClass */ "../../../node_modules/@babel/runtime/helpers/esm/createClass.js"); /* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ "../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js"); // Firefox has low performance of map. var CacheMap = /*#__PURE__*/function () { function CacheMap() { (0,_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_0__["default"])(this, CacheMap); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__["default"])(this, "maps", void 0); // Used for cache key // `useMemo` no need to update if `id` not change (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__["default"])(this, "id", 0); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__["default"])(this, "diffRecords", new Map()); this.maps = Object.create(null); } (0,_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_1__["default"])(CacheMap, [{ key: "set", value: function set(key, value) { // Record prev value this.diffRecords.set(key, this.maps[key]); this.maps[key] = value; this.id += 1; } }, { key: "get", value: function get(key) { return this.maps[key]; } /** * CacheMap will record the key changed. * To help to know what's update in the next render. */ }, { key: "resetRecord", value: function resetRecord() { this.diffRecords.clear(); } }, { key: "getRecord", value: function getRecord() { return this.diffRecords; } }]); return CacheMap; }(); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CacheMap); /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/utils/algorithmUtil.js": /*!***********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/utils/algorithmUtil.js ***! \***********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ findListDiffIndex: () => (/* binding */ findListDiffIndex), /* harmony export */ getIndexByStartLoc: () => (/* binding */ getIndexByStartLoc) /* harmony export */ }); /** * Get index with specific start index one by one. e.g. * min: 3, max: 9, start: 6 * * Return index is: * [0]: 6 * [1]: 7 * [2]: 5 * [3]: 8 * [4]: 4 * [5]: 9 * [6]: 3 */ function getIndexByStartLoc(min, max, start, index) { var beforeCount = start - min; var afterCount = max - start; var balanceCount = Math.min(beforeCount, afterCount) * 2; // Balance if (index <= balanceCount) { var stepIndex = Math.floor(index / 2); if (index % 2) { return start + stepIndex + 1; } return start - stepIndex; } // One is out of range if (beforeCount > afterCount) { return start - (index - afterCount); } return start + (index - beforeCount); } /** * We assume that 2 list has only 1 item diff and others keeping the order. * So we can use dichotomy algorithm to find changed one. */ function findListDiffIndex(originList, targetList, getKey) { var originLen = originList.length; var targetLen = targetList.length; var shortList; var longList; if (originLen === 0 && targetLen === 0) { return null; } if (originLen < targetLen) { shortList = originList; longList = targetList; } else { shortList = targetList; longList = originList; } var notExistKey = { __EMPTY_ITEM__: true }; function getItemKey(item) { if (item !== undefined) { return getKey(item); } return notExistKey; } // Loop to find diff one var diffIndex = null; var multiple = Math.abs(originLen - targetLen) !== 1; for (var i = 0; i < longList.length; i += 1) { var shortKey = getItemKey(shortList[i]); var longKey = getItemKey(longList[i]); if (shortKey !== longKey) { diffIndex = i; multiple = multiple || shortKey !== getItemKey(longList[i + 1]); break; } } return diffIndex === null ? null : { index: diffIndex, multiple: multiple }; } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/utils/isFirefox.js": /*!*******************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/utils/isFirefox.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_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ "../../../node_modules/@babel/runtime/helpers/esm/typeof.js"); var isFF = (typeof navigator === "undefined" ? "undefined" : (0,_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__["default"])(navigator)) === 'object' && /Firefox/i.test(navigator.userAgent); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (isFF); /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/utils/scrollbarUtil.js": /*!***********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/utils/scrollbarUtil.js ***! \***********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getSpinSize: () => (/* binding */ getSpinSize) /* harmony export */ }); var MIN_SIZE = 20; function getSpinSize() { var containerSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var scrollRange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var baseSize = containerSize / scrollRange * containerSize; if (isNaN(baseSize)) { baseSize = 0; } baseSize = Math.max(baseSize, MIN_SIZE); return Math.floor(baseSize); } /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfcmMtdmlydHVhbC1saXN0X2VzX2luZGV4X2pzLnZvbHVudGVlcmFwaS5kYzcwMmQ4ZTZkMjJlYjEzOTc0ZC5idW5kbGUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQTBEO0FBQ2M7QUFDSDtBQUN0QztBQUNpQjtBQUNaO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQiw2Q0FBZ0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLG9GQUFhLENBQUMsb0ZBQWEsR0FBRyxpQkFBaUIsRUFBRSxxRkFBZSxDQUFDLHFGQUFlLENBQUMscUZBQWUsQ0FBQyxxRkFBZSxDQUFDLHFGQUFlO0FBQ2pKO0FBQ0EsS0FBSztBQUNMO0FBQ0Esc0JBQXNCLGdEQUFtQjtBQUN6QztBQUNBLEdBQUcsZUFBZSxnREFBbUIsQ0FBQywwREFBYztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLGVBQWUsZ0RBQW1CLFFBQVEsOEVBQVE7QUFDckQ7QUFDQSxlQUFlLGlEQUFVLENBQUMscUZBQWUsR0FBRztBQUM1QztBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQSxpRUFBZSxNQUFNLEU7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuRFU7QUFDeEI7QUFDUDtBQUNBO0FBQ0EsZ0JBQWdCLDhDQUFpQjtBQUNqQztBQUNBLEdBQUc7QUFDSCxzQkFBc0IsK0NBQWtCO0FBQ3hDO0FBQ0EsR0FBRztBQUNILEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVjBEO0FBQ0Y7QUFDYTtBQUNHO0FBQ0Y7QUFDb0I7QUFDMUY7QUFDb0M7QUFDWTtBQUNiO0FBQzRCO0FBQ2hDO0FBQ1U7QUFDSDtBQUNSO0FBQ2dCO0FBQ0E7QUFD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RSxrRkFBWTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQztBQUNELGlFQUFlLFFBQVEsRTs7Ozs7Ozs7Ozs7Ozs7O0FDN0N2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDOzs7Ozs7Ozs7Ozs7Ozs7QUMvRXdEO0FBQ3hELDZEQUE2RCw2RUFBTztBQUNwRSxpRUFBZSxJQUFJLEU7Ozs7Ozs7Ozs7Ozs7O0FDRm5CO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQyIsInNvdXJjZXMiOlsid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9GaWxsZXIuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL0l0ZW0uanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL0xpc3QuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL1Njcm9sbEJhci5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlQ2hpbGRyZW4uanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL2hvb2tzL3VzZURpZmZJdGVtLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9ob29rcy91c2VGcmFtZVdoZWVsLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9ob29rcy91c2VHZXRTaXplLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9ob29rcy91c2VIZWlnaHRzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9ob29rcy91c2VNb2JpbGVUb3VjaE1vdmUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL2hvb2tzL3VzZU9yaWdpblNjcm9sbC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlU2Nyb2xsRHJhZy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlU2Nyb2xsVG8uanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL2luZGV4LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy91dGlscy9DYWNoZU1hcC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvdXRpbHMvYWxnb3JpdGhtVXRpbC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvdXRpbHMvaXNGaXJlZm94LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy91dGlscy9zY3JvbGxiYXJVdGlsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVzaXplT2JzZXJ2ZXIgZnJvbSAncmMtcmVzaXplLW9ic2VydmVyJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuLyoqXG4gKiBGaWxsIGNvbXBvbmVudCB0byBwcm92aWRlZCB0aGUgc2Nyb2xsIGNvbnRlbnQgcmVhbCBoZWlnaHQuXG4gKi9cbnZhciBGaWxsZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAoX3JlZiwgcmVmKSB7XG4gIHZhciBoZWlnaHQgPSBfcmVmLmhlaWdodCxcbiAgICBvZmZzZXRZID0gX3JlZi5vZmZzZXRZLFxuICAgIG9mZnNldFggPSBfcmVmLm9mZnNldFgsXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIHByZWZpeENscyA9IF9yZWYucHJlZml4Q2xzLFxuICAgIG9uSW5uZXJSZXNpemUgPSBfcmVmLm9uSW5uZXJSZXNpemUsXG4gICAgaW5uZXJQcm9wcyA9IF9yZWYuaW5uZXJQcm9wcyxcbiAgICBydGwgPSBfcmVmLnJ0bCxcbiAgICBleHRyYSA9IF9yZWYuZXh0cmE7XG4gIHZhciBvdXRlclN0eWxlID0ge307XG4gIHZhciBpbm5lclN0eWxlID0ge1xuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJ1xuICB9O1xuICBpZiAob2Zmc2V0WSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gTm90IHNldCBgd2lkdGhgIHNpbmNlIHRoaXMgd2lsbCBicmVhayBgc3RpY2t5OiByaWdodGBcbiAgICBvdXRlclN0eWxlID0ge1xuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgIH07XG4gICAgaW5uZXJTdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaW5uZXJTdHlsZSksIHt9LCBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHtcbiAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGVZKFwiLmNvbmNhdChvZmZzZXRZLCBcInB4KVwiKVxuICAgIH0sIHJ0bCA/ICdtYXJnaW5SaWdodCcgOiAnbWFyZ2luTGVmdCcsIC1vZmZzZXRYKSwgXCJwb3NpdGlvblwiLCAnYWJzb2x1dGUnKSwgXCJsZWZ0XCIsIDApLCBcInJpZ2h0XCIsIDApLCBcInRvcFwiLCAwKSk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBzdHlsZTogb3V0ZXJTdHlsZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemVPYnNlcnZlciwge1xuICAgIG9uUmVzaXplOiBmdW5jdGlvbiBvblJlc2l6ZShfcmVmMikge1xuICAgICAgdmFyIG9mZnNldEhlaWdodCA9IF9yZWYyLm9mZnNldEhlaWdodDtcbiAgICAgIGlmIChvZmZzZXRIZWlnaHQgJiYgb25Jbm5lclJlc2l6ZSkge1xuICAgICAgICBvbklubmVyUmVzaXplKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgc3R5bGU6IGlubmVyU3R5bGUsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ob2xkZXItaW5uZXJcIiksIHByZWZpeENscykpLFxuICAgIHJlZjogcmVmXG4gIH0sIGlubmVyUHJvcHMpLCBjaGlsZHJlbiwgZXh0cmEpKSk7XG59KTtcbkZpbGxlci5kaXNwbGF5TmFtZSA9ICdGaWxsZXInO1xuZXhwb3J0IGRlZmF1bHQgRmlsbGVyOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBmdW5jdGlvbiBJdGVtKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBzZXRSZWYgPSBfcmVmLnNldFJlZjtcbiAgdmFyIHJlZkZ1bmMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAobm9kZSkge1xuICAgIHNldFJlZihub2RlKTtcbiAgfSwgW10pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChjaGlsZHJlbiwge1xuICAgIHJlZjogcmVmRnVuY1xuICB9KTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcInByZWZpeENsc1wiLCBcImNsYXNzTmFtZVwiLCBcImhlaWdodFwiLCBcIml0ZW1IZWlnaHRcIiwgXCJmdWxsSGVpZ2h0XCIsIFwic3R5bGVcIiwgXCJkYXRhXCIsIFwiY2hpbGRyZW5cIiwgXCJpdGVtS2V5XCIsIFwidmlydHVhbFwiLCBcImRpcmVjdGlvblwiLCBcInNjcm9sbFdpZHRoXCIsIFwiY29tcG9uZW50XCIsIFwib25TY3JvbGxcIiwgXCJvblZpcnR1YWxTY3JvbGxcIiwgXCJvblZpc2libGVDaGFuZ2VcIiwgXCJpbm5lclByb3BzXCIsIFwiZXh0cmFSZW5kZXJcIiwgXCJzdHlsZXNcIiwgXCJzaG93U2Nyb2xsQmFyXCJdO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmVzaXplT2JzZXJ2ZXIgZnJvbSAncmMtcmVzaXplLW9ic2VydmVyJztcbmltcG9ydCB7IHVzZUV2ZW50IH0gZnJvbSAncmMtdXRpbCc7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZsdXNoU3luYyB9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgRmlsbGVyIGZyb20gXCIuL0ZpbGxlclwiO1xuaW1wb3J0IHVzZUNoaWxkcmVuIGZyb20gXCIuL2hvb2tzL3VzZUNoaWxkcmVuXCI7XG5pbXBvcnQgdXNlRGlmZkl0ZW0gZnJvbSBcIi4vaG9va3MvdXNlRGlmZkl0ZW1cIjtcbmltcG9ydCB1c2VGcmFtZVdoZWVsIGZyb20gXCIuL2hvb2tzL3VzZUZyYW1lV2hlZWxcIjtcbmltcG9ydCB7IHVzZUdldFNpemUgfSBmcm9tIFwiLi9ob29rcy91c2VHZXRTaXplXCI7XG5pbXBvcnQgdXNlSGVpZ2h0cyBmcm9tIFwiLi9ob29rcy91c2VIZWlnaHRzXCI7XG5pbXBvcnQgdXNlTW9iaWxlVG91Y2hNb3ZlIGZyb20gXCIuL2hvb2tzL3VzZU1vYmlsZVRvdWNoTW92ZVwiO1xuaW1wb3J0IHVzZU9yaWdpblNjcm9sbCBmcm9tIFwiLi9ob29rcy91c2VPcmlnaW5TY3JvbGxcIjtcbmltcG9ydCB1c2VTY3JvbGxEcmFnIGZyb20gXCIuL2hvb2tzL3VzZVNjcm9sbERyYWdcIjtcbmltcG9ydCB1c2VTY3JvbGxUbyBmcm9tIFwiLi9ob29rcy91c2VTY3JvbGxUb1wiO1xuaW1wb3J0IFNjcm9sbEJhciBmcm9tIFwiLi9TY3JvbGxCYXJcIjtcbmltcG9ydCB7IGdldFNwaW5TaXplIH0gZnJvbSBcIi4vdXRpbHMvc2Nyb2xsYmFyVXRpbFwiO1xudmFyIEVNUFRZX0RBVEEgPSBbXTtcbnZhciBTY3JvbGxTdHlsZSA9IHtcbiAgb3ZlcmZsb3dZOiAnYXV0bycsXG4gIG92ZXJmbG93QW5jaG9yOiAnbm9uZSdcbn07XG5leHBvcnQgZnVuY3Rpb24gUmF3TGlzdChwcm9wcywgcmVmKSB7XG4gIHZhciBfcHJvcHMkcHJlZml4Q2xzID0gcHJvcHMucHJlZml4Q2xzLFxuICAgIHByZWZpeENscyA9IF9wcm9wcyRwcmVmaXhDbHMgPT09IHZvaWQgMCA/ICdyYy12aXJ0dWFsLWxpc3QnIDogX3Byb3BzJHByZWZpeENscyxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LFxuICAgIGl0ZW1IZWlnaHQgPSBwcm9wcy5pdGVtSGVpZ2h0LFxuICAgIF9wcm9wcyRmdWxsSGVpZ2h0ID0gcHJvcHMuZnVsbEhlaWdodCxcbiAgICBmdWxsSGVpZ2h0ID0gX3Byb3BzJGZ1bGxIZWlnaHQgPT09IHZvaWQgMCA/IHRydWUgOiBfcHJvcHMkZnVsbEhlaWdodCxcbiAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgIGRhdGEgPSBwcm9wcy5kYXRhLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgaXRlbUtleSA9IHByb3BzLml0ZW1LZXksXG4gICAgdmlydHVhbCA9IHByb3BzLnZpcnR1YWwsXG4gICAgZGlyZWN0aW9uID0gcHJvcHMuZGlyZWN0aW9uLFxuICAgIHNjcm9sbFdpZHRoID0gcHJvcHMuc2Nyb2xsV2lkdGgsXG4gICAgX3Byb3BzJGNvbXBvbmVudCA9IHByb3BzLmNvbXBvbmVudCxcbiAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgb25TY3JvbGwgPSBwcm9wcy5vblNjcm9sbCxcbiAgICBvblZpcnR1YWxTY3JvbGwgPSBwcm9wcy5vblZpcnR1YWxTY3JvbGwsXG4gICAgb25WaXNpYmxlQ2hhbmdlID0gcHJvcHMub25WaXNpYmxlQ2hhbmdlLFxuICAgIGlubmVyUHJvcHMgPSBwcm9wcy5pbm5lclByb3BzLFxuICAgIGV4dHJhUmVuZGVyID0gcHJvcHMuZXh0cmFSZW5kZXIsXG4gICAgc3R5bGVzID0gcHJvcHMuc3R5bGVzLFxuICAgIF9wcm9wcyRzaG93U2Nyb2xsQmFyID0gcHJvcHMuc2hvd1Njcm9sbEJhcixcbiAgICBzaG93U2Nyb2xsQmFyID0gX3Byb3BzJHNob3dTY3JvbGxCYXIgPT09IHZvaWQgMCA/ICdvcHRpb25hbCcgOiBfcHJvcHMkc2hvd1Njcm9sbEJhcixcbiAgICByZXN0UHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJdGVtIEtleSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBnZXRLZXkgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoaXRlbSkge1xuICAgIGlmICh0eXBlb2YgaXRlbUtleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZW1LZXkoaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGl0ZW1baXRlbUtleV07XG4gIH0sIFtpdGVtS2V5XSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSGVpZ2h0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfdXNlSGVpZ2h0cyA9IHVzZUhlaWdodHMoZ2V0S2V5LCBudWxsLCBudWxsKSxcbiAgICBfdXNlSGVpZ2h0czIgPSBfc2xpY2VkVG9BcnJheShfdXNlSGVpZ2h0cywgNCksXG4gICAgc2V0SW5zdGFuY2VSZWYgPSBfdXNlSGVpZ2h0czJbMF0sXG4gICAgY29sbGVjdEhlaWdodCA9IF91c2VIZWlnaHRzMlsxXSxcbiAgICBoZWlnaHRzID0gX3VzZUhlaWdodHMyWzJdLFxuICAgIGhlaWdodFVwZGF0ZWRNYXJrID0gX3VzZUhlaWdodHMyWzNdO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBNSVNDID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgdXNlVmlydHVhbCA9ICEhKHZpcnR1YWwgIT09IGZhbHNlICYmIGhlaWdodCAmJiBpdGVtSGVpZ2h0KTtcbiAgdmFyIGNvbnRhaW5lckhlaWdodCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGhlaWdodHMubWFwcykucmVkdWNlKGZ1bmN0aW9uICh0b3RhbCwgY3Vycikge1xuICAgICAgcmV0dXJuIHRvdGFsICsgY3VycjtcbiAgICB9LCAwKTtcbiAgfSwgW2hlaWdodHMuaWQsIGhlaWdodHMubWFwc10pO1xuICB2YXIgaW5WaXJ0dWFsID0gdXNlVmlydHVhbCAmJiBkYXRhICYmIChNYXRoLm1heChpdGVtSGVpZ2h0ICogZGF0YS5sZW5ndGgsIGNvbnRhaW5lckhlaWdodCkgPiBoZWlnaHQgfHwgISFzY3JvbGxXaWR0aCk7XG4gIHZhciBpc1JUTCA9IGRpcmVjdGlvbiA9PT0gJ3J0bCc7XG4gIHZhciBtZXJnZWRDbGFzc05hbWUgPSBjbGFzc05hbWVzKHByZWZpeENscywgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXJ0bFwiKSwgaXNSVEwpLCBjbGFzc05hbWUpO1xuICB2YXIgbWVyZ2VkRGF0YSA9IGRhdGEgfHwgRU1QVFlfREFUQTtcbiAgdmFyIGNvbXBvbmVudFJlZiA9IHVzZVJlZigpO1xuICB2YXIgZmlsbGVySW5uZXJSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIGNvbnRhaW5lclJlZiA9IHVzZVJlZigpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSXRlbSBLZXkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSgwKSxcbiAgICBfdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlLCAyKSxcbiAgICBvZmZzZXRUb3AgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldE9mZnNldFRvcCA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBfdXNlU3RhdGUzID0gdXNlU3RhdGUoMCksXG4gICAgX3VzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTMsIDIpLFxuICAgIG9mZnNldExlZnQgPSBfdXNlU3RhdGU0WzBdLFxuICAgIHNldE9mZnNldExlZnQgPSBfdXNlU3RhdGU0WzFdO1xuICB2YXIgX3VzZVN0YXRlNSA9IHVzZVN0YXRlKGZhbHNlKSxcbiAgICBfdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX3VzZVN0YXRlNSwgMiksXG4gICAgc2Nyb2xsTW92aW5nID0gX3VzZVN0YXRlNlswXSxcbiAgICBzZXRTY3JvbGxNb3ZpbmcgPSBfdXNlU3RhdGU2WzFdO1xuICB2YXIgb25TY3JvbGxiYXJTdGFydE1vdmUgPSBmdW5jdGlvbiBvblNjcm9sbGJhclN0YXJ0TW92ZSgpIHtcbiAgICBzZXRTY3JvbGxNb3ZpbmcodHJ1ZSk7XG4gIH07XG4gIHZhciBvblNjcm9sbGJhclN0b3BNb3ZlID0gZnVuY3Rpb24gb25TY3JvbGxiYXJTdG9wTW92ZSgpIHtcbiAgICBzZXRTY3JvbGxNb3ZpbmcoZmFsc2UpO1xuICB9O1xuICB2YXIgc2hhcmVkQ29uZmlnID0ge1xuICAgIGdldEtleTogZ2V0S2V5XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2Nyb2xsID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIHN5bmNTY3JvbGxUb3AobmV3VG9wKSB7XG4gICAgc2V0T2Zmc2V0VG9wKGZ1bmN0aW9uIChvcmlnaW4pIHtcbiAgICAgIHZhciB2YWx1ZTtcbiAgICAgIGlmICh0eXBlb2YgbmV3VG9wID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbHVlID0gbmV3VG9wKG9yaWdpbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IG5ld1RvcDtcbiAgICAgIH1cbiAgICAgIHZhciBhbGlnbmVkVG9wID0ga2VlcEluUmFuZ2UodmFsdWUpO1xuICAgICAgY29tcG9uZW50UmVmLmN1cnJlbnQuc2Nyb2xsVG9wID0gYWxpZ25lZFRvcDtcbiAgICAgIHJldHVybiBhbGlnbmVkVG9wO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTGVnYWN5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFB1dCByZWYgaGVyZSBzaW5jZSB0aGUgcmFuZ2UgaXMgZ2VuZXJhdGUgYnkgZm9sbG93XG4gIHZhciByYW5nZVJlZiA9IHVzZVJlZih7XG4gICAgc3RhcnQ6IDAsXG4gICAgZW5kOiBtZXJnZWREYXRhLmxlbmd0aFxuICB9KTtcbiAgdmFyIGRpZmZJdGVtUmVmID0gdXNlUmVmKCk7XG4gIHZhciBfdXNlRGlmZkl0ZW0gPSB1c2VEaWZmSXRlbShtZXJnZWREYXRhLCBnZXRLZXkpLFxuICAgIF91c2VEaWZmSXRlbTIgPSBfc2xpY2VkVG9BcnJheShfdXNlRGlmZkl0ZW0sIDEpLFxuICAgIGRpZmZJdGVtID0gX3VzZURpZmZJdGVtMlswXTtcbiAgZGlmZkl0ZW1SZWYuY3VycmVudCA9IGRpZmZJdGVtO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFZpc2libGUgQ2FsY3VsYXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdXNlVmlydHVhbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNjcm9sbEhlaWdodDogdW5kZWZpbmVkLFxuICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgIGVuZDogbWVyZ2VkRGF0YS5sZW5ndGggLSAxLFxuICAgICAgICAgIG9mZnNldDogdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEFsd2F5cyB1c2UgdmlydHVhbCBzY3JvbGwgYmFyIGluIGF2b2lkIHNoYWtpbmdcbiAgICAgIGlmICghaW5WaXJ0dWFsKSB7XG4gICAgICAgIHZhciBfZmlsbGVySW5uZXJSZWYkY3VycmU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2Nyb2xsSGVpZ2h0OiAoKF9maWxsZXJJbm5lclJlZiRjdXJyZSA9IGZpbGxlcklubmVyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9maWxsZXJJbm5lclJlZiRjdXJyZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZpbGxlcklubmVyUmVmJGN1cnJlLm9mZnNldEhlaWdodCkgfHwgMCxcbiAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICBlbmQ6IG1lcmdlZERhdGEubGVuZ3RoIC0gMSxcbiAgICAgICAgICBvZmZzZXQ6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIGl0ZW1Ub3AgPSAwO1xuICAgICAgdmFyIHN0YXJ0SW5kZXg7XG4gICAgICB2YXIgc3RhcnRPZmZzZXQ7XG4gICAgICB2YXIgZW5kSW5kZXg7XG4gICAgICB2YXIgZGF0YUxlbiA9IG1lcmdlZERhdGEubGVuZ3RoO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhTGVuOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIF9pdGVtID0gbWVyZ2VkRGF0YVtpXTtcbiAgICAgICAgdmFyIGtleSA9IGdldEtleShfaXRlbSk7XG4gICAgICAgIHZhciBjYWNoZUhlaWdodCA9IGhlaWdodHMuZ2V0KGtleSk7XG4gICAgICAgIHZhciBjdXJyZW50SXRlbUJvdHRvbSA9IGl0ZW1Ub3AgKyAoY2FjaGVIZWlnaHQgPT09IHVuZGVmaW5lZCA/IGl0ZW1IZWlnaHQgOiBjYWNoZUhlaWdodCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaXRlbSB0b3AgaW4gdGhlIHJhbmdlXG4gICAgICAgIGlmIChjdXJyZW50SXRlbUJvdHRvbSA+PSBvZmZzZXRUb3AgJiYgc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc3RhcnRJbmRleCA9IGk7XG4gICAgICAgICAgc3RhcnRPZmZzZXQgPSBpdGVtVG9wO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaXRlbSBib3R0b20gaW4gdGhlIHJhbmdlLiBXZSB3aWxsIHJlbmRlciBhZGRpdGlvbmFsIG9uZSBpdGVtIGZvciBtb3Rpb24gdXNhZ2VcbiAgICAgICAgaWYgKGN1cnJlbnRJdGVtQm90dG9tID4gb2Zmc2V0VG9wICsgaGVpZ2h0ICYmIGVuZEluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbmRJbmRleCA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaXRlbVRvcCA9IGN1cnJlbnRJdGVtQm90dG9tO1xuICAgICAgfVxuXG4gICAgICAvLyBXaGVuIHNjcm9sbFRvcCBhdCB0aGUgZW5kIGJ1dCBkYXRhIGN1dCB0byBzbWFsbCBjb3VudCB3aWxsIHJlYWNoIHRoaXNcbiAgICAgIGlmIChzdGFydEluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3RhcnRJbmRleCA9IDA7XG4gICAgICAgIHN0YXJ0T2Zmc2V0ID0gMDtcbiAgICAgICAgZW5kSW5kZXggPSBNYXRoLmNlaWwoaGVpZ2h0IC8gaXRlbUhlaWdodCk7XG4gICAgICB9XG4gICAgICBpZiAoZW5kSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmRJbmRleCA9IG1lcmdlZERhdGEubGVuZ3RoIC0gMTtcbiAgICAgIH1cblxuICAgICAgLy8gR2l2ZSBjYWNoZSB0byBpbXByb3ZlIHNjcm9sbCBleHBlcmllbmNlXG4gICAgICBlbmRJbmRleCA9IE1hdGgubWluKGVuZEluZGV4ICsgMSwgbWVyZ2VkRGF0YS5sZW5ndGggLSAxKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNjcm9sbEhlaWdodDogaXRlbVRvcCxcbiAgICAgICAgc3RhcnQ6IHN0YXJ0SW5kZXgsXG4gICAgICAgIGVuZDogZW5kSW5kZXgsXG4gICAgICAgIG9mZnNldDogc3RhcnRPZmZzZXRcbiAgICAgIH07XG4gICAgfSwgW2luVmlydHVhbCwgdXNlVmlydHVhbCwgb2Zmc2V0VG9wLCBtZXJnZWREYXRhLCBoZWlnaHRVcGRhdGVkTWFyaywgaGVpZ2h0XSksXG4gICAgc2Nyb2xsSGVpZ2h0ID0gX1JlYWN0JHVzZU1lbW8uc2Nyb2xsSGVpZ2h0LFxuICAgIHN0YXJ0ID0gX1JlYWN0JHVzZU1lbW8uc3RhcnQsXG4gICAgZW5kID0gX1JlYWN0JHVzZU1lbW8uZW5kLFxuICAgIGZpbGxlck9mZnNldCA9IF9SZWFjdCR1c2VNZW1vLm9mZnNldDtcbiAgcmFuZ2VSZWYuY3VycmVudC5zdGFydCA9IHN0YXJ0O1xuICByYW5nZVJlZi5jdXJyZW50LmVuZCA9IGVuZDtcblxuICAvLyBXaGVuIHNjcm9sbCB1cCwgZmlyc3QgdmlzaWJsZSBpdGVtIGdldCByZWFsIGhlaWdodCBtYXkgbm90IHNhbWUgYXMgYGl0ZW1IZWlnaHRgLFxuICAvLyBXaGljaCB3aWxsIG1ha2Ugc2Nyb2xsIGp1bXAuXG4gIC8vIExldCdzIHN5bmMgc2Nyb2xsIHRvcCB0byBhdm9pZCBqdW1wXG4gIFJlYWN0LnVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNoYW5nZWRSZWNvcmQgPSBoZWlnaHRzLmdldFJlY29yZCgpO1xuICAgIGlmIChjaGFuZ2VkUmVjb3JkLnNpemUgPT09IDEpIHtcbiAgICAgIHZhciByZWNvcmRLZXkgPSBBcnJheS5mcm9tKGNoYW5nZWRSZWNvcmQua2V5cygpKVswXTtcbiAgICAgIHZhciBwcmV2Q2FjaGVIZWlnaHQgPSBjaGFuZ2VkUmVjb3JkLmdldChyZWNvcmRLZXkpO1xuXG4gICAgICAvLyBRdWljayBzd2l0Y2ggZGF0YSBtYXkgY2F1c2UgYHN0YXJ0YCBub3QgaW4gYG1lcmdlZERhdGFgIGFueW1vcmVcbiAgICAgIHZhciBzdGFydEl0ZW0gPSBtZXJnZWREYXRhW3N0YXJ0XTtcbiAgICAgIGlmIChzdGFydEl0ZW0gJiYgcHJldkNhY2hlSGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIHN0YXJ0SW5kZXhLZXkgPSBnZXRLZXkoc3RhcnRJdGVtKTtcbiAgICAgICAgaWYgKHN0YXJ0SW5kZXhLZXkgPT09IHJlY29yZEtleSkge1xuICAgICAgICAgIHZhciByZWFsU3RhcnRIZWlnaHQgPSBoZWlnaHRzLmdldChyZWNvcmRLZXkpO1xuICAgICAgICAgIHZhciBkaWZmSGVpZ2h0ID0gcmVhbFN0YXJ0SGVpZ2h0IC0gaXRlbUhlaWdodDtcbiAgICAgICAgICBzeW5jU2Nyb2xsVG9wKGZ1bmN0aW9uIChvcmkpIHtcbiAgICAgICAgICAgIHJldHVybiBvcmkgKyBkaWZmSGVpZ2h0O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGhlaWdodHMucmVzZXRSZWNvcmQoKTtcbiAgfSwgW3Njcm9sbEhlaWdodF0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTaXplID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoe1xuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IGhlaWdodFxuICAgIH0pLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHNpemUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFNpemUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgb25Ib2xkZXJSZXNpemUgPSBmdW5jdGlvbiBvbkhvbGRlclJlc2l6ZShzaXplSW5mbykge1xuICAgIHNldFNpemUoe1xuICAgICAgd2lkdGg6IHNpemVJbmZvLm9mZnNldFdpZHRoLFxuICAgICAgaGVpZ2h0OiBzaXplSW5mby5vZmZzZXRIZWlnaHRcbiAgICB9KTtcbiAgfTtcblxuICAvLyBIYWNrIG9uIHNjcm9sbGJhciB0byBlbmFibGUgZmxhc2ggY2FsbFxuICB2YXIgdmVydGljYWxTY3JvbGxCYXJSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIGhvcml6b250YWxTY3JvbGxCYXJSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIGhvcml6b250YWxTY3JvbGxCYXJTcGluU2l6ZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXRTcGluU2l6ZShzaXplLndpZHRoLCBzY3JvbGxXaWR0aCk7XG4gIH0sIFtzaXplLndpZHRoLCBzY3JvbGxXaWR0aF0pO1xuICB2YXIgdmVydGljYWxTY3JvbGxCYXJTcGluU2l6ZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXRTcGluU2l6ZShzaXplLmhlaWdodCwgc2Nyb2xsSGVpZ2h0KTtcbiAgfSwgW3NpemUuaGVpZ2h0LCBzY3JvbGxIZWlnaHRdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEluIFJhbmdlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG1heFNjcm9sbEhlaWdodCA9IHNjcm9sbEhlaWdodCAtIGhlaWdodDtcbiAgdmFyIG1heFNjcm9sbEhlaWdodFJlZiA9IHVzZVJlZihtYXhTY3JvbGxIZWlnaHQpO1xuICBtYXhTY3JvbGxIZWlnaHRSZWYuY3VycmVudCA9IG1heFNjcm9sbEhlaWdodDtcbiAgZnVuY3Rpb24ga2VlcEluUmFuZ2UobmV3U2Nyb2xsVG9wKSB7XG4gICAgdmFyIG5ld1RvcCA9IG5ld1Njcm9sbFRvcDtcbiAgICBpZiAoIU51bWJlci5pc05hTihtYXhTY3JvbGxIZWlnaHRSZWYuY3VycmVudCkpIHtcbiAgICAgIG5ld1RvcCA9IE1hdGgubWluKG5ld1RvcCwgbWF4U2Nyb2xsSGVpZ2h0UmVmLmN1cnJlbnQpO1xuICAgIH1cbiAgICBuZXdUb3AgPSBNYXRoLm1heChuZXdUb3AsIDApO1xuICAgIHJldHVybiBuZXdUb3A7XG4gIH1cbiAgdmFyIGlzU2Nyb2xsQXRUb3AgPSBvZmZzZXRUb3AgPD0gMDtcbiAgdmFyIGlzU2Nyb2xsQXRCb3R0b20gPSBvZmZzZXRUb3AgPj0gbWF4U2Nyb2xsSGVpZ2h0O1xuICB2YXIgaXNTY3JvbGxBdExlZnQgPSBvZmZzZXRMZWZ0IDw9IDA7XG4gIHZhciBpc1Njcm9sbEF0UmlnaHQgPSBvZmZzZXRMZWZ0ID49IHNjcm9sbFdpZHRoO1xuICB2YXIgb3JpZ2luU2Nyb2xsID0gdXNlT3JpZ2luU2Nyb2xsKGlzU2Nyb2xsQXRUb3AsIGlzU2Nyb2xsQXRCb3R0b20sIGlzU2Nyb2xsQXRMZWZ0LCBpc1Njcm9sbEF0UmlnaHQpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNjcm9sbCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZ2V0VmlydHVhbFNjcm9sbEluZm8gPSBmdW5jdGlvbiBnZXRWaXJ0dWFsU2Nyb2xsSW5mbygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogaXNSVEwgPyAtb2Zmc2V0TGVmdCA6IG9mZnNldExlZnQsXG4gICAgICB5OiBvZmZzZXRUb3BcbiAgICB9O1xuICB9O1xuICB2YXIgbGFzdFZpcnR1YWxTY3JvbGxJbmZvUmVmID0gdXNlUmVmKGdldFZpcnR1YWxTY3JvbGxJbmZvKCkpO1xuICB2YXIgdHJpZ2dlclNjcm9sbCA9IHVzZUV2ZW50KGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICBpZiAob25WaXJ0dWFsU2Nyb2xsKSB7XG4gICAgICB2YXIgbmV4dEluZm8gPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGdldFZpcnR1YWxTY3JvbGxJbmZvKCkpLCBwYXJhbXMpO1xuXG4gICAgICAvLyBUcmlnZ2VyIHdoZW4gb2Zmc2V0IGNoYW5nZWRcbiAgICAgIGlmIChsYXN0VmlydHVhbFNjcm9sbEluZm9SZWYuY3VycmVudC54ICE9PSBuZXh0SW5mby54IHx8IGxhc3RWaXJ0dWFsU2Nyb2xsSW5mb1JlZi5jdXJyZW50LnkgIT09IG5leHRJbmZvLnkpIHtcbiAgICAgICAgb25WaXJ0dWFsU2Nyb2xsKG5leHRJbmZvKTtcbiAgICAgICAgbGFzdFZpcnR1YWxTY3JvbGxJbmZvUmVmLmN1cnJlbnQgPSBuZXh0SW5mbztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBmdW5jdGlvbiBvblNjcm9sbEJhcihuZXdTY3JvbGxPZmZzZXQsIGhvcml6b250YWwpIHtcbiAgICB2YXIgbmV3T2Zmc2V0ID0gbmV3U2Nyb2xsT2Zmc2V0O1xuICAgIGlmIChob3Jpem9udGFsKSB7XG4gICAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRPZmZzZXRMZWZ0KG5ld09mZnNldCk7XG4gICAgICB9KTtcbiAgICAgIHRyaWdnZXJTY3JvbGwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3luY1Njcm9sbFRvcChuZXdPZmZzZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdoZW4gZGF0YSBzaXplIHJlZHVjZS4gSXQgbWF5IHRyaWdnZXIgbmF0aXZlIHNjcm9sbCBldmVudCBiYWNrIHRvIGZpdCBzY3JvbGwgcG9zaXRpb25cbiAgZnVuY3Rpb24gb25GYWxsYmFja1Njcm9sbChlKSB7XG4gICAgdmFyIG5ld1Njcm9sbFRvcCA9IGUuY3VycmVudFRhcmdldC5zY3JvbGxUb3A7XG4gICAgaWYgKG5ld1Njcm9sbFRvcCAhPT0gb2Zmc2V0VG9wKSB7XG4gICAgICBzeW5jU2Nyb2xsVG9wKG5ld1Njcm9sbFRvcCk7XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciBvcmlnaW4gb25TY3JvbGxcbiAgICBvblNjcm9sbCA9PT0gbnVsbCB8fCBvblNjcm9sbCA9PT0gdm9pZCAwIHx8IG9uU2Nyb2xsKGUpO1xuICAgIHRyaWdnZXJTY3JvbGwoKTtcbiAgfVxuICB2YXIga2VlcEluSG9yaXpvbnRhbFJhbmdlID0gZnVuY3Rpb24ga2VlcEluSG9yaXpvbnRhbFJhbmdlKG5leHRPZmZzZXRMZWZ0KSB7XG4gICAgdmFyIHRtcE9mZnNldExlZnQgPSBuZXh0T2Zmc2V0TGVmdDtcbiAgICB2YXIgbWF4ID0gISFzY3JvbGxXaWR0aCA/IHNjcm9sbFdpZHRoIC0gc2l6ZS53aWR0aCA6IDA7XG4gICAgdG1wT2Zmc2V0TGVmdCA9IE1hdGgubWF4KHRtcE9mZnNldExlZnQsIDApO1xuICAgIHRtcE9mZnNldExlZnQgPSBNYXRoLm1pbih0bXBPZmZzZXRMZWZ0LCBtYXgpO1xuICAgIHJldHVybiB0bXBPZmZzZXRMZWZ0O1xuICB9O1xuICB2YXIgb25XaGVlbERlbHRhID0gdXNlRXZlbnQoZnVuY3Rpb24gKG9mZnNldFhZLCBmcm9tSG9yaXpvbnRhbCkge1xuICAgIGlmIChmcm9tSG9yaXpvbnRhbCkge1xuICAgICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0T2Zmc2V0TGVmdChmdW5jdGlvbiAobGVmdCkge1xuICAgICAgICAgIHZhciBuZXh0T2Zmc2V0TGVmdCA9IGxlZnQgKyAoaXNSVEwgPyAtb2Zmc2V0WFkgOiBvZmZzZXRYWSk7XG4gICAgICAgICAgcmV0dXJuIGtlZXBJbkhvcml6b250YWxSYW5nZShuZXh0T2Zmc2V0TGVmdCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0cmlnZ2VyU2Nyb2xsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN5bmNTY3JvbGxUb3AoZnVuY3Rpb24gKHRvcCkge1xuICAgICAgICB2YXIgbmV3VG9wID0gdG9wICsgb2Zmc2V0WFk7XG4gICAgICAgIHJldHVybiBuZXdUb3A7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFNpbmNlIHRoaXMgYWRkZWQgaW4gZ2xvYmFsLHNob3VsZCB1c2UgcmVmIHRvIGtlZXAgdXBkYXRlXG4gIHZhciBfdXNlRnJhbWVXaGVlbCA9IHVzZUZyYW1lV2hlZWwodXNlVmlydHVhbCwgaXNTY3JvbGxBdFRvcCwgaXNTY3JvbGxBdEJvdHRvbSwgaXNTY3JvbGxBdExlZnQsIGlzU2Nyb2xsQXRSaWdodCwgISFzY3JvbGxXaWR0aCwgb25XaGVlbERlbHRhKSxcbiAgICBfdXNlRnJhbWVXaGVlbDIgPSBfc2xpY2VkVG9BcnJheShfdXNlRnJhbWVXaGVlbCwgMiksXG4gICAgb25SYXdXaGVlbCA9IF91c2VGcmFtZVdoZWVsMlswXSxcbiAgICBvbkZpcmVGb3hTY3JvbGwgPSBfdXNlRnJhbWVXaGVlbDJbMV07XG5cbiAgLy8gTW9iaWxlIHRvdWNoIG1vdmVcbiAgdXNlTW9iaWxlVG91Y2hNb3ZlKHVzZVZpcnR1YWwsIGNvbXBvbmVudFJlZiwgZnVuY3Rpb24gKGlzSG9yaXpvbnRhbCwgZGVsdGEsIHNtb290aE9mZnNldCwgZSkge1xuICAgIHZhciBldmVudCA9IGU7XG4gICAgaWYgKG9yaWdpblNjcm9sbChpc0hvcml6b250YWwsIGRlbHRhLCBzbW9vdGhPZmZzZXQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gRml4IG5lc3QgTGlzdCB0cmlnZ2VyIFRvdWNoTW92ZSBldmVudFxuICAgIGlmICghZXZlbnQgfHwgIWV2ZW50Ll92aXJ0dWFsSGFuZGxlZCkge1xuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50Ll92aXJ0dWFsSGFuZGxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBvblJhd1doZWVsKHtcbiAgICAgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uIHByZXZlbnREZWZhdWx0KCkge30sXG4gICAgICAgIGRlbHRhWDogaXNIb3Jpem9udGFsID8gZGVsdGEgOiAwLFxuICAgICAgICBkZWx0YVk6IGlzSG9yaXpvbnRhbCA/IDAgOiBkZWx0YVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcblxuICAvLyBNb3VzZURvd24gZHJhZyBmb3Igc2Nyb2xsXG4gIHVzZVNjcm9sbERyYWcoaW5WaXJ0dWFsLCBjb21wb25lbnRSZWYsIGZ1bmN0aW9uIChvZmZzZXQpIHtcbiAgICBzeW5jU2Nyb2xsVG9wKGZ1bmN0aW9uICh0b3ApIHtcbiAgICAgIHJldHVybiB0b3AgKyBvZmZzZXQ7XG4gICAgfSk7XG4gIH0pO1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8vIEZpcmVmb3ggb25seVxuICAgIGZ1bmN0aW9uIG9uTW96TW91c2VQaXhlbFNjcm9sbChlKSB7XG4gICAgICAvLyBzY3JvbGxpbmcgYXQgdG9wL2JvdHRvbSBsaW1pdFxuICAgICAgdmFyIHNjcm9sbGluZ1VwQXRUb3AgPSBpc1Njcm9sbEF0VG9wICYmIGUuZGV0YWlsIDwgMDtcbiAgICAgIHZhciBzY3JvbGxpbmdEb3duQXRCb3R0b20gPSBpc1Njcm9sbEF0Qm90dG9tICYmIGUuZGV0YWlsID4gMDtcbiAgICAgIGlmICh1c2VWaXJ0dWFsICYmICFzY3JvbGxpbmdVcEF0VG9wICYmICFzY3JvbGxpbmdEb3duQXRCb3R0b20pIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgY29tcG9uZW50RWxlID0gY29tcG9uZW50UmVmLmN1cnJlbnQ7XG4gICAgY29tcG9uZW50RWxlLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25SYXdXaGVlbCwge1xuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICBjb21wb25lbnRFbGUuYWRkRXZlbnRMaXN0ZW5lcignRE9NTW91c2VTY3JvbGwnLCBvbkZpcmVGb3hTY3JvbGwsIHtcbiAgICAgIHBhc3NpdmU6IHRydWVcbiAgICB9KTtcbiAgICBjb21wb25lbnRFbGUuYWRkRXZlbnRMaXN0ZW5lcignTW96TW91c2VQaXhlbFNjcm9sbCcsIG9uTW96TW91c2VQaXhlbFNjcm9sbCwge1xuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY29tcG9uZW50RWxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25SYXdXaGVlbCk7XG4gICAgICBjb21wb25lbnRFbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignRE9NTW91c2VTY3JvbGwnLCBvbkZpcmVGb3hTY3JvbGwpO1xuICAgICAgY29tcG9uZW50RWxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ01vek1vdXNlUGl4ZWxTY3JvbGwnLCBvbk1vek1vdXNlUGl4ZWxTY3JvbGwpO1xuICAgIH07XG4gIH0sIFt1c2VWaXJ0dWFsLCBpc1Njcm9sbEF0VG9wLCBpc1Njcm9sbEF0Qm90dG9tXSk7XG5cbiAgLy8gU3luYyBzY3JvbGwgbGVmdFxuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY3JvbGxXaWR0aCkge1xuICAgICAgdmFyIG5ld09mZnNldExlZnQgPSBrZWVwSW5Ib3Jpem9udGFsUmFuZ2Uob2Zmc2V0TGVmdCk7XG4gICAgICBzZXRPZmZzZXRMZWZ0KG5ld09mZnNldExlZnQpO1xuICAgICAgdHJpZ2dlclNjcm9sbCh7XG4gICAgICAgIHg6IG5ld09mZnNldExlZnRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW3NpemUud2lkdGgsIHNjcm9sbFdpZHRoXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlZiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBkZWxheUhpZGVTY3JvbGxCYXIgPSBmdW5jdGlvbiBkZWxheUhpZGVTY3JvbGxCYXIoKSB7XG4gICAgdmFyIF92ZXJ0aWNhbFNjcm9sbEJhclJlZiwgX2hvcml6b250YWxTY3JvbGxCYXJSO1xuICAgIChfdmVydGljYWxTY3JvbGxCYXJSZWYgPSB2ZXJ0aWNhbFNjcm9sbEJhclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfdmVydGljYWxTY3JvbGxCYXJSZWYgPT09IHZvaWQgMCB8fCBfdmVydGljYWxTY3JvbGxCYXJSZWYuZGVsYXlIaWRkZW4oKTtcbiAgICAoX2hvcml6b250YWxTY3JvbGxCYXJSID0gaG9yaXpvbnRhbFNjcm9sbEJhclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfaG9yaXpvbnRhbFNjcm9sbEJhclIgPT09IHZvaWQgMCB8fCBfaG9yaXpvbnRhbFNjcm9sbEJhclIuZGVsYXlIaWRkZW4oKTtcbiAgfTtcbiAgdmFyIF9zY3JvbGxUbyA9IHVzZVNjcm9sbFRvKGNvbXBvbmVudFJlZiwgbWVyZ2VkRGF0YSwgaGVpZ2h0cywgaXRlbUhlaWdodCwgZ2V0S2V5LCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNvbGxlY3RIZWlnaHQodHJ1ZSk7XG4gIH0sIHN5bmNTY3JvbGxUb3AsIGRlbGF5SGlkZVNjcm9sbEJhcik7XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hdGl2ZUVsZW1lbnQ6IGNvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgICAgZ2V0U2Nyb2xsSW5mbzogZ2V0VmlydHVhbFNjcm9sbEluZm8sXG4gICAgICBzY3JvbGxUbzogZnVuY3Rpb24gc2Nyb2xsVG8oY29uZmlnKSB7XG4gICAgICAgIGZ1bmN0aW9uIGlzUG9zU2Nyb2xsKGFyZykge1xuICAgICAgICAgIHJldHVybiBhcmcgJiYgX3R5cGVvZihhcmcpID09PSAnb2JqZWN0JyAmJiAoJ2xlZnQnIGluIGFyZyB8fCAndG9wJyBpbiBhcmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc1Njcm9sbChjb25maWcpKSB7XG4gICAgICAgICAgLy8gU2Nyb2xsIFhcbiAgICAgICAgICBpZiAoY29uZmlnLmxlZnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2V0T2Zmc2V0TGVmdChrZWVwSW5Ib3Jpem9udGFsUmFuZ2UoY29uZmlnLmxlZnQpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTY3JvbGwgWVxuICAgICAgICAgIF9zY3JvbGxUbyhjb25maWcudG9wKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfc2Nyb2xsVG8oY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKiogV2UgbmVlZCB0b2xkIG91dHNpZGUgdGhhdCBzb21lIGxpc3Qgbm90IHJlbmRlcmVkICovXG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG9uVmlzaWJsZUNoYW5nZSkge1xuICAgICAgdmFyIHJlbmRlckxpc3QgPSBtZXJnZWREYXRhLnNsaWNlKHN0YXJ0LCBlbmQgKyAxKTtcbiAgICAgIG9uVmlzaWJsZUNoYW5nZShyZW5kZXJMaXN0LCBtZXJnZWREYXRhKTtcbiAgICB9XG4gIH0sIFtzdGFydCwgZW5kLCBtZXJnZWREYXRhXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRXh0cmEgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBnZXRTaXplID0gdXNlR2V0U2l6ZShtZXJnZWREYXRhLCBnZXRLZXksIGhlaWdodHMsIGl0ZW1IZWlnaHQpO1xuICB2YXIgZXh0cmFDb250ZW50ID0gZXh0cmFSZW5kZXIgPT09IG51bGwgfHwgZXh0cmFSZW5kZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV4dHJhUmVuZGVyKHtcbiAgICBzdGFydDogc3RhcnQsXG4gICAgZW5kOiBlbmQsXG4gICAgdmlydHVhbDogaW5WaXJ0dWFsLFxuICAgIG9mZnNldFg6IG9mZnNldExlZnQsXG4gICAgb2Zmc2V0WTogZmlsbGVyT2Zmc2V0LFxuICAgIHJ0bDogaXNSVEwsXG4gICAgZ2V0U2l6ZTogZ2V0U2l6ZVxuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGxpc3RDaGlsZHJlbiA9IHVzZUNoaWxkcmVuKG1lcmdlZERhdGEsIHN0YXJ0LCBlbmQsIHNjcm9sbFdpZHRoLCBvZmZzZXRMZWZ0LCBzZXRJbnN0YW5jZVJlZiwgY2hpbGRyZW4sIHNoYXJlZENvbmZpZyk7XG4gIHZhciBjb21wb25lbnRTdHlsZSA9IG51bGw7XG4gIGlmIChoZWlnaHQpIHtcbiAgICBjb21wb25lbnRTdHlsZSA9IF9vYmplY3RTcHJlYWQoX2RlZmluZVByb3BlcnR5KHt9LCBmdWxsSGVpZ2h0ID8gJ2hlaWdodCcgOiAnbWF4SGVpZ2h0JywgaGVpZ2h0KSwgU2Nyb2xsU3R5bGUpO1xuICAgIGlmICh1c2VWaXJ0dWFsKSB7XG4gICAgICBjb21wb25lbnRTdHlsZS5vdmVyZmxvd1kgPSAnaGlkZGVuJztcbiAgICAgIGlmIChzY3JvbGxXaWR0aCkge1xuICAgICAgICBjb21wb25lbnRTdHlsZS5vdmVyZmxvd1ggPSAnaGlkZGVuJztcbiAgICAgIH1cbiAgICAgIGlmIChzY3JvbGxNb3ZpbmcpIHtcbiAgICAgICAgY29tcG9uZW50U3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGNvbnRhaW5lclByb3BzID0ge307XG4gIGlmIChpc1JUTCkge1xuICAgIGNvbnRhaW5lclByb3BzLmRpciA9ICdydGwnO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgcmVmOiBjb250YWluZXJSZWYsXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZSdcbiAgICB9KSxcbiAgICBjbGFzc05hbWU6IG1lcmdlZENsYXNzTmFtZVxuICB9LCBjb250YWluZXJQcm9wcywgcmVzdFByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVzaXplT2JzZXJ2ZXIsIHtcbiAgICBvblJlc2l6ZTogb25Ib2xkZXJSZXNpemVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCB7XG4gICAgY2xhc3NOYW1lOiBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLWhvbGRlclwiKSxcbiAgICBzdHlsZTogY29tcG9uZW50U3R5bGUsXG4gICAgcmVmOiBjb21wb25lbnRSZWYsXG4gICAgb25TY3JvbGw6IG9uRmFsbGJhY2tTY3JvbGwsXG4gICAgb25Nb3VzZUVudGVyOiBkZWxheUhpZGVTY3JvbGxCYXJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmlsbGVyLCB7XG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgaGVpZ2h0OiBzY3JvbGxIZWlnaHQsXG4gICAgb2Zmc2V0WDogb2Zmc2V0TGVmdCxcbiAgICBvZmZzZXRZOiBmaWxsZXJPZmZzZXQsXG4gICAgc2Nyb2xsV2lkdGg6IHNjcm9sbFdpZHRoLFxuICAgIG9uSW5uZXJSZXNpemU6IGNvbGxlY3RIZWlnaHQsXG4gICAgcmVmOiBmaWxsZXJJbm5lclJlZixcbiAgICBpbm5lclByb3BzOiBpbm5lclByb3BzLFxuICAgIHJ0bDogaXNSVEwsXG4gICAgZXh0cmE6IGV4dHJhQ29udGVudFxuICB9LCBsaXN0Q2hpbGRyZW4pKSksIGluVmlydHVhbCAmJiBzY3JvbGxIZWlnaHQgPiBoZWlnaHQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsQmFyLCB7XG4gICAgcmVmOiB2ZXJ0aWNhbFNjcm9sbEJhclJlZixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBzY3JvbGxPZmZzZXQ6IG9mZnNldFRvcCxcbiAgICBzY3JvbGxSYW5nZTogc2Nyb2xsSGVpZ2h0LFxuICAgIHJ0bDogaXNSVEwsXG4gICAgb25TY3JvbGw6IG9uU2Nyb2xsQmFyLFxuICAgIG9uU3RhcnRNb3ZlOiBvblNjcm9sbGJhclN0YXJ0TW92ZSxcbiAgICBvblN0b3BNb3ZlOiBvblNjcm9sbGJhclN0b3BNb3ZlLFxuICAgIHNwaW5TaXplOiB2ZXJ0aWNhbFNjcm9sbEJhclNwaW5TaXplLFxuICAgIGNvbnRhaW5lclNpemU6IHNpemUuaGVpZ2h0LFxuICAgIHN0eWxlOiBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMudmVydGljYWxTY3JvbGxCYXIsXG4gICAgdGh1bWJTdHlsZTogc3R5bGVzID09PSBudWxsIHx8IHN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGVzLnZlcnRpY2FsU2Nyb2xsQmFyVGh1bWIsXG4gICAgc2hvd1Njcm9sbEJhcjogc2hvd1Njcm9sbEJhclxuICB9KSwgaW5WaXJ0dWFsICYmIHNjcm9sbFdpZHRoID4gc2l6ZS53aWR0aCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxCYXIsIHtcbiAgICByZWY6IGhvcml6b250YWxTY3JvbGxCYXJSZWYsXG4gICAgcHJlZml4Q2xzOiBwcmVmaXhDbHMsXG4gICAgc2Nyb2xsT2Zmc2V0OiBvZmZzZXRMZWZ0LFxuICAgIHNjcm9sbFJhbmdlOiBzY3JvbGxXaWR0aCxcbiAgICBydGw6IGlzUlRMLFxuICAgIG9uU2Nyb2xsOiBvblNjcm9sbEJhcixcbiAgICBvblN0YXJ0TW92ZTogb25TY3JvbGxiYXJTdGFydE1vdmUsXG4gICAgb25TdG9wTW92ZTogb25TY3JvbGxiYXJTdG9wTW92ZSxcbiAgICBzcGluU2l6ZTogaG9yaXpvbnRhbFNjcm9sbEJhclNwaW5TaXplLFxuICAgIGNvbnRhaW5lclNpemU6IHNpemUud2lkdGgsXG4gICAgaG9yaXpvbnRhbDogdHJ1ZSxcbiAgICBzdHlsZTogc3R5bGVzID09PSBudWxsIHx8IHN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGVzLmhvcml6b250YWxTY3JvbGxCYXIsXG4gICAgdGh1bWJTdHlsZTogc3R5bGVzID09PSBudWxsIHx8IHN0eWxlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGVzLmhvcml6b250YWxTY3JvbGxCYXJUaHVtYixcbiAgICBzaG93U2Nyb2xsQmFyOiBzaG93U2Nyb2xsQmFyXG4gIH0pKTtcbn1cbnZhciBMaXN0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoUmF3TGlzdCk7XG5MaXN0LmRpc3BsYXlOYW1lID0gJ0xpc3QnO1xuZXhwb3J0IGRlZmF1bHQgTGlzdDsiLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0UGFnZVhZIH0gZnJvbSBcIi4vaG9va3MvdXNlU2Nyb2xsRHJhZ1wiO1xudmFyIFNjcm9sbEJhciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHZhciBwcmVmaXhDbHMgPSBwcm9wcy5wcmVmaXhDbHMsXG4gICAgcnRsID0gcHJvcHMucnRsLFxuICAgIHNjcm9sbE9mZnNldCA9IHByb3BzLnNjcm9sbE9mZnNldCxcbiAgICBzY3JvbGxSYW5nZSA9IHByb3BzLnNjcm9sbFJhbmdlLFxuICAgIG9uU3RhcnRNb3ZlID0gcHJvcHMub25TdGFydE1vdmUsXG4gICAgb25TdG9wTW92ZSA9IHByb3BzLm9uU3RvcE1vdmUsXG4gICAgb25TY3JvbGwgPSBwcm9wcy5vblNjcm9sbCxcbiAgICBob3Jpem9udGFsID0gcHJvcHMuaG9yaXpvbnRhbCxcbiAgICBzcGluU2l6ZSA9IHByb3BzLnNwaW5TaXplLFxuICAgIGNvbnRhaW5lclNpemUgPSBwcm9wcy5jb250YWluZXJTaXplLFxuICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgcHJvcHNUaHVtYlN0eWxlID0gcHJvcHMudGh1bWJTdHlsZSxcbiAgICBzaG93U2Nyb2xsQmFyID0gcHJvcHMuc2hvd1Njcm9sbEJhcjtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBkcmFnZ2luZyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0RHJhZ2dpbmcgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBwYWdlWFkgPSBfUmVhY3QkdXNlU3RhdGU0WzBdLFxuICAgIHNldFBhZ2VYWSA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIHZhciBfUmVhY3QkdXNlU3RhdGU1ID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgX1JlYWN0JHVzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTUsIDIpLFxuICAgIHN0YXJ0VG9wID0gX1JlYWN0JHVzZVN0YXRlNlswXSxcbiAgICBzZXRTdGFydFRvcCA9IF9SZWFjdCR1c2VTdGF0ZTZbMV07XG4gIHZhciBpc0xUUiA9ICFydGw7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBSZWZzID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHNjcm9sbGJhclJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgdGh1bWJSZWYgPSBSZWFjdC51c2VSZWYoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBWaXNpYmxlID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX1JlYWN0JHVzZVN0YXRlNyA9IFJlYWN0LnVzZVN0YXRlKHNob3dTY3JvbGxCYXIpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTggPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGU3LCAyKSxcbiAgICB2aXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlOFswXSxcbiAgICBzZXRWaXNpYmxlID0gX1JlYWN0JHVzZVN0YXRlOFsxXTtcbiAgdmFyIHZpc2libGVUaW1lb3V0UmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBkZWxheUhpZGRlbiA9IGZ1bmN0aW9uIGRlbGF5SGlkZGVuKCkge1xuICAgIGlmIChzaG93U2Nyb2xsQmFyID09PSB0cnVlIHx8IHNob3dTY3JvbGxCYXIgPT09IGZhbHNlKSByZXR1cm47XG4gICAgY2xlYXJUaW1lb3V0KHZpc2libGVUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgIHNldFZpc2libGUodHJ1ZSk7XG4gICAgdmlzaWJsZVRpbWVvdXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgc2V0VmlzaWJsZShmYWxzZSk7XG4gICAgfSwgMzAwMCk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFJhbmdlID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGVuYWJsZVNjcm9sbFJhbmdlID0gc2Nyb2xsUmFuZ2UgLSBjb250YWluZXJTaXplIHx8IDA7XG4gIHZhciBlbmFibGVPZmZzZXRSYW5nZSA9IGNvbnRhaW5lclNpemUgLSBzcGluU2l6ZSB8fCAwO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gVG9wID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciB0b3AgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2Nyb2xsT2Zmc2V0ID09PSAwIHx8IGVuYWJsZVNjcm9sbFJhbmdlID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgdmFyIHB0ZyA9IHNjcm9sbE9mZnNldCAvIGVuYWJsZVNjcm9sbFJhbmdlO1xuICAgIHJldHVybiBwdGcgKiBlbmFibGVPZmZzZXRSYW5nZTtcbiAgfSwgW3Njcm9sbE9mZnNldCwgZW5hYmxlU2Nyb2xsUmFuZ2UsIGVuYWJsZU9mZnNldFJhbmdlXSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBDb250YWluZXIgPT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIG9uQ29udGFpbmVyTW91c2VEb3duID0gZnVuY3Rpb24gb25Db250YWluZXJNb3VzZURvd24oZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBUaHVtYiA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBzdGF0ZVJlZiA9IFJlYWN0LnVzZVJlZih7XG4gICAgdG9wOiB0b3AsXG4gICAgZHJhZ2dpbmc6IGRyYWdnaW5nLFxuICAgIHBhZ2VZOiBwYWdlWFksXG4gICAgc3RhcnRUb3A6IHN0YXJ0VG9wXG4gIH0pO1xuICBzdGF0ZVJlZi5jdXJyZW50ID0ge1xuICAgIHRvcDogdG9wLFxuICAgIGRyYWdnaW5nOiBkcmFnZ2luZyxcbiAgICBwYWdlWTogcGFnZVhZLFxuICAgIHN0YXJ0VG9wOiBzdGFydFRvcFxuICB9O1xuICB2YXIgb25UaHVtYk1vdXNlRG93biA9IGZ1bmN0aW9uIG9uVGh1bWJNb3VzZURvd24oZSkge1xuICAgIHNldERyYWdnaW5nKHRydWUpO1xuICAgIHNldFBhZ2VYWShnZXRQYWdlWFkoZSwgaG9yaXpvbnRhbCkpO1xuICAgIHNldFN0YXJ0VG9wKHN0YXRlUmVmLmN1cnJlbnQudG9wKTtcbiAgICBvblN0YXJ0TW92ZSgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLy8gUmVhY3QgbWFrZSBldmVudCBhcyBwYXNzaXZlLCBidXQgd2UgbmVlZCB0byBwcmV2ZW50RGVmYXVsdFxuICAvLyBBZGQgZXZlbnQgb24gZG9tIGRpcmVjdGx5IGluc3RlYWQuXG4gIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy85ODA5XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9uU2Nyb2xsYmFyVG91Y2hTdGFydCA9IGZ1bmN0aW9uIG9uU2Nyb2xsYmFyVG91Y2hTdGFydChlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcbiAgICB2YXIgc2Nyb2xsYmFyRWxlID0gc2Nyb2xsYmFyUmVmLmN1cnJlbnQ7XG4gICAgdmFyIHRodW1iRWxlID0gdGh1bWJSZWYuY3VycmVudDtcbiAgICBzY3JvbGxiYXJFbGUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uU2Nyb2xsYmFyVG91Y2hTdGFydCwge1xuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICB0aHVtYkVsZS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25UaHVtYk1vdXNlRG93biwge1xuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgc2Nyb2xsYmFyRWxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblNjcm9sbGJhclRvdWNoU3RhcnQpO1xuICAgICAgdGh1bWJFbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVGh1bWJNb3VzZURvd24pO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICAvLyBQYXNzIHRvIGVmZmVjdFxuICB2YXIgZW5hYmxlU2Nyb2xsUmFuZ2VSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgZW5hYmxlU2Nyb2xsUmFuZ2VSZWYuY3VycmVudCA9IGVuYWJsZVNjcm9sbFJhbmdlO1xuICB2YXIgZW5hYmxlT2Zmc2V0UmFuZ2VSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgZW5hYmxlT2Zmc2V0UmFuZ2VSZWYuY3VycmVudCA9IGVuYWJsZU9mZnNldFJhbmdlO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChkcmFnZ2luZykge1xuICAgICAgdmFyIG1vdmVSYWZJZDtcbiAgICAgIHZhciBvbk1vdXNlTW92ZSA9IGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGUpIHtcbiAgICAgICAgdmFyIF9zdGF0ZVJlZiRjdXJyZW50ID0gc3RhdGVSZWYuY3VycmVudCxcbiAgICAgICAgICBzdGF0ZURyYWdnaW5nID0gX3N0YXRlUmVmJGN1cnJlbnQuZHJhZ2dpbmcsXG4gICAgICAgICAgc3RhdGVQYWdlWSA9IF9zdGF0ZVJlZiRjdXJyZW50LnBhZ2VZLFxuICAgICAgICAgIHN0YXRlU3RhcnRUb3AgPSBfc3RhdGVSZWYkY3VycmVudC5zdGFydFRvcDtcbiAgICAgICAgcmFmLmNhbmNlbChtb3ZlUmFmSWQpO1xuICAgICAgICB2YXIgcmVjdCA9IHNjcm9sbGJhclJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB2YXIgc2NhbGUgPSBjb250YWluZXJTaXplIC8gKGhvcml6b250YWwgPyByZWN0LndpZHRoIDogcmVjdC5oZWlnaHQpO1xuICAgICAgICBpZiAoc3RhdGVEcmFnZ2luZykge1xuICAgICAgICAgIHZhciBvZmZzZXQgPSAoZ2V0UGFnZVhZKGUsIGhvcml6b250YWwpIC0gc3RhdGVQYWdlWSkgKiBzY2FsZTtcbiAgICAgICAgICB2YXIgbmV3VG9wID0gc3RhdGVTdGFydFRvcDtcbiAgICAgICAgICBpZiAoIWlzTFRSICYmIGhvcml6b250YWwpIHtcbiAgICAgICAgICAgIG5ld1RvcCAtPSBvZmZzZXQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld1RvcCArPSBvZmZzZXQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciB0bXBFbmFibGVTY3JvbGxSYW5nZSA9IGVuYWJsZVNjcm9sbFJhbmdlUmVmLmN1cnJlbnQ7XG4gICAgICAgICAgdmFyIHRtcEVuYWJsZU9mZnNldFJhbmdlID0gZW5hYmxlT2Zmc2V0UmFuZ2VSZWYuY3VycmVudDtcbiAgICAgICAgICB2YXIgcHRnID0gdG1wRW5hYmxlT2Zmc2V0UmFuZ2UgPyBuZXdUb3AgLyB0bXBFbmFibGVPZmZzZXRSYW5nZSA6IDA7XG4gICAgICAgICAgdmFyIG5ld1Njcm9sbFRvcCA9IE1hdGguY2VpbChwdGcgKiB0bXBFbmFibGVTY3JvbGxSYW5nZSk7XG4gICAgICAgICAgbmV3U2Nyb2xsVG9wID0gTWF0aC5tYXgobmV3U2Nyb2xsVG9wLCAwKTtcbiAgICAgICAgICBuZXdTY3JvbGxUb3AgPSBNYXRoLm1pbihuZXdTY3JvbGxUb3AsIHRtcEVuYWJsZVNjcm9sbFJhbmdlKTtcbiAgICAgICAgICBtb3ZlUmFmSWQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgb25TY3JvbGwobmV3U2Nyb2xsVG9wLCBob3Jpem9udGFsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBvbk1vdXNlVXAgPSBmdW5jdGlvbiBvbk1vdXNlVXAoKSB7XG4gICAgICAgIHNldERyYWdnaW5nKGZhbHNlKTtcbiAgICAgICAgb25TdG9wTW92ZSgpO1xuICAgICAgfTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwge1xuICAgICAgICBwYXNzaXZlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvbk1vdXNlTW92ZSwge1xuICAgICAgICBwYXNzaXZlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwLCB7XG4gICAgICAgIHBhc3NpdmU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Nb3VzZVVwLCB7XG4gICAgICAgIHBhc3NpdmU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvbk1vdXNlVXApO1xuICAgICAgICByYWYuY2FuY2VsKG1vdmVSYWZJZCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2RyYWdnaW5nXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgZGVsYXlIaWRkZW4oKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHZpc2libGVUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtzY3JvbGxPZmZzZXRdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IEltcGVyYXRpdmUgPT09PT09PT09PT09PT09PT09PT09PVxuICBSZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkZWxheUhpZGRlbjogZGVsYXlIaWRkZW5cbiAgICB9O1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgc2Nyb2xsYmFyUHJlZml4Q2xzID0gXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1zY3JvbGxiYXJcIik7XG4gIHZhciBjb250YWluZXJTdHlsZSA9IHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlID8gbnVsbCA6ICdoaWRkZW4nXG4gIH07XG4gIHZhciB0aHVtYlN0eWxlID0ge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIGJvcmRlclJhZGl1czogOTksXG4gICAgYmFja2dyb3VuZDogJ3ZhcigtLXJjLXZpcnR1YWwtbGlzdC1zY3JvbGxiYXItYmcsIHJnYmEoMCwgMCwgMCwgMC41KSknLFxuICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgIHVzZXJTZWxlY3Q6ICdub25lJ1xuICB9O1xuICBpZiAoaG9yaXpvbnRhbCkge1xuICAgIE9iamVjdC5hc3NpZ24oY29udGFpbmVyU3R5bGUsIHtcbiAgICAgIGhlaWdodDogOCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICByaWdodDogMCxcbiAgICAgIGJvdHRvbTogMFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24odGh1bWJTdHlsZSwgX2RlZmluZVByb3BlcnR5KHtcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgd2lkdGg6IHNwaW5TaXplXG4gICAgfSwgaXNMVFIgPyAnbGVmdCcgOiAncmlnaHQnLCB0b3ApKTtcbiAgfSBlbHNlIHtcbiAgICBPYmplY3QuYXNzaWduKGNvbnRhaW5lclN0eWxlLCBfZGVmaW5lUHJvcGVydHkoe1xuICAgICAgd2lkdGg6IDgsXG4gICAgICB0b3A6IDAsXG4gICAgICBib3R0b206IDBcbiAgICB9LCBpc0xUUiA/ICdyaWdodCcgOiAnbGVmdCcsIDApKTtcbiAgICBPYmplY3QuYXNzaWduKHRodW1iU3R5bGUsIHtcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6IHNwaW5TaXplLFxuICAgICAgdG9wOiB0b3BcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogc2Nyb2xsYmFyUmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhzY3JvbGxiYXJQcmVmaXhDbHMsIF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChzY3JvbGxiYXJQcmVmaXhDbHMsIFwiLWhvcml6b250YWxcIiksIGhvcml6b250YWwpLCBcIlwiLmNvbmNhdChzY3JvbGxiYXJQcmVmaXhDbHMsIFwiLXZlcnRpY2FsXCIpLCAhaG9yaXpvbnRhbCksIFwiXCIuY29uY2F0KHNjcm9sbGJhclByZWZpeENscywgXCItdmlzaWJsZVwiKSwgdmlzaWJsZSkpLFxuICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGNvbnRhaW5lclN0eWxlKSwgc3R5bGUpLFxuICAgIG9uTW91c2VEb3duOiBvbkNvbnRhaW5lck1vdXNlRG93bixcbiAgICBvbk1vdXNlTW92ZTogZGVsYXlIaWRkZW5cbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogdGh1bWJSZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKFwiXCIuY29uY2F0KHNjcm9sbGJhclByZWZpeENscywgXCItdGh1bWJcIiksIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQoc2Nyb2xsYmFyUHJlZml4Q2xzLCBcIi10aHVtYi1tb3ZpbmdcIiksIGRyYWdnaW5nKSksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGh1bWJTdHlsZSksIHByb3BzVGh1bWJTdHlsZSksXG4gICAgb25Nb3VzZURvd246IG9uVGh1bWJNb3VzZURvd25cbiAgfSkpO1xufSk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBTY3JvbGxCYXIuZGlzcGxheU5hbWUgPSAnU2Nyb2xsQmFyJztcbn1cbmV4cG9ydCBkZWZhdWx0IFNjcm9sbEJhcjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBJdGVtIH0gZnJvbSBcIi4uL0l0ZW1cIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUNoaWxkcmVuKGxpc3QsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBzY3JvbGxXaWR0aCwgb2Zmc2V0WCwgc2V0Tm9kZVJlZiwgcmVuZGVyRnVuYywgX3JlZikge1xuICB2YXIgZ2V0S2V5ID0gX3JlZi5nZXRLZXk7XG4gIHJldHVybiBsaXN0LnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4ICsgMSkubWFwKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgIHZhciBlbGVJbmRleCA9IHN0YXJ0SW5kZXggKyBpbmRleDtcbiAgICB2YXIgbm9kZSA9IHJlbmRlckZ1bmMoaXRlbSwgZWxlSW5kZXgsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHdpZHRoOiBzY3JvbGxXaWR0aFxuICAgICAgfSxcbiAgICAgIG9mZnNldFg6IG9mZnNldFhcbiAgICB9KTtcbiAgICB2YXIga2V5ID0gZ2V0S2V5KGl0ZW0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJdGVtLCB7XG4gICAgICBrZXk6IGtleSxcbiAgICAgIHNldFJlZjogZnVuY3Rpb24gc2V0UmVmKGVsZSkge1xuICAgICAgICByZXR1cm4gc2V0Tm9kZVJlZihpdGVtLCBlbGUpO1xuICAgICAgfVxuICAgIH0sIG5vZGUpO1xuICB9KTtcbn0iLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZpbmRMaXN0RGlmZkluZGV4IH0gZnJvbSBcIi4uL3V0aWxzL2FsZ29yaXRobVV0aWxcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZURpZmZJdGVtKGRhdGEsIGdldEtleSwgb25EaWZmKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShkYXRhKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBwcmV2RGF0YSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0UHJldkRhdGEgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlMyA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUzLCAyKSxcbiAgICBkaWZmSXRlbSA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0RGlmZkl0ZW0gPSBfUmVhY3QkdXNlU3RhdGU0WzFdO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBkaWZmID0gZmluZExpc3REaWZmSW5kZXgocHJldkRhdGEgfHwgW10sIGRhdGEgfHwgW10sIGdldEtleSk7XG4gICAgaWYgKChkaWZmID09PSBudWxsIHx8IGRpZmYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRpZmYuaW5kZXgpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9uRGlmZiA9PT0gbnVsbCB8fCBvbkRpZmYgPT09IHZvaWQgMCB8fCBvbkRpZmYoZGlmZi5pbmRleCk7XG4gICAgICBzZXREaWZmSXRlbShkYXRhW2RpZmYuaW5kZXhdKTtcbiAgICB9XG4gICAgc2V0UHJldkRhdGEoZGF0YSk7XG4gIH0sIFtkYXRhXSk7XG4gIHJldHVybiBbZGlmZkl0ZW1dO1xufSIsImltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaXNGRiBmcm9tIFwiLi4vdXRpbHMvaXNGaXJlZm94XCI7XG5pbXBvcnQgdXNlT3JpZ2luU2Nyb2xsIGZyb20gXCIuL3VzZU9yaWdpblNjcm9sbFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRnJhbWVXaGVlbChpblZpcnR1YWwsIGlzU2Nyb2xsQXRUb3AsIGlzU2Nyb2xsQXRCb3R0b20sIGlzU2Nyb2xsQXRMZWZ0LCBpc1Njcm9sbEF0UmlnaHQsIGhvcml6b250YWxTY3JvbGwsXG4vKioqXG4gKiBSZXR1cm4gYHRydWVgIHdoZW4geW91IG5lZWQgdG8gcHJldmVudCBkZWZhdWx0IGV2ZW50XG4gKi9cbm9uV2hlZWxEZWx0YSkge1xuICB2YXIgb2Zmc2V0UmVmID0gdXNlUmVmKDApO1xuICB2YXIgbmV4dEZyYW1lUmVmID0gdXNlUmVmKG51bGwpO1xuXG4gIC8vIEZpcmVmb3ggcGF0Y2hcbiAgdmFyIHdoZWVsVmFsdWVSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBpc01vdXNlU2Nyb2xsUmVmID0gdXNlUmVmKGZhbHNlKTtcblxuICAvLyBTY3JvbGwgc3RhdHVzIHN5bmNcbiAgdmFyIG9yaWdpblNjcm9sbCA9IHVzZU9yaWdpblNjcm9sbChpc1Njcm9sbEF0VG9wLCBpc1Njcm9sbEF0Qm90dG9tLCBpc1Njcm9sbEF0TGVmdCwgaXNTY3JvbGxBdFJpZ2h0KTtcbiAgZnVuY3Rpb24gb25XaGVlbFkoZSwgZGVsdGFZKSB7XG4gICAgcmFmLmNhbmNlbChuZXh0RnJhbWVSZWYuY3VycmVudCk7XG5cbiAgICAvLyBEbyBub3RoaW5nIHdoZW4gc2Nyb2xsIGF0IHRoZSBlZGdlLCBTa2lwIGNoZWNrIHdoZW4gaXMgaW4gc2Nyb2xsXG4gICAgaWYgKG9yaWdpblNjcm9sbChmYWxzZSwgZGVsdGFZKSkgcmV0dXJuO1xuXG4gICAgLy8gU2tpcCBpZiBuZXN0IExpc3QgaGFzIGhhbmRsZWQgdGhpcyBldmVudFxuICAgIHZhciBldmVudCA9IGU7XG4gICAgaWYgKCFldmVudC5fdmlydHVhbEhhbmRsZWQpIHtcbiAgICAgIGV2ZW50Ll92aXJ0dWFsSGFuZGxlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgb2Zmc2V0UmVmLmN1cnJlbnQgKz0gZGVsdGFZO1xuICAgIHdoZWVsVmFsdWVSZWYuY3VycmVudCA9IGRlbHRhWTtcblxuICAgIC8vIFByb3h5IG9mIHNjcm9sbCBldmVudHNcbiAgICBpZiAoIWlzRkYpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIG5leHRGcmFtZVJlZi5jdXJyZW50ID0gcmFmKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFBhdGNoIGEgbXVsdGlwbGUgZm9yIEZpcmVmb3ggdG8gZml4IHdoZWVsIG51bWJlciB0b28gc21hbGxcbiAgICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjYzNzIjaXNzdWVjb21tZW50LTY3OTQ2MDI2NlxuICAgICAgdmFyIHBhdGNoTXVsdGlwbGUgPSBpc01vdXNlU2Nyb2xsUmVmLmN1cnJlbnQgPyAxMCA6IDE7XG4gICAgICBvbldoZWVsRGVsdGEob2Zmc2V0UmVmLmN1cnJlbnQgKiBwYXRjaE11bHRpcGxlLCBmYWxzZSk7XG4gICAgICBvZmZzZXRSZWYuY3VycmVudCA9IDA7XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gb25XaGVlbFgoZXZlbnQsIGRlbHRhWCkge1xuICAgIG9uV2hlZWxEZWx0YShkZWx0YVgsIHRydWUpO1xuICAgIGlmICghaXNGRikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBmb3Igd2hpY2ggZGlyZWN0aW9uIGRvZXMgd2hlZWwgZG8uIGBzeGAgbWVhbnMgYHNoaWZ0ICsgd2hlZWxgXG4gIHZhciB3aGVlbERpcmVjdGlvblJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIHdoZWVsRGlyZWN0aW9uQ2xlYW5SZWYgPSB1c2VSZWYobnVsbCk7XG4gIGZ1bmN0aW9uIG9uV2hlZWwoZXZlbnQpIHtcbiAgICBpZiAoIWluVmlydHVhbCkgcmV0dXJuO1xuXG4gICAgLy8gV2FpdCBmb3IgMiBmcmFtZSB0byBjbGVhbiBkaXJlY3Rpb25cbiAgICByYWYuY2FuY2VsKHdoZWVsRGlyZWN0aW9uQ2xlYW5SZWYuY3VycmVudCk7XG4gICAgd2hlZWxEaXJlY3Rpb25DbGVhblJlZi5jdXJyZW50ID0gcmFmKGZ1bmN0aW9uICgpIHtcbiAgICAgIHdoZWVsRGlyZWN0aW9uUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH0sIDIpO1xuICAgIHZhciBkZWx0YVggPSBldmVudC5kZWx0YVgsXG4gICAgICBkZWx0YVkgPSBldmVudC5kZWx0YVksXG4gICAgICBzaGlmdEtleSA9IGV2ZW50LnNoaWZ0S2V5O1xuICAgIHZhciBtZXJnZWREZWx0YVggPSBkZWx0YVg7XG4gICAgdmFyIG1lcmdlZERlbHRhWSA9IGRlbHRhWTtcbiAgICBpZiAod2hlZWxEaXJlY3Rpb25SZWYuY3VycmVudCA9PT0gJ3N4JyB8fCAhd2hlZWxEaXJlY3Rpb25SZWYuY3VycmVudCAmJiAoc2hpZnRLZXkgfHwgZmFsc2UpICYmIGRlbHRhWSAmJiAhZGVsdGFYKSB7XG4gICAgICBtZXJnZWREZWx0YVggPSBkZWx0YVk7XG4gICAgICBtZXJnZWREZWx0YVkgPSAwO1xuICAgICAgd2hlZWxEaXJlY3Rpb25SZWYuY3VycmVudCA9ICdzeCc7XG4gICAgfVxuICAgIHZhciBhYnNYID0gTWF0aC5hYnMobWVyZ2VkRGVsdGFYKTtcbiAgICB2YXIgYWJzWSA9IE1hdGguYWJzKG1lcmdlZERlbHRhWSk7XG4gICAgaWYgKHdoZWVsRGlyZWN0aW9uUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHdoZWVsRGlyZWN0aW9uUmVmLmN1cnJlbnQgPSBob3Jpem9udGFsU2Nyb2xsICYmIGFic1ggPiBhYnNZID8gJ3gnIDogJ3knO1xuICAgIH1cbiAgICBpZiAod2hlZWxEaXJlY3Rpb25SZWYuY3VycmVudCA9PT0gJ3knKSB7XG4gICAgICBvbldoZWVsWShldmVudCwgbWVyZ2VkRGVsdGFZKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25XaGVlbFgoZXZlbnQsIG1lcmdlZERlbHRhWCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQSBwYXRjaCBmb3IgZmlyZWZveFxuICBmdW5jdGlvbiBvbkZpcmVGb3hTY3JvbGwoZXZlbnQpIHtcbiAgICBpZiAoIWluVmlydHVhbCkgcmV0dXJuO1xuICAgIGlzTW91c2VTY3JvbGxSZWYuY3VycmVudCA9IGV2ZW50LmRldGFpbCA9PT0gd2hlZWxWYWx1ZVJlZi5jdXJyZW50O1xuICB9XG4gIHJldHVybiBbb25XaGVlbCwgb25GaXJlRm94U2Nyb2xsXTtcbn0iLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcblxuLyoqXG4gKiBTaXplIGluZm8gbmVlZCBsb29wIHF1ZXJ5IGZvciB0aGUgYGhlaWdodHNgIHdoaWNoIHdpbGwgaGFzIHRoZSBwZXJmIGlzc3VlLlxuICogTGV0IGNhY2hlIHJlc3VsdCBmb3IgZWFjaCByZW5kZXIgcGhhc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VHZXRTaXplKG1lcmdlZERhdGEsIGdldEtleSwgaGVpZ2h0cywgaXRlbUhlaWdodCkge1xuICB2YXIgX1JlYWN0JHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBbbmV3IE1hcCgpLCBbXV07XG4gICAgfSwgW21lcmdlZERhdGEsIGhlaWdodHMuaWQsIGl0ZW1IZWlnaHRdKSxcbiAgICBfUmVhY3QkdXNlTWVtbzIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlTWVtbywgMiksXG4gICAga2V5MkluZGV4ID0gX1JlYWN0JHVzZU1lbW8yWzBdLFxuICAgIGJvdHRvbUxpc3QgPSBfUmVhY3QkdXNlTWVtbzJbMV07XG4gIHZhciBnZXRTaXplID0gZnVuY3Rpb24gZ2V0U2l6ZShzdGFydEtleSkge1xuICAgIHZhciBlbmRLZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHN0YXJ0S2V5O1xuICAgIC8vIEdldCBmcm9tIGNhY2hlIGZpcnN0XG4gICAgdmFyIHN0YXJ0SW5kZXggPSBrZXkySW5kZXguZ2V0KHN0YXJ0S2V5KTtcbiAgICB2YXIgZW5kSW5kZXggPSBrZXkySW5kZXguZ2V0KGVuZEtleSk7XG5cbiAgICAvLyBMb29wIHRvIGZpbGwgdGhlIGNhY2hlXG4gICAgaWYgKHN0YXJ0SW5kZXggPT09IHVuZGVmaW5lZCB8fCBlbmRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgZGF0YUxlbiA9IG1lcmdlZERhdGEubGVuZ3RoO1xuICAgICAgZm9yICh2YXIgaSA9IGJvdHRvbUxpc3QubGVuZ3RoOyBpIDwgZGF0YUxlbjsgaSArPSAxKSB7XG4gICAgICAgIHZhciBfaGVpZ2h0cyRnZXQ7XG4gICAgICAgIHZhciBpdGVtID0gbWVyZ2VkRGF0YVtpXTtcbiAgICAgICAgdmFyIGtleSA9IGdldEtleShpdGVtKTtcbiAgICAgICAga2V5MkluZGV4LnNldChrZXksIGkpO1xuICAgICAgICB2YXIgY2FjaGVIZWlnaHQgPSAoX2hlaWdodHMkZ2V0ID0gaGVpZ2h0cy5nZXQoa2V5KSkgIT09IG51bGwgJiYgX2hlaWdodHMkZ2V0ICE9PSB2b2lkIDAgPyBfaGVpZ2h0cyRnZXQgOiBpdGVtSGVpZ2h0O1xuICAgICAgICBib3R0b21MaXN0W2ldID0gKGJvdHRvbUxpc3RbaSAtIDFdIHx8IDApICsgY2FjaGVIZWlnaHQ7XG4gICAgICAgIGlmIChrZXkgPT09IHN0YXJ0S2V5KSB7XG4gICAgICAgICAgc3RhcnRJbmRleCA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gZW5kS2V5KSB7XG4gICAgICAgICAgZW5kSW5kZXggPSBpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydEluZGV4ICE9PSB1bmRlZmluZWQgJiYgZW5kSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0b3A6IGJvdHRvbUxpc3Rbc3RhcnRJbmRleCAtIDFdIHx8IDAsXG4gICAgICBib3R0b206IGJvdHRvbUxpc3RbZW5kSW5kZXhdXG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIGdldFNpemU7XG59IiwiaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDYWNoZU1hcCBmcm9tIFwiLi4vdXRpbHMvQ2FjaGVNYXBcIjtcbmZ1bmN0aW9uIHBhcnNlTnVtYmVyKHZhbHVlKSB7XG4gIHZhciBudW0gPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgcmV0dXJuIGlzTmFOKG51bSkgPyAwIDogbnVtO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlSGVpZ2h0cyhnZXRLZXksIG9uSXRlbUFkZCwgb25JdGVtUmVtb3ZlKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSgwKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICB1cGRhdGVkTWFyayA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0VXBkYXRlZE1hcmsgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgaW5zdGFuY2VSZWYgPSB1c2VSZWYobmV3IE1hcCgpKTtcbiAgdmFyIGhlaWdodHNSZWYgPSB1c2VSZWYobmV3IENhY2hlTWFwKCkpO1xuICB2YXIgcHJvbWlzZUlkUmVmID0gdXNlUmVmKDApO1xuICBmdW5jdGlvbiBjYW5jZWxSYWYoKSB7XG4gICAgcHJvbWlzZUlkUmVmLmN1cnJlbnQgKz0gMTtcbiAgfVxuICBmdW5jdGlvbiBjb2xsZWN0SGVpZ2h0KCkge1xuICAgIHZhciBzeW5jID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICBjYW5jZWxSYWYoKTtcbiAgICB2YXIgZG9Db2xsZWN0ID0gZnVuY3Rpb24gZG9Db2xsZWN0KCkge1xuICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIGluc3RhbmNlUmVmLmN1cnJlbnQuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCwga2V5KSB7XG4gICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQub2Zmc2V0UGFyZW50KSB7XG4gICAgICAgICAgdmFyIG9mZnNldEhlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgIHZhciBfZ2V0Q29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCksXG4gICAgICAgICAgICBtYXJnaW5Ub3AgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5Ub3AsXG4gICAgICAgICAgICBtYXJnaW5Cb3R0b20gPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5Cb3R0b207XG4gICAgICAgICAgdmFyIG1hcmdpblRvcE51bSA9IHBhcnNlTnVtYmVyKG1hcmdpblRvcCk7XG4gICAgICAgICAgdmFyIG1hcmdpbkJvdHRvbU51bSA9IHBhcnNlTnVtYmVyKG1hcmdpbkJvdHRvbSk7XG4gICAgICAgICAgdmFyIHRvdGFsSGVpZ2h0ID0gb2Zmc2V0SGVpZ2h0ICsgbWFyZ2luVG9wTnVtICsgbWFyZ2luQm90dG9tTnVtO1xuICAgICAgICAgIGlmIChoZWlnaHRzUmVmLmN1cnJlbnQuZ2V0KGtleSkgIT09IHRvdGFsSGVpZ2h0KSB7XG4gICAgICAgICAgICBoZWlnaHRzUmVmLmN1cnJlbnQuc2V0KGtleSwgdG90YWxIZWlnaHQpO1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQWx3YXlzIHRyaWdnZXIgdXBkYXRlIG1hcmsgdG8gdGVsbCBwYXJlbnQgdGhhdCBzaG91bGQgcmUtY2FsY3VsYXRlIGhlaWdodHMgd2hlbiByZXNpemVkXG4gICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICBzZXRVcGRhdGVkTWFyayhmdW5jdGlvbiAoYykge1xuICAgICAgICAgIHJldHVybiBjICsgMTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoc3luYykge1xuICAgICAgZG9Db2xsZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2VJZFJlZi5jdXJyZW50ICs9IDE7XG4gICAgICB2YXIgaWQgPSBwcm9taXNlSWRSZWYuY3VycmVudDtcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaWQgPT09IHByb21pc2VJZFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgZG9Db2xsZWN0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzZXRJbnN0YW5jZVJlZihpdGVtLCBpbnN0YW5jZSkge1xuICAgIHZhciBrZXkgPSBnZXRLZXkoaXRlbSk7XG4gICAgdmFyIG9yaWdpbiA9IGluc3RhbmNlUmVmLmN1cnJlbnQuZ2V0KGtleSk7XG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBpbnN0YW5jZVJlZi5jdXJyZW50LnNldChrZXksIGluc3RhbmNlKTtcbiAgICAgIGNvbGxlY3RIZWlnaHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2VSZWYuY3VycmVudC5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICAvLyBJbnN0YW5jZSBjaGFuZ2VkXG4gICAgaWYgKCFvcmlnaW4gIT09ICFpbnN0YW5jZSkge1xuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIG9uSXRlbUFkZCA9PT0gbnVsbCB8fCBvbkl0ZW1BZGQgPT09IHZvaWQgMCB8fCBvbkl0ZW1BZGQoaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbkl0ZW1SZW1vdmUgPT09IG51bGwgfHwgb25JdGVtUmVtb3ZlID09PSB2b2lkIDAgfHwgb25JdGVtUmVtb3ZlKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjYW5jZWxSYWY7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIFtzZXRJbnN0YW5jZVJlZiwgY29sbGVjdEhlaWdodCwgaGVpZ2h0c1JlZi5jdXJyZW50LCB1cGRhdGVkTWFya107XG59IiwiaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbnZhciBTTU9PVEhfUFRHID0gMTQgLyAxNTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU1vYmlsZVRvdWNoTW92ZShpblZpcnR1YWwsIGxpc3RSZWYsIGNhbGxiYWNrKSB7XG4gIHZhciB0b3VjaGVkUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgdmFyIHRvdWNoWFJlZiA9IHVzZVJlZigwKTtcbiAgdmFyIHRvdWNoWVJlZiA9IHVzZVJlZigwKTtcbiAgdmFyIGVsZW1lbnRSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgLy8gU21vb3RoIHNjcm9sbFxuICB2YXIgaW50ZXJ2YWxSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgLyogZXNsaW50LWRpc2FibGUgcHJlZmVyLWNvbnN0ICovXG4gIHZhciBjbGVhblVwRXZlbnRzO1xuICB2YXIgb25Ub3VjaE1vdmUgPSBmdW5jdGlvbiBvblRvdWNoTW92ZShlKSB7XG4gICAgaWYgKHRvdWNoZWRSZWYuY3VycmVudCkge1xuICAgICAgdmFyIGN1cnJlbnRYID0gTWF0aC5jZWlsKGUudG91Y2hlc1swXS5wYWdlWCk7XG4gICAgICB2YXIgY3VycmVudFkgPSBNYXRoLmNlaWwoZS50b3VjaGVzWzBdLnBhZ2VZKTtcbiAgICAgIHZhciBvZmZzZXRYID0gdG91Y2hYUmVmLmN1cnJlbnQgLSBjdXJyZW50WDtcbiAgICAgIHZhciBvZmZzZXRZID0gdG91Y2hZUmVmLmN1cnJlbnQgLSBjdXJyZW50WTtcbiAgICAgIHZhciBfaXNIb3Jpem9udGFsID0gTWF0aC5hYnMob2Zmc2V0WCkgPiBNYXRoLmFicyhvZmZzZXRZKTtcbiAgICAgIGlmIChfaXNIb3Jpem9udGFsKSB7XG4gICAgICAgIHRvdWNoWFJlZi5jdXJyZW50ID0gY3VycmVudFg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b3VjaFlSZWYuY3VycmVudCA9IGN1cnJlbnRZO1xuICAgICAgfVxuICAgICAgdmFyIHNjcm9sbEhhbmRsZWQgPSBjYWxsYmFjayhfaXNIb3Jpem9udGFsLCBfaXNIb3Jpem9udGFsID8gb2Zmc2V0WCA6IG9mZnNldFksIGZhbHNlLCBlKTtcbiAgICAgIGlmIChzY3JvbGxIYW5kbGVkKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU21vb3RoIGludGVydmFsXG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsUmVmLmN1cnJlbnQpO1xuICAgICAgaWYgKHNjcm9sbEhhbmRsZWQpIHtcbiAgICAgICAgaW50ZXJ2YWxSZWYuY3VycmVudCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoX2lzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgb2Zmc2V0WCAqPSBTTU9PVEhfUFRHO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvZmZzZXRZICo9IFNNT09USF9QVEc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBvZmZzZXQgPSBNYXRoLmZsb29yKF9pc0hvcml6b250YWwgPyBvZmZzZXRYIDogb2Zmc2V0WSk7XG4gICAgICAgICAgaWYgKCFjYWxsYmFjayhfaXNIb3Jpem9udGFsLCBvZmZzZXQsIHRydWUpIHx8IE1hdGguYWJzKG9mZnNldCkgPD0gMC4xKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsUmVmLmN1cnJlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTYpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdmFyIG9uVG91Y2hFbmQgPSBmdW5jdGlvbiBvblRvdWNoRW5kKCkge1xuICAgIHRvdWNoZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIGNsZWFuVXBFdmVudHMoKTtcbiAgfTtcbiAgdmFyIG9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uIG9uVG91Y2hTdGFydChlKSB7XG4gICAgY2xlYW5VcEV2ZW50cygpO1xuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID09PSAxICYmICF0b3VjaGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIHRvdWNoZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICB0b3VjaFhSZWYuY3VycmVudCA9IE1hdGguY2VpbChlLnRvdWNoZXNbMF0ucGFnZVgpO1xuICAgICAgdG91Y2hZUmVmLmN1cnJlbnQgPSBNYXRoLmNlaWwoZS50b3VjaGVzWzBdLnBhZ2VZKTtcbiAgICAgIGVsZW1lbnRSZWYuY3VycmVudCA9IGUudGFyZ2V0O1xuICAgICAgZWxlbWVudFJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlLCB7XG4gICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIGVsZW1lbnRSZWYuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVG91Y2hFbmQsIHtcbiAgICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBjbGVhblVwRXZlbnRzID0gZnVuY3Rpb24gY2xlYW5VcEV2ZW50cygpIHtcbiAgICBpZiAoZWxlbWVudFJlZi5jdXJyZW50KSB7XG4gICAgICBlbGVtZW50UmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUpO1xuICAgICAgZWxlbWVudFJlZi5jdXJyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCk7XG4gICAgfVxuICB9O1xuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpblZpcnR1YWwpIHtcbiAgICAgIGxpc3RSZWYuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCB7XG4gICAgICAgIHBhc3NpdmU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9saXN0UmVmJGN1cnJlbnQ7XG4gICAgICAoX2xpc3RSZWYkY3VycmVudCA9IGxpc3RSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2xpc3RSZWYkY3VycmVudCA9PT0gdm9pZCAwIHx8IF9saXN0UmVmJGN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCk7XG4gICAgICBjbGVhblVwRXZlbnRzKCk7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsUmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtpblZpcnR1YWxdKTtcbn0iLCJpbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKGlzU2Nyb2xsQXRUb3AsIGlzU2Nyb2xsQXRCb3R0b20sIGlzU2Nyb2xsQXRMZWZ0LCBpc1Njcm9sbEF0UmlnaHQpIHtcbiAgLy8gRG8gbG9jayBmb3IgYSB3aGVlbCB3aGVuIHNjcm9sbGluZ1xuICB2YXIgbG9ja1JlZiA9IHVzZVJlZihmYWxzZSk7XG4gIHZhciBsb2NrVGltZW91dFJlZiA9IHVzZVJlZihudWxsKTtcbiAgZnVuY3Rpb24gbG9ja1Njcm9sbCgpIHtcbiAgICBjbGVhclRpbWVvdXQobG9ja1RpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgbG9ja1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICBsb2NrVGltZW91dFJlZi5jdXJyZW50ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBsb2NrUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9LCA1MCk7XG4gIH1cblxuICAvLyBQYXNzIHRvIHJlZiBzaW5jZSBnbG9iYWwgYWRkIGlzIGluIGNsb3N1cmVcbiAgdmFyIHNjcm9sbFBpbmdSZWYgPSB1c2VSZWYoe1xuICAgIHRvcDogaXNTY3JvbGxBdFRvcCxcbiAgICBib3R0b206IGlzU2Nyb2xsQXRCb3R0b20sXG4gICAgbGVmdDogaXNTY3JvbGxBdExlZnQsXG4gICAgcmlnaHQ6IGlzU2Nyb2xsQXRSaWdodFxuICB9KTtcbiAgc2Nyb2xsUGluZ1JlZi5jdXJyZW50LnRvcCA9IGlzU2Nyb2xsQXRUb3A7XG4gIHNjcm9sbFBpbmdSZWYuY3VycmVudC5ib3R0b20gPSBpc1Njcm9sbEF0Qm90dG9tO1xuICBzY3JvbGxQaW5nUmVmLmN1cnJlbnQubGVmdCA9IGlzU2Nyb2xsQXRMZWZ0O1xuICBzY3JvbGxQaW5nUmVmLmN1cnJlbnQucmlnaHQgPSBpc1Njcm9sbEF0UmlnaHQ7XG4gIHJldHVybiBmdW5jdGlvbiAoaXNIb3Jpem9udGFsLCBkZWx0YSkge1xuICAgIHZhciBzbW9vdGhPZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICAgIHZhciBvcmlnaW5TY3JvbGwgPSBpc0hvcml6b250YWwgP1xuICAgIC8vIFBhc3Mgb3JpZ2luIHdoZWVsIHdoZW4gb24gdGhlIGxlZnRcbiAgICBkZWx0YSA8IDAgJiYgc2Nyb2xsUGluZ1JlZi5jdXJyZW50LmxlZnQgfHxcbiAgICAvLyBQYXNzIG9yaWdpbiB3aGVlbCB3aGVuIG9uIHRoZSByaWdodFxuICAgIGRlbHRhID4gMCAmJiBzY3JvbGxQaW5nUmVmLmN1cnJlbnQucmlnaHQgLy8gUGFzcyBvcmlnaW4gd2hlZWwgd2hlbiBvbiB0aGUgdG9wXG4gICAgOiBkZWx0YSA8IDAgJiYgc2Nyb2xsUGluZ1JlZi5jdXJyZW50LnRvcCB8fFxuICAgIC8vIFBhc3Mgb3JpZ2luIHdoZWVsIHdoZW4gb24gdGhlIGJvdHRvbVxuICAgIGRlbHRhID4gMCAmJiBzY3JvbGxQaW5nUmVmLmN1cnJlbnQuYm90dG9tO1xuICAgIGlmIChzbW9vdGhPZmZzZXQgJiYgb3JpZ2luU2Nyb2xsKSB7XG4gICAgICAvLyBObyBuZWVkIGxvY2sgYW55bW9yZSB3aGVuIGl0J3Mgc21vb3RoIG9mZnNldCBmcm9tIHRvdWNoTW92ZSBpbnRlcnZhbFxuICAgICAgY2xlYXJUaW1lb3V0KGxvY2tUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgbG9ja1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICghb3JpZ2luU2Nyb2xsIHx8IGxvY2tSZWYuY3VycmVudCkge1xuICAgICAgbG9ja1Njcm9sbCgpO1xuICAgIH1cbiAgICByZXR1cm4gIWxvY2tSZWYuY3VycmVudCAmJiBvcmlnaW5TY3JvbGw7XG4gIH07XG59KTsiLCJpbXBvcnQgcmFmIGZyb20gXCJyYy11dGlsL2VzL3JhZlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZnVuY3Rpb24gc21vb3RoU2Nyb2xsT2Zmc2V0KG9mZnNldCkge1xuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnBvdyhvZmZzZXQsIDAuNSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhZ2VYWShlLCBob3Jpem9udGFsKSB7XG4gIHZhciBvYmogPSAndG91Y2hlcycgaW4gZSA/IGUudG91Y2hlc1swXSA6IGU7XG4gIHJldHVybiBvYmpbaG9yaXpvbnRhbCA/ICdwYWdlWCcgOiAncGFnZVknXSAtIHdpbmRvd1tob3Jpem9udGFsID8gJ3Njcm9sbFgnIDogJ3Njcm9sbFknXTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVNjcm9sbERyYWcoaW5WaXJ0dWFsLCBjb21wb25lbnRSZWYsIG9uU2Nyb2xsT2Zmc2V0KSB7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVsZSA9IGNvbXBvbmVudFJlZi5jdXJyZW50O1xuICAgIGlmIChpblZpcnR1YWwgJiYgZWxlKSB7XG4gICAgICB2YXIgbW91c2VEb3duTG9jayA9IGZhbHNlO1xuICAgICAgdmFyIHJhZklkO1xuICAgICAgdmFyIF9vZmZzZXQ7XG4gICAgICB2YXIgc3RvcFNjcm9sbCA9IGZ1bmN0aW9uIHN0b3BTY3JvbGwoKSB7XG4gICAgICAgIHJhZi5jYW5jZWwocmFmSWQpO1xuICAgICAgfTtcbiAgICAgIHZhciBjb250aW51ZVNjcm9sbCA9IGZ1bmN0aW9uIGNvbnRpbnVlU2Nyb2xsKCkge1xuICAgICAgICBzdG9wU2Nyb2xsKCk7XG4gICAgICAgIHJhZklkID0gcmFmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBvblNjcm9sbE9mZnNldChfb2Zmc2V0KTtcbiAgICAgICAgICBjb250aW51ZVNjcm9sbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICB2YXIgb25Nb3VzZURvd24gPSBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7XG4gICAgICAgIC8vIFNraXAgaWYgZWxlbWVudCBzZXQgZHJhZ2dhYmxlXG4gICAgICAgIGlmIChlLnRhcmdldC5kcmFnZ2FibGUgfHwgZS5idXR0b24gIT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2tpcCBpZiBuZXN0IExpc3QgaGFzIGhhbmRsZWQgdGhpcyBldmVudFxuICAgICAgICB2YXIgZXZlbnQgPSBlO1xuICAgICAgICBpZiAoIWV2ZW50Ll92aXJ0dWFsSGFuZGxlZCkge1xuICAgICAgICAgIGV2ZW50Ll92aXJ0dWFsSGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgbW91c2VEb3duTG9jayA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgb25Nb3VzZVVwID0gZnVuY3Rpb24gb25Nb3VzZVVwKCkge1xuICAgICAgICBtb3VzZURvd25Mb2NrID0gZmFsc2U7XG4gICAgICAgIHN0b3BTY3JvbGwoKTtcbiAgICAgIH07XG4gICAgICB2YXIgb25Nb3VzZU1vdmUgPSBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgICAgIGlmIChtb3VzZURvd25Mb2NrKSB7XG4gICAgICAgICAgdmFyIG1vdXNlWSA9IGdldFBhZ2VYWShlLCBmYWxzZSk7XG4gICAgICAgICAgdmFyIF9lbGUkZ2V0Qm91bmRpbmdDbGllbiA9IGVsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgIHRvcCA9IF9lbGUkZ2V0Qm91bmRpbmdDbGllbi50b3AsXG4gICAgICAgICAgICBib3R0b20gPSBfZWxlJGdldEJvdW5kaW5nQ2xpZW4uYm90dG9tO1xuICAgICAgICAgIGlmIChtb3VzZVkgPD0gdG9wKSB7XG4gICAgICAgICAgICB2YXIgZGlmZiA9IHRvcCAtIG1vdXNlWTtcbiAgICAgICAgICAgIF9vZmZzZXQgPSAtc21vb3RoU2Nyb2xsT2Zmc2V0KGRpZmYpO1xuICAgICAgICAgICAgY29udGludWVTY3JvbGwoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG1vdXNlWSA+PSBib3R0b20pIHtcbiAgICAgICAgICAgIHZhciBfZGlmZiA9IG1vdXNlWSAtIGJvdHRvbTtcbiAgICAgICAgICAgIF9vZmZzZXQgPSBzbW9vdGhTY3JvbGxPZmZzZXQoX2RpZmYpO1xuICAgICAgICAgICAgY29udGludWVTY3JvbGwoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RvcFNjcm9sbCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGVsZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICBlbGUub3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgIGVsZS5vd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGVsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICAgIGVsZS5vd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICBlbGUub3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIHN0b3BTY3JvbGwoKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbaW5WaXJ0dWFsXSk7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDJcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0IHsgd2FybmluZyB9IGZyb20gJ3JjLXV0aWwnO1xudmFyIE1BWF9USU1FUyA9IDEwO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlU2Nyb2xsVG8oY29udGFpbmVyUmVmLCBkYXRhLCBoZWlnaHRzLCBpdGVtSGVpZ2h0LCBnZXRLZXksIGNvbGxlY3RIZWlnaHQsIHN5bmNTY3JvbGxUb3AsIHRyaWdnZXJGbGFzaCkge1xuICB2YXIgc2Nyb2xsUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICBzeW5jU3RhdGUgPSBfUmVhY3QkdXNlU3RhdGUyWzBdLFxuICAgIHNldFN5bmNTdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gU3luYyBTY3JvbGwgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc3luY1N0YXRlICYmIHN5bmNTdGF0ZS50aW1lcyA8IE1BWF9USU1FUykge1xuICAgICAgLy8gTmV2ZXIgcmVhY2hcbiAgICAgIGlmICghY29udGFpbmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgc2V0U3luY1N0YXRlKGZ1bmN0aW9uIChvcmkpIHtcbiAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgb3JpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbGxlY3RIZWlnaHQoKTtcbiAgICAgIHZhciB0YXJnZXRBbGlnbiA9IHN5bmNTdGF0ZS50YXJnZXRBbGlnbixcbiAgICAgICAgb3JpZ2luQWxpZ24gPSBzeW5jU3RhdGUub3JpZ2luQWxpZ24sXG4gICAgICAgIGluZGV4ID0gc3luY1N0YXRlLmluZGV4LFxuICAgICAgICBvZmZzZXQgPSBzeW5jU3RhdGUub2Zmc2V0O1xuICAgICAgdmFyIGhlaWdodCA9IGNvbnRhaW5lclJlZi5jdXJyZW50LmNsaWVudEhlaWdodDtcbiAgICAgIHZhciBuZWVkQ29sbGVjdEhlaWdodCA9IGZhbHNlO1xuICAgICAgdmFyIG5ld1RhcmdldEFsaWduID0gdGFyZ2V0QWxpZ247XG4gICAgICB2YXIgdGFyZ2V0VG9wID0gbnVsbDtcblxuICAgICAgLy8gR28gdG8gbmV4dCBmcmFtZSBpZiBoZWlnaHQgbm90IGV4aXN0XG4gICAgICBpZiAoaGVpZ2h0KSB7XG4gICAgICAgIHZhciBtZXJnZWRBbGlnbiA9IHRhcmdldEFsaWduIHx8IG9yaWdpbkFsaWduO1xuXG4gICAgICAgIC8vIEdldCB0b3AgJiBib3R0b21cbiAgICAgICAgdmFyIHN0YWNrVG9wID0gMDtcbiAgICAgICAgdmFyIGl0ZW1Ub3AgPSAwO1xuICAgICAgICB2YXIgaXRlbUJvdHRvbSA9IDA7XG4gICAgICAgIHZhciBtYXhMZW4gPSBNYXRoLm1pbihkYXRhLmxlbmd0aCAtIDEsIGluZGV4KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gbWF4TGVuOyBpICs9IDEpIHtcbiAgICAgICAgICB2YXIga2V5ID0gZ2V0S2V5KGRhdGFbaV0pO1xuICAgICAgICAgIGl0ZW1Ub3AgPSBzdGFja1RvcDtcbiAgICAgICAgICB2YXIgY2FjaGVIZWlnaHQgPSBoZWlnaHRzLmdldChrZXkpO1xuICAgICAgICAgIGl0ZW1Cb3R0b20gPSBpdGVtVG9wICsgKGNhY2hlSGVpZ2h0ID09PSB1bmRlZmluZWQgPyBpdGVtSGVpZ2h0IDogY2FjaGVIZWlnaHQpO1xuICAgICAgICAgIHN0YWNrVG9wID0gaXRlbUJvdHRvbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIG5lZWQgc3luYyBoZWlnaHQgKHZpc2libGUgcmFuZ2UgaGFzIGl0ZW0gbm90IHJlY29yZCBoZWlnaHQpXG4gICAgICAgIHZhciBsZWZ0SGVpZ2h0ID0gbWVyZ2VkQWxpZ24gPT09ICd0b3AnID8gb2Zmc2V0IDogaGVpZ2h0IC0gb2Zmc2V0O1xuICAgICAgICBmb3IgKHZhciBfaSA9IG1heExlbjsgX2kgPj0gMDsgX2kgLT0gMSkge1xuICAgICAgICAgIHZhciBfa2V5ID0gZ2V0S2V5KGRhdGFbX2ldKTtcbiAgICAgICAgICB2YXIgX2NhY2hlSGVpZ2h0ID0gaGVpZ2h0cy5nZXQoX2tleSk7XG4gICAgICAgICAgaWYgKF9jYWNoZUhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBuZWVkQ29sbGVjdEhlaWdodCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgbGVmdEhlaWdodCAtPSBfY2FjaGVIZWlnaHQ7XG4gICAgICAgICAgaWYgKGxlZnRIZWlnaHQgPD0gMCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2Nyb2xsIHRvXG4gICAgICAgIHN3aXRjaCAobWVyZ2VkQWxpZ24pIHtcbiAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgdGFyZ2V0VG9wID0gaXRlbVRvcCAtIG9mZnNldDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICB0YXJnZXRUb3AgPSBpdGVtQm90dG9tIC0gaGVpZ2h0ICsgb2Zmc2V0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIHNjcm9sbFRvcCA9IGNvbnRhaW5lclJlZi5jdXJyZW50LnNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgdmFyIHNjcm9sbEJvdHRvbSA9IHNjcm9sbFRvcCArIGhlaWdodDtcbiAgICAgICAgICAgICAgaWYgKGl0ZW1Ub3AgPCBzY3JvbGxUb3ApIHtcbiAgICAgICAgICAgICAgICBuZXdUYXJnZXRBbGlnbiA9ICd0b3AnO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW1Cb3R0b20gPiBzY3JvbGxCb3R0b20pIHtcbiAgICAgICAgICAgICAgICBuZXdUYXJnZXRBbGlnbiA9ICdib3R0b20nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldFRvcCAhPT0gbnVsbCkge1xuICAgICAgICAgIHN5bmNTY3JvbGxUb3AodGFyZ2V0VG9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9uZSBtb3JlIHRpbWUgZm9yIHN5bmNcbiAgICAgICAgaWYgKHRhcmdldFRvcCAhPT0gc3luY1N0YXRlLmxhc3RUb3ApIHtcbiAgICAgICAgICBuZWVkQ29sbGVjdEhlaWdodCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVHJpZ2dlciBuZXh0IGVmZmVjdFxuICAgICAgaWYgKG5lZWRDb2xsZWN0SGVpZ2h0KSB7XG4gICAgICAgIHNldFN5bmNTdGF0ZShfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN5bmNTdGF0ZSksIHt9LCB7XG4gICAgICAgICAgdGltZXM6IHN5bmNTdGF0ZS50aW1lcyArIDEsXG4gICAgICAgICAgdGFyZ2V0QWxpZ246IG5ld1RhcmdldEFsaWduLFxuICAgICAgICAgIGxhc3RUb3A6IHRhcmdldFRvcFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIChzeW5jU3RhdGUgPT09IG51bGwgfHwgc3luY1N0YXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzeW5jU3RhdGUudGltZXMpID09PSBNQVhfVElNRVMpIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsICdTZWVtcyBgc2Nyb2xsVG9gIHdpdGggYHJjLXZpcnR1YWwtbGlzdGAgcmVhY2ggdGhlIG1heCBsaW1pdGF0aW9uLiBQbGVhc2UgZmlyZSBpc3N1ZSBmb3IgdXMuIFRoYW5rcy4nKTtcbiAgICB9XG4gIH0sIFtzeW5jU3RhdGUsIGNvbnRhaW5lclJlZi5jdXJyZW50XSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09IFNjcm9sbCBUbyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAvLyBXaGVuIG5vdCBhcmd1bWVudCBwcm92aWRlZCwgd2UgdGhpbmsgZGV2IG1heSB3YW50IHRvIHNob3cgdGhlIHNjcm9sbGJhclxuICAgIGlmIChhcmcgPT09IG51bGwgfHwgYXJnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyaWdnZXJGbGFzaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE5vcm1hbCBzY3JvbGwgbG9naWNcbiAgICByYWYuY2FuY2VsKHNjcm9sbFJlZi5jdXJyZW50KTtcbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHN5bmNTY3JvbGxUb3AoYXJnKTtcbiAgICB9IGVsc2UgaWYgKGFyZyAmJiBfdHlwZW9mKGFyZykgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgaW5kZXg7XG4gICAgICB2YXIgYWxpZ24gPSBhcmcuYWxpZ247XG4gICAgICBpZiAoJ2luZGV4JyBpbiBhcmcpIHtcbiAgICAgICAgaW5kZXggPSBhcmcuaW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmRleCA9IGRhdGEuZmluZEluZGV4KGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGdldEtleShpdGVtKSA9PT0gYXJnLmtleTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB2YXIgX2FyZyRvZmZzZXQgPSBhcmcub2Zmc2V0LFxuICAgICAgICBvZmZzZXQgPSBfYXJnJG9mZnNldCA9PT0gdm9pZCAwID8gMCA6IF9hcmckb2Zmc2V0O1xuICAgICAgc2V0U3luY1N0YXRlKHtcbiAgICAgICAgdGltZXM6IDAsXG4gICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgICAgIG9yaWdpbkFsaWduOiBhbGlnblxuICAgICAgfSk7XG4gICAgfVxuICB9O1xufSIsImltcG9ydCBMaXN0IGZyb20gXCIuL0xpc3RcIjtcbmV4cG9ydCBkZWZhdWx0IExpc3Q7IiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuLy8gRmlyZWZveCBoYXMgbG93IHBlcmZvcm1hbmNlIG9mIG1hcC5cbnZhciBDYWNoZU1hcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENhY2hlTWFwKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDYWNoZU1hcCk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwibWFwc1wiLCB2b2lkIDApO1xuICAgIC8vIFVzZWQgZm9yIGNhY2hlIGtleVxuICAgIC8vIGB1c2VNZW1vYCBubyBuZWVkIHRvIHVwZGF0ZSBpZiBgaWRgIG5vdCBjaGFuZ2VcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJpZFwiLCAwKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJkaWZmUmVjb3Jkc1wiLCBuZXcgTWFwKCkpO1xuICAgIHRoaXMubWFwcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKENhY2hlTWFwLCBbe1xuICAgIGtleTogXCJzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIC8vIFJlY29yZCBwcmV2IHZhbHVlXG4gICAgICB0aGlzLmRpZmZSZWNvcmRzLnNldChrZXksIHRoaXMubWFwc1trZXldKTtcbiAgICAgIHRoaXMubWFwc1trZXldID0gdmFsdWU7XG4gICAgICB0aGlzLmlkICs9IDE7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXBzW2tleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FjaGVNYXAgd2lsbCByZWNvcmQgdGhlIGtleSBjaGFuZ2VkLlxuICAgICAqIFRvIGhlbHAgdG8ga25vdyB3aGF0J3MgdXBkYXRlIGluIHRoZSBuZXh0IHJlbmRlci5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJyZXNldFJlY29yZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldFJlY29yZCgpIHtcbiAgICAgIHRoaXMuZGlmZlJlY29yZHMuY2xlYXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UmVjb3JkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJlY29yZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpZmZSZWNvcmRzO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQ2FjaGVNYXA7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBDYWNoZU1hcDsiLCIvKipcbiAqIEdldCBpbmRleCB3aXRoIHNwZWNpZmljIHN0YXJ0IGluZGV4IG9uZSBieSBvbmUuIGUuZy5cbiAqIG1pbjogMywgbWF4OiA5LCBzdGFydDogNlxuICpcbiAqIFJldHVybiBpbmRleCBpczpcbiAqIFswXTogNlxuICogWzFdOiA3XG4gKiBbMl06IDVcbiAqIFszXTogOFxuICogWzRdOiA0XG4gKiBbNV06IDlcbiAqIFs2XTogM1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXhCeVN0YXJ0TG9jKG1pbiwgbWF4LCBzdGFydCwgaW5kZXgpIHtcbiAgdmFyIGJlZm9yZUNvdW50ID0gc3RhcnQgLSBtaW47XG4gIHZhciBhZnRlckNvdW50ID0gbWF4IC0gc3RhcnQ7XG4gIHZhciBiYWxhbmNlQ291bnQgPSBNYXRoLm1pbihiZWZvcmVDb3VudCwgYWZ0ZXJDb3VudCkgKiAyO1xuXG4gIC8vIEJhbGFuY2VcbiAgaWYgKGluZGV4IDw9IGJhbGFuY2VDb3VudCkge1xuICAgIHZhciBzdGVwSW5kZXggPSBNYXRoLmZsb29yKGluZGV4IC8gMik7XG4gICAgaWYgKGluZGV4ICUgMikge1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgc3RlcEluZGV4ICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0IC0gc3RlcEluZGV4O1xuICB9XG5cbiAgLy8gT25lIGlzIG91dCBvZiByYW5nZVxuICBpZiAoYmVmb3JlQ291bnQgPiBhZnRlckNvdW50KSB7XG4gICAgcmV0dXJuIHN0YXJ0IC0gKGluZGV4IC0gYWZ0ZXJDb3VudCk7XG4gIH1cbiAgcmV0dXJuIHN0YXJ0ICsgKGluZGV4IC0gYmVmb3JlQ291bnQpO1xufVxuXG4vKipcbiAqIFdlIGFzc3VtZSB0aGF0IDIgbGlzdCBoYXMgb25seSAxIGl0ZW0gZGlmZiBhbmQgb3RoZXJzIGtlZXBpbmcgdGhlIG9yZGVyLlxuICogU28gd2UgY2FuIHVzZSBkaWNob3RvbXkgYWxnb3JpdGhtIHRvIGZpbmQgY2hhbmdlZCBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGlzdERpZmZJbmRleChvcmlnaW5MaXN0LCB0YXJnZXRMaXN0LCBnZXRLZXkpIHtcbiAgdmFyIG9yaWdpbkxlbiA9IG9yaWdpbkxpc3QubGVuZ3RoO1xuICB2YXIgdGFyZ2V0TGVuID0gdGFyZ2V0TGlzdC5sZW5ndGg7XG4gIHZhciBzaG9ydExpc3Q7XG4gIHZhciBsb25nTGlzdDtcbiAgaWYgKG9yaWdpbkxlbiA9PT0gMCAmJiB0YXJnZXRMZW4gPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAob3JpZ2luTGVuIDwgdGFyZ2V0TGVuKSB7XG4gICAgc2hvcnRMaXN0ID0gb3JpZ2luTGlzdDtcbiAgICBsb25nTGlzdCA9IHRhcmdldExpc3Q7XG4gIH0gZWxzZSB7XG4gICAgc2hvcnRMaXN0ID0gdGFyZ2V0TGlzdDtcbiAgICBsb25nTGlzdCA9IG9yaWdpbkxpc3Q7XG4gIH1cbiAgdmFyIG5vdEV4aXN0S2V5ID0ge1xuICAgIF9fRU1QVFlfSVRFTV9fOiB0cnVlXG4gIH07XG4gIGZ1bmN0aW9uIGdldEl0ZW1LZXkoaXRlbSkge1xuICAgIGlmIChpdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBnZXRLZXkoaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBub3RFeGlzdEtleTtcbiAgfVxuXG4gIC8vIExvb3AgdG8gZmluZCBkaWZmIG9uZVxuICB2YXIgZGlmZkluZGV4ID0gbnVsbDtcbiAgdmFyIG11bHRpcGxlID0gTWF0aC5hYnMob3JpZ2luTGVuIC0gdGFyZ2V0TGVuKSAhPT0gMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb25nTGlzdC5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHZhciBzaG9ydEtleSA9IGdldEl0ZW1LZXkoc2hvcnRMaXN0W2ldKTtcbiAgICB2YXIgbG9uZ0tleSA9IGdldEl0ZW1LZXkobG9uZ0xpc3RbaV0pO1xuICAgIGlmIChzaG9ydEtleSAhPT0gbG9uZ0tleSkge1xuICAgICAgZGlmZkluZGV4ID0gaTtcbiAgICAgIG11bHRpcGxlID0gbXVsdGlwbGUgfHwgc2hvcnRLZXkgIT09IGdldEl0ZW1LZXkobG9uZ0xpc3RbaSArIDFdKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGlmZkluZGV4ID09PSBudWxsID8gbnVsbCA6IHtcbiAgICBpbmRleDogZGlmZkluZGV4LFxuICAgIG11bHRpcGxlOiBtdWx0aXBsZVxuICB9O1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbnZhciBpc0ZGID0gKHR5cGVvZiBuYXZpZ2F0b3IgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihuYXZpZ2F0b3IpKSA9PT0gJ29iamVjdCcgJiYgL0ZpcmVmb3gvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuZXhwb3J0IGRlZmF1bHQgaXNGRjsiLCJ2YXIgTUlOX1NJWkUgPSAyMDtcbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGluU2l6ZSgpIHtcbiAgdmFyIGNvbnRhaW5lclNpemUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDA7XG4gIHZhciBzY3JvbGxSYW5nZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIGJhc2VTaXplID0gY29udGFpbmVyU2l6ZSAvIHNjcm9sbFJhbmdlICogY29udGFpbmVyU2l6ZTtcbiAgaWYgKGlzTmFOKGJhc2VTaXplKSkge1xuICAgIGJhc2VTaXplID0gMDtcbiAgfVxuICBiYXNlU2l6ZSA9IE1hdGgubWF4KGJhc2VTaXplLCBNSU5fU0laRSk7XG4gIHJldHVybiBNYXRoLmZsb29yKGJhc2VTaXplKTtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=