silika-website/wwwroot/assets/vendor/js/menu.js

78 lines
139 KiB
JavaScript

/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else {
var a = factory();
for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
}
})(self, function() {
return /******/ (function() { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ "./js/menu.js":
/*!********************!*\
!*** ./js/menu.js ***!
\********************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Menu\": function() { return /* binding */ Menu; }\n/* harmony export */ });\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter); }\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nvar TRANSITION_EVENTS = ['transitionend', 'webkitTransitionEnd', 'oTransitionEnd'];\n// const TRANSITION_PROPERTIES = ['transition', 'MozTransition', 'webkitTransition', 'WebkitTransition', 'OTransition']\nvar DELTA = 5;\nvar Menu = /*#__PURE__*/function () {\n function Menu(el) {\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _PS = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n _classCallCheck(this, Menu);\n this._el = el;\n this._horizontal = config.orientation === 'horizontal';\n this._animate = config.animate !== false;\n this._accordion = config.accordion !== false;\n this._showDropdownOnHover = Boolean(config.showDropdownOnHover);\n this._closeChildren = Boolean(config.closeChildren);\n this._rtl = document.documentElement.getAttribute('dir') === 'rtl' || document.body.getAttribute('dir') === 'rtl';\n this._onOpen = config.onOpen || function () {};\n this._onOpened = config.onOpened || function () {};\n this._onClose = config.onClose || function () {};\n this._onClosed = config.onClosed || function () {};\n this._psScroll = null;\n this._topParent = null;\n this._menuBgClass = null;\n el.classList.add('menu');\n el.classList[this._animate ? 'remove' : 'add']('menu-no-animation');\n if (!this._horizontal) {\n el.classList.add('menu-vertical');\n el.classList.remove('menu-horizontal');\n var PerfectScrollbarLib = _PS || window.PerfectScrollbar;\n if (PerfectScrollbarLib) {\n this._scrollbar = new PerfectScrollbarLib(el.querySelector('.menu-inner'), {\n suppressScrollX: true,\n wheelPropagation: !Menu._hasClass('layout-menu-fixed layout-menu-fixed-offcanvas')\n });\n window.Helpers.menuPsScroll = this._scrollbar;\n } else {\n el.querySelector('.menu-inner').classList.add('overflow-auto');\n }\n } else {\n el.classList.add('menu-horizontal');\n el.classList.remove('menu-vertical');\n this._inner = el.querySelector('.menu-inner');\n var container = this._inner.parentNode;\n this._prevBtn = el.querySelector('.menu-horizontal-prev');\n if (!this._prevBtn) {\n this._prevBtn = document.createElement('a');\n this._prevBtn.href = '#';\n this._prevBtn.className = 'menu-horizontal-prev';\n container.appendChild(this._prevBtn);\n }\n this._wrapper = el.querySelector('.menu-horizontal-wrapper');\n if (!this._wrapper) {\n this._wrapper = document.createElement('div');\n this._wrapper.className = 'menu-horizontal-wrapper';\n this._wrapper.appendChild(this._inner);\n container.appendChild(this._wrapper);\n }\n this._nextBtn = el.querySelector('.menu-horizontal-next');\n if (!this._nextBtn) {\n this._nextBtn = document.createElement('a');\n this._nextBtn.href = '#';\n this._nextBtn.className = 'menu-horizontal-next';\n container.appendChild(this._nextBtn);\n }\n this._innerPosition = 0;\n this.update();\n }\n\n // Add data attribute for bg color class of menu\n var menuClassList = el.classList;\n for (var i = 0; i < menuClassList.length; i++) {\n if (menuClassList[i].startsWith('bg-')) {\n this._menuBgClass = menuClassList[i];\n }\n }\n el.setAttribute('data-bg-class', this._menuBgClass);\n\n // Switch to vertical menu on small screen for horizontal menu layout on page load\n if (this._horizontal && window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) this.switchMenu('vertical');\n this._bindEvents();\n\n // Link menu instance to element\n el.menuInstance = this;\n }\n _createClass(Menu, [{\n key: \"_bindEvents\",\n value: function _bindEvents() {\n var _this = this;\n // Click Event\n this._evntElClick = function (e) {\n // Find top parent element\n if (e.target.closest('ul') && e.target.closest('ul').classList.contains('menu-inner')) {\n var menuItem = Menu._findParent(e.target, 'menu-item', false);\n\n // eslint-disable-next-line prefer-destructuring\n if (menuItem) _this._topParent = menuItem.childNodes[0];\n }\n var toggleLink = e.target.classList.contains('menu-toggle') ? e.target : Menu._findParent(e.target, 'menu-toggle', false);\n if (toggleLink) {\n e.preventDefault();\n if (toggleLink.getAttribute('data-hover') !== 'true') {\n _this.toggle(toggleLink);\n }\n }\n };\n if (!this._showDropdownOnHover && this._horizontal || !this._horizontal || window.Helpers.isMobileDevice) this._el.addEventListener('click', this._evntElClick);\n this._evntWindowResize = function () {\n _this.update();\n if (_this._lastWidth !== window.innerWidth) {\n _this._lastWidth = window.innerWidth;\n _this.update();\n }\n var horizontalMenuTemplate = document.querySelector(\"[data-template^='horizontal-menu']\");\n if (!_this._horizontal && !horizontalMenuTemplate) _this.manageScroll();\n };\n window.addEventListener('resize', this._evntWindowResize);\n if (this._horizontal) {\n this._evntPrevBtnClick = function (e) {\n e.preventDefault();\n if (_this._prevBtn.classList.contains('disabled')) return;\n _this._slide('prev');\n };\n this._prevBtn.addEventListener('click', this._evntPrevBtnClick);\n this._evntNextBtnClick = function (e) {\n e.preventDefault();\n if (_this._nextBtn.classList.contains('disabled')) return;\n _this._slide('next');\n };\n this._nextBtn.addEventListener('click', this._evntNextBtnClick);\n this._evntBodyClick = function (e) {\n if (!_this._inner.contains(e.target) && _this._el.querySelectorAll('.menu-inner > .menu-item.open').length) _this.closeAll();\n };\n document.body.addEventListener('click', this._evntBodyClick);\n if (this._showDropdownOnHover) {\n /** ***********************************************\r\n * Horizontal Menu Mouse Over Event\r\n * ? e.target !== e.currentTarget condition to disable mouseover event on whole menu navbar\r\n * ? !e.target.parentNode.classList.contains('open') to disable mouseover events on icon, text and dropdown arrow\r\n */\n this._evntElMouseOver = function (e) {\n if (e.target !== e.currentTarget && !e.target.parentNode.classList.contains('open')) {\n var toggleLink = e.target.classList.contains('menu-toggle') ? e.target : null;\n if (toggleLink) {\n e.preventDefault();\n if (toggleLink.getAttribute('data-hover') !== 'true') {\n _this.toggle(toggleLink);\n }\n }\n }\n e.stopPropagation();\n };\n if (this._horizontal && window.screen.width > window.Helpers.LAYOUT_BREAKPOINT) {\n this._el.addEventListener('mouseover', this._evntElMouseOver);\n }\n\n /** ***********************************************\r\n * Horizontal Menu Mouse Out Event\r\n * ? e.target !== e.currentTarget condition to disable mouseout event on whole menu navbar\r\n * ? mouseOutEl.parentNode.classList.contains('open') to check if the mouseout element has open class or not\r\n * ? !mouseOutEl.classList.contains('menu-toggle') to check if mouseout was from single menu item and not from the one which has submenu\r\n * ? !mouseOverEl.parentNode.classList.contains('menu-link') to disable mouseout event for icon, text and dropdown arrow\r\n */\n this._evntElMouseOut = function (e) {\n var mainEl = e.currentTarget;\n var mouseOutEl = e.target;\n var mouseOverEl = e.toElement || e.relatedTarget;\n\n // Find absolute parent of any menu item from which mouseout event triggered\n if (mouseOutEl.closest('ul') && mouseOutEl.closest('ul').classList.contains('menu-inner')) {\n _this._topParent = mouseOutEl;\n }\n if (mouseOutEl !== mainEl && (mouseOutEl.parentNode.classList.contains('open') || !mouseOutEl.classList.contains('menu-toggle')) && mouseOverEl && mouseOverEl.parentNode && !mouseOverEl.parentNode.classList.contains('menu-link')) {\n // When mouse goes totally out of menu items, check mouse over element to confirm it's not the child of menu, once confirmed close the menu\n if (_this._topParent && !Menu.childOf(mouseOverEl, _this._topParent.parentNode)) {\n var _toggleLink = _this._topParent.classList.contains('menu-toggle') ? _this._topParent : null;\n if (_toggleLink) {\n e.preventDefault();\n if (_toggleLink.getAttribute('data-hover') !== 'true') {\n _this.toggle(_toggleLink);\n _this._topParent = null;\n }\n }\n }\n\n // When mouse enter the sub menu, check if it's child of the initially mouse overed menu item(Actual Parent),\n // if it's the parent do not close the sub menu else close the sub menu\n if (Menu.childOf(mouseOverEl, mouseOutEl.parentNode)) {\n return;\n }\n var toggleLink = mouseOutEl.classList.contains('menu-toggle') ? mouseOutEl : null;\n if (toggleLink) {\n e.preventDefault();\n if (toggleLink.getAttribute('data-hover') !== 'true') {\n _this.toggle(toggleLink);\n }\n }\n }\n e.stopPropagation();\n };\n if (this._horizontal && window.screen.width > window.Helpers.LAYOUT_BREAKPOINT) {\n this._el.addEventListener('mouseout', this._evntElMouseOut);\n }\n }\n }\n }\n }, {\n key: \"_unbindEvents\",\n value: function _unbindEvents() {\n if (this._evntElClick) {\n this._el.removeEventListener('click', this._evntElClick);\n this._evntElClick = null;\n }\n if (this._evntElMouseOver) {\n this._el.removeEventListener('mouseover', this._evntElMouseOver);\n this._evntElMouseOver = null;\n }\n if (this._evntElMouseOut) {\n this._el.removeEventListener('mouseout', this._evntElMouseOut);\n this._evntElMouseOut = null;\n }\n if (this._evntWindowResize) {\n window.removeEventListener('resize', this._evntWindowResize);\n this._evntWindowResize = null;\n }\n if (this._evntBodyClick) {\n document.body.removeEventListener('click', this._evntBodyClick);\n this._evntBodyClick = null;\n }\n if (this._evntInnerMousemove) {\n this._inner.removeEventListener('mousemove', this._evntInnerMousemove);\n this._evntInnerMousemove = null;\n }\n if (this._evntInnerMouseleave) {\n this._inner.removeEventListener('mouseleave', this._evntInnerMouseleave);\n this._evntInnerMouseleave = null;\n }\n }\n }, {\n key: \"open\",\n value: function open(el) {\n var _this2 = this;\n var closeChildren = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this._closeChildren;\n var item = this._findUnopenedParent(Menu._getItem(el, true), closeChildren);\n if (!item) return;\n var toggleLink = Menu._getLink(item, true);\n Menu._promisify(this._onOpen, this, item, toggleLink, Menu._findMenu(item)).then(function () {\n if (!_this2._horizontal || !Menu._isRoot(item)) {\n if (_this2._animate && !_this2._horizontal) {\n window.requestAnimationFrame(function () {\n return _this2._toggleAnimation(true, item, false);\n });\n if (_this2._accordion) _this2._closeOther(item, closeChildren);\n } else if (_this2._animate) {\n _this2._toggleDropdown(true, item, closeChildren);\n // eslint-disable-next-line no-unused-expressions\n _this2._onOpened && _this2._onOpened(_this2, item, toggleLink, Menu._findMenu(item));\n } else {\n item.classList.add('open');\n // eslint-disable-next-line no-unused-expressions\n _this2._onOpened && _this2._onOpened(_this2, item, toggleLink, Menu._findMenu(item));\n if (_this2._accordion) _this2._closeOther(item, closeChildren);\n }\n } else {\n _this2._toggleDropdown(true, item, closeChildren);\n // eslint-disable-next-line no-unused-expressions\n _this2._onOpened && _this2._onOpened(_this2, item, toggleLink, Menu._findMenu(item));\n }\n }).catch(function () {});\n }\n }, {\n key: \"close\",\n value: function close(el) {\n var _this3 = this;\n var closeChildren = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this._closeChildren;\n var _autoClose = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var item = Menu._getItem(el, true);\n var toggleLink = Menu._getLink(el, true);\n if (!item.classList.contains('open') || item.classList.contains('disabled')) return;\n Menu._promisify(this._onClose, this, item, toggleLink, Menu._findMenu(item), _autoClose).then(function () {\n if (!_this3._horizontal || !Menu._isRoot(item)) {\n if (_this3._animate && !_this3._horizontal) {\n window.requestAnimationFrame(function () {\n return _this3._toggleAnimation(false, item, closeChildren);\n });\n } else {\n item.classList.remove('open');\n if (closeChildren) {\n var opened = item.querySelectorAll('.menu-item.open');\n for (var i = 0, l = opened.length; i < l; i++) opened[i].classList.remove('open');\n }\n\n // eslint-disable-next-line no-unused-expressions\n _this3._onClosed && _this3._onClosed(_this3, item, toggleLink, Menu._findMenu(item));\n }\n } else {\n _this3._toggleDropdown(false, item, closeChildren);\n // eslint-disable-next-line no-unused-expressions\n _this3._onClosed && _this3._onClosed(_this3, item, toggleLink, Menu._findMenu(item));\n }\n }).catch(function () {});\n }\n }, {\n key: \"_closeOther\",\n value: function _closeOther(item, closeChildren) {\n var opened = Menu._findChild(item.parentNode, ['menu-item', 'open']);\n for (var i = 0, l = opened.length; i < l; i++) {\n if (opened[i] !== item) this.close(opened[i], closeChildren);\n }\n }\n }, {\n key: \"toggle\",\n value: function toggle(el) {\n var closeChildren = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this._closeChildren;\n var item = Menu._getItem(el, true);\n // const toggleLink = Menu._getLink(el, true)\n\n if (item.classList.contains('open')) this.close(item, closeChildren);else this.open(item, closeChildren);\n }\n }, {\n key: \"_toggleDropdown\",\n value: function _toggleDropdown(show, item, closeChildren) {\n var menu = Menu._findMenu(item);\n var actualItem = item;\n var subMenuItem = false;\n if (show) {\n if (Menu._findParent(item, 'menu-sub', false)) {\n subMenuItem = true;\n item = this._topParent ? this._topParent.parentNode : item;\n }\n var wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width);\n var position = this._innerPosition;\n var itemOffset = this._getItemOffset(item);\n var itemWidth = Math.round(item.getBoundingClientRect().width);\n if (itemOffset - DELTA <= -1 * position) {\n this._innerPosition = -1 * itemOffset;\n } else if (itemOffset + position + itemWidth + DELTA >= wrapperWidth) {\n if (itemWidth > wrapperWidth) {\n this._innerPosition = -1 * itemOffset;\n } else {\n this._innerPosition = -1 * (itemOffset + itemWidth - wrapperWidth);\n }\n }\n actualItem.classList.add('open');\n var menuWidth = Math.round(menu.getBoundingClientRect().width);\n if (subMenuItem) {\n if (itemOffset + this._innerPosition + menuWidth * 2 > wrapperWidth && menuWidth < wrapperWidth && menuWidth >= itemWidth) {\n menu.style.left = [this._rtl ? '100%' : '-100%'];\n }\n } else if (itemOffset + this._innerPosition + menuWidth > wrapperWidth && menuWidth < wrapperWidth && menuWidth > itemWidth) {\n menu.style[this._rtl ? 'marginRight' : 'marginLeft'] = \"-\".concat(menuWidth - itemWidth, \"px\");\n }\n this._closeOther(actualItem, closeChildren);\n this._updateSlider();\n } else {\n var toggle = Menu._findChild(item, ['menu-toggle']);\n\n // eslint-disable-next-line no-unused-expressions\n toggle.length && toggle[0].removeAttribute('data-hover', 'true');\n item.classList.remove('open');\n menu.style[this._rtl ? 'marginRight' : 'marginLeft'] = null;\n if (closeChildren) {\n var opened = menu.querySelectorAll('.menu-item.open');\n for (var i = 0, l = opened.length; i < l; i++) opened[i].classList.remove('open');\n }\n }\n }\n }, {\n key: \"_slide\",\n value: function _slide(direction) {\n var wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width);\n var innerWidth = this._innerWidth;\n var newPosition;\n if (direction === 'next') {\n newPosition = this._getSlideNextPos();\n if (innerWidth + newPosition < wrapperWidth) {\n newPosition = wrapperWidth - innerWidth;\n }\n } else {\n newPosition = this._getSlidePrevPos();\n if (newPosition > 0) newPosition = 0;\n }\n this._innerPosition = newPosition;\n this.update();\n }\n }, {\n key: \"_getSlideNextPos\",\n value: function _getSlideNextPos() {\n var wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width);\n var position = this._innerPosition;\n var curItem = this._inner.childNodes[0];\n var left = 0;\n while (curItem) {\n if (curItem.tagName) {\n var curItemWidth = Math.round(curItem.getBoundingClientRect().width);\n if (left + position - DELTA <= wrapperWidth && left + position + curItemWidth + DELTA >= wrapperWidth) {\n if (curItemWidth > wrapperWidth && left === -1 * position) left += curItemWidth;\n break;\n }\n left += curItemWidth;\n }\n curItem = curItem.nextSibling;\n }\n return -1 * left;\n }\n }, {\n key: \"_getSlidePrevPos\",\n value: function _getSlidePrevPos() {\n var wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width);\n var position = this._innerPosition;\n var curItem = this._inner.childNodes[0];\n var left = 0;\n while (curItem) {\n if (curItem.tagName) {\n var curItemWidth = Math.round(curItem.getBoundingClientRect().width);\n if (left - DELTA <= -1 * position && left + curItemWidth + DELTA >= -1 * position) {\n if (curItemWidth <= wrapperWidth) left = left + curItemWidth - wrapperWidth;\n break;\n }\n left += curItemWidth;\n }\n curItem = curItem.nextSibling;\n }\n return -1 * left;\n }\n }, {\n key: \"_findUnopenedParent\",\n value: function _findUnopenedParent(item, closeChildren) {\n var tree = [];\n var parentItem = null;\n while (item) {\n if (item.classList.contains('disabled')) {\n parentItem = null;\n tree = [];\n } else {\n if (!item.classList.contains('open')) parentItem = item;\n tree.push(item);\n }\n item = Menu._findParent(item, 'menu-item', false);\n }\n if (!parentItem) return null;\n if (tree.length === 1) return parentItem;\n tree = tree.slice(0, tree.indexOf(parentItem));\n for (var i = 0, l = tree.length; i < l; i++) {\n tree[i].classList.add('open');\n if (this._accordion) {\n var openedItems = Menu._findChild(tree[i].parentNode, ['menu-item', 'open']);\n for (var j = 0, k = openedItems.length; j < k; j++) {\n if (openedItems[j] !== tree[i]) {\n openedItems[j].classList.remove('open');\n if (closeChildren) {\n var openedChildren = openedItems[j].querySelectorAll('.menu-item.open');\n for (var x = 0, z = openedChildren.length; x < z; x++) {\n openedChildren[x].classList.remove('open');\n }\n }\n }\n }\n }\n }\n return parentItem;\n }\n }, {\n key: \"_toggleAnimation\",\n value: function _toggleAnimation(open, item, closeChildren) {\n var _this4 = this;\n var toggleLink = Menu._getLink(item, true);\n var menu = Menu._findMenu(item);\n Menu._unbindAnimationEndEvent(item);\n var linkHeight = Math.round(toggleLink.getBoundingClientRect().height);\n item.style.overflow = 'hidden';\n var clearItemStyle = function clearItemStyle() {\n item.classList.remove('menu-item-animating');\n item.classList.remove('menu-item-closing');\n item.style.overflow = null;\n item.style.height = null;\n if (!_this4._horizontal) _this4.update();\n };\n if (open) {\n item.style.height = \"\".concat(linkHeight, \"px\");\n item.classList.add('menu-item-animating');\n item.classList.add('open');\n Menu._bindAnimationEndEvent(item, function () {\n clearItemStyle();\n _this4._onOpened(_this4, item, toggleLink, menu);\n });\n setTimeout(function () {\n item.style.height = \"\".concat(linkHeight + Math.round(menu.getBoundingClientRect().height), \"px\");\n }, 50);\n } else {\n item.style.height = \"\".concat(linkHeight + Math.round(menu.getBoundingClientRect().height), \"px\");\n item.classList.add('menu-item-animating');\n item.classList.add('menu-item-closing');\n Menu._bindAnimationEndEvent(item, function () {\n item.classList.remove('open');\n clearItemStyle();\n if (closeChildren) {\n var opened = item.querySelectorAll('.menu-item.open');\n for (var i = 0, l = opened.length; i < l; i++) opened[i].classList.remove('open');\n }\n _this4._onClosed(_this4, item, toggleLink, menu);\n });\n setTimeout(function () {\n item.style.height = \"\".concat(linkHeight, \"px\");\n }, 50);\n }\n }\n }, {\n key: \"_getItemOffset\",\n value: function _getItemOffset(item) {\n var curItem = this._inner.childNodes[0];\n var left = 0;\n while (curItem !== item) {\n if (curItem.tagName) {\n left += Math.round(curItem.getBoundingClientRect().width);\n }\n curItem = curItem.nextSibling;\n }\n return left;\n }\n }, {\n key: \"_updateSlider\",\n value: function _updateSlider() {\n var wrapperWidth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var innerWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var position = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var _wrapperWidth = wrapperWidth !== null ? wrapperWidth : Math.round(this._wrapper.getBoundingClientRect().width);\n var _innerWidth = innerWidth !== null ? innerWidth : this._innerWidth;\n var _position = position !== null ? position : this._innerPosition;\n if (_innerWidth < _wrapperWidth || window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {\n this._prevBtn.classList.add('d-none');\n this._nextBtn.classList.add('d-none');\n } else {\n this._prevBtn.classList.remove('d-none');\n this._nextBtn.classList.remove('d-none');\n }\n if (_innerWidth > _wrapperWidth && window.innerWidth > window.Helpers.LAYOUT_BREAKPOINT) {\n if (_position === 0) this._prevBtn.classList.add('disabled');else this._prevBtn.classList.remove('disabled');\n if (_innerWidth + _position <= _wrapperWidth) this._nextBtn.classList.add('disabled');else this._nextBtn.classList.remove('disabled');\n }\n }\n }, {\n key: \"_innerWidth\",\n get: function get() {\n var items = this._inner.childNodes;\n var width = 0;\n for (var i = 0, l = items.length; i < l; i++) {\n if (items[i].tagName) {\n width += Math.round(items[i].getBoundingClientRect().width);\n }\n }\n return width;\n }\n }, {\n key: \"_innerPosition\",\n get: function get() {\n return parseInt(this._inner.style[this._rtl ? 'marginRight' : 'marginLeft'] || '0px', 10);\n },\n set: function set(value) {\n this._inner.style[this._rtl ? 'marginRight' : 'marginLeft'] = \"\".concat(value, \"px\");\n return value;\n }\n }, {\n key: \"closeAll\",\n value: function closeAll() {\n var closeChildren = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._closeChildren;\n var opened = this._el.querySelectorAll('.menu-inner > .menu-item.open');\n for (var i = 0, l = opened.length; i < l; i++) this.close(opened[i], closeChildren);\n }\n }, {\n key: \"update\",\n value: function update() {\n if (!this._horizontal) {\n if (this._scrollbar) {\n this._scrollbar.update();\n }\n } else {\n this.closeAll();\n var wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width);\n var innerWidth = this._innerWidth;\n var position = this._innerPosition;\n if (wrapperWidth - position > innerWidth) {\n position = wrapperWidth - innerWidth;\n if (position > 0) position = 0;\n this._innerPosition = position;\n }\n this._updateSlider(wrapperWidth, innerWidth, position);\n }\n }\n }, {\n key: \"manageScroll\",\n value: function manageScroll() {\n var _window = window,\n PerfectScrollbar = _window.PerfectScrollbar;\n var menuInner = document.querySelector('.menu-inner');\n if (window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {\n if (this._scrollbar !== null) {\n // window.Helpers.menuPsScroll.destroy()\n this._scrollbar.destroy();\n this._scrollbar = null;\n }\n menuInner.classList.add('overflow-auto');\n } else {\n if (this._scrollbar === null) {\n var menuScroll = new PerfectScrollbar(document.querySelector('.menu-inner'), {\n suppressScrollX: true,\n wheelPropagation: false\n });\n // window.Helpers.menuPsScroll = menuScroll\n this._scrollbar = menuScroll;\n }\n menuInner.classList.remove('overflow-auto');\n }\n }\n }, {\n key: \"switchMenu\",\n value: function switchMenu(menu) {\n // Unbind Events\n this._unbindEvents();\n\n // const html = document.documentElement\n var navbar = document.querySelector('nav.layout-navbar');\n var navbarCollapse = document.querySelector('#navbar-collapse');\n /* const fullNavbar = document.querySelector('.layout-navbar-full')\r\n const contentNavbar = document.querySelector('.layout-content-navbar')\r\n const contentWrapper = document.querySelector('.content-wrapper') */\n var asideMenuWrapper = document.querySelector('#layout-menu div');\n var asideMenu = document.querySelector('#layout-menu');\n var horzMenuClasses = ['layout-menu-horizontal', 'menu', 'menu-horizontal', 'container-fluid', 'flex-grow-0'];\n var vertMenuClasses = ['layout-menu', 'menu', 'menu-vertical'];\n var horzMenuWrapper = document.querySelector('.menu-horizontal-wrapper');\n var menuInner = document.querySelector('.menu-inner');\n var brand = document.querySelector('.app-brand');\n var menuToggler = document.querySelector('.layout-menu-toggle');\n var activeMenuItems = document.querySelectorAll('.menu-inner .active');\n /* const layoutPage = document.querySelector('.layout-page')\r\n const layoutContainer = document.querySelector('.layout-container')\r\n const content = document.querySelector('.container-fluid') */\n\n // const { PerfectScrollbar } = window\n\n if (menu === 'vertical') {\n var _asideMenu$classList, _asideMenu$classList2;\n this._horizontal = false;\n asideMenuWrapper.insertBefore(brand, horzMenuWrapper);\n asideMenuWrapper.insertBefore(menuInner, horzMenuWrapper);\n asideMenuWrapper.classList.add('flex-column', 'p-0');\n (_asideMenu$classList = asideMenu.classList).remove.apply(_asideMenu$classList, _toConsumableArray(asideMenu.classList));\n (_asideMenu$classList2 = asideMenu.classList).add.apply(_asideMenu$classList2, vertMenuClasses.concat([this._menuBgClass]));\n brand.classList.remove('d-none', 'd-lg-flex');\n menuToggler.classList.remove('d-none');\n // if (PerfectScrollbar !== undefined) {\n // this._psScroll = new PerfectScrollbar(document.querySelector('.menu-inner'), {\n // suppressScrollX: true,\n // wheelPropagation: !Menu._hasClass('layout-menu-fixed layout-menu-fixed-offcanvas')\n // })\n // }\n\n menuInner.classList.add('overflow-auto');\n\n // Add open class to active items\n for (var i = 0; i < activeMenuItems.length - 1; ++i) {\n activeMenuItems[i].classList.add('open');\n }\n } else {\n var _asideMenu$classList3, _asideMenu$classList4;\n this._horizontal = true;\n navbar.children[0].insertBefore(brand, navbarCollapse);\n brand.classList.add('d-none', 'd-lg-flex');\n horzMenuWrapper.appendChild(menuInner);\n asideMenuWrapper.classList.remove('flex-column', 'p-0');\n (_asideMenu$classList3 = asideMenu.classList).remove.apply(_asideMenu$classList3, _toConsumableArray(asideMenu.classList));\n (_asideMenu$classList4 = asideMenu.classList).add.apply(_asideMenu$classList4, horzMenuClasses.concat([this._menuBgClass]));\n menuToggler.classList.add('d-none');\n menuInner.classList.remove('overflow-auto');\n\n // if (PerfectScrollbar !== undefined && this._psScroll !== null) {\n // this._psScroll.destroy()\n // this._psScroll = null\n // }\n\n // Remove open class from active items\n for (var _i = 0; _i < activeMenuItems.length; ++_i) {\n activeMenuItems[_i].classList.remove('open');\n }\n }\n this._bindEvents();\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n if (!this._el) return;\n this._unbindEvents();\n var items = this._el.querySelectorAll('.menu-item');\n for (var i = 0, l = items.length; i < l; i++) {\n Menu._unbindAnimationEndEvent(items[i]);\n items[i].classList.remove('menu-item-animating');\n items[i].classList.remove('open');\n items[i].style.overflow = null;\n items[i].style.height = null;\n }\n var menus = this._el.querySelectorAll('.menu-menu');\n for (var i2 = 0, l2 = menus.length; i2 < l2; i2++) {\n menus[i2].style.marginRight = null;\n menus[i2].style.marginLeft = null;\n }\n this._el.classList.remove('menu-no-animation');\n if (this._wrapper) {\n this._prevBtn.parentNode.removeChild(this._prevBtn);\n this._nextBtn.parentNode.removeChild(this._nextBtn);\n this._wrapper.parentNode.insertBefore(this._inner, this._wrapper);\n this._wrapper.parentNode.removeChild(this._wrapper);\n this._inner.style.marginLeft = null;\n this._inner.style.marginRight = null;\n }\n this._el.menuInstance = null;\n delete this._el.menuInstance;\n this._el = null;\n this._horizontal = null;\n this._animate = null;\n this._accordion = null;\n this._showDropdownOnHover = null;\n this._closeChildren = null;\n this._rtl = null;\n this._onOpen = null;\n this._onOpened = null;\n this._onClose = null;\n this._onClosed = null;\n if (this._scrollbar) {\n this._scrollbar.destroy();\n this._scrollbar = null;\n }\n this._inner = null;\n this._prevBtn = null;\n this._wrapper = null;\n this._nextBtn = null;\n }\n }], [{\n key: \"childOf\",\n value: function childOf( /* child node */c, /* parent node */p) {\n // returns boolean\n if (c.parentNode) {\n while ((c = c.parentNode) && c !== p);\n return !!c;\n }\n return false;\n }\n }, {\n key: \"_isRoot\",\n value: function _isRoot(item) {\n return !Menu._findParent(item, 'menu-item', false);\n }\n }, {\n key: \"_findParent\",\n value: function _findParent(el, cls) {\n var throwError = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n if (el.tagName.toUpperCase() === 'BODY') return null;\n el = el.parentNode;\n while (el.tagName.toUpperCase() !== 'BODY' && !el.classList.contains(cls)) {\n el = el.parentNode;\n }\n el = el.tagName.toUpperCase() !== 'BODY' ? el : null;\n if (!el && throwError) throw new Error(\"Cannot find `.\".concat(cls, \"` parent element\"));\n return el;\n }\n }, {\n key: \"_findChild\",\n value: function _findChild(el, cls) {\n var items = el.childNodes;\n var found = [];\n for (var i = 0, l = items.length; i < l; i++) {\n if (items[i].classList) {\n var passed = 0;\n for (var j = 0; j < cls.length; j++) {\n if (items[i].classList.contains(cls[j])) passed += 1;\n }\n if (cls.length === passed) found.push(items[i]);\n }\n }\n return found;\n }\n }, {\n key: \"_findMenu\",\n value: function _findMenu(item) {\n var curEl = item.childNodes[0];\n var menu = null;\n while (curEl && !menu) {\n if (curEl.classList && curEl.classList.contains('menu-sub')) menu = curEl;\n curEl = curEl.nextSibling;\n }\n if (!menu) throw new Error('Cannot find `.menu-sub` element for the current `.menu-toggle`');\n return menu;\n }\n\n // Has class\n }, {\n key: \"_hasClass\",\n value: function _hasClass(cls) {\n var el = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window.Helpers.ROOT_EL;\n var result = false;\n cls.split(' ').forEach(function (c) {\n if (el.classList.contains(c)) result = true;\n });\n return result;\n }\n }, {\n key: \"_getItem\",\n value: function _getItem(el, toggle) {\n var item = null;\n var selector = toggle ? 'menu-toggle' : 'menu-link';\n if (el.classList.contains('menu-item')) {\n if (Menu._findChild(el, [selector]).length) item = el;\n } else if (el.classList.contains(selector)) {\n item = el.parentNode.classList.contains('menu-item') ? el.parentNode : null;\n }\n if (!item) {\n throw new Error(\"\".concat(toggle ? 'Toggable ' : '', \"`.menu-item` element not found.\"));\n }\n return item;\n }\n }, {\n key: \"_getLink\",\n value: function _getLink(el, toggle) {\n var found = [];\n var selector = toggle ? 'menu-toggle' : 'menu-link';\n if (el.classList.contains(selector)) found = [el];else if (el.classList.contains('menu-item')) found = Menu._findChild(el, [selector]);\n if (!found.length) throw new Error(\"`\".concat(selector, \"` element not found.\"));\n return found[0];\n }\n }, {\n key: \"_bindAnimationEndEvent\",\n value: function _bindAnimationEndEvent(el, handler) {\n var cb = function cb(e) {\n if (e.target !== el) return;\n Menu._unbindAnimationEndEvent(el);\n handler(e);\n };\n var duration = window.getComputedStyle(el).transitionDuration;\n duration = parseFloat(duration) * (duration.indexOf('ms') !== -1 ? 1 : 1000);\n el._menuAnimationEndEventCb = cb;\n TRANSITION_EVENTS.forEach(function (ev) {\n return el.addEventListener(ev, el._menuAnimationEndEventCb, false);\n });\n el._menuAnimationEndEventTimeout = setTimeout(function () {\n cb({\n target: el\n });\n }, duration + 50);\n }\n }, {\n key: \"_promisify\",\n value: function _promisify(fn) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n var result = fn.apply(void 0, args);\n if (result instanceof Promise) {\n return result;\n }\n if (result === false) {\n return Promise.reject();\n }\n return Promise.resolve();\n }\n }, {\n key: \"_unbindAnimationEndEvent\",\n value: function _unbindAnimationEndEvent(el) {\n var cb = el._menuAnimationEndEventCb;\n if (el._menuAnimationEndEventTimeout) {\n clearTimeout(el._menuAnimationEndEventTimeout);\n el._menuAnimationEndEventTimeout = null;\n }\n if (!cb) return;\n TRANSITION_EVENTS.forEach(function (ev) {\n return el.removeEventListener(ev, cb, false);\n });\n el._menuAnimationEndEventCb = null;\n }\n }, {\n key: \"setDisabled\",\n value: function setDisabled(el, disabled) {\n Menu._getItem(el, false).classList[disabled ? 'add' : 'remove']('disabled');\n }\n }, {\n key: \"isActive\",\n value: function isActive(el) {\n return Menu._getItem(el, false).classList.contains('active');\n }\n }, {\n key: \"isOpened\",\n value: function isOpened(el) {\n return Menu._getItem(el, false).classList.contains('open');\n }\n }, {\n key: \"isDisabled\",\n value: function isDisabled(el) {\n return Menu._getItem(el, false).classList.contains('disabled');\n }\n }]);\n return Menu;\n}();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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b0JBQWtCdEUsRUFBRSxFQUFFO01BQ3BCLE9BQU9ELElBQUksQ0FBQzJHLFFBQVEsQ0FBQzFHLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQytCLFNBQVMsQ0FBQ3VDLFFBQVEsQ0FBQyxVQUFVLENBQUM7SUFDaEU7RUFBQztFQUFBO0FBQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9WdWV4eS8uL2pzL21lbnUuanM/ODc3ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBUUkFOU0lUSU9OX0VWRU5UUyA9IFsndHJhbnNpdGlvbmVuZCcsICd3ZWJraXRUcmFuc2l0aW9uRW5kJywgJ29UcmFuc2l0aW9uRW5kJ11cclxuLy8gY29uc3QgVFJBTlNJVElPTl9QUk9QRVJUSUVTID0gWyd0cmFuc2l0aW9uJywgJ01velRyYW5zaXRpb24nLCAnd2Via2l0VHJhbnNpdGlvbicsICdXZWJraXRUcmFuc2l0aW9uJywgJ09UcmFuc2l0aW9uJ11cclxuY29uc3QgREVMVEEgPSA1XHJcblxyXG5jbGFzcyBNZW51IHtcclxuICBjb25zdHJ1Y3RvcihlbCwgY29uZmlnID0ge30sIF9QUyA9IG51bGwpIHtcclxuICAgIHRoaXMuX2VsID0gZWxcclxuICAgIHRoaXMuX2hvcml6b250YWwgPSBjb25maWcub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJ1xyXG4gICAgdGhpcy5fYW5pbWF0ZSA9IGNvbmZpZy5hbmltYXRlICE9PSBmYWxzZVxyXG4gICAgdGhpcy5fYWNjb3JkaW9uID0gY29uZmlnLmFjY29yZGlvbiAhPT0gZmFsc2VcclxuICAgIHRoaXMuX3Nob3dEcm9wZG93bk9uSG92ZXIgPSBCb29sZWFuKGNvbmZpZy5zaG93RHJvcGRvd25PbkhvdmVyKVxyXG4gICAgdGhpcy5fY2xvc2VDaGlsZHJlbiA9IEJvb2xlYW4oY29uZmlnLmNsb3NlQ2hpbGRyZW4pXHJcbiAgICB0aGlzLl9ydGwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXInKSA9PT0gJ3J0bCcgfHwgZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RpcicpID09PSAncnRsJ1xyXG5cclxuICAgIHRoaXMuX29uT3BlbiA9IGNvbmZpZy5vbk9wZW4gfHwgKCgpID0+IHt9KVxyXG4gICAgdGhpcy5fb25PcGVuZWQgPSBjb25maWcub25PcGVuZWQgfHwgKCgpID0+IHt9KVxyXG4gICAgdGhpcy5fb25DbG9zZSA9IGNvbmZpZy5vbkNsb3NlIHx8ICgoKSA9PiB7fSlcclxuICAgIHRoaXMuX29uQ2xvc2VkID0gY29uZmlnLm9uQ2xvc2VkIHx8ICgoKSA9PiB7fSlcclxuXHJcbiAgICB0aGlzLl9wc1Njcm9sbCA9IG51bGxcclxuICAgIHRoaXMuX3RvcFBhcmVudCA9IG51bGxcclxuICAgIHRoaXMuX21lbnVCZ0NsYXNzID0gbnVsbFxyXG5cclxuICAgIGVsLmNsYXNzTGlzdC5hZGQoJ21lbnUnKVxyXG4gICAgZWwuY2xhc3NMaXN0W3RoaXMuX2FuaW1hdGUgPyAncmVtb3ZlJyA6ICdhZGQnXSgnbWVudS1uby1hbmltYXRpb24nKVxyXG5cclxuICAgIGlmICghdGhpcy5faG9yaXpvbnRhbCkge1xyXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdtZW51LXZlcnRpY2FsJylcclxuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnbWVudS1ob3Jpem9udGFsJylcclxuXHJcbiAgICAgIGNvbnN0IFBlcmZlY3RTY3JvbGxiYXJMaWIgPSBfUFMgfHwgd2luZG93LlBlcmZlY3RTY3JvbGxiYXJcclxuXHJcbiAgICAgIGlmIChQZXJmZWN0U2Nyb2xsYmFyTGliKSB7XHJcbiAgICAgICAgdGhpcy5fc2Nyb2xsYmFyID0gbmV3IFBlcmZlY3RTY3JvbGxiYXJMaWIoZWwucXVlcnlTZWxlY3RvcignLm1lbnUtaW5uZXInKSwge1xyXG4gICAgICAgICAgc3VwcHJlc3NTY3JvbGxYOiB0cnVlLFxyXG4gICAgICAgICAgd2hlZWxQcm9wYWdhdGlvbjogIU1lbnUuX2hhc0NsYXNzKCdsYXlvdXQtbWVudS1maXhlZCBsYXlvdXQtbWVudS1maXhlZC1vZmZjYW52YXMnKVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHdpbmRvdy5IZWxwZXJzLm1lbnVQc1Njcm9sbCA9IHRoaXMuX3Njcm9sbGJhclxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGVsLnF1ZXJ5U2VsZWN0b3IoJy5tZW51LWlubmVyJykuY2xhc3NMaXN0LmFkZCgnb3ZlcmZsb3ctYXV0bycpXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ21lbnUtaG9yaXpvbnRhbCcpXHJcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ21lbnUtdmVydGljYWwnKVxyXG5cclxuICAgICAgdGhpcy5faW5uZXIgPSBlbC5xdWVyeVNlbGVjdG9yKCcubWVudS1pbm5lcicpXHJcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuX2lubmVyLnBhcmVudE5vZGVcclxuXHJcbiAgICAgIHRoaXMuX3ByZXZCdG4gPSBlbC5xdWVyeVNlbGVjdG9yKCcubWVudS1ob3Jpem9udGFsLXByZXYnKVxyXG4gICAgICBpZiAoIXRoaXMuX3ByZXZCdG4pIHtcclxuICAgICAgICB0aGlzLl9wcmV2QnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXHJcbiAgICAgICAgdGhpcy5fcHJldkJ0bi5ocmVmID0gJyMnXHJcbiAgICAgICAgdGhpcy5fcHJldkJ0bi5jbGFzc05hbWUgPSAnbWVudS1ob3Jpem9udGFsLXByZXYnXHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX3ByZXZCdG4pXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX3dyYXBwZXIgPSBlbC5xdWVyeVNlbGVjdG9yKCcubWVudS1ob3Jpem9udGFsLXdyYXBwZXInKVxyXG4gICAgICBpZiAoIXRoaXMuX3dyYXBwZXIpIHtcclxuICAgICAgICB0aGlzLl93cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcclxuICAgICAgICB0aGlzLl93cmFwcGVyLmNsYXNzTmFtZSA9ICdtZW51LWhvcml6b250YWwtd3JhcHBlcidcclxuICAgICAgICB0aGlzLl93cmFwcGVyLmFwcGVuZENoaWxkKHRoaXMuX2lubmVyKVxyXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl93cmFwcGVyKVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9uZXh0QnRuID0gZWwucXVlcnlTZWxlY3RvcignLm1lbnUtaG9yaXpvbnRhbC1uZXh0JylcclxuICAgICAgaWYgKCF0aGlzLl9uZXh0QnRuKSB7XHJcbiAgICAgICAgdGhpcy5fbmV4dEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxyXG4gICAgICAgIHRoaXMuX25leHRCdG4uaHJlZiA9ICcjJ1xyXG4gICAgICAgIHRoaXMuX25leHRCdG4uY2xhc3NOYW1lID0gJ21lbnUtaG9yaXpvbnRhbC1uZXh0J1xyXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9uZXh0QnRuKVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9pbm5lclBvc2l0aW9uID0gMFxyXG4gICAgICB0aGlzLnVwZGF0ZSgpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWRkIGRhdGEgYXR0cmlidXRlIGZvciBiZyBjb2xvciBjbGFzcyBvZiBtZW51XHJcbiAgICBjb25zdCBtZW51Q2xhc3NMaXN0ID0gZWwuY2xhc3NMaXN0XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZW51Q2xhc3NMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChtZW51Q2xhc3NMaXN0W2ldLnN0YXJ0c1dpdGgoJ2JnLScpKSB7XHJcbiAgICAgICAgdGhpcy5fbWVudUJnQ2xhc3MgPSBtZW51Q2xhc3NMaXN0W2ldXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1iZy1jbGFzcycsIHRoaXMuX21lbnVCZ0NsYXNzKVxyXG5cclxuICAgIC8vIFN3aXRjaCB0byB2ZXJ0aWNhbCBtZW51IG9uIHNtYWxsIHNjcmVlbiBmb3IgaG9yaXpvbnRhbCBtZW51IGxheW91dCBvbiBwYWdlIGxvYWRcclxuICAgIGlmICh0aGlzLl9ob3Jpem9udGFsICYmIHdpbmRvdy5pbm5lcldpZHRoIDwgd2luZG93LkhlbHBlcnMuTEFZT1VUX0JSRUFLUE9JTlQpIHRoaXMuc3dpdGNoTWVudSgndmVydGljYWwnKVxyXG5cclxuICAgIHRoaXMuX2JpbmRFdmVudHMoKVxyXG5cclxuICAgIC8vIExpbmsgbWVudSBpbnN0YW5jZSB0byBlbGVtZW50XHJcbiAgICBlbC5tZW51SW5zdGFuY2UgPSB0aGlzXHJcbiAgfVxyXG5cclxuICBfYmluZEV2ZW50cygpIHtcclxuICAgIC8vIENsaWNrIEV2ZW50XHJcbiAgICB0aGlzLl9ldm50RWxDbGljayA9IGUgPT4ge1xyXG4gICAgICAvLyBGaW5kIHRvcCBwYXJlbnQgZWxlbWVudFxyXG4gICAgICBpZiAoZS50YXJnZXQuY2xvc2VzdCgndWwnKSAmJiBlLnRhcmdldC5jbG9zZXN0KCd1bCcpLmNsYXNzTGlzdC5jb250YWlucygnbWVudS1pbm5lcicpKSB7XHJcbiAgICAgICAgY29uc3QgbWVudUl0ZW0gPSBNZW51Ll9maW5kUGFyZW50KGUudGFyZ2V0LCAnbWVudS1pdGVtJywgZmFsc2UpXHJcblxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItZGVzdHJ1Y3R1cmluZ1xyXG4gICAgICAgIGlmIChtZW51SXRlbSkgdGhpcy5fdG9wUGFyZW50ID0gbWVudUl0ZW0uY2hpbGROb2Rlc1swXVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB0b2dnbGVMaW5rID0gZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdtZW51LXRvZ2dsZScpXHJcbiAgICAgICAgPyBlLnRhcmdldFxyXG4gICAgICAgIDogTWVudS5fZmluZFBhcmVudChlLnRhcmdldCwgJ21lbnUtdG9nZ2xlJywgZmFsc2UpXHJcblxyXG4gICAgICBpZiAodG9nZ2xlTGluaykge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKVxyXG5cclxuICAgICAgICBpZiAodG9nZ2xlTGluay5nZXRBdHRyaWJ1dGUoJ2RhdGEtaG92ZXInKSAhPT0gJ3RydWUnKSB7XHJcbiAgICAgICAgICB0aGlzLnRvZ2dsZSh0b2dnbGVMaW5rKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCghdGhpcy5fc2hvd0Ryb3Bkb3duT25Ib3ZlciAmJiB0aGlzLl9ob3Jpem9udGFsKSB8fCAhdGhpcy5faG9yaXpvbnRhbCB8fCB3aW5kb3cuSGVscGVycy5pc01vYmlsZURldmljZSlcclxuICAgICAgdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9ldm50RWxDbGljaylcclxuXHJcbiAgICB0aGlzLl9ldm50V2luZG93UmVzaXplID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZSgpXHJcbiAgICAgIGlmICh0aGlzLl9sYXN0V2lkdGggIT09IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgICAgdGhpcy5fbGFzdFdpZHRoID0gd2luZG93LmlubmVyV2lkdGhcclxuICAgICAgICB0aGlzLnVwZGF0ZSgpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGhvcml6b250YWxNZW51VGVtcGxhdGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiW2RhdGEtdGVtcGxhdGVePSdob3Jpem9udGFsLW1lbnUnXVwiKVxyXG4gICAgICBpZiAoIXRoaXMuX2hvcml6b250YWwgJiYgIWhvcml6b250YWxNZW51VGVtcGxhdGUpIHRoaXMubWFuYWdlU2Nyb2xsKClcclxuICAgIH1cclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9ldm50V2luZG93UmVzaXplKVxyXG5cclxuICAgIGlmICh0aGlzLl9ob3Jpem9udGFsKSB7XHJcbiAgICAgIHRoaXMuX2V2bnRQcmV2QnRuQ2xpY2sgPSBlID0+IHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICBpZiAodGhpcy5fcHJldkJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpIHJldHVyblxyXG4gICAgICAgIHRoaXMuX3NsaWRlKCdwcmV2JylcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9wcmV2QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fZXZudFByZXZCdG5DbGljaylcclxuXHJcbiAgICAgIHRoaXMuX2V2bnROZXh0QnRuQ2xpY2sgPSBlID0+IHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICBpZiAodGhpcy5fbmV4dEJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpIHJldHVyblxyXG4gICAgICAgIHRoaXMuX3NsaWRlKCduZXh0JylcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9uZXh0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fZXZudE5leHRCdG5DbGljaylcclxuXHJcbiAgICAgIHRoaXMuX2V2bnRCb2R5Q2xpY2sgPSBlID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuX2lubmVyLmNvbnRhaW5zKGUudGFyZ2V0KSAmJiB0aGlzLl9lbC5xdWVyeVNlbGVjdG9yQWxsKCcubWVudS1pbm5lciA+IC5tZW51LWl0ZW0ub3BlbicpLmxlbmd0aClcclxuICAgICAgICAgIHRoaXMuY2xvc2VBbGwoKVxyXG4gICAgICB9XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9ldm50Qm9keUNsaWNrKVxyXG5cclxuICAgICAgaWYgKHRoaXMuX3Nob3dEcm9wZG93bk9uSG92ZXIpIHtcclxuICAgICAgICAvKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAgICAgKiBIb3Jpem9udGFsIE1lbnUgTW91c2UgT3ZlciBFdmVudFxyXG4gICAgICAgICAqID8gZS50YXJnZXQgIT09IGUuY3VycmVudFRhcmdldCBjb25kaXRpb24gdG8gZGlzYWJsZSBtb3VzZW92ZXIgZXZlbnQgb24gd2hvbGUgbWVudSBuYXZiYXJcclxuICAgICAgICAgKiA/ICFlLnRhcmdldC5wYXJlbnROb2RlLmNsYXNzTGlzdC5jb250YWlucygnb3BlbicpIHRvIGRpc2FibGUgbW91c2VvdmVyIGV2ZW50cyBvbiBpY29uLCB0ZXh0IGFuZCBkcm9wZG93biBhcnJvd1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2V2bnRFbE1vdXNlT3ZlciA9IGUgPT4ge1xyXG4gICAgICAgICAgaWYgKGUudGFyZ2V0ICE9PSBlLmN1cnJlbnRUYXJnZXQgJiYgIWUudGFyZ2V0LnBhcmVudE5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdvcGVuJykpIHtcclxuICAgICAgICAgICAgY29uc3QgdG9nZ2xlTGluayA9IGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnbWVudS10b2dnbGUnKSA/IGUudGFyZ2V0IDogbnVsbFxyXG5cclxuICAgICAgICAgICAgaWYgKHRvZ2dsZUxpbmspIHtcclxuICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHRvZ2dsZUxpbmsuZ2V0QXR0cmlidXRlKCdkYXRhLWhvdmVyJykgIT09ICd0cnVlJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGUodG9nZ2xlTGluaylcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2hvcml6b250YWwgJiYgd2luZG93LnNjcmVlbi53aWR0aCA+IHdpbmRvdy5IZWxwZXJzLkxBWU9VVF9CUkVBS1BPSU5UKSB7XHJcbiAgICAgICAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLl9ldm50RWxNb3VzZU92ZXIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAgICAgKiBIb3Jpem9udGFsIE1lbnUgTW91c2UgT3V0IEV2ZW50XHJcbiAgICAgICAgICogPyBlLnRhcmdldCAhPT0gZS5jdXJyZW50VGFyZ2V0IGNvbmRpdGlvbiB0byBkaXNhYmxlIG1vdXNlb3V0IGV2ZW50IG9uIHdob2xlIG1lbnUgbmF2YmFyXHJcbiAgICAgICAgICogPyBtb3VzZU91dEVsLnBhcmVudE5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdvcGVuJykgdG8gY2hlY2sgaWYgdGhlIG1vdXNlb3V0IGVsZW1lbnQgaGFzIG9wZW4gY2xhc3Mgb3Igbm90XHJcbiAgICAgICAgICogPyAhbW91c2VPdXRFbC5jbGFzc0xpc3QuY29udGFpbnMoJ21lbnUtdG9nZ2xlJykgdG8gY2hlY2sgaWYgbW91c2VvdXQgd2FzIGZyb20gc2luZ2xlIG1lbnUgaXRlbSBhbmQgbm90IGZyb20gdGhlIG9uZSB3aGljaCBoYXMgc3VibWVudVxyXG4gICAgICAgICAqID8gIW1vdXNlT3ZlckVsLnBhcmVudE5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdtZW51LWxpbmsnKSB0byBkaXNhYmxlIG1vdXNlb3V0IGV2ZW50IGZvciBpY29uLCB0ZXh0IGFuZCBkcm9wZG93biBhcnJvd1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2V2bnRFbE1vdXNlT3V0ID0gZSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBtYWluRWwgPSBlLmN1cnJlbnRUYXJnZXRcclxuICAgICAgICAgIGNvbnN0IG1vdXNlT3V0RWwgPSBlLnRhcmdldFxyXG4gICAgICAgICAgY29uc3QgbW91c2VPdmVyRWwgPSBlLnRvRWxlbWVudCB8fCBlLnJlbGF0ZWRUYXJnZXRcclxuXHJcbiAgICAgICAgICAvLyBGaW5kIGFic29sdXRlIHBhcmVudCBvZiBhbnkgbWVudSBpdGVtIGZyb20gd2hpY2ggbW91c2VvdXQgZXZlbnQgdHJpZ2dlcmVkXHJcbiAgICAgICAgICBpZiAobW91c2VPdXRFbC5jbG9zZXN0KCd1bCcpICYmIG1vdXNlT3V0RWwuY2xvc2VzdCgndWwnKS5jbGFzc0xpc3QuY29udGFpbnMoJ21lbnUtaW5uZXInKSkge1xyXG4gICAgICAgICAgICB0aGlzLl90b3BQYXJlbnQgPSBtb3VzZU91dEVsXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBtb3VzZU91dEVsICE9PSBtYWluRWwgJiZcclxuICAgICAgICAgICAgKG1vdXNlT3V0RWwucGFyZW50Tm9kZS5jbGFzc0xpc3QuY29udGFpbnMoJ29wZW4nKSB8fCAhbW91c2VPdXRFbC5jbGFzc0xpc3QuY29udGFpbnMoJ21lbnUtdG9nZ2xlJykpICYmXHJcbiAgICAgICAgICAgIG1vdXNlT3ZlckVsICYmXHJcbiAgICAgICAgICAgIG1vdXNlT3ZlckVsLnBhcmVudE5vZGUgJiZcclxuICAgICAgICAgICAgIW1vdXNlT3ZlckVsLnBhcmVudE5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdtZW51LWxpbmsnKVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIC8vIFdoZW4gbW91c2UgZ29lcyB0b3RhbGx5IG91dCBvZiBtZW51IGl0ZW1zLCBjaGVjayBtb3VzZSBvdmVyIGVsZW1lbnQgdG8gY29uZmlybSBpdCdzIG5vdCB0aGUgY2hpbGQgb2YgbWVudSwgb25jZSBjb25maXJtZWQgY2xvc2UgdGhlIG1lbnVcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3RvcFBhcmVudCAmJiAhTWVudS5jaGlsZE9mKG1vdXNlT3ZlckVsLCB0aGlzLl90b3BQYXJlbnQucGFyZW50Tm9kZSkpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0b2dnbGVMaW5rID0gdGhpcy5fdG9wUGFyZW50LmNsYXNzTGlzdC5jb250YWlucygnbWVudS10b2dnbGUnKSA/IHRoaXMuX3RvcFBhcmVudCA6IG51bGxcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHRvZ2dsZUxpbmspIHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0b2dnbGVMaW5rLmdldEF0dHJpYnV0ZSgnZGF0YS1ob3ZlcicpICE9PSAndHJ1ZScpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUodG9nZ2xlTGluaylcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fdG9wUGFyZW50ID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gV2hlbiBtb3VzZSBlbnRlciB0aGUgc3ViIG1lbnUsIGNoZWNrIGlmIGl0J3MgY2hpbGQgb2YgdGhlIGluaXRpYWxseSBtb3VzZSBvdmVyZWQgbWVudSBpdGVtKEFjdHVhbCBQYXJlbnQpLFxyXG4gICAgICAgICAgICAvLyBpZiBpdCdzIHRoZSBwYXJlbnQgZG8gbm90IGNsb3NlIHRoZSBzdWIgbWVudSBlbHNlIGNsb3NlIHRoZSBzdWIgbWVudVxyXG4gICAgICAgICAgICBpZiAoTWVudS5jaGlsZE9mKG1vdXNlT3ZlckVsLCBtb3VzZU91dEVsLnBhcmVudE5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgdG9nZ2xlTGluayA9IG1vdXNlT3V0RWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdtZW51LXRvZ2dsZScpID8gbW91c2VPdXRFbCA6IG51bGxcclxuXHJcbiAgICAgICAgICAgIGlmICh0b2dnbGVMaW5rKSB7XHJcbiAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcblxyXG4gICAgICAgICAgICAgIGlmICh0b2dnbGVMaW5rLmdldEF0dHJpYnV0ZSgnZGF0YS1ob3ZlcicpICE9PSAndHJ1ZScpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlKHRvZ2dsZUxpbmspXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9ob3Jpem9udGFsICYmIHdpbmRvdy5zY3JlZW4ud2lkdGggPiB3aW5kb3cuSGVscGVycy5MQVlPVVRfQlJFQUtQT0lOVCkge1xyXG4gICAgICAgICAgdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCB0aGlzLl9ldm50RWxNb3VzZU91dClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBjaGlsZE9mKC8qIGNoaWxkIG5vZGUgKi8gYywgLyogcGFyZW50IG5vZGUgKi8gcCkge1xyXG4gICAgLy8gcmV0dXJucyBib29sZWFuXHJcbiAgICBpZiAoYy5wYXJlbnROb2RlKSB7XHJcbiAgICAgIHdoaWxlICgoYyA9IGMucGFyZW50Tm9kZSkgJiYgYyAhPT0gcCk7XHJcbiAgICAgIHJldHVybiAhIWNcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgX3VuYmluZEV2ZW50cygpIHtcclxuICAgIGlmICh0aGlzLl9ldm50RWxDbGljaykge1xyXG4gICAgICB0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2V2bnRFbENsaWNrKVxyXG4gICAgICB0aGlzLl9ldm50RWxDbGljayA9IG51bGxcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fZXZudEVsTW91c2VPdmVyKSB7XHJcbiAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMuX2V2bnRFbE1vdXNlT3ZlcilcclxuICAgICAgdGhpcy5fZXZudEVsTW91c2VPdmVyID0gbnVsbFxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9ldm50RWxNb3VzZU91dCkge1xyXG4gICAgICB0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMuX2V2bnRFbE1vdXNlT3V0KVxyXG4gICAgICB0aGlzLl9ldm50RWxNb3VzZU91dCA9IG51bGxcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fZXZudFdpbmRvd1Jlc2l6ZSkge1xyXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fZXZudFdpbmRvd1Jlc2l6ZSlcclxuICAgICAgdGhpcy5fZXZudFdpbmRvd1Jlc2l6ZSA9IG51bGxcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fZXZudEJvZHlDbGljaykge1xyXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fZXZudEJvZHlDbGljaylcclxuICAgICAgdGhpcy5fZXZudEJvZHlDbGljayA9IG51bGxcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fZXZudElubmVyTW91c2Vtb3ZlKSB7XHJcbiAgICAgIHRoaXMuX2lubmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX2V2bnRJbm5lck1vdXNlbW92ZSlcclxuICAgICAgdGhpcy5fZXZudElubmVyTW91c2Vtb3ZlID0gbnVsbFxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9ldm50SW5uZXJNb3VzZWxlYXZlKSB7XHJcbiAgICAgIHRoaXMuX2lubmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLl9ldm50SW5uZXJNb3VzZWxlYXZlKVxyXG4gICAgICB0aGlzLl9ldm50SW5uZXJNb3VzZWxlYXZlID0gbnVsbFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIF9pc1Jvb3QoaXRlbSkge1xyXG4gICAgcmV0dXJuICFNZW51Ll9maW5kUGFyZW50KGl0ZW0sICdtZW51LWl0ZW0nLCBmYWxzZSlcclxuICB9XHJcblxyXG4gIHN0YXRpYyBfZmluZFBhcmVudChlbCwgY2xzLCB0aHJvd0Vycm9yID0gdHJ1ZSkge1xyXG4gICAgaWYgKGVsLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0JPRFknKSByZXR1cm4gbnVsbFxyXG4gICAgZWwgPSBlbC5wYXJlbnROb2RlXHJcbiAgICB3aGlsZSAoZWwudGFnTmFtZS50b1VwcGVyQ2FzZSgpICE9PSAnQk9EWScgJiYgIWVsLmNsYXNzTGlzdC5jb250YWlucyhjbHMpKSB7XHJcbiAgICAgIGVsID0gZWwucGFyZW50Tm9kZVxyXG4gICAgfVxyXG5cclxuICAgIGVsID0gZWwudGFnTmFtZS50b1VwcGVyQ2FzZSgpICE9PSAnQk9EWScgPyBlbCA6IG51bGxcclxuXHJcbiAgICBpZiAoIWVsICYmIHRocm93RXJyb3IpIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgXFxgLiR7Y2xzfVxcYCBwYXJlbnQgZWxlbWVudGApXHJcblxyXG4gICAgcmV0dXJuIGVsXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgX2ZpbmRDaGlsZChlbCwgY2xzKSB7XHJcbiAgICBjb25zdCBpdGVtcyA9IGVsLmNoaWxkTm9kZXNcclxuICAgIGNvbnN0IGZvdW5kID0gW11cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IGl0ZW1zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICBpZiAoaXRlbXNbaV0uY2xhc3NMaXN0KSB7XHJcbiAgICAgICAgbGV0IHBhc3NlZCA9IDBcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjbHMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgIGlmIChpdGVtc1tpXS5jbGFzc0xpc3QuY29udGFpbnMoY2xzW2pdKSkgcGFzc2VkICs9IDFcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjbHMubGVuZ3RoID09PSBwYXNzZWQpIGZvdW5kLnB1c2goaXRlbXNbaV0pXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm91bmRcclxuICB9XHJcblxyXG4gIHN0YXRpYyBfZmluZE1lbnUoaXRlbSkge1xyXG4gICAgbGV0IGN1ckVsID0gaXRlbS5jaGlsZE5vZGVzWzBdXHJcbiAgICBsZXQgbWVudSA9IG51bGxcclxuXHJcbiAgICB3aGlsZSAoY3VyRWwgJiYgIW1lbnUpIHtcclxuICAgICAgaWYgKGN1ckVsLmNsYXNzTGlzdCAmJiBjdXJFbC5jbGFzc0xpc3QuY29udGFpbnMoJ21lbnUtc3ViJykpIG1lbnUgPSBjdXJFbFxyXG4gICAgICBjdXJFbCA9IGN1ckVsLm5leHRTaWJsaW5nXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFtZW51KSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIGAubWVudS1zdWJgIGVsZW1lbnQgZm9yIHRoZSBjdXJyZW50IGAubWVudS10b2dnbGVgJylcclxuXHJcbiAgICByZXR1cm4gbWVudVxyXG4gIH1cclxuXHJcbiAgLy8gSGFzIGNsYXNzXHJcbiAgc3RhdGljIF9oYXNDbGFzcyhjbHMsIGVsID0gd2luZG93LkhlbHBlcnMuUk9PVF9FTCkge1xyXG4gICAgbGV0IHJlc3VsdCA9IGZhbHNlXHJcblxyXG4gICAgY2xzLnNwbGl0KCcgJykuZm9yRWFjaChjID0+IHtcclxuICAgICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucyhjKSkgcmVzdWx0ID0gdHJ1ZVxyXG4gICAgfSlcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0XHJcbiAgfVxyXG5cclxuICBvcGVuKGVsLCBjbG9zZUNoaWxkcmVuID0gdGhpcy5fY2xvc2VDaGlsZHJlbikge1xyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuX2ZpbmRVbm9wZW5lZFBhcmVudChNZW51Ll9nZXRJdGVtKGVsLCB0cnVlKSwgY2xvc2VDaGlsZHJlbilcclxuXHJcbiAgICBpZiAoIWl0ZW0pIHJldHVyblxyXG5cclxuICAgIGNvbnN0IHRvZ2dsZUxpbmsgPSBNZW51Ll9nZXRMaW5rKGl0ZW0sIHRydWUpXHJcblxyXG4gICAgTWVudS5fcHJvbWlzaWZ5KHRoaXMuX29uT3BlbiwgdGhpcywgaXRlbSwgdG9nZ2xlTGluaywgTWVudS5fZmluZE1lbnUoaXRlbSkpXHJcbiAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuX2hvcml6b250YWwgfHwgIU1lbnUuX2lzUm9vdChpdGVtKSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2FuaW1hdGUgJiYgIXRoaXMuX2hvcml6b250YWwpIHtcclxuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLl90b2dnbGVBbmltYXRpb24odHJ1ZSwgaXRlbSwgZmFsc2UpKVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fYWNjb3JkaW9uKSB0aGlzLl9jbG9zZU90aGVyKGl0ZW0sIGNsb3NlQ2hpbGRyZW4pXHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2FuaW1hdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fdG9nZ2xlRHJvcGRvd24odHJ1ZSwgaXRlbSwgY2xvc2VDaGlsZHJlbilcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xyXG4gICAgICAgICAgICB0aGlzLl9vbk9wZW5lZCAmJiB0aGlzLl9vbk9wZW5lZCh0aGlzLCBpdGVtLCB0b2dnbGVMaW5rLCBNZW51Ll9maW5kTWVudShpdGVtKSlcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgnb3BlbicpXHJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcclxuICAgICAgICAgICAgdGhpcy5fb25PcGVuZWQgJiYgdGhpcy5fb25PcGVuZWQodGhpcywgaXRlbSwgdG9nZ2xlTGluaywgTWVudS5fZmluZE1lbnUoaXRlbSkpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9hY2NvcmRpb24pIHRoaXMuX2Nsb3NlT3RoZXIoaXRlbSwgY2xvc2VDaGlsZHJlbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fdG9nZ2xlRHJvcGRvd24odHJ1ZSwgaXRlbSwgY2xvc2VDaGlsZHJlbilcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcclxuICAgICAgICAgIHRoaXMuX29uT3BlbmVkICYmIHRoaXMuX29uT3BlbmVkKHRoaXMsIGl0ZW0sIHRvZ2dsZUxpbmssIE1lbnUuX2ZpbmRNZW51KGl0ZW0pKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKCgpID0+IHt9KVxyXG4gIH1cclxuXHJcbiAgY2xvc2UoZWwsIGNsb3NlQ2hpbGRyZW4gPSB0aGlzLl9jbG9zZUNoaWxkcmVuLCBfYXV0b0Nsb3NlID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IGl0ZW0gPSBNZW51Ll9nZXRJdGVtKGVsLCB0cnVlKVxyXG4gICAgY29uc3QgdG9nZ2xlTGluayA9IE1lbnUuX2dldExpbmsoZWwsIHRydWUpXHJcblxyXG4gICAgaWYgKCFpdGVtLmNsYXNzTGlzdC5jb250YWlucygnb3BlbicpIHx8IGl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXNhYmxlZCcpKSByZXR1cm5cclxuXHJcbiAgICBNZW51Ll9wcm9taXNpZnkodGhpcy5fb25DbG9zZSwgdGhpcywgaXRlbSwgdG9nZ2xlTGluaywgTWVudS5fZmluZE1lbnUoaXRlbSksIF9hdXRvQ2xvc2UpXHJcbiAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuX2hvcml6b250YWwgfHwgIU1lbnUuX2lzUm9vdChpdGVtKSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2FuaW1hdGUgJiYgIXRoaXMuX2hvcml6b250YWwpIHtcclxuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLl90b2dnbGVBbmltYXRpb24oZmFsc2UsIGl0ZW0sIGNsb3NlQ2hpbGRyZW4pKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJylcclxuXHJcbiAgICAgICAgICAgIGlmIChjbG9zZUNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgb3BlbmVkID0gaXRlbS5xdWVyeVNlbGVjdG9yQWxsKCcubWVudS1pdGVtLm9wZW4nKVxyXG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gb3BlbmVkLmxlbmd0aDsgaSA8IGw7IGkrKykgb3BlbmVkW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXHJcbiAgICAgICAgICAgIHRoaXMuX29uQ2xvc2VkICYmIHRoaXMuX29uQ2xvc2VkKHRoaXMsIGl0ZW0sIHRvZ2dsZUxpbmssIE1lbnUuX2ZpbmRNZW51KGl0ZW0pKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl90b2dnbGVEcm9wZG93bihmYWxzZSwgaXRlbSwgY2xvc2VDaGlsZHJlbilcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcclxuICAgICAgICAgIHRoaXMuX29uQ2xvc2VkICYmIHRoaXMuX29uQ2xvc2VkKHRoaXMsIGl0ZW0sIHRvZ2dsZUxpbmssIE1lbnUuX2ZpbmRNZW51KGl0ZW0pKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKCgpID0+IHt9KVxyXG4gIH1cclxuXHJcbiAgX2Nsb3NlT3RoZXIoaXRlbSwgY2xvc2VDaGlsZHJlbikge1xyXG4gICAgY29uc3Qgb3BlbmVkID0gTWVudS5fZmluZENoaWxkKGl0ZW0ucGFyZW50Tm9kZSwgWydtZW51LWl0ZW0nLCAnb3BlbiddKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gb3BlbmVkLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICBpZiAob3BlbmVkW2ldICE9PSBpdGVtKSB0aGlzLmNsb3NlKG9wZW5lZFtpXSwgY2xvc2VDaGlsZHJlbilcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZShlbCwgY2xvc2VDaGlsZHJlbiA9IHRoaXMuX2Nsb3NlQ2hpbGRyZW4pIHtcclxuICAgIGNvbnN0IGl0ZW0gPSBNZW51Ll9nZXRJdGVtKGVsLCB0cnVlKVxyXG4gICAgLy8gY29uc3QgdG9nZ2xlTGluayA9IE1lbnUuX2dldExpbmsoZWwsIHRydWUpXHJcblxyXG4gICAgaWYgKGl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdvcGVuJykpIHRoaXMuY2xvc2UoaXRlbSwgY2xvc2VDaGlsZHJlbilcclxuICAgIGVsc2UgdGhpcy5vcGVuKGl0ZW0sIGNsb3NlQ2hpbGRyZW4pXHJcbiAgfVxyXG5cclxuICBfdG9nZ2xlRHJvcGRvd24oc2hvdywgaXRlbSwgY2xvc2VDaGlsZHJlbikge1xyXG4gICAgY29uc3QgbWVudSA9IE1lbnUuX2ZpbmRNZW51KGl0ZW0pXHJcbiAgICBjb25zdCBhY3R1YWxJdGVtID0gaXRlbVxyXG4gICAgbGV0IHN1Yk1lbnVJdGVtID0gZmFsc2VcclxuXHJcbiAgICBpZiAoc2hvdykge1xyXG4gICAgICBpZiAoTWVudS5fZmluZFBhcmVudChpdGVtLCAnbWVudS1zdWInLCBmYWxzZSkpIHtcclxuICAgICAgICBzdWJNZW51SXRlbSA9IHRydWVcclxuICAgICAgICBpdGVtID0gdGhpcy5fdG9wUGFyZW50ID8gdGhpcy5fdG9wUGFyZW50LnBhcmVudE5vZGUgOiBpdGVtXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHdyYXBwZXJXaWR0aCA9IE1hdGgucm91bmQodGhpcy5fd3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aClcclxuICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLl9pbm5lclBvc2l0aW9uXHJcbiAgICAgIGNvbnN0IGl0ZW1PZmZzZXQgPSB0aGlzLl9nZXRJdGVtT2Zmc2V0KGl0ZW0pXHJcbiAgICAgIGNvbnN0IGl0ZW1XaWR0aCA9IE1hdGgucm91bmQoaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aClcclxuXHJcbiAgICAgIGlmIChpdGVtT2Zmc2V0IC0gREVMVEEgPD0gLTEgKiBwb3NpdGlvbikge1xyXG4gICAgICAgIHRoaXMuX2lubmVyUG9zaXRpb24gPSAtMSAqIGl0ZW1PZmZzZXRcclxuICAgICAgfSBlbHNlIGlmIChpdGVtT2Zmc2V0ICsgcG9zaXRpb24gKyBpdGVtV2lkdGggKyBERUxUQSA+PSB3cmFwcGVyV2lkdGgpIHtcclxuICAgICAgICBpZiAoaXRlbVdpZHRoID4gd3JhcHBlcldpZHRoKSB7XHJcbiAgICAgICAgICB0aGlzLl9pbm5lclBvc2l0aW9uID0gLTEgKiBpdGVtT2Zmc2V0XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX2lubmVyUG9zaXRpb24gPSAtMSAqIChpdGVtT2Zmc2V0ICsgaXRlbVdpZHRoIC0gd3JhcHBlcldpZHRoKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgYWN0dWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdvcGVuJylcclxuXHJcbiAgICAgIGNvbnN0IG1lbnVXaWR0aCA9IE1hdGgucm91bmQobWVudS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aClcclxuXHJcbiAgICAgIGlmIChzdWJNZW51SXRlbSkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGl0ZW1PZmZzZXQgKyB0aGlzLl9pbm5lclBvc2l0aW9uICsgbWVudVdpZHRoICogMiA+IHdyYXBwZXJXaWR0aCAmJlxyXG4gICAgICAgICAgbWVudVdpZHRoIDwgd3JhcHBlcldpZHRoICYmXHJcbiAgICAgICAgICBtZW51V2lkdGggPj0gaXRlbVdpZHRoXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBtZW51LnN0eWxlLmxlZnQgPSBbdGhpcy5fcnRsID8gJzEwMCUnIDogJy0xMDAlJ11cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgaXRlbU9mZnNldCArIHRoaXMuX2lubmVyUG9zaXRpb24gKyBtZW51V2lkdGggPiB3cmFwcGVyV2lkdGggJiZcclxuICAgICAgICBtZW51V2lkdGggPCB3cmFwcGVyV2lkdGggJiZcclxuICAgICAgICBtZW51V2lkdGggPiBpdGVtV2lkdGhcclxuICAgICAgKSB7XHJcbiAgICAgICAgbWVudS5zdHlsZVt0aGlzLl9ydGwgPyAnbWFyZ2luUmlnaHQnIDogJ21hcmdpbkxlZnQnXSA9IGAtJHttZW51V2lkdGggLSBpdGVtV2lkdGh9cHhgXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX2Nsb3NlT3RoZXIoYWN0dWFsSXRlbSwgY2xvc2VDaGlsZHJlbilcclxuICAgICAgdGhpcy5fdXBkYXRlU2xpZGVyKClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRvZ2dsZSA9IE1lbnUuX2ZpbmRDaGlsZChpdGVtLCBbJ21lbnUtdG9nZ2xlJ10pXHJcblxyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXHJcbiAgICAgIHRvZ2dsZS5sZW5ndGggJiYgdG9nZ2xlWzBdLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1ob3ZlcicsICd0cnVlJylcclxuICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJylcclxuICAgICAgbWVudS5zdHlsZVt0aGlzLl9ydGwgPyAnbWFyZ2luUmlnaHQnIDogJ21hcmdpbkxlZnQnXSA9IG51bGxcclxuXHJcbiAgICAgIGlmIChjbG9zZUNoaWxkcmVuKSB7XHJcbiAgICAgICAgY29uc3Qgb3BlbmVkID0gbWVudS5xdWVyeVNlbGVjdG9yQWxsKCcubWVudS1pdGVtLm9wZW4nKVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IG9wZW5lZC5sZW5ndGg7IGkgPCBsOyBpKyspIG9wZW5lZFtpXS5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJylcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgX3NsaWRlKGRpcmVjdGlvbikge1xyXG4gICAgY29uc3Qgd3JhcHBlcldpZHRoID0gTWF0aC5yb3VuZCh0aGlzLl93cmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKVxyXG4gICAgY29uc3QgaW5uZXJXaWR0aCA9IHRoaXMuX2lubmVyV2lkdGhcclxuICAgIGxldCBuZXdQb3NpdGlvblxyXG5cclxuICAgIGlmIChkaXJlY3Rpb24gPT09ICduZXh0Jykge1xyXG4gICAgICBuZXdQb3NpdGlvbiA9IHRoaXMuX2dldFNsaWRlTmV4dFBvcygpXHJcblxyXG4gICAgICBpZiAoaW5uZXJXaWR0aCArIG5ld1Bvc2l0aW9uIDwgd3JhcHBlcldpZHRoKSB7XHJcbiAgICAgICAgbmV3UG9zaXRpb24gPSB3cmFwcGVyV2lkdGggLSBpbm5lcldpZHRoXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5ld1Bvc2l0aW9uID0gdGhpcy5fZ2V0U2xpZGVQcmV2UG9zKClcclxuXHJcbiAgICAgIGlmIChuZXdQb3NpdGlvbiA+IDApIG5ld1Bvc2l0aW9uID0gMFxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2lubmVyUG9zaXRpb24gPSBuZXdQb3NpdGlvblxyXG4gICAgdGhpcy51cGRhdGUoKVxyXG4gIH1cclxuXHJcbiAgX2dldFNsaWRlTmV4dFBvcygpIHtcclxuICAgIGNvbnN0IHdyYXBwZXJXaWR0aCA9IE1hdGgucm91bmQodGhpcy5fd3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aClcclxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5faW5uZXJQb3NpdGlvblxyXG4gICAgbGV0IGN1ckl0ZW0gPSB0aGlzLl9pbm5lci5jaGlsZE5vZGVzWzBdXHJcbiAgICBsZXQgbGVmdCA9IDBcclxuXHJcbiAgICB3aGlsZSAoY3VySXRlbSkge1xyXG4gICAgICBpZiAoY3VySXRlbS50YWdOYW1lKSB7XHJcbiAgICAgICAgY29uc3QgY3VySXRlbVdpZHRoID0gTWF0aC5yb3VuZChjdXJJdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKVxyXG5cclxuICAgICAgICBpZiAobGVmdCArIHBvc2l0aW9uIC0gREVMVEEgPD0gd3JhcHBlcldpZHRoICYmIGxlZnQgKyBwb3NpdGlvbiArIGN1ckl0ZW1XaWR0aCArIERFTFRBID49IHdyYXBwZXJXaWR0aCkge1xyXG4gICAgICAgICAgaWYgKGN1ckl0ZW1XaWR0aCA+IHdyYXBwZXJXaWR0aCAmJiBsZWZ0ID09PSAtMSAqIHBvc2l0aW9uKSBsZWZ0ICs9IGN1ckl0ZW1XaWR0aFxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxlZnQgKz0gY3VySXRlbVdpZHRoXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGN1ckl0ZW0gPSBjdXJJdGVtLm5leHRTaWJsaW5nXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIC0xICogbGVmdFxyXG4gIH1cclxuXHJcbiAgX2dldFNsaWRlUHJldlBvcygpIHtcclxuICAgIGNvbnN0IHdyYXBwZXJXaWR0aCA9IE1hdGgucm91bmQodGhpcy5fd3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aClcclxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5faW5uZXJQb3NpdGlvblxyXG4gICAgbGV0IGN1ckl0ZW0gPSB0aGlzLl9pbm5lci5jaGlsZE5vZGVzWzBdXHJcbiAgICBsZXQgbGVmdCA9IDBcclxuXHJcbiAgICB3aGlsZSAoY3VySXRlbSkge1xyXG4gICAgICBpZiAoY3VySXRlbS50YWdOYW1lKSB7XHJcbiAgICAgICAgY29uc3QgY3VySXRlbVdpZHRoID0gTWF0aC5yb3VuZChjdXJJdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKVxyXG5cclxuICAgICAgICBpZiAobGVmdCAtIERFTFRBIDw9IC0xICogcG9zaXRpb24gJiYgbGVmdCArIGN1ckl0ZW1XaWR0aCArIERFTFRBID49IC0xICogcG9zaXRpb24pIHtcclxuICAgICAgICAgIGlmIChjdXJJdGVtV2lkdGggPD0gd3JhcHBlcldpZHRoKSBsZWZ0ID0gbGVmdCArIGN1ckl0ZW1XaWR0aCAtIHdyYXBwZXJXaWR0aFxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxlZnQgKz0gY3VySXRlbVdpZHRoXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGN1ckl0ZW0gPSBjdXJJdGVtLm5leHRTaWJsaW5nXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIC0xICogbGVmdFxyXG4gIH1cclxuXHJcbiAgc3RhdGljIF9nZXRJdGVtKGVsLCB0b2dnbGUpIHtcclxuICAgIGxldCBpdGVtID0gbnVsbFxyXG4gICAgY29uc3Qgc2VsZWN0b3IgPSB0b2dnbGUgPyAnbWVudS10b2dnbGUnIDogJ21lbnUtbGluaydcclxuXHJcbiAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdtZW51LWl0ZW0nKSkge1xyXG4gICAgICBpZiAoTWVudS5fZmluZENoaWxkKGVsLCBbc2VsZWN0b3JdKS5sZW5ndGgpIGl0ZW0gPSBlbFxyXG4gICAgfSBlbHNlIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoc2VsZWN0b3IpKSB7XHJcbiAgICAgIGl0ZW0gPSBlbC5wYXJlbnROb2RlLmNsYXNzTGlzdC5jb250YWlucygnbWVudS1pdGVtJykgPyBlbC5wYXJlbnROb2RlIDogbnVsbFxyXG4gICAgfVxyXG5cclxuICAgIGlmICghaXRlbSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dG9nZ2xlID8gJ1RvZ2dhYmxlICcgOiAnJ31cXGAubWVudS1pdGVtXFxgIGVsZW1lbnQgbm90IGZvdW5kLmApXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBfZ2V0TGluayhlbCwgdG9nZ2xlKSB7XHJcbiAgICBsZXQgZm91bmQgPSBbXVxyXG4gICAgY29uc3Qgc2VsZWN0b3IgPSB0b2dnbGUgPyAnbWVudS10b2dnbGUnIDogJ21lbnUtbGluaydcclxuXHJcbiAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKHNlbGVjdG9yKSkgZm91bmQgPSBbZWxdXHJcbiAgICBlbHNlIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ21lbnUtaXRlbScpKSBmb3VuZCA9IE1lbnUuX2ZpbmRDaGlsZChlbCwgW3NlbGVjdG9yXSlcclxuXHJcbiAgICBpZiAoIWZvdW5kLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKGBcXGAke3NlbGVjdG9yfVxcYCBlbGVtZW50IG5vdCBmb3VuZC5gKVxyXG5cclxuICAgIHJldHVybiBmb3VuZFswXVxyXG4gIH1cclxuXHJcbiAgX2ZpbmRVbm9wZW5lZFBhcmVudChpdGVtLCBjbG9zZUNoaWxkcmVuKSB7XHJcbiAgICBsZXQgdHJlZSA9IFtdXHJcbiAgICBsZXQgcGFyZW50SXRlbSA9IG51bGxcclxuXHJcbiAgICB3aGlsZSAoaXRlbSkge1xyXG4gICAgICBpZiAoaXRlbS5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpIHtcclxuICAgICAgICBwYXJlbnRJdGVtID0gbnVsbFxyXG4gICAgICAgIHRyZWUgPSBbXVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICghaXRlbS5jbGFzc0xpc3QuY29udGFpbnMoJ29wZW4nKSkgcGFyZW50SXRlbSA9IGl0ZW1cclxuICAgICAgICB0cmVlLnB1c2goaXRlbSlcclxuICAgICAgfVxyXG5cclxuICAgICAgaXRlbSA9IE1lbnUuX2ZpbmRQYXJlbnQoaXRlbSwgJ21lbnUtaXRlbScsIGZhbHNlKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghcGFyZW50SXRlbSkgcmV0dXJuIG51bGxcclxuICAgIGlmICh0cmVlLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHBhcmVudEl0ZW1cclxuXHJcbiAgICB0cmVlID0gdHJlZS5zbGljZSgwLCB0cmVlLmluZGV4T2YocGFyZW50SXRlbSkpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0cmVlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICB0cmVlW2ldLmNsYXNzTGlzdC5hZGQoJ29wZW4nKVxyXG5cclxuICAgICAgaWYgKHRoaXMuX2FjY29yZGlvbikge1xyXG4gICAgICAgIGNvbnN0IG9wZW5lZEl0ZW1zID0gTWVudS5fZmluZENoaWxkKHRyZWVbaV0ucGFyZW50Tm9kZSwgWydtZW51LWl0ZW0nLCAnb3BlbiddKVxyXG5cclxuICAgICAgICBmb3IgKGxldCBqID0gMCwgayA9IG9wZW5lZEl0ZW1zLmxlbmd0aDsgaiA8IGs7IGorKykge1xyXG4gICAgICAgICAgaWYgKG9wZW5lZEl0ZW1zW2pdICE9PSB0cmVlW2ldKSB7XHJcbiAgICAgICAgICAgIG9wZW5lZEl0ZW1zW2pdLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKVxyXG5cclxuICAgICAgICAgICAgaWYgKGNsb3NlQ2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICBjb25zdCBvcGVuZWRDaGlsZHJlbiA9IG9wZW5lZEl0ZW1zW2pdLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tZW51LWl0ZW0ub3BlbicpXHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgeCA9IDAsIHogPSBvcGVuZWRDaGlsZHJlbi5sZW5ndGg7IHggPCB6OyB4KyspIHtcclxuICAgICAgICAgICAgICAgIG9wZW5lZENoaWxkcmVuW3hdLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwYXJlbnRJdGVtXHJcbiAgfVxyXG5cclxuICBfdG9nZ2xlQW5pbWF0aW9uKG9wZW4sIGl0ZW0sIGNsb3NlQ2hpbGRyZW4pIHtcclxuICAgIGNvbnN0IHRvZ2dsZUxpbmsgPSBNZW51Ll9nZXRMaW5rKGl0ZW0sIHRydWUpXHJcbiAgICBjb25zdCBtZW51ID0gTWVudS5fZmluZE1lbnUoaXRlbSlcclxuXHJcbiAgICBNZW51Ll91bmJpbmRBbmltYXRpb25FbmRFdmVudChpdGVtKVxyXG5cclxuICAgIGNvbnN0IGxpbmtIZWlnaHQgPSBNYXRoLnJvdW5kKHRvZ2dsZUxpbmsuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KVxyXG5cclxuICAgIGl0ZW0uc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJ1xyXG5cclxuICAgIGNvbnN0IGNsZWFySXRlbVN0eWxlID0gKCkgPT4ge1xyXG4gICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ21lbnUtaXRlbS1hbmltYXRpbmcnKVxyXG4gICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ21lbnUtaXRlbS1jbG9zaW5nJylcclxuICAgICAgaXRlbS5zdHlsZS5vdmVyZmxvdyA9IG51bGxcclxuICAgICAgaXRlbS5zdHlsZS5oZWlnaHQgPSBudWxsXHJcblxyXG4gICAgICBpZiAoIXRoaXMuX2hvcml6b250YWwpIHRoaXMudXBkYXRlKClcclxuICAgIH1cclxuXHJcbiAgICBpZiAob3Blbikge1xyXG4gICAgICBpdGVtLnN0eWxlLmhlaWdodCA9IGAke2xpbmtIZWlnaHR9cHhgXHJcbiAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgnbWVudS1pdGVtLWFuaW1hdGluZycpXHJcbiAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgnb3BlbicpXHJcblxyXG4gICAgICBNZW51Ll9iaW5kQW5pbWF0aW9uRW5kRXZlbnQoaXRlbSwgKCkgPT4ge1xyXG4gICAgICAgIGNsZWFySXRlbVN0eWxlKClcclxuICAgICAgICB0aGlzLl9vbk9wZW5lZCh0aGlzLCBpdGVtLCB0b2dnbGVMaW5rLCBtZW51KVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaXRlbS5zdHlsZS5oZWlnaHQgPSBgJHtsaW5rSGVpZ2h0ICsgTWF0aC5yb3VuZChtZW51LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCl9cHhgXHJcbiAgICAgIH0sIDUwKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaXRlbS5zdHlsZS5oZWlnaHQgPSBgJHtsaW5rSGVpZ2h0ICsgTWF0aC5yb3VuZChtZW51LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCl9cHhgXHJcbiAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgnbWVudS1pdGVtLWFuaW1hdGluZycpXHJcbiAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgnbWVudS1pdGVtLWNsb3NpbmcnKVxyXG5cclxuICAgICAgTWVudS5fYmluZEFuaW1hdGlvbkVuZEV2ZW50KGl0ZW0sICgpID0+IHtcclxuICAgICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKVxyXG4gICAgICAgIGNsZWFySXRlbVN0eWxlKClcclxuXHJcbiAgICAgICAgaWYgKGNsb3NlQ2hpbGRyZW4pIHtcclxuICAgICAgICAgIGNvbnN0IG9wZW5lZCA9IGl0ZW0ucXVlcnlTZWxlY3RvckFsbCgnLm1lbnUtaXRlbS5vcGVuJylcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gb3BlbmVkLmxlbmd0aDsgaSA8IGw7IGkrKykgb3BlbmVkW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fb25DbG9zZWQodGhpcywgaXRlbSwgdG9nZ2xlTGluaywgbWVudSlcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGl0ZW0uc3R5bGUuaGVpZ2h0ID0gYCR7bGlua0hlaWdodH1weGBcclxuICAgICAgfSwgNTApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgX2JpbmRBbmltYXRpb25FbmRFdmVudChlbCwgaGFuZGxlcikge1xyXG4gICAgY29uc3QgY2IgPSBlID0+IHtcclxuICAgICAgaWYgKGUudGFyZ2V0ICE9PSBlbCkgcmV0dXJuXHJcbiAgICAgIE1lbnUuX3VuYmluZEFuaW1hdGlvbkVuZEV2ZW50KGVsKVxyXG4gICAgICBoYW5kbGVyKGUpXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGR1cmF0aW9uID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpLnRyYW5zaXRpb25EdXJhdGlvblxyXG4gICAgZHVyYXRpb24gPSBwYXJzZUZsb2F0KGR1cmF0aW9uKSAqIChkdXJhdGlvbi5pbmRleE9mKCdtcycpICE9PSAtMSA/IDEgOiAxMDAwKVxyXG5cclxuICAgIGVsLl9tZW51QW5pbWF0aW9uRW5kRXZlbnRDYiA9IGNiXHJcbiAgICBUUkFOU0lUSU9OX0VWRU5UUy5mb3JFYWNoKGV2ID0+IGVsLmFkZEV2ZW50TGlzdGVuZXIoZXYsIGVsLl9tZW51QW5pbWF0aW9uRW5kRXZlbnRDYiwgZmFsc2UpKVxyXG5cclxuICAgIGVsLl9tZW51QW5pbWF0aW9uRW5kRXZlbnRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGNiKHsgdGFyZ2V0OiBlbCB9KVxyXG4gICAgfSwgZHVyYXRpb24gKyA1MClcclxuICB9XHJcblxyXG4gIF9nZXRJdGVtT2Zmc2V0KGl0ZW0pIHtcclxuICAgIGxldCBjdXJJdGVtID0gdGhpcy5faW5uZXIuY2hpbGROb2Rlc1swXVxyXG4gICAgbGV0IGxlZnQgPSAwXHJcblxyXG4gICAgd2hpbGUgKGN1ckl0ZW0gIT09IGl0ZW0pIHtcclxuICAgICAgaWYgKGN1ckl0ZW0udGFnTmFtZSkge1xyXG4gICAgICAgIGxlZnQgKz0gTWF0aC5yb3VuZChjdXJJdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjdXJJdGVtID0gY3VySXRlbS5uZXh0U2libGluZ1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsZWZ0XHJcbiAgfVxyXG5cclxuICBfdXBkYXRlU2xpZGVyKHdyYXBwZXJXaWR0aCA9IG51bGwsIGlubmVyV2lkdGggPSBudWxsLCBwb3NpdGlvbiA9IG51bGwpIHtcclxuICAgIGNvbnN0IF93cmFwcGVyV2lkdGggPSB3cmFwcGVyV2lkdGggIT09IG51bGwgPyB3cmFwcGVyV2lkdGggOiBNYXRoLnJvdW5kKHRoaXMuX3dyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpXHJcbiAgICBjb25zdCBfaW5uZXJXaWR0aCA9IGlubmVyV2lkdGggIT09IG51bGwgPyBpbm5lcldpZHRoIDogdGhpcy5faW5uZXJXaWR0aFxyXG4gICAgY29uc3QgX3Bvc2l0aW9uID0gcG9zaXRpb24gIT09IG51bGwgPyBwb3NpdGlvbiA6IHRoaXMuX2lubmVyUG9zaXRpb25cclxuXHJcbiAgICBpZiAoX2lubmVyV2lkdGggPCBfd3JhcHBlcldpZHRoIHx8IHdpbmRvdy5pbm5lcldpZHRoIDwgd2luZG93LkhlbHBlcnMuTEFZT1VUX0JSRUFLUE9JTlQpIHtcclxuICAgICAgdGhpcy5fcHJldkJ0bi5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKVxyXG4gICAgICB0aGlzLl9uZXh0QnRuLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9wcmV2QnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpXHJcbiAgICAgIHRoaXMuX25leHRCdG4uY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJylcclxuICAgIH1cclxuICAgIGlmIChfaW5uZXJXaWR0aCA+IF93cmFwcGVyV2lkdGggJiYgd2luZG93LmlubmVyV2lkdGggPiB3aW5kb3cuSGVscGVycy5MQVlPVVRfQlJFQUtQT0lOVCkge1xyXG4gICAgICBpZiAoX3Bvc2l0aW9uID09PSAwKSB0aGlzLl9wcmV2QnRuLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJylcclxuICAgICAgZWxzZSB0aGlzLl9wcmV2QnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2Rpc2FibGVkJylcclxuXHJcbiAgICAgIGlmIChfaW5uZXJXaWR0aCArIF9wb3NpdGlvbiA8PSBfd3JhcHBlcldpZHRoKSB0aGlzLl9uZXh0QnRuLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJylcclxuICAgICAgZWxzZSB0aGlzLl9uZXh0QnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2Rpc2FibGVkJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBfcHJvbWlzaWZ5KGZuLCAuLi5hcmdzKSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSBmbiguLi5hcmdzKVxyXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgfVxyXG4gICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KClcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxyXG4gIH1cclxuXHJcbiAgZ2V0IF9pbm5lcldpZHRoKCkge1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLl9pbm5lci5jaGlsZE5vZGVzXHJcbiAgICBsZXQgd2lkdGggPSAwXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgaWYgKGl0ZW1zW2ldLnRhZ05hbWUpIHtcclxuICAgICAgICB3aWR0aCArPSBNYXRoLnJvdW5kKGl0ZW1zW2ldLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHdpZHRoXHJcbiAgfVxyXG5cclxuICBnZXQgX2lubmVyUG9zaXRpb24oKSB7XHJcbiAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5faW5uZXIuc3R5bGVbdGhpcy5fcnRsID8gJ21hcmdpblJpZ2h0JyA6ICdtYXJnaW5MZWZ0J10gfHwgJzBweCcsIDEwKVxyXG4gIH1cclxuXHJcbiAgc2V0IF9pbm5lclBvc2l0aW9uKHZhbHVlKSB7XHJcbiAgICB0aGlzLl9pbm5lci5zdHlsZVt0aGlzLl9ydGwgPyAnbWFyZ2luUmlnaHQnIDogJ21hcmdpbkxlZnQnXSA9IGAke3ZhbHVlfXB4YFxyXG4gICAgcmV0dXJuIHZhbHVlXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgX3VuYmluZEFuaW1hdGlvbkVuZEV2ZW50KGVsKSB7XHJcbiAgICBjb25zdCBjYiA9IGVsLl9tZW51QW5pbWF0aW9uRW5kRXZlbnRDYlxyXG5cclxuICAgIGlmIChlbC5fbWVudUFuaW1hdGlvbkVuZEV2ZW50VGltZW91dCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQoZWwuX21lbnVBbmltYXRpb25FbmRFdmVudFRpbWVvdXQpXHJcbiAgICAgIGVsLl9tZW51QW5pbWF0aW9uRW5kRXZlbnRUaW1lb3V0ID0gbnVsbFxyXG4gICAgfVxyXG5cclxuICAgIGlmICghY2IpIHJldHVyblxyXG5cclxuICAgIFRSQU5TSVRJT05fRVZFTlRTLmZvckVhY2goZXYgPT4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldiwgY2IsIGZhbHNlKSlcclxuICAgIGVsLl9tZW51QW5pbWF0aW9uRW5kRXZlbnRDYiA9IG51bGxcclxuICB9XHJcblxyXG4gIGNsb3NlQWxsKGNsb3NlQ2hpbGRyZW4gPSB0aGlzLl9jbG9zZUNoaWxkcmVuKSB7XHJcbiAgICBjb25zdCBvcGVuZWQgPSB0aGlzLl9lbC5xdWVyeVNlbGVjdG9yQWxsKCcubWVudS1pbm5lciA+IC5tZW51LWl0ZW0ub3BlbicpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBvcGVuZWQubGVuZ3RoOyBpIDwgbDsgaSsrKSB0aGlzLmNsb3NlKG9wZW5lZFtpXSwgY2xvc2VDaGlsZHJlbilcclxuICB9XHJcblxyXG4gIHN0YXRpYyBzZXREaXNhYmxlZChlbCwgZGlzYWJsZWQpIHtcclxuICAgIE1lbnUuX2dldEl0ZW0oZWwsIGZhbHNlKS5jbGFzc0xpc3RbZGlzYWJsZWQgPyAnYWRkJyA6ICdyZW1vdmUnXSgnZGlzYWJsZWQnKVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGlzQWN0aXZlKGVsKSB7XHJcbiAgICByZXR1cm4gTWVudS5fZ2V0SXRlbShlbCwgZmFsc2UpLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJylcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpc09wZW5lZChlbCkge1xyXG4gICAgcmV0dXJuIE1lbnUuX2dldEl0ZW0oZWwsIGZhbHNlKS5jbGFzc0xpc3QuY29udGFpbnMoJ29wZW4nKVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGlzRGlzYWJsZWQoZWwpIHtcclxuICAgIHJldHVybiBNZW51Ll9nZXRJdGVtKGVsLCBmYWxzZSkuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXNhYmxlZCcpXHJcbiAgfVxyXG5cclxuICB1cGRhdGUoKSB7XHJcbiAgICBpZiAoIXRoaXMuX2hvcml6b250YWwpIHtcclxuICAgICAgaWYgKHRoaXMuX3Njcm9sbGJhcikge1xyXG4gICAgICAgIHRoaXMuX3Njcm9sbGJhci51cGRhdGUoKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNsb3NlQWxsKClcclxuXHJcbiAgICAgIGNvbnN0IHdyYXBwZXJXaWR0aCA9IE1hdGgucm91bmQodGhpcy5fd3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aClcclxuICAgICAgY29uc3QgaW5uZXJXaWR0aCA9IHRoaXMuX2lubmVyV2lkdGhcclxuICAgICAgbGV0IHBvc2l0aW9uID0gdGhpcy5faW5uZXJQb3NpdGlvblxyXG5cclxuICAgICAgaWYgKHdyYXBwZXJXaWR0aCAtIHBvc2l0aW9uID4gaW5uZXJXaWR0aCkge1xyXG4gICAgICAgIHBvc2l0aW9uID0gd3JhcHBlcldpZHRoIC0gaW5uZXJXaWR0aFxyXG4gICAgICAgIGlmIChwb3NpdGlvbiA+IDApIHBvc2l0aW9uID0gMFxyXG4gICAgICAgIHRoaXMuX2lubmVyUG9zaXRpb24gPSBwb3NpdGlvblxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl91cGRhdGVTbGlkZXIod3JhcHBlcldpZHRoLCBpbm5lcldpZHRoLCBwb3NpdGlvbilcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1hbmFnZVNjcm9sbCgpIHtcclxuICAgIGNvbnN0IHsgUGVyZmVjdFNjcm9sbGJhciB9ID0gd2luZG93XHJcbiAgICBjb25zdCBtZW51SW5uZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWVudS1pbm5lcicpXHJcblxyXG4gICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgd2luZG93LkhlbHBlcnMuTEFZT1VUX0JSRUFLUE9JTlQpIHtcclxuICAgICAgaWYgKHRoaXMuX3Njcm9sbGJhciAhPT0gbnVsbCkge1xyXG4gICAgICAgIC8vIHdpbmRvdy5IZWxwZXJzLm1lbnVQc1Njcm9sbC5kZXN0cm95KClcclxuICAgICAgICB0aGlzLl9zY3JvbGxiYXIuZGVzdHJveSgpXHJcbiAgICAgICAgdGhpcy5fc2Nyb2xsYmFyID0gbnVsbFxyXG4gICAgICB9XHJcbiAgICAgIG1lbnVJbm5lci5jbGFzc0xpc3QuYWRkKCdvdmVyZmxvdy1hdXRvJylcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9zY3JvbGxiYXIgPT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCBtZW51U2Nyb2xsID0gbmV3IFBlcmZlY3RTY3JvbGxiYXIoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lbnUtaW5uZXInKSwge1xyXG4gICAgICAgICAgc3VwcHJlc3NTY3JvbGxYOiB0cnVlLFxyXG4gICAgICAgICAgd2hlZWxQcm9wYWdhdGlvbjogZmFsc2VcclxuICAgICAgICB9KVxyXG4gICAgICAgIC8vIHdpbmRvdy5IZWxwZXJzLm1lbnVQc1Njcm9sbCA9IG1lbnVTY3JvbGxcclxuICAgICAgICB0aGlzLl9zY3JvbGxiYXIgPSBtZW51U2Nyb2xsXHJcbiAgICAgIH1cclxuICAgICAgbWVudUlubmVyLmNsYXNzTGlzdC5yZW1vdmUoJ292ZXJmbG93LWF1dG8nKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3dpdGNoTWVudShtZW51KSB7XHJcbiAgICAvLyBVbmJpbmQgRXZlbnRzXHJcbiAgICB0aGlzLl91bmJpbmRFdmVudHMoKVxyXG5cclxuICAgIC8vIGNvbnN0IGh0bWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRcclxuICAgIGNvbnN0IG5hdmJhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ25hdi5sYXlvdXQtbmF2YmFyJylcclxuICAgIGNvbnN0IG5hdmJhckNvbGxhcHNlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI25hdmJhci1jb2xsYXBzZScpXHJcbiAgICAvKiBjb25zdCBmdWxsTmF2YmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxheW91dC1uYXZiYXItZnVsbCcpXHJcbiAgICBjb25zdCBjb250ZW50TmF2YmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxheW91dC1jb250ZW50LW5hdmJhcicpXHJcbiAgICBjb25zdCBjb250ZW50V3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb250ZW50LXdyYXBwZXInKSAqL1xyXG4gICAgY29uc3QgYXNpZGVNZW51V3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNsYXlvdXQtbWVudSBkaXYnKVxyXG4gICAgY29uc3QgYXNpZGVNZW51ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2xheW91dC1tZW51JylcclxuICAgIGNvbnN0IGhvcnpNZW51Q2xhc3NlcyA9IFsnbGF5b3V0LW1lbnUtaG9yaXpvbnRhbCcsICdtZW51JywgJ21lbnUtaG9yaXpvbnRhbCcsICdjb250YWluZXItZmx1aWQnLCAnZmxleC1ncm93LTAnXVxyXG4gICAgY29uc3QgdmVydE1lbnVDbGFzc2VzID0gWydsYXlvdXQtbWVudScsICdtZW51JywgJ21lbnUtdmVydGljYWwnXVxyXG4gICAgY29uc3QgaG9yek1lbnVXcmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lbnUtaG9yaXpvbnRhbC13cmFwcGVyJylcclxuICAgIGNvbnN0IG1lbnVJbm5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZW51LWlubmVyJylcclxuICAgIGNvbnN0IGJyYW5kID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFwcC1icmFuZCcpXHJcbiAgICBjb25zdCBtZW51VG9nZ2xlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5sYXlvdXQtbWVudS10b2dnbGUnKVxyXG4gICAgY29uc3QgYWN0aXZlTWVudUl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1lbnUtaW5uZXIgLmFjdGl2ZScpXHJcbiAgICAvKiBjb25zdCBsYXlvdXRQYWdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxheW91dC1wYWdlJylcclxuICAgIGNvbnN0IGxheW91dENvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5sYXlvdXQtY29udGFpbmVyJylcclxuICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29udGFpbmVyLWZsdWlkJykgKi9cclxuXHJcbiAgICAvLyBjb25zdCB7IFBlcmZlY3RTY3JvbGxiYXIgfSA9IHdpbmRvd1xyXG5cclxuICAgIGlmIChtZW51ID09PSAndmVydGljYWwnKSB7XHJcbiAgICAgIHRoaXMuX2hvcml6b250YWwgPSBmYWxzZVxyXG4gICAgICBhc2lkZU1lbnVXcmFwcGVyLmluc2VydEJlZm9yZShicmFuZCwgaG9yek1lbnVXcmFwcGVyKVxyXG4gICAgICBhc2lkZU1lbnVXcmFwcGVyLmluc2VydEJlZm9yZShtZW51SW5uZXIsIGhvcnpNZW51V3JhcHBlcilcclxuICAgICAgYXNpZGVNZW51V3JhcHBlci5jbGFzc0xpc3QuYWRkKCdmbGV4LWNvbHVtbicsICdwLTAnKVxyXG4gICAgICBhc2lkZU1lbnUuY2xhc3NMaXN0LnJlbW92ZSguLi5hc2lkZU1lbnUuY2xhc3NMaXN0KVxyXG4gICAgICBhc2lkZU1lbnUuY2xhc3NMaXN0LmFkZCguLi52ZXJ0TWVudUNsYXNzZXMsIHRoaXMuX21lbnVCZ0NsYXNzKVxyXG4gICAgICBicmFuZC5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnLCAnZC1sZy1mbGV4JylcclxuICAgICAgbWVudVRvZ2dsZXIuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJylcclxuICAgICAgLy8gaWYgKFBlcmZlY3RTY3JvbGxiYXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyAgIHRoaXMuX3BzU2Nyb2xsID0gbmV3IFBlcmZlY3RTY3JvbGxiYXIoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lbnUtaW5uZXInKSwge1xyXG4gICAgICAvLyAgICAgc3VwcHJlc3NTY3JvbGxYOiB0cnVlLFxyXG4gICAgICAvLyAgICAgd2hlZWxQcm9wYWdhdGlvbjogIU1lbnUuX2hhc0NsYXNzKCdsYXlvdXQtbWVudS1maXhlZCBsYXlvdXQtbWVudS1maXhlZC1vZmZjYW52YXMnKVxyXG4gICAgICAvLyAgIH0pXHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIG1lbnVJbm5lci5jbGFzc0xpc3QuYWRkKCdvdmVyZmxvdy1hdXRvJylcclxuXHJcbiAgICAgIC8vIEFkZCBvcGVuIGNsYXNzIHRvIGFjdGl2ZSBpdGVtc1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdGl2ZU1lbnVJdGVtcy5sZW5ndGggLSAxOyArK2kpIHtcclxuICAgICAgICBhY3RpdmVNZW51SXRlbXNbaV0uY2xhc3NMaXN0LmFkZCgnb3BlbicpXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2hvcml6b250YWwgPSB0cnVlXHJcbiAgICAgIG5hdmJhci5jaGlsZHJlblswXS5pbnNlcnRCZWZvcmUoYnJhbmQsIG5hdmJhckNvbGxhcHNlKVxyXG4gICAgICBicmFuZC5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnLCAnZC1sZy1mbGV4JylcclxuICAgICAgaG9yek1lbnVXcmFwcGVyLmFwcGVuZENoaWxkKG1lbnVJbm5lcilcclxuICAgICAgYXNpZGVNZW51V3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCdmbGV4LWNvbHVtbicsICdwLTAnKVxyXG4gICAgICBhc2lkZU1lbnUuY2xhc3NMaXN0LnJlbW92ZSguLi5hc2lkZU1lbnUuY2xhc3NMaXN0KVxyXG4gICAgICBhc2lkZU1lbnUuY2xhc3NMaXN0LmFkZCguLi5ob3J6TWVudUNsYXNzZXMsIHRoaXMuX21lbnVCZ0NsYXNzKVxyXG4gICAgICBtZW51VG9nZ2xlci5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKVxyXG4gICAgICBtZW51SW5uZXIuY2xhc3NMaXN0LnJlbW92ZSgnb3ZlcmZsb3ctYXV0bycpXHJcblxyXG4gICAgICAvLyBpZiAoUGVyZmVjdFNjcm9sbGJhciAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX3BzU2Nyb2xsICE9PSBudWxsKSB7XHJcbiAgICAgIC8vICAgdGhpcy5fcHNTY3JvbGwuZGVzdHJveSgpXHJcbiAgICAgIC8vICAgdGhpcy5fcHNTY3JvbGwgPSBudWxsXHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIC8vIFJlbW92ZSBvcGVuIGNsYXNzIGZyb20gYWN0aXZlIGl0ZW1zXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0aXZlTWVudUl0ZW1zLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgYWN0aXZlTWVudUl0ZW1zW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fYmluZEV2ZW50cygpXHJcbiAgfVxyXG5cclxuICBkZXN0cm95KCkge1xyXG4gICAgaWYgKCF0aGlzLl9lbCkgcmV0dXJuXHJcblxyXG4gICAgdGhpcy5fdW5iaW5kRXZlbnRzKClcclxuXHJcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuX2VsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tZW51LWl0ZW0nKVxyXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgTWVudS5fdW5iaW5kQW5pbWF0aW9uRW5kRXZlbnQoaXRlbXNbaV0pXHJcbiAgICAgIGl0ZW1zW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ21lbnUtaXRlbS1hbmltYXRpbmcnKVxyXG4gICAgICBpdGVtc1tpXS5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJylcclxuICAgICAgaXRlbXNbaV0uc3R5bGUub3ZlcmZsb3cgPSBudWxsXHJcbiAgICAgIGl0ZW1zW2ldLnN0eWxlLmhlaWdodCA9IG51bGxcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtZW51cyA9IHRoaXMuX2VsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tZW51LW1lbnUnKVxyXG4gICAgZm9yIChsZXQgaTIgPSAwLCBsMiA9IG1lbnVzLmxlbmd0aDsgaTIgPCBsMjsgaTIrKykge1xyXG4gICAgICBtZW51c1tpMl0uc3R5bGUubWFyZ2luUmlnaHQgPSBudWxsXHJcbiAgICAgIG1lbnVzW2kyXS5zdHlsZS5tYXJnaW5MZWZ0ID0gbnVsbFxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2VsLmNsYXNzTGlzdC5yZW1vdmUoJ21lbnUtbm8tYW5pbWF0aW9uJylcclxuXHJcbiAgICBpZiAodGhpcy5fd3JhcHBlcikge1xyXG4gICAgICB0aGlzLl9wcmV2QnRuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fcHJldkJ0bilcclxuICAgICAgdGhpcy5fbmV4dEJ0bi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX25leHRCdG4pXHJcbiAgICAgIHRoaXMuX3dyYXBwZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5faW5uZXIsIHRoaXMuX3dyYXBwZXIpXHJcbiAgICAgIHRoaXMuX3dyYXBwZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl93cmFwcGVyKVxyXG4gICAgICB0aGlzLl9pbm5lci5zdHlsZS5tYXJnaW5MZWZ0ID0gbnVsbFxyXG4gICAgICB0aGlzLl9pbm5lci5zdHlsZS5tYXJnaW5SaWdodCA9IG51bGxcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9lbC5tZW51SW5zdGFuY2UgPSBudWxsXHJcbiAgICBkZWxldGUgdGhpcy5fZWwubWVudUluc3RhbmNlXHJcblxyXG4gICAgdGhpcy5fZWwgPSBudWxsXHJcbiAgICB0aGlzLl9ob3Jpem9udGFsID0gbnVsbFxyXG4gICAgdGhpcy5fYW5pbWF0ZSA9IG51bGxcclxuICAgIHRoaXMuX2FjY29yZGlvbiA9IG51bGxcclxuICAgIHRoaXMuX3Nob3dEcm9wZG93bk9uSG92ZXIgPSBudWxsXHJcbiAgICB0aGlzLl9jbG9zZUNoaWxkcmVuID0gbnVsbFxyXG4gICAgdGhpcy5fcnRsID0gbnVsbFxyXG4gICAgdGhpcy5fb25PcGVuID0gbnVsbFxyXG4gICAgdGhpcy5fb25PcGVuZWQgPSBudWxsXHJcbiAgICB0aGlzLl9vbkNsb3NlID0gbnVsbFxyXG4gICAgdGhpcy5fb25DbG9zZWQgPSBudWxsXHJcbiAgICBpZiAodGhpcy5fc2Nyb2xsYmFyKSB7XHJcbiAgICAgIHRoaXMuX3Njcm9sbGJhci5kZXN0cm95KClcclxuICAgICAgdGhpcy5fc2Nyb2xsYmFyID0gbnVsbFxyXG4gICAgfVxyXG4gICAgdGhpcy5faW5uZXIgPSBudWxsXHJcbiAgICB0aGlzLl9wcmV2QnRuID0gbnVsbFxyXG4gICAgdGhpcy5fd3JhcHBlciA9IG51bGxcclxuICAgIHRoaXMuX25leHRCdG4gPSBudWxsXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgeyBNZW51IH1cclxuIl0sIm5hbWVzIjpbIlRSQU5TSVRJT05fRVZFTlRTIiwiREVMVEEiLCJNZW51IiwiZWwiLCJjb25maWciLCJfUFMiLCJfZWwiLCJfaG9yaXpvbnRhbCIsIm9yaWVudGF0aW9uIiwiX2FuaW1hdGUiLCJhbmltYXRlIiwiX2FjY29yZGlvbiIsImFjY29yZGlvbiIsIl9zaG93RHJvcGRvd25PbkhvdmVyIiwiQm9vbGVhbiIsInNob3dEcm9wZG93bk9uSG92ZXIiLCJfY2xvc2VDaGlsZHJlbiIsImNsb3NlQ2hpbGRyZW4iLCJfcnRsIiwiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJnZXRBdHRyaWJ1dGUiLCJib2R5IiwiX29uT3BlbiIsIm9uT3BlbiIsIl9vbk9wZW5lZCIsIm9uT3BlbmVkIiwiX29uQ2xvc2UiLCJvbkNsb3NlIiwiX29uQ2xvc2VkIiwib25DbG9zZWQiLCJfcHNTY3JvbGwiLCJfdG9wUGFyZW50IiwiX21lbnVCZ0NsYXNzIiwiY2xhc3NMaXN0IiwiYWRkIiwicmVtb3ZlIiwiUGVyZmVjdFNjcm9sbGJhckxpYiIsIndpbmRvdyIsIlBlcmZlY3RTY3JvbGxiYXIiLCJfc2Nyb2xsYmFyIiwicXVlcnlTZWxlY3RvciIsInN1cHByZXNzU2Nyb2xsWCIsIndoZWVsUHJvcGFnYXRpb24iLCJfaGFzQ2xhc3MiLCJIZWxwZXJzIiwibWVudVBzU2Nyb2xsIiwiX2lubmVyIiwiY29udGFpbmVyIiwicGFyZW50Tm9kZSIsIl9wcmV2QnRuIiwiY3JlYXRlRWxlbWVudCIsImhyZWYiLCJjbGFzc05hbWUiLCJhcHBlbmRDaGlsZCIsIl93cmFwcGVyIiwiX25leHRCdG4iLCJfaW5uZXJQb3NpdGlvbiIsInVwZGF0ZSIsIm1lbnVDbGFzc0xpc3QiLCJpIiwibGVuZ3RoIiwic3RhcnRzV2l0aCIsInNldEF0dHJpYnV0ZSIsImlubmVyV2lkdGgiLCJMQVlPVVRfQlJFQUtQT0lOVCIsInN3aXRjaE1lbnUiLCJfYmluZEV2ZW50cyIsIm1lbnVJbnN0YW5jZSIsIl9ldm50RWxDbGljayIsImUiLCJ0YXJnZXQiLCJjbG9zZXN0IiwiY29udGFpbnMiLCJtZW51SXRlbSIsIl9maW5kUGFyZW50IiwiY2hpbGROb2RlcyIsInRvZ2dsZUxpbmsiLCJwcmV2ZW50RGVmYXVsdCIsInRvZ2dsZSIsImlzTW9iaWxlRGV2aWNlIiwiYWRkRXZlbnRMaXN0ZW5lciIsIl9ldm50V2luZG93UmVzaXplIiwiX2xhc3RXaWR0aCIsImhvcml6b250YWxNZW51VGVtcGxhdGUiLCJtYW5hZ2VTY3JvbGwiLCJfZXZudFByZXZCdG5DbGljayIsIl9zbGlkZSIsIl9ldm50TmV4dEJ0bkNsaWNrIiwiX2V2bnRCb2R5Q2xpY2siLCJxdWVyeVNlbGVjdG9yQWxsIiwiY2xvc2VBbGwiLCJfZXZudEVsTW91c2VPdmVyIiwiY3VycmVudFRhcmdldCIsInN0b3BQcm9wYWdhdGlvbiIsInNjcmVlbiIsIndpZHRoIiwiX2V2bnRFbE1vdXNlT3V0IiwibWFpbkVsIiwibW91c2VPdXRFbCIsIm1vdXNlT3ZlckVsIiwidG9FbGVtZW50IiwicmVsYXRlZFRhcmdldCIsImNoaWxkT2YiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiX2V2bnRJbm5lck1vdXNlbW92ZSIsIl9ldm50SW5uZXJNb3VzZWxlYXZlIiwiaXRlbSIsIl9maW5kVW5vcGVuZWRQYXJlbnQiLCJfZ2V0SXRlbSIsIl9nZXRMaW5rIiwiX3Byb21pc2lmeSIsIl9maW5kTWVudSIsInRoZW4iLCJfaXNSb290IiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiX3RvZ2dsZUFuaW1hdGlvbiIsIl9jbG9zZU90aGVyIiwiX3RvZ2dsZURyb3Bkb3duIiwiY2F0Y2giLCJfYXV0b0Nsb3NlIiwib3BlbmVkIiwibCIsIl9maW5kQ2hpbGQiLCJjbG9zZSIsIm9wZW4iLCJzaG93IiwibWVudSIsImFjdHVhbEl0ZW0iLCJzdWJNZW51SXRlbSIsIndyYXBwZXJXaWR0aCIsIk1hdGgiLCJyb3VuZCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInBvc2l0aW9uIiwiaXRlbU9mZnNldCIsIl9nZXRJdGVtT2Zmc2V0IiwiaXRlbVdpZHRoIiwibWVudVdpZHRoIiwic3R5bGUiLCJsZWZ0IiwiX3VwZGF0ZVNsaWRlciIsInJlbW92ZUF0dHJpYnV0ZSIsImRpcmVjdGlvbiIsIl9pbm5lcldpZHRoIiwibmV3UG9zaXRpb24iLCJfZ2V0U2xpZGVOZXh0UG9zIiwiX2dldFNsaWRlUHJldlBvcyIsImN1ckl0ZW0iLCJ0YWdOYW1lIiwiY3VySXRlbVdpZHRoIiwibmV4dFNpYmxpbmciLCJ0cmVlIiwicGFyZW50SXRlbSIsInB1c2giLCJzbGljZSIsImluZGV4T2YiLCJvcGVuZWRJdGVtcyIsImoiLCJrIiwib3BlbmVkQ2hpbGRyZW4iLCJ4IiwieiIsIl91bmJpbmRBbmltYXRpb25FbmRFdmVudCIsImxpbmtIZWlnaHQiLCJoZWlnaHQiLCJvdmVyZmxvdyIsImNsZWFySXRlbVN0eWxlIiwiX2JpbmRBbmltYXRpb25FbmRFdmVudCIsInNldFRpbWVvdXQiLCJfd3JhcHBlcldpZHRoIiwiX3Bvc2l0aW9uIiwiaXRlbXMiLCJwYXJzZUludCIsInZhbHVlIiwibWVudUlubmVyIiwiZGVzdHJveSIsIm1lbnVTY3JvbGwiLCJfdW5iaW5kRXZlbnRzIiwibmF2YmFyIiwibmF2YmFyQ29sbGFwc2UiLCJhc2lkZU1lbnVXcmFwcGVyIiwiYXNpZGVNZW51IiwiaG9yek1lbnVDbGFzc2VzIiwidmVydE1lbnVDbGFzc2VzIiwiaG9yek1lbnVXcmFwcGVyIiwiYnJhbmQiLCJtZW51VG9nZ2xlciIsImFjdGl2ZU1lbnVJdGVtcyIsImluc2VydEJlZm9yZSIsImNoaWxkcmVuIiwibWVudXMiLCJpMiIsImwyIiwibWFyZ2luUmlnaHQiLCJtYXJnaW5MZWZ0IiwicmVtb3ZlQ2hpbGQiLCJjIiwicCIsImNscyIsInRocm93RXJyb3IiLCJ0b1VwcGVyQ2FzZSIsIkVycm9yIiwiZm91bmQiLCJwYXNzZWQiLCJjdXJFbCIsIlJPT1RfRUwiLCJyZXN1bHQiLCJzcGxpdCIsImZvckVhY2giLCJzZWxlY3RvciIsImhhbmRsZXIiLCJjYiIsImR1cmF0aW9uIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsInRyYW5zaXRpb25EdXJhdGlvbiIsInBhcnNlRmxvYXQiLCJfbWVudUFuaW1hdGlvbkVuZEV2ZW50Q2IiLCJldiIsIl9tZW51QW5pbWF0aW9uRW5kRXZlbnRUaW1lb3V0IiwiZm4iLCJhcmdzIiwiUHJvbWlzZSIsInJlamVjdCIsInJlc29sdmUiLCJjbGVhclRpbWVvdXQiLCJkaXNhYmxlZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./js/menu.js\n");
/***/ })
/******/ });
/************************************************************************/
/******/ // The require scope
/******/ var __webpack_require__ = {};
/******/
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ !function() {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = function(exports, definition) {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ !function() {
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
/******/ }();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ !function() {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ }();
/******/
/************************************************************************/
/******/
/******/ // startup
/******/ // Load entry module and return exports
/******/ // This entry module can't be inlined because the eval-source-map devtool is used.
/******/ var __webpack_exports__ = {};
/******/ __webpack_modules__["./js/menu.js"](0, __webpack_exports__, __webpack_require__);
/******/
/******/ return __webpack_exports__;
/******/ })()
;
});