vendor: 3,614 bytes, lines 1-88
1/******/ (function(modules) { // webpackBootstrap 2/******/ // The module cache 3/******/ var installedModules = {}; 4/******/ 5/******/ // The require function 6/******/ function __webpack_require__(moduleId) { 7/******/ 8/******/ // Check if module is in cache 9/******/ if(installedModules[moduleId]) { 10/******/ return installedModules[moduleId].exports; 11/******/ } 12/******/ // Create a new module (and put it into the cache) 13/******/ var module = installedModules[moduleId] = { 14/******/ i: moduleId, 15/******/ l: false, 16/******/ exports: {} 17/******/ }; 18/******/ 19/******/ // Execute the module function 20/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 21/******/ 22/******/ // Flag the module as loaded 23/******/ module.l = true; 24/******/ 25/******/ // Return the exports of the module 26/******/ return module.exports; 27/******/ } 28/******/ 29/******/ 30/******/ // expose the modules object (__webpack_modules__) 31/******/ __webpack_require__.m = modules; 32/******/ 33/******/ // expose the module cache 34/******/ __webpack_require__.c = installedModules; 35/******/ 36/******/ // define getter function for harmony exports 37/******/ __webpack_require__.d = function(exports, name, getter) { 38/******/ if(!__webpack_require__.o(exports, name)) { 39/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); 40/******/ } 41/******/ }; 42/******/ 43/******/ // define __esModule on exports 44/******/ __webpack_require__.r = function(exports) { 45/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 46/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 47/******/ } 48/******/ Object.defineProperty(exports, '__esModule', { value: true }); 49/******/ }; 50/******/ 51/******/ // create a fake namespace object 52/******/ // mode & 1: value is a module id, require it 53/******/ // mode & 2: merge all properties of value into the ns 54/******/ // mode & 4: return value when already ns object 55/******/ // mode & 8|1: behave like require 56/******/ __webpack_require__.t = function(value, mode) { 57/******/ if(mode & 1) value = __webpack_require__(value); 58/******/ if(mode & 8) return value; 59/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; 60/******/ var ns = Object.create(null); 61/******/ __webpack_require__.r(ns); 62/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); 63/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); 64/******/ return ns; 65/******/ }; 66/******/ 67/******/ // getDefaultExport function for compatibility with non-harmony modules 68/******/ __webpack_require__.n = function(module) { 69/******/ var getter = module && module.__esModule ? 70/******/ function getDefault() { return module['default']; } : 71/******/ function getModuleExports() { return module; }; 72/******/ __webpack_require__.d(getter, 'a', getter); 73/******/ return getter; 74/******/ }; 75/******/ 76/******/ // Object.prototype.hasOwnProperty.call 77/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 78/******/ 79/******/ // __webpack_public_path__ 80/******/ __webpack_require__.p = ""; 81/******/ 82/******/ 83/******/ // Load entry module and return exports 84/******/ return __webpack_require__(__webpack_require__.s = "./src/js/scripts.js"); 85/******/ }) 86/************************************************************************/ 87/******/ ({ 88
89/***/ "./src/js/lazyload.js": 90/*!****************************!*\ 91 !*** ./src/js/lazyload.js ***! 92 \****************************/ 93/*! no static exports found */ 94/***/ (function(module, exports, __webpack_require__) { 95 96eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n// vanilla lazy load js version 17.8\n// https://github.com/verlok/vanilla-lazyload\n(function (global, factory) {\n ( false ? undefined : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? module.exports = factory() : true ? !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : (undefined);\n})(this, function () {\n 'use strict';\n\n function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n }\n var runningOnBrowser = typeof window !== \"undefined\";\n var isBot = runningOnBrowser && !(\"onscroll\" in window) || typeof navigator !== \"undefined\" && /(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent);\n var supportsIntersectionObserver = runningOnBrowser && \"IntersectionObserver\" in window;\n var supportsClassList = runningOnBrowser && \"classList\" in document.createElement(\"p\");\n var isHiDpi = runningOnBrowser && window.devicePixelRatio > 1;\n var defaultSettings = {\n elements_selector: \".lazy\",\n container: isBot || runningOnBrowser ? document : null,\n threshold: 300,\n thresholds: null,\n data_src: \"src\",\n data_srcset: \"srcset\",\n data_sizes: \"sizes\",\n data_bg: \"bg\",\n data_bg_hidpi: \"bg-hidpi\",\n data_bg_multi: \"bg-multi\",\n data_bg_multi_hidpi: \"bg-multi-hidpi\",\n data_bg_set: \"bg-set\",\n data_poster: \"poster\",\n class_applied: \"applied\",\n class_loading: \"loading\",\n class_loaded: \"loaded\",\n class_error: \"error\",\n class_entered: \"entered\",\n class_exited: \"exited\",\n unobserve_completed: true,\n unobserve_entered: false,\n cancel_on_exit: true,\n callback_enter: null,\n callback_exit: null,\n callback_applied: null,\n callback_loading: null,\n callback_loaded: null,\n callback_error: null,\n callback_finish: null,\n callback_cancel: null,\n use_native: false,\n restore_on_error: false\n };\n var getExtendedSettings = function getExtendedSettings(customSettings) {\n return _extends({}, defaultSettings, customSettings);\n };\n\n /* Creates instance and notifies it through the window element */\n var createInstance = function createInstance(classObj, options) {\n var event;\n var eventString = \"LazyLoad::Initialized\";\n var instance = new classObj(options);\n try {\n // Works in modern browsers\n event = new CustomEvent(eventString, {\n detail: {\n instance: instance\n }\n });\n } catch (err) {\n // Works in Internet Explorer (all versions)\n event = document.createEvent(\"CustomEvent\");\n event.initCustomEvent(eventString, false, false, {\n instance: instance\n });\n }\n window.dispatchEvent(event);\n };\n /* Auto initialization of one or more instances of LazyLoad, depending on the\n options passed in (plain object or an array) */\n\n var autoInitialize = function autoInitialize(classObj, options) {\n if (!options) {\n return;\n }\n if (!options.length) {\n // Plain object\n createInstance(classObj, options);\n } else {\n // Array of objects\n for (var i = 0, optionsItem; optionsItem = options[i]; i += 1) {\n createInstance(classObj, optionsItem);\n }\n }\n };\n var SRC = \"src\";\n var SRCSET = \"srcset\";\n var SIZES = \"sizes\";\n var POSTER = \"poster\";\n var ORIGINALS = \"llOriginalAttrs\";\n var DATA = \"data\";\n var statusLoading = \"loading\";\n var statusLoaded = \"loaded\";\n var statusApplied = \"applied\";\n var statusEntered = \"entered\";\n var statusError = \"error\";\n var statusNative = \"native\";\n var dataPrefix = \"data-\";\n var statusDataName = \"ll-status\";\n var getData = function getData(element, attribute) {\n return element.getAttribute(dataPrefix + attribute);\n };\n var setData = function setData(element, attribute, value) {\n var attrName = dataPrefix + attribute;\n if (value === null) {\n element.removeAttribute(attrName);\n return;\n }\n element.setAttribute(attrName, value);\n };\n var getStatus = function getStatus(element) {\n return getData(element, statusDataName);\n };\n var setStatus = function setStatus(element, status) {\n return setData(element, statusDataName, status);\n };\n var resetStatus = function resetStatus(element) {\n return setStatus(element, null);\n };\n var hasEmptyStatus = function hasEmptyStatus(element) {\n return getStatus(element) === null;\n };\n var hasStatusLoading = function hasStatusLoading(element) {\n return getStatus(element) === statusLoading;\n };\n var hasStatusError = function hasStatusError(element) {\n return getStatus(element) === statusError;\n };\n var hasStatusNative = function hasStatusNative(element) {\n return getStatus(element) === statusNative;\n };\n var statusesAfterLoading = [statusLoading, statusLoaded, statusApplied, statusError];\n var hadStartedLoading = function hadStartedLoading(element) {\n return statusesAfterLoading.
96indexOf(getStatus(element)) >= 0;\n };\n var safeCallback = function safeCallback(callback, arg1, arg2, arg3) {\n if (!callback || typeof callback !== 'function') {\n return;\n }\n if (arg3 !== undefined) {\n callback(arg1, arg2, arg3);\n return;\n }\n if (arg2 !== undefined) {\n callback(arg1, arg2);\n return;\n }\n callback(arg1);\n };\n var addClass = function addClass(element, className) {\n if (supportsClassList) {\n element.classList.add(className);\n return;\n }\n element.className += (element.className ? \" \" : \"\") + className;\n };\n var removeClass = function removeClass(element, className) {\n if (supportsClassList) {\n element.classList.remove(className);\n return;\n }\n element.className = element.className.replace(new RegExp(\"(^|\\\\s+)\" + className + \"(\\\\s+|$)\"), \" \").replace(/^\\s+/, \"\").replace(/\\s+$/, \"\");\n };\n var addTempImage = function addTempImage(element) {\n element.llTempImage = document.createElement(\"IMG\");\n };\n var deleteTempImage = function deleteTempImage(element) {\n delete element.llTempImage;\n };\n var getTempImage = function getTempImage(element) {\n return element.llTempImage;\n };\n var unobserve = function unobserve(element, instance) {\n if (!instance) return;\n var observer = instance._observer;\n if (!observer) return;\n observer.unobserve(element);\n };\n var resetObserver = function resetObserver(observer) {\n observer.disconnect();\n };\n var unobserveEntered = function unobserveEntered(element, settings, instance) {\n if (settings.unobserve_entered) unobserve(element, instance);\n };\n var updateLoadingCount = function updateLoadingCount(instance, delta) {\n if (!instance) return;\n instance.loadingCount += delta;\n };\n var decreaseToLoadCount = function decreaseToLoadCount(instance) {\n if (!instance) return;\n instance.toLoadCount -= 1;\n };\n var setToLoadCount = function setToLoadCount(instance, value) {\n if (!instance) return;\n instance.toLoadCount = value;\n };\n var isSomethingLoading = function isSomethingLoading(instance) {\n return instance.loadingCount > 0;\n };\n var haveElementsToLoad = function haveElementsToLoad(instance) {\n return instance.toLoadCount > 0;\n };\n var getSourceTags = function getSourceTags(parentTag) {\n var sourceTags = [];\n for (var i = 0, childTag; childTag = parentTag.children[i]; i += 1) {\n if (childTag.tagName === \"SOURCE\") {\n sourceTags.push(childTag);\n }\n }\n return sourceTags;\n };\n var forEachPictureSource = function forEachPictureSource(element, fn) {\n var parent = element.parentNode;\n if (!parent || parent.tagName !== \"PICTURE\") {\n return;\n }\n var sourceTags = getSourceTags(parent);\n sourceTags.forEach(fn);\n };\n var forEachVideoSource = function forEachVideoSource(element, fn) {\n var sourceTags = getSourceTags(element);\n sourceTags.forEach(fn);\n };\n var attrsSrc = [SRC];\n var attrsSrcPoster = [SRC, POSTER];\n var attrsSrcSrcsetSizes = [SRC, SRCSET, SIZES];\n var attrsData = [DATA];\n var hasOriginalAttrs = function hasOriginalAttrs(element) {\n return !!element[ORIGINALS];\n };\n var getOriginalAttrs = function getOriginalAttrs(element) {\n return element[ORIGINALS];\n };\n var deleteOriginalAttrs = function deleteOriginalAttrs(element) {\n return delete element[ORIGINALS];\n }; // ## SAVE ##\n\n var setOriginalsObject = function setOriginalsObject(element, attributes) {\n if (hasOriginalAttrs(element)) {\n return;\n }\n var originals = {};\n attributes.forEach(function (attribute) {\n originals[attribute] = element.getAttribute(attribute);\n });\n element[ORIGINALS] = originals;\n };\n var saveOriginalBackgroundStyle = function saveOriginalBackgroundStyle(element) {\n if (hasOriginalAttrs(element)) {\n return;\n }\n element[ORIGINALS] = {\n backgroundImage: element.style.backgroundImage\n };\n }; // ## RESTORE ##\n\n var setOrResetAttribute = function setOrResetAttribute(element, attrName, value) {\n if (!value) {\n element.removeAttribute(attrName);\n return;\n }\n element.setAttribute(attrName, value);\n };\n var restoreOriginalAttrs = function restoreOriginalAttrs(element, attributes) {\n if (!hasOriginalAttrs(element)) {\n return;\n }\n var originals = getOriginalAttrs(element);
96\n attributes.forEach(function (attribute) {\n setOrResetAttribute(element, attribute, originals[attribute]);\n });\n };\n var restoreOriginalBgImage = function restoreOriginalBgImage(element) {\n if (!hasOriginalAttrs(element)) {\n return;\n }\n var originals = getOriginalAttrs(element);\n element.style.backgroundImage = originals.backgroundImage;\n };\n var manageApplied = function manageApplied(element, settings, instance) {\n addClass(element, settings.class_applied);\n setStatus(element, statusApplied); // Instance is not provided when loading is called from static class\n\n if (!instance) return;\n if (settings.unobserve_completed) {\n // Unobserve now because we can't do it on load\n unobserve(element, settings);\n }\n safeCallback(settings.callback_applied, element, instance);\n };\n var manageLoading = function manageLoading(element, settings, instance) {\n addClass(element, settings.class_loading);\n setStatus(element, statusLoading); // Instance is not provided when loading is called from static class\n\n if (!instance) return;\n updateLoadingCount(instance, +1);\n safeCallback(settings.callback_loading, element, instance);\n };\n var setAttributeIfValue = function setAttributeIfValue(element, attrName, value) {\n if (!value) {\n return;\n }\n element.setAttribute(attrName, value);\n };\n var setImageAttributes = function setImageAttributes(element, settings) {\n setAttributeIfValue(element, SIZES, getData(element, settings.data_sizes));\n setAttributeIfValue(element, SRCSET, getData(element, settings.data_srcset));\n setAttributeIfValue(element, SRC, getData(element, settings.data_src));\n };\n var setSourcesImg = function setSourcesImg(imgEl, settings) {\n forEachPictureSource(imgEl, function (sourceTag) {\n setOriginalsObject(sourceTag, attrsSrcSrcsetSizes);\n setImageAttributes(sourceTag, settings);\n });\n setOriginalsObject(imgEl, attrsSrcSrcsetSizes);\n setImageAttributes(imgEl, settings);\n };\n var setSourcesIframe = function setSourcesIframe(iframe, settings) {\n setOriginalsObject(iframe, attrsSrc);\n setAttributeIfValue(iframe, SRC, getData(iframe, settings.data_src));\n };\n var setSourcesVideo = function setSourcesVideo(videoEl, settings) {\n forEachVideoSource(videoEl, function (sourceEl) {\n setOriginalsObject(sourceEl, attrsSrc);\n setAttributeIfValue(sourceEl, SRC, getData(sourceEl, settings.data_src));\n });\n setOriginalsObject(videoEl, attrsSrcPoster);\n setAttributeIfValue(videoEl, POSTER, getData(videoEl, settings.data_poster));\n setAttributeIfValue(videoEl, SRC, getData(videoEl, settings.data_src));\n videoEl.load();\n };\n var setSourcesObject = function setSourcesObject(object, settings) {\n setOriginalsObject(object, attrsData);\n setAttributeIfValue(object, DATA, getData(object, settings.data_src));\n };\n var setBackground = function setBackground(element, settings, instance) {\n var bg1xValue = getData(element, settings.data_bg);\n var bgHiDpiValue = getData(element, settings.data_bg_hidpi);\n var bgDataValue = isHiDpi && bgHiDpiValue ? bgHiDpiValue : bg1xValue;\n if (!bgDataValue) return;\n element.style.backgroundImage = \"url(\\\"\".concat(bgDataValue, \"\\\")\");\n getTempImage(element).setAttribute(SRC, bgDataValue);\n manageLoading(element, settings, instance);\n }; // NOTE: THE TEMP IMAGE TRICK CANNOT BE DONE WITH data-multi-bg\n // BECAUSE INSIDE ITS VALUES MUST BE WRAPPED WITH URL() AND ONE OF THEM\n // COULD BE A GRADIENT BACKGROUND IMAGE\n\n var setMultiBackground = function setMultiBackground(element, settings, instance) {\n var bg1xValue = getData(element, settings.data_bg_multi);\n var bgHiDpiValue = getData(element, settings.data_bg_multi_hidpi);\n var bgDataValue = isHiDpi && bgHiDpiValue ? bgHiDpiValue : bg1xValue;\n if (!bgDataValue) {\n return;\n }\n element.style.backgroundImage = bgDataValue;\n manageApplied(element, settings, instance);\n };
96\n var setImgsetBackground = function setImgsetBackground(element, settings, instance) {\n var bgImgSetDataValue = getData(element, settings.data_bg_set);\n if (!bgImgSetDataValue) {\n return;\n }\n var imgSetValues = bgImgSetDataValue.split(\"|\");\n var bgImageValues = imgSetValues.map(function (value) {\n return \"image-set(\".concat(value, \")\");\n });\n element.style.backgroundImage = bgImageValues.join(); // Temporary fix for Chromeium with the -webkit- prefix\n\n if (element.style.backgroundImage === \"\") {\n bgImageValues = imgSetValues.map(function (value) {\n return \"-webkit-image-set(\".concat(value, \")\");\n });\n element.style.backgroundImage = bgImageValues.join();\n }\n manageApplied(element, settings, instance);\n };\n var setSourcesFunctions = {\n IMG: setSourcesImg,\n IFRAME: setSourcesIframe,\n VIDEO: setSourcesVideo,\n OBJECT: setSourcesObject\n };\n var setSourcesNative = function setSourcesNative(element, settings) {\n var setSourcesFunction = setSourcesFunctions[element.tagName];\n if (!setSourcesFunction) {\n return;\n }\n setSourcesFunction(element, settings);\n };\n var setSources = function setSources(element, settings, instance) {\n var setSourcesFunction = setSourcesFunctions[element.tagName];\n if (!setSourcesFunction) {\n return;\n }\n setSourcesFunction(element, settings);\n manageLoading(element, settings, instance);\n };\n var elementsWithLoadEvent = [\"IMG\", \"IFRAME\", \"VIDEO\", \"OBJECT\"];\n var hasLoadEvent = function hasLoadEvent(element) {\n return elementsWithLoadEvent.indexOf(element.tagName) > -1;\n };\n var checkFinish = function checkFinish(settings, instance) {\n if (instance && !isSomethingLoading(instance) && !haveElementsToLoad(instance)) {\n safeCallback(settings.callback_finish, instance);\n }\n };\n var addEventListener = function addEventListener(element, eventName, handler) {\n element.addEventListener(eventName, handler);\n element.llEvLisnrs[eventName] = handler;\n };\n var removeEventListener = function removeEventListener(element, eventName, handler) {\n element.removeEventListener(eventName, handler);\n };\n var hasEventListeners = function hasEventListeners(element) {\n return !!element.llEvLisnrs;\n };\n var addEventListeners = function addEventListeners(element, loadHandler, errorHandler) {\n if (!hasEventListeners(element)) element.llEvLisnrs = {};\n var loadEventName = element.tagName === \"VIDEO\" ? \"loadeddata\" : \"load\";\n addEventListener(element, loadEventName, loadHandler);\n addEventListener(element, \"error\", errorHandler);\n };\n var removeEventListeners = function removeEventListeners(element) {\n if (!hasEventListeners(element)) {\n return;\n }\n var eventListeners = element.llEvLisnrs;\n for (var eventName in eventListeners) {\n var handler = eventListeners[eventName];\n removeEventListener(element, eventName, handler);\n }\n delete element.llEvLisnrs;\n };\n var doneHandler = function doneHandler(element, settings, instance) {\n deleteTempImage(element);\n updateLoadingCount(instance, -1);\n decreaseToLoadCount(instance);\n removeClass(element, settings.class_loading);\n if (settings.unobserve_completed) {\n unobserve(element, instance);\n }\n };\n var loadHandler = function loadHandler(event, element, settings, instance) {\n var goingNative = hasStatusNative(element);\n doneHandler(element, settings, instance);\n addClass(element, settings.class_loaded);\n setStatus(element, statusLoaded);\n safeCallback(settings.callback_loaded, element, instance);\n if (!goingNative) checkFinish(settings, instance);\n };\n var errorHandler = function errorHandler(event, element, settings, instance) {\n var goingNative = hasStatusNative(element);\n doneHandler(element, settings, instance);\n addClass(element, settings.class_error);\n setStatus(element, statusError);\n safeCallback(settings.callback_error, element, instance);\n if (settings.restore_on_error) restoreOriginalAttrs(element, attrsSrcSrcsetSizes);\n if (!goingNative) checkFinish(settings, instance);\n };\n var addOneShotEventListeners = function addOneShotEventListeners(element, settings, instance) {\n var elementToListenTo = getTempImage(element) || element;\n if (hasEventListeners(elementToListenTo)) {\n // This happens when loading is retried twice\n return;\n }\n var _loadHandler = function _loadHandler(event) {\n loadHandler(event, element, settings, instance);\n removeEventListeners(elementToListenTo);\n };\n var _errorHandler = function _errorHandler(event) {\n errorHandler(event, element, settings, instance);\n removeEventListeners(elementToListenTo);\n };\n addEventListeners(elementToListenTo, _loadHandler, _errorHandler);\n };
96\n var loadBackground = function loadBackground(element, settings, instance) {\n addTempImage(element);\n addOneShotEventListeners(element, settings, instance);\n saveOriginalBackgroundStyle(element);\n setBackground(element, settings, instance);\n setMultiBackground(element, settings, instance);\n setImgsetBackground(element, settings, instance);\n };\n var loadRegular = function loadRegular(element, settings, instance) {\n addOneShotEventListeners(element, settings, instance);\n setSources(element, settings, instance);\n };\n var load = function load(element, settings, instance) {\n if (hasLoadEvent(element)) {\n loadRegular(element, settings, instance);\n } else {\n loadBackground(element, settings, instance);\n }\n };\n var loadNative = function loadNative(element, settings, instance) {\n element.setAttribute(\"loading\", \"lazy\");\n addOneShotEventListeners(element, settings, instance);\n setSourcesNative(element, settings);\n setStatus(element, statusNative);\n };\n var removeImageAttributes = function removeImageAttributes(element) {\n element.removeAttribute(SRC);\n element.removeAttribute(SRCSET);\n element.removeAttribute(SIZES);\n };\n var resetSourcesImg = function resetSourcesImg(element) {\n forEachPictureSource(element, function (sourceTag) {\n removeImageAttributes(sourceTag);\n });\n removeImageAttributes(element);\n };\n var restoreImg = function restoreImg(imgEl) {\n forEachPictureSource(imgEl, function (sourceEl) {\n restoreOriginalAttrs(sourceEl, attrsSrcSrcsetSizes);\n });\n restoreOriginalAttrs(imgEl, attrsSrcSrcsetSizes);\n };\n var restoreVideo = function restoreVideo(videoEl) {\n forEachVideoSource(videoEl, function (sourceEl) {\n restoreOriginalAttrs(sourceEl, attrsSrc);\n });\n restoreOriginalAttrs(videoEl, attrsSrcPoster);\n videoEl.load();\n };\n var restoreIframe = function restoreIframe(iframeEl) {\n restoreOriginalAttrs(iframeEl, attrsSrc);\n };\n var restoreObject = function restoreObject(objectEl) {\n restoreOriginalAttrs(objectEl, attrsData);\n };\n var restoreFunctions = {\n IMG: restoreImg,\n IFRAME: restoreIframe,\n VIDEO: restoreVideo,\n OBJECT: restoreObject\n };\n var restoreAttributes = function restoreAttributes(element) {\n var restoreFunction = restoreFunctions[element.tagName];\n if (!restoreFunction) {\n restoreOriginalBgImage(element);\n return;\n }\n restoreFunction(element);\n };\n var resetClasses = function resetClasses(element, settings) {\n if (hasEmptyStatus(element) || hasStatusNative(element)) {\n return;\n }\n removeClass(element, settings.class_entered);\n removeClass(element, settings.class_exited);\n removeClass(element, settings.class_applied);\n removeClass(element, settings.class_loading);\n removeClass(element, settings.class_loaded);\n removeClass(element, settings.class_error);\n };\n var restore = function restore(element, settings) {\n restoreAttributes(element);\n resetClasses(element, settings);\n resetStatus(element);\n deleteOriginalAttrs(element);\n };\n var cancelLoading = function cancelLoading(element, entry, settings, instance) {\n if (!settings.cancel_on_exit) return;\n if (!hasStatusLoading(element)) return;\n if (element.tagName !== \"IMG\") return; //Works only on images\n\n removeEventListeners(element);\n resetSourcesImg(element);\n restoreImg(element);\n removeClass(element, settings.class_loading);\n updateLoadingCount(instance, -1);\n resetStatus(element);\n safeCallback(settings.callback_cancel, element, entry, instance);\n };\n var onEnter = function onEnter(element, entry, settings, instance) {\n var dontLoad = hadStartedLoading(element);\n /* Save status\n before setting it, to prevent loading it again. Fixes #526. */\n\n setStatus(element, statusEntered);\n addClass(element, settings.class_entered);\n removeClass(element, settings.class_exited);\n unobserveEntered(element, settings, instance);\n safeCallback(settings.callback_enter, element, entry, instance);\n if (dontLoad) return;\n load(element, settings, instance);\n };\n var onExit = function onExit(element, entry, settings, instance) {\n if (hasEmptyStatus(element)) return; //Ignore the first pass, at landing\n\n addClass(element, settings.class_exited);\n cancelLoading(element, entry, settings, instance);\n safeCallback(settings.callback_exit, element, entry, instance);\n };\n var tagsWithNativeLazy = [\"IMG\", \"IFRAME\", \"VIDEO\"];\n var shouldUseNative = function shouldUseNative(settings) {\n return settings.use_native && \"loading\" in HTMLImageElement.prototype;\n };\n var loadAllNative = function loadAllNative(elements, settings, instance) {\n elements.forEac
96h(function (element) {\n if (tagsWithNativeLazy.indexOf(element.tagName) === -1) {\n return;\n }\n loadNative(element, settings, instance);\n });\n setToLoadCount(instance, 0);\n };\n var isIntersecting = function isIntersecting(entry) {\n return entry.isIntersecting || entry.intersectionRatio > 0;\n };\n var getObserverSettings = function getObserverSettings(settings) {\n return {\n root: settings.container === document ? null : settings.container,\n rootMargin: settings.thresholds || settings.threshold + \"px\"\n };\n };\n var intersectionHandler = function intersectionHandler(entries, settings, instance) {\n entries.forEach(function (entry) {\n return isIntersecting(entry) ? onEnter(entry.target, entry, settings, instance) : onExit(entry.target, entry, settings, instance);\n });\n };\n var observeElements = function observeElements(observer, elements) {\n elements.forEach(function (element) {\n observer.observe(element);\n });\n };\n var updateObserver = function updateObserver(observer, elementsToObserve) {\n resetObserver(observer);\n observeElements(observer, elementsToObserve);\n };\n var setObserver = function setObserver(settings, instance) {\n if (!supportsIntersectionObserver || shouldUseNative(settings)) {\n return;\n }\n instance._observer = new IntersectionObserver(function (entries) {\n intersectionHandler(entries, settings, instance);\n }, getObserverSettings(settings));\n };\n var toArray = function toArray(nodeSet) {\n return Array.prototype.slice.call(nodeSet);\n };\n var queryElements = function queryElements(settings) {\n return settings.container.querySelectorAll(settings.elements_selector);\n };\n var excludeManagedElements = function excludeManagedElements(elements) {\n return toArray(elements).filter(hasEmptyStatus);\n };\n var hasError = function hasError(element) {\n return hasStatusError(element);\n };\n var filterErrorElements = function filterErrorElements(elements) {\n return toArray(elements).filter(hasError);\n };\n var getElementsToLoad = function getElementsToLoad(elements, settings) {\n return excludeManagedElements(elements || queryElements(settings));\n };\n var retryLazyLoad = function retryLazyLoad(settings, instance) {\n var errorElements = filterErrorElements(queryElements(settings));\n errorElements.forEach(function (element) {\n removeClass(element, settings.class_error);\n resetStatus(element);\n });\n instance.update();\n };\n var setOnlineCheck = function setOnlineCheck(settings, instance) {\n if (!runningOnBrowser) {\n return;\n }\n instance._onlineHandler = function () {\n retryLazyLoad(settings, instance);\n };\n window.addEventListener(\"online\", instance._onlineHandler);\n };\n var resetOnlineCheck = function resetOnlineCheck(instance) {\n if (!runningOnBrowser) {\n return;\n }\n window.removeEventListener(\"online\", instance._onlineHandler);\n };\n var LazyLoad = function LazyLoad(customSettings, elements) {\n var settings = getExtendedSettings(customSettings);\n this._settings = settings;\n this.loadingCount = 0;\n setObserver(settings, this);\n setOnlineCheck(settings, this);\n this.update(elements);\n };\n LazyLoad.prototype = {\n update: function update(givenNodeset) {\n var settings = this._settings;\n var elementsToLoad = getElementsToLoad(givenNodeset, settings);\n setToLoadCount(this, elementsToLoad.length);\n if (isBot || !supportsIntersectionObserver) {\n this.loadAll(elementsToLoad);\n return;\n }\n if (shouldUseNative(settings)) {\n loadAllNative(elementsToLoad, settings, this);\n return;\n }\n updateObserver(this._observer, elementsToLoad);\n },\n destroy: function destroy() {\n // Observer\n if (this._observer) {\n this._observer.disconnect();\n } // Clean handlers\n\n resetOnlineCheck(this); // Clean custom attributes on elements\n\n queryElements(this._settings).forEac
96h(function (element) {\n deleteOriginalAttrs(element);\n }); // Delete all internal props\n\n delete this._observer;\n delete this._settings;\n delete this._onlineHandler;\n delete this.loadingCount;\n delete this.toLoadCount;\n },\n loadAll: function loadAll(elements) {\n var _this = this;\n var settings = this._settings;\n var elementsToLoad = getElementsToLoad(elements, settings);\n elementsToLoad.forEach(function (element) {\n unobserve(element, _this);\n load(element, settings, _this);\n });\n },\n restoreAll: function restoreAll() {\n var settings = this._settings;\n queryElements(settings).forEach(function (element) {\n restore(element, settings);\n });\n }\n };\n LazyLoad.load = function (element, customSettings) {\n var settings = getExtendedSettings(customSettings);\n load(element, settings);\n };\n LazyLoad.resetStatus = function (element) {\n resetStatus(element);\n }; // Automatic instances creation if required (useful for async script loading)\n\n if (runningOnBrowser) {\n autoInitialize(LazyLoad, window.lazyLoadOptions);\n }\n return LazyLoad;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvbGF6eWxvYWQuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvanMvbGF6eWxvYWQuanM/NDQ4YSJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG4vLyB2YW5pbGxhIGxhenkgbG9hZCBqcyB2ZXJzaW9uIDE3Ljhcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS92ZXJsb2svdmFuaWxsYS1sYXp5bG9hZFxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgKHR5cGVvZiBleHBvcnRzID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoZXhwb3J0cykpID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDogdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDogKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLkxhenlMb2FkID0gZmFjdG9yeSgpKTtcbn0pKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICAgIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2Y
96XIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH07XG4gICAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cbiAgdmFyIHJ1bm5pbmdPbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiO1xuICB2YXIgaXNCb3QgPSBydW5uaW5nT25Ccm93c2VyICYmICEoXCJvbnNjcm9sbFwiIGluIHdpbmRvdykgfHwgdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiAvKGdsZXxpbmd8cm8pYm90fGNyYXdsfHNwaWRlci9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gIHZhciBzdXBwb3J0c0ludGVyc2VjdGlvbk9ic2VydmVyID0gcnVubmluZ09uQnJvd3NlciAmJiBcIkludGVyc2VjdGlvbk9ic2VydmVyXCIgaW4gd2luZG93O1xuICB2YXIgc3VwcG9ydHNDbGFzc0xpc3QgPSBydW5uaW5nT25Ccm93c2VyICYmIFwiY2xhc3NMaXN0XCIgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gIHZhciBpc0hpRHBpID0gcnVubmluZ09uQnJvd3NlciAmJiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA+IDE7XG4gIHZhciBkZWZhdWx0U2V0dGluZ3MgPSB7XG4gICAgZWxlbWVudHNfc2VsZWN0b3I6IFwiLmxhenlcIixcbiAgICBjb250YWluZXI6IGlzQm90IHx8IHJ1bm5pbmdPbkJyb3dzZXIgPyBkb2N1bWVudCA6IG51bGwsXG4gICAgdGhyZXNob2xkOiAzMDAsXG4gICAgdGhyZXNob2xkczogbnVsbCxcbiAgICBkYXRhX3NyYzogXCJzcmNcIixcbiAgICBkYXRhX3NyY3NldDogXCJzcmNzZXRcIixcbiAgICBkYXRhX3NpemVzOiBcInNpemVzXCIsXG4gICAgZGF0YV9iZzogXCJiZ1wiLFxuICAgIGRhdGFfYmdfaGlkcGk6IFwiYmctaGlkcGlcIixcbiAgICBkYXRhX2JnX211bHRpOiBcImJnLW11bHRpXCIsXG4gICAgZGF0YV9iZ19tdWx0aV9oaWRwaTogXCJiZy1tdWx0aS1oaWRwaVwiLFxuICAgIGRhdGFfYmdfc2V0OiBcImJnLXNldFwiLFxuICAgIGRhdGFfcG9zdGVyOiBcInBvc3RlclwiLFxuICAgIGNsYXNzX2FwcGxpZWQ6IFwiYXBwbGllZFwiLFxuICAgIGNsYXNzX2xvYWRpbmc6IFwibG9hZGluZ1wiLFxuICAgIGNsYXNzX2xvYWRlZDogXCJsb2FkZWRcIixcbiAgICBjbGFzc19lcnJvcjogXCJlcnJvclwiLFxuICAgIGNsYXNzX2VudGVyZWQ6IFwiZW50ZXJlZFwiLFxuICAgIGNsYXNzX2V4aXRlZDogXCJleGl0ZWRcIixcbiAgICB1bm9ic2VydmVfY29tcGxldGVkOiB0cnVlLFxuICAgIHVub2JzZXJ2ZV9lbnRlcmVkOiBmYWxzZSxcbiAgICBjYW5jZWxfb25fZXhpdDogdHJ1ZSxcbiAgICBjYWxsYmFja19lbnRlcjogbnVsbCxcbiAgICBjYWxsYmFja19leGl0OiBudWxsLFxuICAgIGNhbGxiYWNrX2FwcGxpZWQ6IG51bGwsXG4gICAgY2FsbGJhY2tfbG9hZGluZzogbnVsbCxcbiAgICBjYWxsYmFja19sb2FkZWQ6IG51bGwsXG4gICAgY2FsbGJhY2tfZXJyb3I6IG51bGwsXG4gICAgY2FsbGJhY2tfZmluaXNoOiBudWxsLFxuICAgIGNhbGxiYWNrX2NhbmNlbDogbnVsbCxcbiAgICB1c2VfbmF0aXZlOiBmYWxzZSxcbiAgICByZXN0b3JlX29uX2Vycm9yOiBmYWxzZVxuICB9O1xuICB2YXIgZ2V0RXh0ZW5kZWRTZXR0aW5ncyA9IGZ1bmN0aW9uIGdldEV4dGVuZGVkU2V0dGluZ3MoY3VzdG9tU2V0dGluZ3MpIHtcbiAgICByZXR1cm4gX2V4dGVuZHMoe30sIGRlZmF1bHRTZXR0aW5ncywgY3VzdG9tU2V0dGluZ3MpO1xuICB9O1xuXG4gIC8qIENyZWF0ZXMgaW5zdGFuY2UgYW5kIG5vdGlmaWVzIGl0IHRocm91Z2ggdGhlIHdpbmRvdyBlbGVtZW50ICovXG4gIHZhciBjcmVhdGVJbnN0YW5jZSA9IGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGNsYXNzT2JqLCBvcHRpb25zKSB7XG4gICAgdmFyIGV2ZW50O1xuICAgIHZhciBldmVudFN0cmluZyA9IFwiTGF6eUxvYWQ6OkluaXRpYWxpemVkXCI7XG4gICAgdmFyIGluc3RhbmNlID0gbmV3IGNsYXNzT2JqKG9wdGlvbnMpO1xuICAgIHRyeSB7XG4gICAgICAvLyBXb3JrcyBpbiBtb2Rlcm4gYnJvd3NlcnNcbiAgICAgIGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50U3RyaW5nLCB7XG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIFdvcmtzIGluIEludGVybmV0IEV4cGxvcmVyIChhbGwgdmVyc2lvbnMpXG4gICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiQ3VzdG9tRXZlbnRcIik7XG4gICAgICBldmVudC5pbml0Q3VzdG9tRXZlbnQoZXZlbnRTdHJpbmcsIGZhbHNlLCBmYWxzZSwge1xuICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH07XG4gIC8qIEF1dG8gaW5pdGlhbGl6YXRpb24gb2Ygb25lIG9y
96IG1vcmUgaW5zdGFuY2VzIG9mIExhenlMb2FkLCBkZXBlbmRpbmcgb24gdGhlXG4gICAgICBvcHRpb25zIHBhc3NlZCBpbiAocGxhaW4gb2JqZWN0IG9yIGFuIGFycmF5KSAqL1xuXG4gIHZhciBhdXRvSW5pdGlhbGl6ZSA9IGZ1bmN0aW9uIGF1dG9Jbml0aWFsaXplKGNsYXNzT2JqLCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIC8vIFBsYWluIG9iamVjdFxuICAgICAgY3JlYXRlSW5zdGFuY2UoY2xhc3NPYmosIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcnJheSBvZiBvYmplY3RzXG4gICAgICBmb3IgKHZhciBpID0gMCwgb3B0aW9uc0l0ZW07IG9wdGlvbnNJdGVtID0gb3B0aW9uc1tpXTsgaSArPSAxKSB7XG4gICAgICAgIGNyZWF0ZUluc3RhbmNlKGNsYXNzT2JqLCBvcHRpb25zSXRlbSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgU1JDID0gXCJzcmNcIjtcbiAgdmFyIFNSQ1NFVCA9IFwic3Jjc2V0XCI7XG4gIHZhciBTSVpFUyA9IFwic2l6ZXNcIjtcbiAgdmFyIFBPU1RFUiA9IFwicG9zdGVyXCI7XG4gIHZhciBPUklHSU5BTFMgPSBcImxsT3JpZ2luYWxBdHRyc1wiO1xuICB2YXIgREFUQSA9IFwiZGF0YVwiO1xuICB2YXIgc3RhdHVzTG9hZGluZyA9IFwibG9hZGluZ1wiO1xuICB2YXIgc3RhdHVzTG9hZGVkID0gXCJsb2FkZWRcIjtcbiAgdmFyIHN0YXR1c0FwcGxpZWQgPSBcImFwcGxpZWRcIjtcbiAgdmFyIHN0YXR1c0VudGVyZWQgPSBcImVudGVyZWRcIjtcbiAgdmFyIHN0YXR1c0Vycm9yID0gXCJlcnJvclwiO1xuICB2YXIgc3RhdHVzTmF0aXZlID0gXCJuYXRpdmVcIjtcbiAgdmFyIGRhdGFQcmVmaXggPSBcImRhdGEtXCI7XG4gIHZhciBzdGF0dXNEYXRhTmFtZSA9IFwibGwtc3RhdHVzXCI7XG4gIHZhciBnZXREYXRhID0gZnVuY3Rpb24gZ2V0RGF0YShlbGVtZW50LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoZGF0YVByZWZpeCArIGF0dHJpYnV0ZSk7XG4gIH07XG4gIHZhciBzZXREYXRhID0gZnVuY3Rpb24gc2V0RGF0YShlbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgdmFyIGF0dHJOYW1lID0gZGF0YVByZWZpeCArIGF0dHJpYnV0ZTtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIHZhbHVlKTtcbiAgfTtcbiAgdmFyIGdldFN0YXR1cyA9IGZ1bmN0aW9uIGdldFN0YXR1cyhlbGVtZW50KSB7XG4gICAgcmV0dXJuIGdldERhdGEoZWxlbWVudCwgc3RhdHVzRGF0YU5hbWUpO1xuICB9O1xuICB2YXIgc2V0U3RhdHVzID0gZnVuY3Rpb24gc2V0U3RhdHVzKGVsZW1lbnQsIHN0YXR1cykge1xuICAgIHJldHVybiBzZXREYXRhKGVsZW1lbnQsIHN0YXR1c0RhdGFOYW1lLCBzdGF0dXMpO1xuICB9O1xuICB2YXIgcmVzZXRTdGF0dXMgPSBmdW5jdGlvbiByZXNldFN0YXR1cyhlbGVtZW50KSB7XG4gICAgcmV0dXJuIHNldFN0YXR1cyhlbGVtZW50LCBudWxsKTtcbiAgfTtcbiAgdmFyIGhhc0VtcHR5U3RhdHVzID0gZnVuY3Rpb24gaGFzRW1wdHlTdGF0dXMoZWxlbWVudCkge1xuICAgIHJldHVybiBnZXRTdGF0dXMoZWxlbWVudCkgPT09IG51bGw7XG4gIH07XG4gIHZhciBoYXNTdGF0dXNMb2FkaW5nID0gZnVuY3Rpb24gaGFzU3RhdHVzTG9hZGluZyhlbGVtZW50KSB7XG4gICAgcmV0dXJuIGdldFN0YXR1cyhlbGVtZW50KSA9PT0gc3RhdHVzTG9hZGluZztcbiAgfTtcbiAgdmFyIGhhc1N0YXR1c0Vycm9yID0gZnVuY3Rpb24gaGFzU3RhdHVzRXJyb3IoZWxlbWVudCkge1xuICAgIHJldHVybiBnZXRTdGF0dXMoZWxlbWVudCkgPT09IHN0YXR1c0Vycm9yO1xuICB9O1xuICB2YXIgaGFzU3RhdHVzTmF0aXZlID0gZnVuY3Rpb24gaGFzU3RhdHVzTmF0aXZlKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gZ2V0U3RhdHVzKGVsZW1lbnQpID09PSBzdGF0dXNOYXRpdmU7XG4gIH07XG4gIHZhciBzdGF0dXNlc0FmdGVyTG9hZGluZyA9IFtzdGF0dXNMb2FkaW5nLCBzdGF0dXNMb2FkZWQsIHN0YXR1c0FwcGxpZWQsIHN0YXR1c0Vycm9yXTtcbiAgdmFyIGhhZFN0YXJ0ZWRMb2FkaW5nID0gZnVuY3Rpb24gaGFkU3RhcnRlZExvYWRpbmcoZWxlbWVudCkge1xuICAgIHJldHVybiBzdGF0dXNlc0FmdGVyTG9hZGluZy5pbmRleE9mKGdldFN0YXR1cyhlbGVtZW50KSkgPj0gMDtcbiAgfTtcbiAgdmFyIHNhZmVDYWxsYmFjayA9IGZ1bmN0aW9uIHNhZmVDYWxsYmFjayhjYWxsYmFjaywgYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmICghY2FsbGJhY2sgfHwgdHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhcmczICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhbGxiYWNrKGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoYXJnMiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjYWxsYmFjayhhcmcxLCBhcmcyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FsbGJhY2soYXJnMSk7XG4gIH07XG4gIHZhciBhZGRDbGFzcyA9IGZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICAgIGlmIChzdXBwb3J0c0NsYXNzTGlzdCkge1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuY2xhc3NOYW1lICs9IChlbGVtZW50LmNsYXNzTmFtZSA/IFwiIFwiIDogXCJcIikgKyBjbGFzc05hbWU7XG4gIH07XG4gIHZhciByZW1vdmVDbGFzcyA9IGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICAgIGlmIChzdXBwb3J0c0NsYXNzTGlzdCkge1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gZWxlbWVudC5jbGFzc05hbWUucmVwbGFjZShuZXcgUmVnRXhwKFwiKF58XFxcXHMrKVwiICsgY2xhc3NOYW1lICsgXCIoXFxcXHMrfCQpXCIpLCBcIiBcIikucmVwbGFjZSgvXlxccysvLCBcIlwiKS5yZXBsYWNlKC9cXHMrJC8sIFwiXCIpO1xuICB9O1xuICB2YXIgYWRkVGVtcEltYWdlID0gZnVuY3Rpb24gYWRkVGVtcEltYWdlKGVsZW1lbnQpIHtcbiAgICBlbGVtZW50LmxsVGVtcEltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIklNR1wiKTtcbiAgfTtcbiAgdmFyIGRlbGV0ZVRlbXBJbWFnZSA9IGZ1bmN0aW9uIGRlbGV0ZVRlbXBJbWFnZShlbGVtZW50KSB7XG4gICAgZGVsZXRlIGVsZW1lbnQubGxUZW1wSW1hZ2U7XG4gIH07XG4gIHZhciBnZXRUZW1wSW1hZ2UgPSBmdW5jdGlvbiBnZXRUZW1wSW1hZ2UoZWxlbWVudCkge1xuICAgIHJldHVybi
96BlbGVtZW50LmxsVGVtcEltYWdlO1xuICB9O1xuICB2YXIgdW5vYnNlcnZlID0gZnVuY3Rpb24gdW5vYnNlcnZlKGVsZW1lbnQsIGluc3RhbmNlKSB7XG4gICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuO1xuICAgIHZhciBvYnNlcnZlciA9IGluc3RhbmNlLl9vYnNlcnZlcjtcbiAgICBpZiAoIW9ic2VydmVyKSByZXR1cm47XG4gICAgb2JzZXJ2ZXIudW5vYnNlcnZlKGVsZW1lbnQpO1xuICB9O1xuICB2YXIgcmVzZXRPYnNlcnZlciA9IGZ1bmN0aW9uIHJlc2V0T2JzZXJ2ZXIob2JzZXJ2ZXIpIHtcbiAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH07XG4gIHZhciB1bm9ic2VydmVFbnRlcmVkID0gZnVuY3Rpb24gdW5vYnNlcnZlRW50ZXJlZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICBpZiAoc2V0dGluZ3MudW5vYnNlcnZlX2VudGVyZWQpIHVub2JzZXJ2ZShlbGVtZW50LCBpbnN0YW5jZSk7XG4gIH07XG4gIHZhciB1cGRhdGVMb2FkaW5nQ291bnQgPSBmdW5jdGlvbiB1cGRhdGVMb2FkaW5nQ291bnQoaW5zdGFuY2UsIGRlbHRhKSB7XG4gICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuO1xuICAgIGluc3RhbmNlLmxvYWRpbmdDb3VudCArPSBkZWx0YTtcbiAgfTtcbiAgdmFyIGRlY3JlYXNlVG9Mb2FkQ291bnQgPSBmdW5jdGlvbiBkZWNyZWFzZVRvTG9hZENvdW50KGluc3RhbmNlKSB7XG4gICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuO1xuICAgIGluc3RhbmNlLnRvTG9hZENvdW50IC09IDE7XG4gIH07XG4gIHZhciBzZXRUb0xvYWRDb3VudCA9IGZ1bmN0aW9uIHNldFRvTG9hZENvdW50KGluc3RhbmNlLCB2YWx1ZSkge1xuICAgIGlmICghaW5zdGFuY2UpIHJldHVybjtcbiAgICBpbnN0YW5jZS50b0xvYWRDb3VudCA9IHZhbHVlO1xuICB9O1xuICB2YXIgaXNTb21ldGhpbmdMb2FkaW5nID0gZnVuY3Rpb24gaXNTb21ldGhpbmdMb2FkaW5nKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLmxvYWRpbmdDb3VudCA+IDA7XG4gIH07XG4gIHZhciBoYXZlRWxlbWVudHNUb0xvYWQgPSBmdW5jdGlvbiBoYXZlRWxlbWVudHNUb0xvYWQoaW5zdGFuY2UpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UudG9Mb2FkQ291bnQgPiAwO1xuICB9O1xuICB2YXIgZ2V0U291cmNlVGFncyA9IGZ1bmN0aW9uIGdldFNvdXJjZVRhZ3MocGFyZW50VGFnKSB7XG4gICAgdmFyIHNvdXJjZVRhZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgY2hpbGRUYWc7IGNoaWxkVGFnID0gcGFyZW50VGFnLmNoaWxkcmVuW2ldOyBpICs9IDEpIHtcbiAgICAgIGlmIChjaGlsZFRhZy50YWdOYW1lID09PSBcIlNPVVJDRVwiKSB7XG4gICAgICAgIHNvdXJjZVRhZ3MucHVzaChjaGlsZFRhZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VUYWdzO1xuICB9O1xuICB2YXIgZm9yRWFjaFBpY3R1cmVTb3VyY2UgPSBmdW5jdGlvbiBmb3JFYWNoUGljdHVyZVNvdXJjZShlbGVtZW50LCBmbikge1xuICAgIHZhciBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50LnRhZ05hbWUgIT09IFwiUElDVFVSRVwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBzb3VyY2VUYWdzID0gZ2V0U291cmNlVGFncyhwYXJlbnQpO1xuICAgIHNvdXJjZVRhZ3MuZm9yRWFjaChmbik7XG4gIH07XG4gIHZhciBmb3JFYWNoVmlkZW9Tb3VyY2UgPSBmdW5jdGlvbiBmb3JFYWNoVmlkZW9Tb3VyY2UoZWxlbWVudCwgZm4pIHtcbiAgICB2YXIgc291cmNlVGFncyA9IGdldFNvdXJjZVRhZ3MoZWxlbWVudCk7XG4gICAgc291cmNlVGFncy5mb3JFYWNoKGZuKTtcbiAgfTtcbiAgdmFyIGF0dHJzU3JjID0gW1NSQ107XG4gIHZhciBhdHRyc1NyY1Bvc3RlciA9IFtTUkMsIFBPU1RFUl07XG4gIHZhciBhdHRyc1NyY1NyY3NldFNpemVzID0gW1NSQywgU1JDU0VULCBTSVpFU107XG4gIHZhciBhdHRyc0RhdGEgPSBbREFUQV07XG4gIHZhciBoYXNPcmlnaW5hbEF0dHJzID0gZnVuY3Rpb24gaGFzT3JpZ2luYWxBdHRycyhlbGVtZW50KSB7XG4gICAgcmV0dXJuICEhZWxlbWVudFtPUklHSU5BTFNdO1xuICB9O1xuICB2YXIgZ2V0T3JpZ2luYWxBdHRycyA9IGZ1bmN0aW9uIGdldE9yaWdpbmFsQXR0cnMoZWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50W09SSUdJTkFMU107XG4gIH07XG4gIHZhciBkZWxldGVPcmlnaW5hbEF0dHJzID0gZnVuY3Rpb24gZGVsZXRlT3JpZ2luYWxBdHRycyhlbGVtZW50KSB7XG4gICAgcmV0dXJuIGRlbGV0ZSBlbGVtZW50W09SSUdJTkFMU107XG4gIH07IC8vICMjIFNBVkUgIyNcblxuICB2YXIgc2V0T3JpZ2luYWxzT2JqZWN0ID0gZnVuY3Rpb24gc2V0T3JpZ2luYWxzT2JqZWN0KGVsZW1lbnQsIGF0dHJpYnV0ZXMpIHtcbiAgICBpZiAoaGFzT3JpZ2luYWxBdHRycyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgb3JpZ2luYWxzID0ge307XG4gICAgYXR0cmlidXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgIG9yaWdpbmFsc1thdHRyaWJ1dGVdID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICB9KTtcbiAgICBlbGVtZW50W09SSUdJTkFMU10gPSBvcmlnaW5hbHM7XG4gIH07XG4gIHZhciBzYXZlT3JpZ2luYWxCYWNrZ3JvdW5kU3R5bGUgPSBmdW5jdGlvbiBzYXZlT3JpZ2luYWxCYWNrZ3JvdW5kU3R5bGUoZWxlbWVudCkge1xuICAgIGlmIChoYXNPcmlnaW5hbEF0dHJzKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnRbT1JJR0lOQUxTXSA9IHtcbiAgICAgIGJhY2tncm91bmRJbWFnZTogZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2VcbiAgICB9O1xuICB9OyAvLyAjIyBSRVNUT1JFICMjXG5cbiAgdmFyIHNldE9yUmVzZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiBzZXRPclJlc2V0QXR0cmlidXRlKGVsZW1lbnQsIGF0dHJOYW1lLCB2YWx1ZSkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIHZhbHVlKTtcbiAgfTtcbiAgdmFyIHJlc3RvcmVPcmlnaW5hbEF0dHJzID0gZnVuY3Rpb24gcmVzdG9yZU9yaWdpbmFsQXR0cnMoZWxlbWVudCwgYXR0cmlidXRlcykge1xuICAgIGlmICghaGFzT3JpZ2luYWxBdHRycyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgb3JpZ2luYWxzID0gZ2V0T3JpZ2luYWxBdHRycyhlbGVtZW50KTtcbiAgICBhdHRyaWJ1dGVzLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgc2V0T3JSZXNldEF0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGUsIG9yaWdpbmFsc1thdHRyaWJ1dGVdKTtcbiAgICB9KTtcbiAgfTtcbiAgdmFyIHJlc3RvcmVPcmlnaW5hbEJnSW1hZ2UgPSBmdW5jdGlvbiByZXN0b3JlT3JpZ2luYWxCZ0ltYWdlKGVsZW1lbnQpIHtcbiAgICBpZiAoIWhhc09yaWdpbmFsQXR0cnMoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG9yaWdpbmFscyA9IGdldE9yaWdpbmFsQXR0cnMoZWxlbWVudCk7XG4gICAgZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBvcmlnaW5hbHMuYmFja2dyb3VuZEltYWdlO1xuICB9O1xuICB2YXIgbWFuYWdlQXBwbGllZCA9IGZ1bmN0aW9uIG1hbmFnZUFwcGxpZWQoZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuY2xhc3NfYXBwbGllZCk7XG4gICAgc2V0U3RhdHVzKGVsZW1lbnQsIHN0YXR1c0FwcGxpZWQpOyAvLyBJbnN0YW5jZSBpcyBub3QgcHJvdmlkZWQgd2hlbiBsb2FkaW5nIGlzIGNhbGxlZCBmcm9tIHN0YXRpYyBjbGFzc1xuXG4gICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuO1xuICAgIGlmIChzZXR0aW5ncy51bm9ic2VydmVfY29tcGxldGVkKSB7XG4gICAgICAvLyBVbm9ic2VydmUgbm93IGJlY2F1c2Ugd2UgY2FuJ3QgZG8gaXQgb24gbG9hZFxuICAgICAgdW5vYnNlcnZlKGVsZW1lbnQsIHNldHRpbmdzKTtcbiAgICB9XG4gICAgc2FmZUNhbGxiYWNrKHNldH
96RpbmdzLmNhbGxiYWNrX2FwcGxpZWQsIGVsZW1lbnQsIGluc3RhbmNlKTtcbiAgfTtcbiAgdmFyIG1hbmFnZUxvYWRpbmcgPSBmdW5jdGlvbiBtYW5hZ2VMb2FkaW5nKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSkge1xuICAgIGFkZENsYXNzKGVsZW1lbnQsIHNldHRpbmdzLmNsYXNzX2xvYWRpbmcpO1xuICAgIHNldFN0YXR1cyhlbGVtZW50LCBzdGF0dXNMb2FkaW5nKTsgLy8gSW5zdGFuY2UgaXMgbm90IHByb3ZpZGVkIHdoZW4gbG9hZGluZyBpcyBjYWxsZWQgZnJvbSBzdGF0aWMgY2xhc3NcblxuICAgIGlmICghaW5zdGFuY2UpIHJldHVybjtcbiAgICB1cGRhdGVMb2FkaW5nQ291bnQoaW5zdGFuY2UsICsxKTtcbiAgICBzYWZlQ2FsbGJhY2soc2V0dGluZ3MuY2FsbGJhY2tfbG9hZGluZywgZWxlbWVudCwgaW5zdGFuY2UpO1xuICB9O1xuICB2YXIgc2V0QXR0cmlidXRlSWZWYWx1ZSA9IGZ1bmN0aW9uIHNldEF0dHJpYnV0ZUlmVmFsdWUoZWxlbWVudCwgYXR0ck5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgdmFsdWUpO1xuICB9O1xuICB2YXIgc2V0SW1hZ2VBdHRyaWJ1dGVzID0gZnVuY3Rpb24gc2V0SW1hZ2VBdHRyaWJ1dGVzKGVsZW1lbnQsIHNldHRpbmdzKSB7XG4gICAgc2V0QXR0cmlidXRlSWZWYWx1ZShlbGVtZW50LCBTSVpFUywgZ2V0RGF0YShlbGVtZW50LCBzZXR0aW5ncy5kYXRhX3NpemVzKSk7XG4gICAgc2V0QXR0cmlidXRlSWZWYWx1ZShlbGVtZW50LCBTUkNTRVQsIGdldERhdGEoZWxlbWVudCwgc2V0dGluZ3MuZGF0YV9zcmNzZXQpKTtcbiAgICBzZXRBdHRyaWJ1dGVJZlZhbHVlKGVsZW1lbnQsIFNSQywgZ2V0RGF0YShlbGVtZW50LCBzZXR0aW5ncy5kYXRhX3NyYykpO1xuICB9O1xuICB2YXIgc2V0U291cmNlc0ltZyA9IGZ1bmN0aW9uIHNldFNvdXJjZXNJbWcoaW1nRWwsIHNldHRpbmdzKSB7XG4gICAgZm9yRWFjaFBpY3R1cmVTb3VyY2UoaW1nRWwsIGZ1bmN0aW9uIChzb3VyY2VUYWcpIHtcbiAgICAgIHNldE9yaWdpbmFsc09iamVjdChzb3VyY2VUYWcsIGF0dHJzU3JjU3Jjc2V0U2l6ZXMpO1xuICAgICAgc2V0SW1hZ2VBdHRyaWJ1dGVzKHNvdXJjZVRhZywgc2V0dGluZ3MpO1xuICAgIH0pO1xuICAgIHNldE9yaWdpbmFsc09iamVjdChpbWdFbCwgYXR0cnNTcmNTcmNzZXRTaXplcyk7XG4gICAgc2V0SW1hZ2VBdHRyaWJ1dGVzKGltZ0VsLCBzZXR0aW5ncyk7XG4gIH07XG4gIHZhciBzZXRTb3VyY2VzSWZyYW1lID0gZnVuY3Rpb24gc2V0U291cmNlc0lmcmFtZShpZnJhbWUsIHNldHRpbmdzKSB7XG4gICAgc2V0T3JpZ2luYWxzT2JqZWN0KGlmcmFtZSwgYXR0cnNTcmMpO1xuICAgIHNldEF0dHJpYnV0ZUlmVmFsdWUoaWZyYW1lLCBTUkMsIGdldERhdGEoaWZyYW1lLCBzZXR0aW5ncy5kYXRhX3NyYykpO1xuICB9O1xuICB2YXIgc2V0U291cmNlc1ZpZGVvID0gZnVuY3Rpb24gc2V0U291cmNlc1ZpZGVvKHZpZGVvRWwsIHNldHRpbmdzKSB7XG4gICAgZm9yRWFjaFZpZGVvU291cmNlKHZpZGVvRWwsIGZ1bmN0aW9uIChzb3VyY2VFbCkge1xuICAgICAgc2V0T3JpZ2luYWxzT2JqZWN0KHNvdXJjZUVsLCBhdHRyc1NyYyk7XG4gICAgICBzZXRBdHRyaWJ1dGVJZlZhbHVlKHNvdXJjZUVsLCBTUkMsIGdldERhdGEoc291cmNlRWwsIHNldHRpbmdzLmRhdGFfc3JjKSk7XG4gICAgfSk7XG4gICAgc2V0T3JpZ2luYWxzT2JqZWN0KHZpZGVvRWwsIGF0dHJzU3JjUG9zdGVyKTtcbiAgICBzZXRBdHRyaWJ1dGVJZlZhbHVlKHZpZGVvRWwsIFBPU1RFUiwgZ2V0RGF0YSh2aWRlb0VsLCBzZXR0aW5ncy5kYXRhX3Bvc3RlcikpO1xuICAgIHNldEF0dHJpYnV0ZUlmVmFsdWUodmlkZW9FbCwgU1JDLCBnZXREYXRhKHZpZGVvRWwsIHNldHRpbmdzLmRhdGFfc3JjKSk7XG4gICAgdmlkZW9FbC5sb2FkKCk7XG4gIH07XG4gIHZhciBzZXRTb3VyY2VzT2JqZWN0ID0gZnVuY3Rpb24gc2V0U291cmNlc09iamVjdChvYmplY3QsIHNldHRpbmdzKSB7XG4gICAgc2V0T3JpZ2luYWxzT2JqZWN0KG9iamVjdCwgYXR0cnNEYXRhKTtcbiAgICBzZXRBdHRyaWJ1dGVJZlZhbHVlKG9iamVjdCwgREFUQSwgZ2V0RGF0YShvYmplY3QsIHNldHRpbmdzLmRhdGFfc3JjKSk7XG4gIH07XG4gIHZhciBzZXRCYWNrZ3JvdW5kID0gZnVuY3Rpb24gc2V0QmFja2dyb3VuZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICB2YXIgYmcxeFZhbHVlID0gZ2V0RGF0YShlbGVtZW50LCBzZXR0aW5ncy5kYXRhX2JnKTtcbiAgICB2YXIgYmdIaURwaVZhbHVlID0gZ2V0RGF0YShlbGVtZW50LCBzZXR0aW5ncy5kYXRhX2JnX2hpZHBpKTtcbiAgICB2YXIgYmdEYXRhVmFsdWUgPSBpc0hpRHBpICYmIGJnSGlEcGlWYWx1ZSA/IGJnSGlEcGlWYWx1ZSA6IGJnMXhWYWx1ZTtcbiAgICBpZiAoIWJnRGF0YVZhbHVlKSByZXR1cm47XG4gICAgZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBcInVybChcXFwiXCIuY29uY2F0KGJnRGF0YVZhbHVlLCBcIlxcXCIpXCIpO1xuICAgIGdldFRlbXBJbWFnZShlbGVtZW50KS5zZXRBdHRyaWJ1dGUoU1JDLCBiZ0RhdGFWYWx1ZSk7XG4gICAgbWFuYWdlTG9hZGluZyhlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICB9OyAvLyBOT1RFOiBUSEUgVEVNUCBJTUFHRSBUUklDSyBDQU5OT1QgQkUgRE9ORSBXSVRIIGRhdGEtbXVsdGktYmdcbiAgLy8gQkVDQVVTRSBJTlNJREUgSVRTIFZBTFVFUyBNVVNUIEJFIFdSQVBQRUQgV0lUSCBVUkwoKSBBTkQgT05FIE9GIFRIRU1cbiAgLy8gQ09VTEQgQkUgQSBHUkFESUVOVCBCQUNLR1JPVU5EIElNQUdFXG5cbiAgdmFyIHNldE11bHRpQmFja2dyb3VuZCA9IGZ1bmN0aW9uIHNldE11bHRpQmFja2dyb3VuZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICB2YXIgYmcxeFZhbHVlID0gZ2V0RGF0YShlbGVtZW50LCBzZXR0aW5ncy5kYXRhX2JnX211bHRpKTtcbiAgICB2YXIgYmdIaURwaVZhbHVlID0gZ2V0RGF0YShlbGVtZW50LCBzZXR0aW5ncy5kYXRhX2JnX211bHRpX2hpZHBpKTtcbiAgICB2YXIgYmdEYXRhVmFsdWUgPSBpc0hpRHBpICYmIGJnSGlEcGlWYWx1ZSA/IGJnSGlEcGlWYWx1ZSA6IGJnMXhWYWx1ZTtcbiAgICBpZiAoIWJnRGF0YVZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gYmdEYXRhVmFsdWU7XG4gICAgbWFuYWdlQXBwbGllZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICB9O1xuICB2YXIgc2V0SW1nc2V0QmFja2dyb3VuZCA9IGZ1bmN0aW9uIHNldEltZ3NldEJhY2tncm91bmQoZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgdmFyIGJnSW1nU2V0RGF0YVZhbHVlID0gZ2V0RGF0YShlbGVtZW50LCBzZXR0aW5ncy5kYXRhX2JnX3NldCk7XG4gICAgaWYgKCFiZ0ltZ1NldERhdGFWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW1nU2V0VmFsdWVzID0gYmdJbWdTZXREYXRhVmFsdWUuc3BsaXQoXCJ8XCIpO1xuICAgIHZhciBiZ0ltYWdlVmFsdWVzID0gaW1nU2V0VmFsdWVzLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybi
96BcImltYWdlLXNldChcIi5jb25jYXQodmFsdWUsIFwiKVwiKTtcbiAgICB9KTtcbiAgICBlbGVtZW50LnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IGJnSW1hZ2VWYWx1ZXMuam9pbigpOyAvLyBUZW1wb3JhcnkgZml4IGZvciBDaHJvbWVpdW0gd2l0aCB0aGUgLXdlYmtpdC0gcHJlZml4XG5cbiAgICBpZiAoZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPT09IFwiXCIpIHtcbiAgICAgIGJnSW1hZ2VWYWx1ZXMgPSBpbWdTZXRWYWx1ZXMubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gXCItd2Via2l0LWltYWdlLXNldChcIi5jb25jYXQodmFsdWUsIFwiKVwiKTtcbiAgICAgIH0pO1xuICAgICAgZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBiZ0ltYWdlVmFsdWVzLmpvaW4oKTtcbiAgICB9XG4gICAgbWFuYWdlQXBwbGllZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICB9O1xuICB2YXIgc2V0U291cmNlc0Z1bmN0aW9ucyA9IHtcbiAgICBJTUc6IHNldFNvdXJjZXNJbWcsXG4gICAgSUZSQU1FOiBzZXRTb3VyY2VzSWZyYW1lLFxuICAgIFZJREVPOiBzZXRTb3VyY2VzVmlkZW8sXG4gICAgT0JKRUNUOiBzZXRTb3VyY2VzT2JqZWN0XG4gIH07XG4gIHZhciBzZXRTb3VyY2VzTmF0aXZlID0gZnVuY3Rpb24gc2V0U291cmNlc05hdGl2ZShlbGVtZW50LCBzZXR0aW5ncykge1xuICAgIHZhciBzZXRTb3VyY2VzRnVuY3Rpb24gPSBzZXRTb3VyY2VzRnVuY3Rpb25zW2VsZW1lbnQudGFnTmFtZV07XG4gICAgaWYgKCFzZXRTb3VyY2VzRnVuY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0U291cmNlc0Z1bmN0aW9uKGVsZW1lbnQsIHNldHRpbmdzKTtcbiAgfTtcbiAgdmFyIHNldFNvdXJjZXMgPSBmdW5jdGlvbiBzZXRTb3VyY2VzKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSkge1xuICAgIHZhciBzZXRTb3VyY2VzRnVuY3Rpb24gPSBzZXRTb3VyY2VzRnVuY3Rpb25zW2VsZW1lbnQudGFnTmFtZV07XG4gICAgaWYgKCFzZXRTb3VyY2VzRnVuY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0U291cmNlc0Z1bmN0aW9uKGVsZW1lbnQsIHNldHRpbmdzKTtcbiAgICBtYW5hZ2VMb2FkaW5nKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gIH07XG4gIHZhciBlbGVtZW50c1dpdGhMb2FkRXZlbnQgPSBbXCJJTUdcIiwgXCJJRlJBTUVcIiwgXCJWSURFT1wiLCBcIk9CSkVDVFwiXTtcbiAgdmFyIGhhc0xvYWRFdmVudCA9IGZ1bmN0aW9uIGhhc0xvYWRFdmVudChlbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnRzV2l0aExvYWRFdmVudC5pbmRleE9mKGVsZW1lbnQudGFnTmFtZSkgPiAtMTtcbiAgfTtcbiAgdmFyIGNoZWNrRmluaXNoID0gZnVuY3Rpb24gY2hlY2tGaW5pc2goc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgaWYgKGluc3RhbmNlICYmICFpc1NvbWV0aGluZ0xvYWRpbmcoaW5zdGFuY2UpICYmICFoYXZlRWxlbWVudHNUb0xvYWQoaW5zdGFuY2UpKSB7XG4gICAgICBzYWZlQ2FsbGJhY2soc2V0dGluZ3MuY2FsbGJhY2tfZmluaXNoLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9O1xuICB2YXIgYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgZWxlbWVudC5sbEV2TGlzbnJzW2V2ZW50TmFtZV0gPSBoYW5kbGVyO1xuICB9O1xuICB2YXIgcmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7XG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gIH07XG4gIHZhciBoYXNFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uIGhhc0V2ZW50TGlzdGVuZXJzKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gISFlbGVtZW50LmxsRXZMaXNucnM7XG4gIH07XG4gIHZhciBhZGRFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJzKGVsZW1lbnQsIGxvYWRIYW5kbGVyLCBlcnJvckhhbmRsZXIpIHtcbiAgICBpZiAoIWhhc0V2ZW50TGlzdGVuZXJzKGVsZW1lbnQpKSBlbGVtZW50LmxsRXZMaXNucnMgPSB7fTtcbiAgICB2YXIgbG9hZEV2ZW50TmFtZSA9IGVsZW1lbnQudGFnTmFtZSA9PT0gXCJWSURFT1wiID8gXCJsb2FkZWRkYXRhXCIgOiBcImxvYWRcIjtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGxvYWRFdmVudE5hbWUsIGxvYWRIYW5kbGVyKTtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIFwiZXJyb3JcIiwgZXJyb3JIYW5kbGVyKTtcbiAgfTtcbiAgdmFyIHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZWxlbWVudCkge1xuICAgIGlmICghaGFzRXZlbnRMaXN0ZW5lcnMoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGV2ZW50TGlzdGVuZXJzID0gZWxlbWVudC5sbEV2TGlzbnJzO1xuICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBldmVudExpc3RlbmVycykge1xuICAgICAgdmFyIGhhbmRsZXIgPSBldmVudExpc3RlbmVyc1tldmVudE5hbWVdO1xuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgIH1cbiAgICBkZWxldGUgZWxlbWVudC5sbEV2TGlzbnJzO1xuICB9O1xuICB2YXIgZG9uZUhhbmRsZXIgPSBmdW5jdGlvbiBkb25lSGFuZGxlcihlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICBkZWxldGVUZW1wSW1hZ2UoZWxlbWVudCk7XG4gICAgdXBkYXRlTG9hZGluZ0NvdW50KGluc3RhbmNlLCAtMSk7XG4gICAgZGVjcmVhc2VUb0xvYWRDb3VudChpbnN0YW5jZSk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuY2xhc3NfbG9hZGluZyk7XG4gICAgaWYgKHNldHRpbmdzLnVub2JzZXJ2ZV9jb21wbGV0ZWQpIHtcbiAgICAgIHVub2JzZXJ2ZShlbGVtZW50LCBpbnN0YW5jZSk7XG4gICAgfVxuICB9O1xuICB2YXIgbG9hZEhhbmRsZXIgPSBmdW5jdGlvbiBsb2FkSGFuZGxlcihldmVudCwgZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgdmFyIGdvaW5nTmF0aXZlID0gaGFzU3RhdHVzTmF0aXZlKGVsZW1lbnQpO1xuICAgIGRvbmVIYW5kbGVyKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuY2xhc3NfbG9hZGVkKTtcbiAgICBzZXRTdGF0dXMoZWxlbWVudCwgc3RhdHVzTG9hZGVkKTtcbiAgICBzYWZlQ2FsbGJhY2soc2V0dGluZ3MuY2FsbGJhY2tfbG9hZGVkLCBlbGVtZW50LCBpbnN0YW5jZSk7XG4gICAgaWYgKCFnb2luZ05hdGl2ZSkgY2hlY2tGaW5pc2goc2V0dGluZ3MsIGluc3RhbmNlKTtcbiAgfTtcbiAgdmFyIGVycm9ySGFuZGxlciA9IGZ1bmN0aW9uIGVycm9ySGFuZGxlcihldmVudCwgZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgdmFyIGdvaW5nTmF0aXZlID0gaGFzU3RhdHVzTmF0aXZlKGVsZW1lbnQpO1xuICAgIGRvbmVIYW5kbGVyKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuY2xhc3NfZXJyb3IpO1xuICAgIHNldFN0YXR1cy
96hlbGVtZW50LCBzdGF0dXNFcnJvcik7XG4gICAgc2FmZUNhbGxiYWNrKHNldHRpbmdzLmNhbGxiYWNrX2Vycm9yLCBlbGVtZW50LCBpbnN0YW5jZSk7XG4gICAgaWYgKHNldHRpbmdzLnJlc3RvcmVfb25fZXJyb3IpIHJlc3RvcmVPcmlnaW5hbEF0dHJzKGVsZW1lbnQsIGF0dHJzU3JjU3Jjc2V0U2l6ZXMpO1xuICAgIGlmICghZ29pbmdOYXRpdmUpIGNoZWNrRmluaXNoKHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gIH07XG4gIHZhciBhZGRPbmVTaG90RXZlbnRMaXN0ZW5lcnMgPSBmdW5jdGlvbiBhZGRPbmVTaG90RXZlbnRMaXN0ZW5lcnMoZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgdmFyIGVsZW1lbnRUb0xpc3RlblRvID0gZ2V0VGVtcEltYWdlKGVsZW1lbnQpIHx8IGVsZW1lbnQ7XG4gICAgaWYgKGhhc0V2ZW50TGlzdGVuZXJzKGVsZW1lbnRUb0xpc3RlblRvKSkge1xuICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gbG9hZGluZyBpcyByZXRyaWVkIHR3aWNlXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBfbG9hZEhhbmRsZXIgPSBmdW5jdGlvbiBfbG9hZEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgIGxvYWRIYW5kbGVyKGV2ZW50LCBlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZWxlbWVudFRvTGlzdGVuVG8pO1xuICAgIH07XG4gICAgdmFyIF9lcnJvckhhbmRsZXIgPSBmdW5jdGlvbiBfZXJyb3JIYW5kbGVyKGV2ZW50KSB7XG4gICAgICBlcnJvckhhbmRsZXIoZXZlbnQsIGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gICAgICByZW1vdmVFdmVudExpc3RlbmVycyhlbGVtZW50VG9MaXN0ZW5Ubyk7XG4gICAgfTtcbiAgICBhZGRFdmVudExpc3RlbmVycyhlbGVtZW50VG9MaXN0ZW5UbywgX2xvYWRIYW5kbGVyLCBfZXJyb3JIYW5kbGVyKTtcbiAgfTtcbiAgdmFyIGxvYWRCYWNrZ3JvdW5kID0gZnVuY3Rpb24gbG9hZEJhY2tncm91bmQoZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgYWRkVGVtcEltYWdlKGVsZW1lbnQpO1xuICAgIGFkZE9uZVNob3RFdmVudExpc3RlbmVycyhlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICAgIHNhdmVPcmlnaW5hbEJhY2tncm91bmRTdHlsZShlbGVtZW50KTtcbiAgICBzZXRCYWNrZ3JvdW5kKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gICAgc2V0TXVsdGlCYWNrZ3JvdW5kKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gICAgc2V0SW1nc2V0QmFja2dyb3VuZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICB9O1xuICB2YXIgbG9hZFJlZ3VsYXIgPSBmdW5jdGlvbiBsb2FkUmVndWxhcihlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICBhZGRPbmVTaG90RXZlbnRMaXN0ZW5lcnMoZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKTtcbiAgICBzZXRTb3VyY2VzKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gIH07XG4gIHZhciBsb2FkID0gZnVuY3Rpb24gbG9hZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICBpZiAoaGFzTG9hZEV2ZW50KGVsZW1lbnQpKSB7XG4gICAgICBsb2FkUmVndWxhcihlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkQmFja2dyb3VuZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICAgIH1cbiAgfTtcbiAgdmFyIGxvYWROYXRpdmUgPSBmdW5jdGlvbiBsb2FkTmF0aXZlKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwibG9hZGluZ1wiLCBcImxhenlcIik7XG4gICAgYWRkT25lU2hvdEV2ZW50TGlzdGVuZXJzKGVsZW1lbnQsIHNldHRpbmdzLCBpbnN0YW5jZSk7XG4gICAgc2V0U291cmNlc05hdGl2ZShlbGVtZW50LCBzZXR0aW5ncyk7XG4gICAgc2V0U3RhdHVzKGVsZW1lbnQsIHN0YXR1c05hdGl2ZSk7XG4gIH07XG4gIHZhciByZW1vdmVJbWFnZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiByZW1vdmVJbWFnZUF0dHJpYnV0ZXMoZWxlbWVudCkge1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFNSQyk7XG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoU1JDU0VUKTtcbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShTSVpFUyk7XG4gIH07XG4gIHZhciByZXNldFNvdXJjZXNJbWcgPSBmdW5jdGlvbiByZXNldFNvdXJjZXNJbWcoZWxlbWVudCkge1xuICAgIGZvckVhY2hQaWN0dXJlU291cmNlKGVsZW1lbnQsIGZ1bmN0aW9uIChzb3VyY2VUYWcpIHtcbiAgICAgIHJlbW92ZUltYWdlQXR0cmlidXRlcyhzb3VyY2VUYWcpO1xuICAgIH0pO1xuICAgIHJlbW92ZUltYWdlQXR0cmlidXRlcyhlbGVtZW50KTtcbiAgfTtcbiAgdmFyIHJlc3RvcmVJbWcgPSBmdW5jdGlvbiByZXN0b3JlSW1nKGltZ0VsKSB7XG4gICAgZm9yRWFjaFBpY3R1cmVTb3VyY2UoaW1nRWwsIGZ1bmN0aW9uIChzb3VyY2VFbCkge1xuICAgICAgcmVzdG9yZU9yaWdpbmFsQXR0cnMoc291cmNlRWwsIGF0dHJzU3JjU3Jjc2V0U2l6ZXMpO1xuICAgIH0pO1xuICAgIHJlc3RvcmVPcmlnaW5hbEF0dHJzKGltZ0VsLCBhdHRyc1NyY1NyY3NldFNpemVzKTtcbiAgfTtcbiAgdmFyIHJlc3RvcmVWaWRlbyA9IGZ1bmN0aW9uIHJlc3RvcmVWaWRlbyh2aWRlb0VsKSB7XG4gICAgZm9yRWFjaFZpZGVvU291cmNlKHZpZGVvRWwsIGZ1bmN0aW9uIChzb3VyY2VFbCkge1xuICAgICAgcmVzdG9yZU9yaWdpbmFsQXR0cnMoc291cmNlRWwsIGF0dHJzU3JjKTtcbiAgICB9KTtcbiAgICByZXN0b3JlT3JpZ2luYWxBdHRycyh2aWRlb0VsLCBhdHRyc1NyY1Bvc3Rlcik7XG4gICAgdmlkZW9FbC5sb2FkKCk7XG4gIH07XG4gIHZhciByZXN0b3JlSWZyYW1lID0gZnVuY3Rpb24gcmVzdG9yZUlmcmFtZShpZnJhbWVFbCkge1xuICAgIHJlc3RvcmVPcmlnaW5hbEF0dHJzKGlmcmFtZUVsLCBhdHRyc1NyYyk7XG4gIH07XG4gIHZhciByZXN0b3JlT2JqZWN0ID0gZnVuY3Rpb24gcmVzdG9yZU9iamVjdChvYmplY3RFbCkge1xuICAgIHJlc3RvcmVPcmlnaW5hbEF0dHJzKG9iamVjdEVsLCBhdHRyc0RhdGEpO1xuICB9O1xuICB2YXIgcmVzdG9yZUZ1bmN0aW9ucyA9IHtcbiAgICBJTUc6IHJlc3RvcmVJbWcsXG4gICAgSUZSQU1FOiByZXN0b3JlSWZyYW1lLFxuICAgIFZJREVPOiByZXN0b3JlVmlkZW8sXG4gICAgT0JKRUNUOiByZXN0b3JlT2JqZWN0XG4gIH07XG4gIHZhciByZXN0b3JlQXR0cmlidXRlcyA9IGZ1bmN0aW9uIHJlc3RvcmVBdHRyaWJ1dGVzKGVsZW1lbnQpIHtcbiAgICB2YXIgcmVzdG9yZUZ1bmN0aW9uID0gcmVzdG9yZUZ1bmN0aW9uc1tlbGVtZW50LnRhZ05hbWVdO1xuICAgIGlmICghcmVzdG9yZUZ1bmN0aW9uKSB7XG4gICAgICByZXN0b3JlT3JpZ2luYWxCZ0ltYWdlKGVsZW1lbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXN0b3JlRnVuY3Rpb24oZWxlbWVudCk7XG4gIH07XG4gIHZhciByZXNldENsYXNzZXMgPSBmdW5jdGlvbiByZXNldENsYXNzZXMoZWxlbWVudCwgc2V0dGluZ3MpIHtcbiAgICBpZiAoaGFzRW1wdHlTdGF0dXMoZWxlbWVudCkgfHwgaGFzU3RhdHVzTmF0aXZlKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLmNsYXNzX2VudGVyZWQpO1xuICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIHNldHRpbmdzLmNsYXNzX2V4aXRlZCk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuY2xhc3NfYXBwbGllZCk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuY2xhc3NfbG9hZGluZyk7XG4gICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgc2V0dGluZ3MuY2xhc3NfbG9hZGVkKTtcbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5jbGFzc19lcnJvcik7XG4gIH07XG4gIHZhciByZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZShlbGVtZW50LCBzZXR0aW5ncykge1xuICAgIHJlc3RvcmVBdHRyaWJ1dGVzKGVsZW1lbnQpO1xuICAgIHJlc2V0Q2xhc3NlcyhlbGVtZW50LCBzZXR0aW5ncyk7XG4gICAgcmVzZXRTdGF0dXMoZWxlbWVudCk7XG4gICAgZGVsZXRlT3JpZ2luYWxBdHRycyhlbGVtZW50KTtcbiAgfTtcbiAgdmFyIGNhbmNlbExvYWRpbmcgPSBmdW5jdGlvbiBjYW5jZWxMb2FkaW5nKGVsZW1lbnQsIGVudHJ5LCBzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICBpZiAoIXNldHRpbmdzLmNhbmNlbF9vbl9leGl0KSByZXR1cm47XG4gICAgaWYgKCFoYXNTdGF0dXNMb2FkaW5nKGVsZW1lbnQpKSByZXR1cm47XG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSAhPT0gXCJJTUdcIikgcmV0dXJuOyAvL1dvcmtzIG9ubHkgb24gaW1hZ2VzXG5cbiAgICByZW1vdmVFdmVudExpc3RlbmVycyhlbGVtZW50KTtcbiAgICByZXNldFNvdXJjZXNJbWcoZWxlbWVudCk7XG4gICAgcmVzdG9yZUltZyhlbGVtZW50KTtcbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5jbGFzc19sb2FkaW5nKTtcbiAgICB1cGRhdGVMb2FkaW5nQ291bnQoaW5zdGFuY2UsIC0xKTtcbiAgICByZXNldFN0YXR1cy
96hlbGVtZW50KTtcbiAgICBzYWZlQ2FsbGJhY2soc2V0dGluZ3MuY2FsbGJhY2tfY2FuY2VsLCBlbGVtZW50LCBlbnRyeSwgaW5zdGFuY2UpO1xuICB9O1xuICB2YXIgb25FbnRlciA9IGZ1bmN0aW9uIG9uRW50ZXIoZWxlbWVudCwgZW50cnksIHNldHRpbmdzLCBpbnN0YW5jZSkge1xuICAgIHZhciBkb250TG9hZCA9IGhhZFN0YXJ0ZWRMb2FkaW5nKGVsZW1lbnQpO1xuICAgIC8qIFNhdmUgc3RhdHVzXG4gICAgYmVmb3JlIHNldHRpbmcgaXQsIHRvIHByZXZlbnQgbG9hZGluZyBpdCBhZ2Fpbi4gRml4ZXMgIzUyNi4gKi9cblxuICAgIHNldFN0YXR1cyhlbGVtZW50LCBzdGF0dXNFbnRlcmVkKTtcbiAgICBhZGRDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5jbGFzc19lbnRlcmVkKTtcbiAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5jbGFzc19leGl0ZWQpO1xuICAgIHVub2JzZXJ2ZUVudGVyZWQoZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKTtcbiAgICBzYWZlQ2FsbGJhY2soc2V0dGluZ3MuY2FsbGJhY2tfZW50ZXIsIGVsZW1lbnQsIGVudHJ5LCBpbnN0YW5jZSk7XG4gICAgaWYgKGRvbnRMb2FkKSByZXR1cm47XG4gICAgbG9hZChlbGVtZW50LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICB9O1xuICB2YXIgb25FeGl0ID0gZnVuY3Rpb24gb25FeGl0KGVsZW1lbnQsIGVudHJ5LCBzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICBpZiAoaGFzRW1wdHlTdGF0dXMoZWxlbWVudCkpIHJldHVybjsgLy9JZ25vcmUgdGhlIGZpcnN0IHBhc3MsIGF0IGxhbmRpbmdcblxuICAgIGFkZENsYXNzKGVsZW1lbnQsIHNldHRpbmdzLmNsYXNzX2V4aXRlZCk7XG4gICAgY2FuY2VsTG9hZGluZyhlbGVtZW50LCBlbnRyeSwgc2V0dGluZ3MsIGluc3RhbmNlKTtcbiAgICBzYWZlQ2FsbGJhY2soc2V0dGluZ3MuY2FsbGJhY2tfZXhpdCwgZWxlbWVudCwgZW50cnksIGluc3RhbmNlKTtcbiAgfTtcbiAgdmFyIHRhZ3NXaXRoTmF0aXZlTGF6eSA9IFtcIklNR1wiLCBcIklGUkFNRVwiLCBcIlZJREVPXCJdO1xuICB2YXIgc2hvdWxkVXNlTmF0aXZlID0gZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKHNldHRpbmdzKSB7XG4gICAgcmV0dXJuIHNldHRpbmdzLnVzZV9uYXRpdmUgJiYgXCJsb2FkaW5nXCIgaW4gSFRNTEltYWdlRWxlbWVudC5wcm90b3R5cGU7XG4gIH07XG4gIHZhciBsb2FkQWxsTmF0aXZlID0gZnVuY3Rpb24gbG9hZEFsbE5hdGl2ZShlbGVtZW50cywgc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgaWYgKHRhZ3NXaXRoTmF0aXZlTGF6eS5pbmRleE9mKGVsZW1lbnQudGFnTmFtZSkgPT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvYWROYXRpdmUoZWxlbWVudCwgc2V0dGluZ3MsIGluc3RhbmNlKTtcbiAgICB9KTtcbiAgICBzZXRUb0xvYWRDb3VudChpbnN0YW5jZSwgMCk7XG4gIH07XG4gIHZhciBpc0ludGVyc2VjdGluZyA9IGZ1bmN0aW9uIGlzSW50ZXJzZWN0aW5nKGVudHJ5KSB7XG4gICAgcmV0dXJuIGVudHJ5LmlzSW50ZXJzZWN0aW5nIHx8IGVudHJ5LmludGVyc2VjdGlvblJhdGlvID4gMDtcbiAgfTtcbiAgdmFyIGdldE9ic2VydmVyU2V0dGluZ3MgPSBmdW5jdGlvbiBnZXRPYnNlcnZlclNldHRpbmdzKHNldHRpbmdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJvb3Q6IHNldHRpbmdzLmNvbnRhaW5lciA9PT0gZG9jdW1lbnQgPyBudWxsIDogc2V0dGluZ3MuY29udGFpbmVyLFxuICAgICAgcm9vdE1hcmdpbjogc2V0dGluZ3MudGhyZXNob2xkcyB8fCBzZXR0aW5ncy50aHJlc2hvbGQgKyBcInB4XCJcbiAgICB9O1xuICB9O1xuICB2YXIgaW50ZXJzZWN0aW9uSGFuZGxlciA9IGZ1bmN0aW9uIGludGVyc2VjdGlvbkhhbmRsZXIoZW50cmllcywgc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgcmV0dXJuIGlzSW50ZXJzZWN0aW5nKGVudHJ5KSA/IG9uRW50ZXIoZW50cnkudGFyZ2V0LCBlbnRyeSwgc2V0dGluZ3MsIGluc3RhbmNlKSA6IG9uRXhpdChlbnRyeS50YXJnZXQsIGVudHJ5LCBzZXR0aW5ncywgaW5zdGFuY2UpO1xuICAgIH0pO1xuICB9O1xuICB2YXIgb2JzZXJ2ZUVsZW1lbnRzID0gZnVuY3Rpb24gb2JzZXJ2ZUVsZW1lbnRzKG9ic2VydmVyLCBlbGVtZW50cykge1xuICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCk7XG4gICAgfSk7XG4gIH07XG4gIHZhciB1cGRhdGVPYnNlcnZlciA9IGZ1bmN0aW9uIHVwZGF0ZU9ic2VydmVyKG9ic2VydmVyLCBlbGVtZW50c1RvT2JzZXJ2ZSkge1xuICAgIHJlc2V0T2JzZXJ2ZXIob2JzZXJ2ZXIpO1xuICAgIG9ic2VydmVFbGVtZW50cyhvYnNlcnZlciwgZWxlbWVudHNUb09ic2VydmUpO1xuICB9O1xuICB2YXIgc2V0T2JzZXJ2ZXIgPSBmdW5jdGlvbiBzZXRPYnNlcnZlcihzZXR0aW5ncywgaW5zdGFuY2UpIHtcbiAgICBpZiAoIXN1cHBvcnRzSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgfHwgc2hvdWxkVXNlTmF0aXZlKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbnN0YW5jZS5fb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHtcbiAgICAgIGludGVyc2VjdGlvbkhhbmRsZXIoZW50cmllcywgc2V0dGluZ3MsIGluc3RhbmNlKTtcbiAgICB9LCBnZXRPYnNlcnZlclNldHRpbmdzKHNldHRpbmdzKSk7XG4gIH07XG4gIHZhciB0b0FycmF5ID0gZnVuY3Rpb24gdG9BcnJheShub2RlU2V0KSB7XG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG5vZGVTZXQpO1xuICB9O1xuICB2YXIgcXVlcnlFbGVtZW50cyA9IGZ1bmN0aW9uIHF1ZXJ5RWxlbWVudHMoc2V0dGluZ3MpIHtcbiAgICByZXR1cm4gc2V0dGluZ3MuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoc2V0dGluZ3MuZWxlbWVudHNfc2VsZWN0b3IpO1xuICB9O1xuICB2YXIgZXhjbHVkZU1hbmFnZWRFbGVtZW50cyA9IGZ1bmN0aW9uIGV4Y2x1ZGVNYW5hZ2VkRWxlbWVudHMoZWxlbWVudHMpIHtcbiAgICByZXR1cm4gdG9BcnJheShlbGVtZW50cykuZmlsdGVyKGhhc0VtcHR5U3RhdHVzKTtcbiAgfTtcbiAgdmFyIGhhc0Vycm9yID0gZnVuY3Rpb24gaGFzRXJyb3IoZWxlbWVudCkge1xuICAgIHJldHVybi
96BoYXNTdGF0dXNFcnJvcihlbGVtZW50KTtcbiAgfTtcbiAgdmFyIGZpbHRlckVycm9yRWxlbWVudHMgPSBmdW5jdGlvbiBmaWx0ZXJFcnJvckVsZW1lbnRzKGVsZW1lbnRzKSB7XG4gICAgcmV0dXJuIHRvQXJyYXkoZWxlbWVudHMpLmZpbHRlcihoYXNFcnJvcik7XG4gIH07XG4gIHZhciBnZXRFbGVtZW50c1RvTG9hZCA9IGZ1bmN0aW9uIGdldEVsZW1lbnRzVG9Mb2FkKGVsZW1lbnRzLCBzZXR0aW5ncykge1xuICAgIHJldHVybiBleGNsdWRlTWFuYWdlZEVsZW1lbnRzKGVsZW1lbnRzIHx8IHF1ZXJ5RWxlbWVudHMoc2V0dGluZ3MpKTtcbiAgfTtcbiAgdmFyIHJldHJ5TGF6eUxvYWQgPSBmdW5jdGlvbiByZXRyeUxhenlMb2FkKHNldHRpbmdzLCBpbnN0YW5jZSkge1xuICAgIHZhciBlcnJvckVsZW1lbnRzID0gZmlsdGVyRXJyb3JFbGVtZW50cyhxdWVyeUVsZW1lbnRzKHNldHRpbmdzKSk7XG4gICAgZXJyb3JFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBzZXR0aW5ncy5jbGFzc19lcnJvcik7XG4gICAgICByZXNldFN0YXR1cyhlbGVtZW50KTtcbiAgICB9KTtcbiAgICBpbnN0YW5jZS51cGRhdGUoKTtcbiAgfTtcbiAgdmFyIHNldE9ubGluZUNoZWNrID0gZnVuY3Rpb24gc2V0T25saW5lQ2hlY2soc2V0dGluZ3MsIGluc3RhbmNlKSB7XG4gICAgaWYgKCFydW5uaW5nT25Ccm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluc3RhbmNlLl9vbmxpbmVIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0cnlMYXp5TG9hZChzZXR0aW5ncywgaW5zdGFuY2UpO1xuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgaW5zdGFuY2UuX29ubGluZUhhbmRsZXIpO1xuICB9O1xuICB2YXIgcmVzZXRPbmxpbmVDaGVjayA9IGZ1bmN0aW9uIHJlc2V0T25saW5lQ2hlY2soaW5zdGFuY2UpIHtcbiAgICBpZiAoIXJ1bm5pbmdPbkJyb3dzZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgaW5zdGFuY2UuX29ubGluZUhhbmRsZXIpO1xuICB9O1xuICB2YXIgTGF6eUxvYWQgPSBmdW5jdGlvbiBMYXp5TG9hZChjdXN0b21TZXR0aW5ncywgZWxlbWVudHMpIHtcbiAgICB2YXIgc2V0dGluZ3MgPSBnZXRFeHRlbmRlZFNldHRpbmdzKGN1c3RvbVNldHRpbmdzKTtcbiAgICB0aGlzLl9zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIHRoaXMubG9hZGluZ0NvdW50ID0gMDtcbiAgICBzZXRPYnNlcnZlcihzZXR0aW5ncywgdGhpcyk7XG4gICAgc2V0T25saW5lQ2hlY2soc2V0dGluZ3MsIHRoaXMpO1xuICAgIHRoaXMudXBkYXRlKGVsZW1lbnRzKTtcbiAgfTtcbiAgTGF6eUxvYWQucHJvdG90eXBlID0ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGdpdmVuTm9kZXNldCkge1xuICAgICAgdmFyIHNldHRpbmdzID0gdGhpcy5fc2V0dGluZ3M7XG4gICAgICB2Y
96XIgZWxlbWVudHNUb0xvYWQgPSBnZXRFbGVtZW50c1RvTG9hZChnaXZlbk5vZGVzZXQsIHNldHRpbmdzKTtcbiAgICAgIHNldFRvTG9hZENvdW50KHRoaXMsIGVsZW1lbnRzVG9Mb2FkLmxlbmd0aCk7XG4gICAgICBpZiAoaXNCb3QgfHwgIXN1cHBvcnRzSW50ZXJzZWN0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgdGhpcy5sb2FkQWxsKGVsZW1lbnRzVG9Mb2FkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFVzZU5hdGl2ZShzZXR0aW5ncykpIHtcbiAgICAgICAgbG9hZEFsbE5hdGl2ZShlbGVtZW50c1RvTG9hZCwgc2V0dGluZ3MsIHRoaXMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1cGRhdGVPYnNlcnZlcih0aGlzLl9vYnNlcnZlciwgZWxlbWVudHNUb0xvYWQpO1xuICAgIH0sXG4gICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIC8vIE9ic2VydmVyXG4gICAgICBpZiAodGhpcy5fb2JzZXJ2ZXIpIHtcbiAgICAgICAgdGhpcy5fb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgfSAvLyBDbGVhbiBoYW5kbGVyc1xuXG4gICAgICByZXNldE9ubGluZUNoZWNrKHRoaXMpOyAvLyBDbGVhbiBjdXN0b20gYXR0cmlidXRlcyBvbiBlbGVtZW50c1xuXG4gICAgICBxdWVyeUVsZW1lbnRzKHRoaXMuX3NldHRpbmdzKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGRlbGV0ZU9yaWdpbmFsQXR0cnMoZWxlbWVudCk7XG4gICAgICB9KTsgLy8gRGVsZXRlIGFsbCBpbnRlcm5hbCBwcm9wc1xuXG4gICAgICBkZWxldGUgdGhpcy5fb2JzZXJ2ZXI7XG4gICAgICBkZWxldGUgdGhpcy5fc2V0dGluZ3M7XG4gICAgICBkZWxldGUgdGhpcy5fb25saW5lSGFuZGxlcjtcbiAgICAgIGRlbGV0ZSB0aGlzLmxvYWRpbmdDb3VudDtcbiAgICAgIGRlbGV0ZSB0aGlzLnRvTG9hZENvdW50O1xuICAgIH0sXG4gICAgbG9hZEFsbDogZnVuY3Rpb24gbG9hZEFsbChlbGVtZW50cykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuX3NldHRpbmdzO1xuICAgICAgdmFyIGVsZW1lbnRzVG9Mb2FkID0gZ2V0RWxlbWVudHNUb0xvYWQoZWxlbWVudHMsIHNldHRpbmdzKTtcbiAgICAgIGVsZW1lbnRzVG9Mb2FkLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgdW5vYnNlcnZlKGVsZW1lbnQsIF90aGlzKTtcbiAgICAgICAgbG9hZChlbGVtZW50LCBzZXR0aW5ncywgX3RoaXMpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICByZXN0b3JlQWxsOiBmdW5jdGlvbiByZXN0b3JlQWxsKCkge1xuICAgICAgdmFyIHNldHRpbmdzID0gdGhpcy5fc2V0dGluZ3M7XG4gICAgICBxdWVyeUVsZW1lbnRzKHNldHRpbmdzKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJlc3RvcmUoZWxlbWVudCwgc2V0dGluZ3MpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBMYXp5TG9hZC5sb2FkID0gZnVuY3Rpb24gKGVsZW1lbnQsIGN1c3RvbVNldHRpbmdzKSB7XG4gICAgdmFyIHNldHRpbmdzID0gZ2V0RXh0ZW5kZWRTZXR0aW5ncyhjdXN0b21TZXR0aW5ncyk7XG4gICAgbG9hZChlbGVtZW50LCBzZXR0aW5ncyk7XG4gIH07XG4gIExhenlMb2FkLnJlc2V0U3RhdHVzID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICByZXNldFN0YXR1cyhlbGVtZW50KTtcbiAgfTsgLy8gQXV0b21hdGljIGluc3RhbmNlcyBjcmVhdGlvbiBpZiByZXF1aXJlZCAodXNlZnVsIGZvciBhc3luYyBzY3JpcHQgbG9hZGluZylcblxuICBpZiAocnVubmluZ09uQnJvd3Nlcikge1xuICAgIGF1dG9Jbml0aWFsaXplKExhenlMb2FkLCB3aW5kb3cubGF6eUxvYWRPcHRpb25zKTtcbiAgfVxuICByZXR1cm4gTGF6eUxvYWQ7XG59KTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/js/lazyload.js\n"); 97 98/***/ }), 99
100/***/ "./src/js/scripts.js": 101/*!***************************!*\ 102 !*** ./src/js/scripts.js ***! 103 \***************************/ 104/*! no exports provided */ 105/***/ (function(module, __webpack_exports__, __webpack_require__) { 106 107"use strict"; 108eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ \"./src/js/utils.js\");\n/* harmony import */ var _lazyload__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lazyload */ \"./src/js/lazyload.js\");\n/* harmony import */ var _lazyload__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_lazyload__WEBPACK_IMPORTED_MODULE_1__);\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _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 _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\nif (window.NodeList && !NodeList.prototype.forEach) {\n NodeList.prototype.forEach = Array.prototype.forEach;\n}\nif (window.Element && !Element.prototype.closest) {\n Element.prototype.closest = function (s) {\n var matches = (this.document || this.ownerDocument).querySelectorAll(s),\n i,\n el = this;\n do {\n i = matches.length;\n while (--i >= 0 && matches.item(i) !== el) {}\n ;\n } while (i < 0 && (el = el.parentElement));\n return el;\n };\n}\n\n// Header Events\nvar body = document.body;\n$(document).on('ready', function () {\n if (document.body.classList.contains('page-template-page-faq')) {\n window.addEventListener('scroll', fixedHeader);\n }\n\n // If Subnav Exsists\n if (document.body.contains(document.querySelector('.header--subnav'))) {\n window.addEventListener('scroll', fixedHeader);\n document.querySelector('.js-subnav-toggle').addEventListener('click', toggleSubNav);\n Object(_utils__WEBPACK_IMPORTED_MODULE_0__[\"groupEventListener\"])('click', document.querySelectorAll('.subnav a'), closeSubNav);\n Object(_utils__WEBPACK_IMPORTED_MODULE_0__[\"groupEventListener\"])('click', document.querySelectorAll('.subnav__item-link'), setActiveLink);\n }\n if (document.querySelector('.js-play')) {\n document.querySelector('.js-play').addEventListener('click', toggleVideo);\n document.querySelector('.btn--play').addEventListener('click', togglePlay);\n }\n if (document.body.contains(document.querySelector('.js-modal')) || document.body.classList.contains('search')) {\n Object(_utils__WEBPACK_IMPORTED_MODULE_0__[\"groupEventListener\"])('click', document.querySelectorAll('.js-modal'), toggleModal);\n Object(_utils__WEBPACK_IMPORTED_MODULE_0__[\"groupEventListener\"])('click', document.querySelectorAll('.js-close-modal'), closeModal);\n }\n if (document.body.classList.contains('single-neuejournal')) {\n document.querySelector('.js-clipboard').addEventListener('click', copyToClipboard);\n }\n if (document.body.contains(document.querySelector('.newsletter-popup'))) {\n toggleNewsletter();\n }\n\n // Check if Newsletter Modal has any responses after Submission -- Show Modal with\n if (document.querySelector('.newsletter-popup .mc4wp-alert')) {\n var modal = document.querySelector(\"[data-modal-window=\\\"newsletter\\\"]\");\n modal.classList.add('active');\n addModalCloseEvent(modal);\n }\n});\nif (document.body.contains(document.querySelector('.hamburger'))) {\n document.querySelector('.hamburger').addEventListener('click', openM
108obileNav);\n document.querySelector('.header--mobile .btn--close').addEventListener('click', closeMobileNav);\n document.querySelectorAll('.aria-expanded-toggle').forEach(function (item) {\n item.addEventListener('click', toggleAriaExpanded);\n });\n var mobileMenuItems = document.querySelectorAll('.header--mobile .menu-item-has-children');\n mobileMenuItems.forEach(function (item) {\n item.addEventListener('click', toggleSubMenu);\n });\n} else {\n document.querySelectorAll('.aria-expanded-toggle').forEach(function (item) {\n item.addEventListener('mouseover', toggleAriaExpanded);\n });\n document.querySelectorAll('.aria-expanded-toggle').forEach(function (item) {\n item.addEventListener('mouseout', toggleAriaExpanded);\n });\n}\n\n// Expand Module\nObject(_utils__WEBPACK_IMPORTED_MODULE_0__[\"groupEventListener\"])('click', document.querySelectorAll('.js-expand'), expandModule);\nObject(_utils__WEBPACK_IMPORTED_MODULE_0__[\"groupEventListener\"])('click', document.querySelectorAll('.js-toggle-list'), toggleList);\nfunction openMobileNav() {\n document.querySelector('.header--mobile').classList.add('-is-open');\n document.querySelector('.btn--close').focus();\n document.querySelector('body').classList.add('-hide-page-overflow');\n}\nfunction closeMobileNav() {\n document.querySelector('.header--mobile').classList.remove('-is-open');\n document.querySelector('body').classList.remove('-hide-page-overflow');\n}\nfunction toggleSubMenu(event) {\n this.classList.toggle('active');\n}\nfunction toggleAriaExpanded(event) {\n var expanded = this.getAttribute('aria-expanded') == 'true' ? 'false' : 'true';\n this.setAttribute('aria-expanded', expanded);\n}\nfunction toggleSubNav(event) {\n event.preventDefault();\n this.classList.toggle('active');\n document.querySelector('.subnav').classList.toggle('active');\n document.body.classList.toggle('-hide-page-overflow');\n}\nfunction closeSubNav(event) {\n document.querySelector('.header__toggle').classList.remove('active');\n document.querySelector('.subnav').classList.remove('active');\n document.body.classList.remove('-hide-page-overflow');\n}\nfunction setActiveLink(event) {\n if (document.body.contains(document.querySelector('.subnav__item-link.active'))) {\n document.querySelector('.subnav__item-link.active').classList.remove('active');\n }\n event.currentTarget.classList.add('active');\n}\nfunction fixedHeader() {\n if (window.pageYOffset >= 75) {\n body.classList.add('-has-fixed-header');\n document.querySelector('.header--subnav').classList.add('-is-fixed');\n } else {\n body.classList.remove('-has-fixed-header');\n document.querySelector('.header--subnav').classList.remove('-is-fixed');\n }\n}\nfunction toggleModal() {\n var modalType = this.dataset.modal;\n document.querySelector(\"[data-modal-window=\\\"\".concat(modalType, \"\\\"]\")).classList.add('active');\n document.body.classList.add('-hide-page-overflow');\n}\nfunction closeModal() {\n var modalType = this.dataset.modalClose;\n document.querySelector(\"[data-modal-window=\\\"\".concat(modalType, \"\\\"]\")).classList.remove('active');\n document.body.classList.remove('-hide-page-overflow');\n}\nfunction copyToClipboard() {\n var copyText = document.querySelector('.copy-link');\n copyText.select();\n document.execCommand('copy');\n document.querySelector('.btn--copy').classList.add('copied');\n}\nfunction toggleVideo(event) {\n if (this.paused) {\n this.play();\n this.muted = false;\n this.classList.add('playing');\n $(this).siblings('.btn--play').addClass('d-none');\n } else {\n this.pause();\n this.muted = true;\n this.classList.remove('playing');\n $(this).siblings('.btn--play').removeClass('d-none');\n }\n}\nfunction togglePlay(event) {\n var $video = $(event.currentTarget).siblings('.video-element');\n if ($video[0].paused) {\n $video[0].play();\n $video[0].muted = false;\n $video[0].classList.add('playing');\n event.target.classList.add('d-none');\n } else {\n $video[0].pause();\n $video[0].muted = false;\n $video[0].classList.remove('playing');\n event.target.classList.remove('d-none');\n }\n}\nfunction toggleNewsletter() {\n if (checkCookie('home-newsletter') != 'on') {\n var modal = document.querySelector(\"[data-modal-window=\\\"newsletter\\\"]\");\n if (checkCookie('home-newsletter') != 'on') {\n modal.classList.add('active');\n createCookie('home-newsletter', 'on', 7);\n }\n addModalCloseEvent(modal);\n }\n}\nfunction addModalCloseEvent(modal) {\n window.onclick = function (event) {\n if (event.target == modal) {\n modal.classList.remove('active');\n document.body.classList.remove('-hide-page-overflow');\n }\n };\n}\nfunction createCookie(name, value, days) {\n if (days) {\n var date = new Date();\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n var expires = \"; expires=\" + date.toGMTString();\n } else var expires = \"\";\n if (true) {\n // Change true to false to disable the cookie for help in local dev\n document.cookie = name + \"=\" + value + expires + \"; path=/\";\n }\n}\nfunction checkCookie(name) {\n var nameEQ = name + \"=\";\n var ca = document.cookie.split(';');\n for (var i = 0; i < ca.length;
108 i++) {\n var c = ca[i];\n while (c.charAt(0) == ' ') c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n}\n\n// Slider\n$('.section-slider .section-slider__slides').each(function (idx, item) {\n var slideCount = this.querySelectorAll('.slide').length;\n var sliderId = \"slider\" + idx;\n this.id = sliderId;\n $(this).attr('id', sliderId);\n $(this).addClass(sliderId);\n if (slideCount > 1) {\n $('#' + sliderId).slick({\n dots: true,\n arrows: false,\n infinite: true,\n slidesToScroll: 1,\n fade: true\n });\n }\n});\n\n// Full Slider\n$('.section-full_slider .section-slider__slides').each(function (idx, item) {\n var slideCount = this.querySelectorAll('.slide').length;\n var sliderId = \"slider\" + idx;\n this.id = sliderId;\n if (slideCount > 1) {\n $(this).slick({\n dots: true,\n arrows: false,\n infinite: true,\n fade: true,\n autoplay: true,\n autoplaySpeed: 3000,\n slidesToScroll: 1,\n adaptiveHeight: false,\n pauseOnHover: false,\n pauseOnFocus: false\n });\n }\n});\n\n// Quote Slider\n$('.section-quote').each(function (idx, item) {\n var slideCount = this.querySelectorAll('.section-quote blockquote').length;\n var sliderId = \"slider\" + idx;\n this.id = sliderId;\n if (slideCount > 1) {\n $(this).slick({\n slide: 'blockquote',\n dots: false,\n arrows: false,\n infinite: true,\n fade: true,\n speed: 1000,\n autoplay: false,\n autoplaySpeed: 4000,\n slidesToScroll: 1,\n adaptiveHeight: false,\n pauseOnHover: false,\n pauseOnFocus: false,\n responsive: [{\n breakpoint: 1024,\n settings: {\n autoplay: false\n }\n }]\n });\n }\n});\n\n// Private Events Slider\n$('.section-slider_group .slider__slides').each(function (idx, item) {\n var sliderId = \"slider\" + idx;\n this.id = sliderId;\n $(this).slick(_defineProperty(_defineProperty(_defineProperty({\n dots: true,\n infinite: true,\n fade: true,\n autoplay: false,\n autoplaySpeed: 3000,\n slidesToScroll: 1,\n adaptiveHeight: false,\n pauseOnHover: false,\n pauseOnFocus: false\n }, \"dots\", false), \"arrows\", true), \"responsive\", [{\n breakpoint: 1024,\n settings: {\n dots: true,\n arrows: false,\n pauseOnHover: false,\n pauseOnFocus: false\n }\n }]));\n});\n$('.section-slider_group .slider__slides').on('beforeChange', function (event, slick, currentSlide, nextSlide) {\n if (this.querySelector('video')) {\n this.querySelector('video').pause();\n }\n});\n\n// Membership Slider\n$('.section-membership .slider__slides').each(function (idx, item) {\n var sliderId = \"membership-slider-\" + idx;\n this.id = sliderId;\n $(this).slick({\n dots: true,\n appendDots: '.slider__slides .slick-list',\n infinite: true,\n autoplay: true,\n autoplaySpeed: 3000,\n fade: true,\n slidesToScroll: 1,\n adaptiveHeight: false,\n pauseOnHover: false,\n pauseOnFocus: false\n });\n});\n\n// Grid Slider\n$('.section-grid .block').each(function (idx, item) {\n var sliderWrap = this.querySelector('.grid__slider');\n var slides = $(sliderWrap).children(); // Get all the children slides\n\n // Check if there are more than one slide\n if (slides.length > 1) {\n var sliderNextButton = $(sliderWrap).siblings('.grid__slider__nav').find('.slider-next');\n var sliderPrevButton = $(sliderWrap).siblings('.grid__slider__nav').find('.slider-prev');\n var sliderId = \"slider\" + idx;\n sliderWrap.id = sliderId;\n sliderNextButton.attr('id', 'next-' + sliderId);\n sliderPrevButton.attr('id', 'prev-' + sliderId);\n $(sliderWrap).slick({\n dots: false,\n arrows: true,\n prevArrow: '#' + sliderPrevButton.attr('id'),\n // Custom previous button selector\n nextArrow: '#' + sliderNextButton.attr('id'),\n // Custom next button selector\n infinite: true,\n fade: true,\n autoplay: false,\n slidesToScroll: 1,\n adaptiveHeight: false,\n pauseOnHover: false,\n pauseOnFocus: false\n });\n } else {\n // Optionally handle cases with only one slide, e.g., disable navigation, no need for a slider, etc.\n $(sliderWrap).slick({\n dots: false,\n arrows: fal
108se,\n // Disable arrows when only one slide\n infinite: false,\n fade: true,\n autoplay: false,\n slidesToScroll: 1,\n adaptiveHeight: true,\n pauseOnHover: true,\n pauseOnFocus: true\n });\n }\n});\n\n// Slider with Nav\n$('.section-slider_with_nav .slider__slides').on('beforeChange', function (event, slick, currentSlide, nextSlide) {\n var navList = slick.options.asNavFor;\n if (currentSlide === slick.slideCount - 1) {\n $(navList).slick('slickGoTo', 0);\n } else if (currentSlide === 0) {\n $(navList).slick('slickGoTo', slick.slideCount);\n }\n});\n$('.section-slider_with_nav .slider__slides').each(function (idx, item) {\n var slideCount = this.querySelectorAll('.slider__slide').length;\n var sliderId = \"slider-\" + idx;\n this.id = sliderId;\n if (slideCount > 1) {\n $(this).slick({\n dots: true,\n infinite: true,\n fade: true,\n slidesToScroll: 1,\n adaptiveHeight: true,\n asNavFor: $(this).parents('.section-slider_with_nav').find('.slider-nav ul'),\n mobileFirst: true,\n responsive: [{\n breakpoint: 1024,\n settings: {\n dots: false,\n prevArrow: '<button class=\"slick-prev slick-arrow arrow--prev\" aria-label=\"Previous\" type=\"button\"></button>',\n nextArrow: '<button class=\"slick-next slick-arrow arrow--next\" aria-label=\"Next\" type=\"button\"></button>'\n }\n }]\n });\n }\n});\n$('.section-slider_with_nav .slider-nav ul').each(function (idx, item) {\n var sliderNavId = \"sliderNav-\" + idx;\n this.id = sliderNavId;\n $(this).slick({\n asNavFor: $(this).parents('.section-slider_with_nav').find('.slider__slides'),\n slidesToShow: 1,\n focusOnSelect: true,\n arrows: false,\n centerMode: true,\n variableWidth: true,\n infinite: $('.slider-nav').width() > this.listWidth,\n mobileFirst: true,\n responsive: [{\n breakpoint: 1024,\n settings: {\n infinite: false,\n slidesToShow: this.slideCount,\n centerMode: false,\n vertical: true\n }\n }]\n });\n});\n\n// Homepage Featured Posts Slider\n$('.featured-posts__images').each(function (idx, item) {\n var sliderId = \"featured_posts-slider-\" + idx;\n this.id = sliderId;\n $(this).slick({\n dots: false,\n arrows: false,\n infinite: true,\n slidesToScroll: 1,\n adaptiveHeight: false,\n pauseOnHover: false,\n pauseOnFocus: false,\n mobileFirst: true,\n asNavFor: '.featured-posts__details',\n fade: true,\n responsive: [{\n breakpoint: 1024,\n settings: {\n dots: true,\n appendDots: '.featured-posts__images .slick-list',\n fade: true,\n autoplay: true,\n pauseOnHover: false,\n pauseOnFocus: false\n }\n }]\n });\n});\n$('.featured-posts__details').each(function (idx, item) {\n var sliderId = \"featured_posts_detail-slider-\" + idx;\n this.id = sliderId;\n $(this).slick({\n dots: false,\n arrows: false,\n infinite: true,\n slidesToScroll: 1,\n adaptiveHeight: false,\n pauseOnHover: false,\n pauseOnFocus: false,\n mobileFirst: true,\n asNavFor: '.featured-posts__images',\n fade: true,\n responsive: [{\n breakpoint: 1024,\n settings: {\n fade: true,\n autoplay: true,\n pauseOnHover: false,\n pauseOnFocus: false\n }\n }]\n });\n});\n\n// Slider with Quote\n$('.section-slider_with_quote .slider__slides').on('beforeChange', function (event, slick, currentSlide, nextSlide) {\n var navList = slick.options.asNavFor;\n if (currentSlide === slick.slideCount - 1) {\n $(navList).slick('slickGoTo', 0);\n } else if (currentSlide === 0) {\n $(navList).slick('slickGoTo', slick.slideCount);\n }\n});\n$('.section-slider_with_quote .slider__slides').each(function (idx, item) {\n var slideCount = this.querySelectorAll('.slider__slide').length;\n var sliderId = \"slider-\" + idx;\n this.id = sliderId;\n if (slideCount > 1) {\n $(this).slick({\n dots: false,\n infinite: true,\n fade: true,\n slidesToScroll: 1,\n adaptiveHeight: false,\n asNavFor: $(this).parents('.section-sli
108der_with_quote').find('.slider-aside__quotes'),\n mobileFirst: true,\n responsive: [{\n breakpoint: 767,\n settings: {\n dots: true\n }\n }]\n });\n }\n});\n$('.section-slider_with_quote .slider-aside__quotes').each(function (idx, item) {\n var sliderNavId = \"sliderNav-\" + idx;\n this.id = sliderNavId;\n $(this).slick({\n asNavFor: $(this).parents('.section-slider_with_quote').find('.slider__slides'),\n slidesToShow: 1,\n focusOnSelect: true,\n arrows: false,\n fade: true,\n infinite: true,\n mobileFirst: true,\n dots: true,\n responsive: [{\n breakpoint: 767,\n settings: {\n dots: false\n }\n }, {\n breakpoint: 1024,\n settings: {\n dots: false,\n slidesToShow: this.slideCount,\n centerMode: false\n }\n }]\n });\n});\n\n// Feature Group Slider\n$('.feature_group-slides').each(function (idx, item) {\n var slideCount = this.querySelectorAll('.section-feature_group__image').length;\n var sliderId = \"slider\" + idx;\n this.id = sliderId;\n if (slideCount > 1) {\n $(this).slick({\n dots: true,\n arrows: false,\n infinite: true,\n fade: true,\n autoplay: false,\n autoplaySpeed: 3000,\n slidesToScroll: 1,\n adaptiveHeight: false,\n pauseOnHover: false,\n pauseOnFocus: false,\n mobileFirst: true,\n responsive: [{\n breakpoint: 1024,\n settings: 'unslick'\n }]\n });\n }\n});\n\n// Quote Carousel Slider\n$('.quote-carousel-slider').each(function (idx, item) {\n var slideCount = this.querySelectorAll('.quote-slide').length;\n var sliderId = \"slider\" + idx;\n this.id = sliderId;\n if (slideCount > 1) {\n $(this).slick({\n dots: true,\n arrows: false,\n infinite: true,\n fade: true,\n autoplay: false,\n autoplaySpeed: 3000,\n slidesToScroll: 1,\n adaptiveHeight: false,\n pauseOnHover: false,\n pauseOnFocus: false,\n mobileFirst: true\n // responsive: [\n // {\n // breakpoint: 1024,\n // settings: 'unslick'\n // }\n // ]\n });\n }\n});\n\n// comparison chart slider\n$('.comparison-slider-inner').slick({\n // Your Slick slider options here\n dots: true,\n arrows: true,\n infinite: false,\n speed: 300,\n slidesToShow: 1,\n adaptiveHeight: true,\n prevArrow: fal
108se,\n nextArrow: false\n});\n\n// Expandable Modules:\n// 1. Features Module\n\nfunction expandModule() {\n var openToggle = document.querySelector('.-is-expanded');\n if (openToggle && openToggle != this) openToggle.classList.remove('-is-expanded');\n this.classList.toggle('-is-expanded');\n}\nif (document.body.classList.contains('page-template-page-event-listing')) {\n document.addEventListener('click', function (event) {\n if (event.target.closest('.js-expand')) return;\n document.querySelector('.-is-expanded').classList.remove('-is-expanded');\n }, false);\n}\n\n// Toggle List\nfunction toggleList() {\n document.querySelector('.list-expand').classList.toggle('-is-expanded');\n}\n\n// Animations\nif (document.body.contains(document.querySelector('.copy__heading'))) {\n var speed = 40;\n var heading = document.querySelector('.copy__heading');\n var delay = heading.innerHTML.length * speed + speed;\n}\nfunction typeEffect(element, speed) {\n var text = element.innerHTML;\n element.innerHTML = \"\";\n var i = 0;\n var timer = setInterval(function () {\n if (i < text.length) {\n element.append(text.charAt(i));\n i++;\n } else {\n clearInterval(timer);\n }\n }, speed);\n}\n\n// Lazy Load in Viewport\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n var animateElements = [].slice.call(document.querySelectorAll('.animate'));\n var options = {\n threshold: .4\n };\n if (\"IntersectionObserver\" in window) {\n var animateElObserver = new IntersectionObserver(function (entries, observer) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) {\n var animateEl = entry.target;\n animateEl.classList.add('-is-visible');\n animateElObserver.unobserve(animateEl);\n }\n });\n }, options);\n animateElements.forEach(function (animateEl) {\n animateElObserver.observe(animateEl);\n });\n } else {\n // Fallback here\n document.addEventListener(\"scroll\", lazyLoadFallback);\n }\n});\n\n//Vision Full Section\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n var visionElement = [].slice.call(document.querySelectorAll('.animate--cover'));\n if (\"IntersectionObserver\" in window) {\n var visionElObserver = new IntersectionObserver(function (entries, observer) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) {\n var visionEl = entry.target;\n visionEl.classList.add('-is-visible');\n visionElObserver.unobserve(visionEl);\n }\n });\n });\n visionElement.forEach(function (visionEl) {\n visionElObserver.observe(visionEl);\n });\n } else {\n document.addEventListener(\"scroll\", lazyLoadFallback);\n }\n});\n\n// Parallax\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n var parallaxElements = [].slice.call(document.querySelectorAll('.section-collection__image'));\n var options = {\n // threshold: .5\n trackVisibility: true,\n delay: 100\n };\n if (\"IntersectionObserver\" in window) {\n var parallaxElObserver = new IntersectionObserver(function (entries, observer) {\n entries.forEach(function (entry) {\n var parallaxEl = entry.target;\n if (entry.intersectionRatio > 0) {\n parallaxEl.classList.add('-is-visible');\n } else {\n parallaxEl.classList.remove('-is-visible');\n }\n });\n }, options);\n parallaxElements.forEach(function (parallaxEl) {\n parallaxElObserver.observe(parallaxEl);\n });\n } else {\n // Fallback here\n lazyLoadFallback();\n document.addEventListener(\"scroll\", lazyLoadFallback);\n }\n});\nfunction lazyLoadFallback() {\n var animateElements = [].slice.call(document.querySelectorAll('.animate, .animate--cover, .section-collection__image'));\n animateElements.forEach(function (animateEl) {\n if (animateEl.getBoundingClientRect().top <= window.innerHeight && animateEl.getBoundingClientRect().bottom >= 0) {\n animateEl.classList.add('-is-visible');\n }\n });\n}\n$(document).on('click', '.opt-in__close', closeCookieBanner);\nfunction closeCookieBanner() {\n $('#pi_tracking_opt_in_div').addClass('hide');\n setTimeout(function () {\n $('#pi_tracking_opt_in_no').click();\n }, 500);\n}\n$('.wpcf7-form').removeAttr('novalidate');\n$('.wpcf7-validates-as-required').prop('required', true);
108\n\n// Adjust Contact Form 7 Default Behavior\n$('.wpcf7-form').on('submit', function (event) {\n // var $successElement = $('.wpcf7-response-output');\n // $successElement.text('Thank you for your submission');\n // $successElement.show();\n\n $('.wpcf7-form').addClass('-is-loading');\n $('.loader').addClass('active');\n});\n\n// Map\nObject(_utils__WEBPACK_IMPORTED_MODULE_0__[\"groupEventListener\"])('mouseenter', document.querySelectorAll(\"[data-hotspot]\"), showLocations);\nObject(_utils__WEBPACK_IMPORTED_MODULE_0__[\"groupEventListener\"])('mouseleave', document.querySelectorAll(\"[data-hotspot]\"), hideLocations);\nfunction showLocations(event) {\n var hotspot = event.target.dataset.hotspot;\n var items = document.querySelectorAll(\"[data-location=\\\"\".concat(hotspot, \"\\\"]\"));\n items.forEach(function (item) {\n item.classList.add('active');\n });\n}\nfunction hideLocations(event) {\n var hotspot = event.target.dataset.hotspot;\n var items = document.querySelectorAll(\"[data-location=\\\"\".concat(hotspot, \"\\\"]\"));\n items.forEach(function (item) {\n item.classList.remove('active');\n });\n}\n\n// Custom Video controls\n$(window).load(function () {\n $('.slide__control-overlay').each(function () {\n $(this).on('click', function (event) {\n event.preventDefault();\n var slick = $(this).closest('.section-slider__slides');\n var slide = $(this).closest('.slide');\n var overlay = $(this);\n if ($(overlay).hasClass('paused')) {\n $(overlay).removeClass('paused');\n $(overlay).addClass('playing');\n playVideo(slide);\n } else {\n $(overlay).removeClass('playing');\n $(overlay).addClass('paused');\n pauseVideo(slide);\n }\n });\n });\n});\nfunction playVideo(slide) {\n if ($(slide).has('.slide__embed').length) {\n var iframe = $(slide).find('iframe')[0];\n var data = {\n method: \"play\"\n };\n iframe.contentWindow.postMessage(JSON.stringify(data), \"*\");\n } else {\n var video = $(slide).find('video');\n video[0].play();\n }\n}\nfunction pauseVideo(slide) {\n if ($(slide).has('.slide__embed').length) {\n var iframe = $(slide).find('iframe')[0];\n var data = {\n method: \"pause\"\n };\n iframe.contentWindow.postMessage(JSON.stringify(data), \"*\");\n } else {\n var video = $(slide).find('video');\n video[0].pause();\n }\n}\n\n// Home Hero Carousel\nsessionStorage.setItem('isLoopingHeroCarousel', \"false\");\nif (window.location.pathname === \"/\") {\n sessionStorage.setItem(\"isLoopingHeroCarousel\", \"true\");\n} else {\n sessionStorage.setItem(\"isLoopingHeroCarousel\", \"false\");\n}\n\n// home draggable section\nvar mouseDown = false;\nvar startX, scrollLeft;\nvar slider = document.querySelector('#wrap-whats-on-grid');\nvar dragged = false;\nvar startDragging = function startDragging(e) {\n e.preventDefault();
108\n mouseDown = true;\n startX = e.pageX - slider.offsetLeft;\n scrollLeft = slider.scrollLeft;\n};\nvar stopDragging = function stopDragging(e) {\n e.preventDefault();\n e.stopImmediatePropagation();\n mouseDown = false;\n};\nvar move = function move(e) {\n e.preventDefault();\n if (!mouseDown) {\n dragged = false;\n return;\n } else {\n dragged = true;\n var x = e.pageX - slider.offsetLeft;\n var scroll = x - startX;\n slider.scrollLeft = scrollLeft - scroll;\n }\n};\nvar noFollowLink = function noFollowLink(e) {\n if (dragged) {\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n};\n\n// Feature Group Slider\n// $('.feature_group-slides').each(function(idx, item) {\n// var slideCount = this.querySelectorAll('.section-feature_group__image').length\n// var sliderId = \"slider\" + idx;\n// this.id = sliderId;\n\n// if (slideCount > 1) {\n// $(this).slick({\n// dots: true,\n// arrows: false,\n// infinite: true,\n// fade: true,\n// autoplay: false,\n// autoplaySpeed: 3000,\n// slidesToScroll: 1,\n// adaptiveHeight: false,\n// pauseOnHover: false,\n// pauseOnFocus: false,\n// mobileFirst: true,\n// responsive: [\n// {\n// breakpoint: 1024,\n// settings: 'unslick'\n// }\n// ]\n// })\n// }\n// });
108\n\nfunction initializePricingSlick() {\n setTimeout(function () {\n if ($(window).width() > 1000) {\n if ($('.row-pricing').hasClass('slick-initialized')) {\n $('.row-pricing').slick('unslick');\n }\n }\n if ($(window).width() < 1000) {\n if ($('.row-pricing').hasClass('slick-initialized')) {\n $('.row-pricing').slick('unslick');\n }\n $('.row-pricing').slick({\n dots: true\n });\n }\n }, 0);\n}\n$(document).ready(function () {\n initializePricingSlick();\n});\nvar previousWidth = window.innerWidth;\n$(window).on('resize', function () {\n var currentWidth = window.innerWidth;\n if (currentWidth !== previousWidth) {\n initializePricingSlick();\n // Update the previous width\n previousWidth = currentWidth;\n }\n});\n\n// Add the event listeners\nif (slider) {\n slider.addEventListener('click', noFollowLink, false);\n slider.addEventListener('mousemove', move, false);\n slider.addEventListener('mousedown', startDragging, false);\n slider.addEventListener('mouseup', stopDragging, false);\n slider.addEventListener('mouseleave', stopDragging, false);\n}\nfunction writeParamsToInputs() {\n // Function to get the value of a cookie by name\n function getCookie(name) {\n var cookieArr = document.cookie.split(\";\");\n for (var i = 0; i < cookieArr.length; i++) {\n var cookiePair = cookieArr[i].split(\"=\");\n if (name == cookiePair[0].trim()) {\n return decodeURIComponent(cookiePair[1]);\n }\n }\n return null;\n }\n\n // Function to get the value of a URL parameter by name\n function getUrlParameter(name) {\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\n var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\n results = regex.exec(window.location.href);\n if (!results) return null;\n if (!results[2]) return '';\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n }\n\n // List of parameters to check\n var params = ['gclid', 'utm_source', 'utm_campaign', 'utm_medium'];\n\n // Find and set the value for each parameter\n params.forEach(function (param) {\n var value = getUrlParameter(param) || getCookie(param);\n if (value) {\n var labels = document.getElementsByTagName('label');\n var _iterator = _createForOfIteratorHelper(labels),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var label = _step.value;\n if (label.textContent.trim() === param) {\n var ginputContainer = label.nextElementSibling;\n if (ginputContainer && ginputContainer.classList.contains('ginput_container')) {\n var input = ginputContainer.getElementsByTagName('input')[0];\n if (input) {\n input.value = value;\n break;\n }\n }\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n }\n });\n}\n\n// Call the function\nif (document.querySelector('.gform-body')) {\n writeParamsToInputs();\n}\n$(document).ready(function () {\n // function logElementEvent(eventName, element) {\n // console.log(Date.now(), eventName, element.getAttribute(\"data-src\"));\n // }\n // var callback_enter = function (element) {\n // logElementEvent(\"ð ENTERED\", element);\n // };\n // var callback_exit = function (element) {\n // logElementEvent(\"ðª EXITED\", element);\n // };\n // var callback_loading = function (element) {\n // logElementEvent(\"â LOADING\", element);\n // };\n // var callback_loaded = function (element) {\n // logElementEvent(\"ð LOADED\", element);\n // };\n // var callback_error = function (element) {\n // logElementEvent(\"ð ERROR\", element);\n // element.src = \"https://via.placeholder.com/440x560/?text=Error+Placeholder\";\n // };\n // var callback_finish = function () {\n // logElementEvent(\"âï¸ FINISHED\", document.documentElement);\n // };\n // var callback_cancel = function (element) {\n // logElementEvent(\"ð¥ CANCEL\", element);\n // };\n\n var windowWidth = window.innerWidth;\n var threshold = -200;\n if (windowWidth < 1024) {\n threshold = 0;\n }\n var ll = new _lazyload__WEBPACK_IMPORTED_MODULE_1___default.a({\n threshold: threshold,\n // use_native: true, // use native lazy loading when browser compatible\n elements_selector: \".lazy\",\n use_native: true,\n callback_loaded: function callback_loaded(el) {\n // Optional: handle when images are loaded\n el.classList.add('loaded');\n }\n\n // class_applied: \"lz-applied\",\n // class_loading: \"lz-loading\",\n // class_loaded: \"lz-loaded\",\n // class_error: \"lz-error\",\n // class_entered: \"lz-entered\",\n // class_exited: \"lz-exited\",\n // Assign the callbacks defined above\n // callback_enter: callback_enter,\n // callback_exit: callback_exit,\n // callback_cancel: callback_cancel,\n // callback_loading: callback_loading,\n // callback_loaded: callback_loaded,\n // callback_error: callback_error,\n // callback_finish: callback_finish\n });\n $(document).on('click', function (e) {\n // console.log(e.target)\n });\n $('#plan-compare-prev, #plan-compare-next').on('click', function (e) {\n e.stopPropagation(); // Stop the event from bubbling up to parent elements\n\n var targetAnimate = $('.plan-wrap');\n var targetSection = $('.section-plan-comparison');\n var clickedId = $(this).attr('id'); // Use $(this) to get the id of the clicked element\n\n if (clickedId === 'plan-compare-prev' && targetSection.hasClass('active')) {\n targetAnimate.animate({\n scrollLeft: 0\n }, 200, function () {\n // Animation complete, remove the active class\n targetSection.removeClass('active');\n });\n }
108\n if (clickedId === 'plan-compare-next' && !targetSection.hasClass('active')) {\n targetSection.addClass('active');\n // Calculate the maximum scroll position\n var maxScrollLeft = targetAnimate[0].scrollWidth - targetAnimate.outerWidth();\n // Animate scroll to the maximum scroll position\n targetAnimate.animate({\n scrollLeft: maxScrollLeft\n }, 200, function () {\n // targetSection.removeClass('scrolling');\n });\n }\n });\n\n // Variable to hold the last horizontal scroll position\n var lastScrollLeft = 0;\n\n // Variable to hold the reference to the debounce timeout\n var debounceTimeout = null;\n var debounceDelay = 100; // Delay in milliseconds\n\n $('.plan-wrap').on('scroll', function () {\n // Clear the previous timeout to reset the debounce timer\n clearTimeout(debounceTimeout);\n\n // Set a new timeout\n debounceTimeout = setTimeout(function () {\n // Get the current horizontal scroll position\n var currentScrollLeft = $('.plan-wrap').scrollLeft();\n var targetAnimate = $('.plan-wrap');\n var targetSection = $('.section-plan-comparison');\n\n // Check if scrolling from right to left\n if (currentScrollLeft < lastScrollLeft) {\n if (targetSection.hasClass('active')) {\n targetAnimate.animate({\n scrollLeft: 0\n }, 200, function () {\n // Animation complete, remove the active class\n targetSection.removeClass('active');\n });\n }\n } else {\n targetSection.addClass('active');\n // Calculate the maximum scroll position\n var maxScrollLeft = targetAnimate[0].scrollWidth - targetAnimate.outerWidth();\n // Animate scroll to the maximum scroll position\n targetAnimate.animate({\n scrollLeft: maxScrollLeft\n }, 200);\n }\n\n // Update the last scroll position to the current one for the next scroll event\n lastScrollLeft = currentScrollLeft;\n }, debounceDelay);\n });\n\n // make nav dark if first element is dark\n var mainBodyTheme = $('#content >:first-child').attr('data-theme');\n if (mainBodyTheme && mainBodyTheme == 'dark') {\n $('#header').attr('data-theme', 'dark');\n }\n\n // form split trigger click\n var location, usage, desks, seats;\n var memParent, memChild;\n // $('.form-split-section .nh-radio-button .gfield_radio > .gchoice').click(function(e) {\n function nhMemberFormClicks() {\n $('.form-split-section .nh-radio-button .gfield_radio > .gchoice').click(function (e) {\n // check if click location button or membership type button\n if ($(this).closest('.nh-radio-membership').length > 0) {\n // remove active from parent nh radio buttons\n $('.nh-radio-membership').removeClass('active');\n $('.nh-radio-membership').removeClass('nh-radio-membership-default');\n\n // Uncheck all radio buttons inside all divs with the class nh-radio-location\n $(this).closest('.nh-radio-membership').addClass('active');\n $('.nh-radio-membership').find('.gfield-choice-input').prop('checked', false);\n $('.nh-radio-membership').find('.gfield-choice-input').change();\n $('.nh-radio-membership .gchoice').removeClass('checked');\n\n // Then, check the radio button within the clicked .gchoice\n $(this).find('.gfield-choice-input').prop('checked', true);\n $(this).find('.gfield-choice-input').change();\n $(this).addClass('checked');\n } else if ($(this).closest('.nh-radio-location').length > 0) {\n // First, uncheck all radio buttons in the same group\n $(this).siblings().find('.gfield-choice-input').prop('checked', false);\n $(this).siblings().removeClass('checked');\n // Then, check the radio button within the clicked .gchoice\n $(this).closest('.nh-radio-location').addClass('active');\n $(this).find('.gfield-choice-input').prop('checked', true);\n $(this).addClass('checked');\n } else {\n // First, uncheck all radio buttons in the same group\n $(this).siblings().find('.gfield-choice-input').prop('checked', false);\n $(this).siblings().removeClass('checked');\n // Then, check the radio button within the clicked .gchoice\n $(this).closest('.nh-radio-button').addClass('active');\n $(this).find('.gfield-choice-input').prop('checked', true);\n $(this).addClass('checked');\n }\n\n // become member form\n if ($(this).closest('.nh-becomemember-form').length > 0) {\n // if fieldset with class nh-radio-salon has class of active\n if ($(this).closest('.nh-radio-salon').hasClass('active')) {\n // find closes submit button and change value to Apply\n $('#gform_submit_button_34').val('Apply');\n }\n // if fieldset with class nh-radio-resident has class of active\n if ($(this).closest('.nh-radio-resident').hasClass('active')) {\n // find closes submit button and change value to Apply\n $('#gform_submit_button_34').val('Submit');\n }\n }\n\n // build membership form\n if ($(this).closest('.nh-radio-buildmember').length > 0) {\n if ($(this).closest('.nh-radio-buildmember').hasClass('location')) {\n location = $(this).find('.gfield-choice-input').val();\n } else if ($(this).closest('.nh-radio-buildmember').hasClass('usage')) {\n usage = $(this).find('.gfield-choice-input').val();\n } else if ($(this).closest('.nh-radio-buildmember').hasClass('desks')) {\n desks = $(this).find('.gfield-choice-input').val();\n } else if ($(this).closest('.nh-radio-buildmember').hasClass('seats')) {\n seats = $(this).find('.gfield-choice-input').val();\n }\n if (location == 'madison-square') {\n location = 'Madison Square';\n } else if (location == 'hollywood') {\n location = 'Hollywood';\n } else if (location == 'venice-beach') {\n location = 'Venice Beach';\n }\n if (desks == 'dedicated-desk') {\n memParent = 'Resident';\n memChild = 'Atelier';\n }\n if (desks == 'private-space') {\n memParent = 'Resident';\n memChild = 'Studio';\n }\n if (desks == 'flexible-seating') {\n if (usage == 'unlimited') {\n memParent = 'Resident';\n memChild = 'Gallery';\n } else {\n memParent = 'Salon';\n if (seats == '1' || seats == '2-4') {\n memChild = 'Indiv
108idual';\n } else {\n memChild = 'Team';\n }\n }\n }\n\n // Set the cookies\n var now = new Date();\n now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000); // 1 year from now\n var expires = \"expires=\" + now.toUTCString();\n document.cookie = \"location=\" + location + \";\" + expires + \";path=/\";\n var membershipType = memParent + ' ' + memChild;\n document.cookie = \"membershipType=\" + membershipType + \";\" + expires + \";path=/\";\n }\n }); // close click event handler\n } // close nhMemberFormClicks function\n nhMemberFormClicks();\n function getCookie(name) {\n var cookieArr = document.cookie.split(\";\");\n for (var i = 0; i < cookieArr.length; i++) {\n var cookiePair = cookieArr[i].split(\"=\");\n if (name == cookiePair[0].trim()) {\n // Decode the cookie value and return\n return decodeURIComponent(cookiePair[1]);\n }\n }\n // Return null if not found\n return null;\n }\n\n // set cookies to use on next page of form\n $(document).on('gform_page_loaded', function (event, formId, currentPage) {\n $('.__buildmembership .form__img').each(function () {\n $(this).removeClass('active');\n if (!$(this).hasClass('hidden')) {\n $(this).addClass('hidden');\n }\n });\n $('.__buildmembership .selection_text').each(function () {\n $(this).removeClass('active');\n });\n var viewportWidth = $(window).width();\n if (viewportWidth < 1024) {\n $('.__buildmembership').each(function () {\n $(this).removeClass('active');\n $(this).height(0);\n });\n }\n if (currentPage == 2) {\n // Retrieve cookie values\n var locationCookie = getCookie(\"location\");\n var membershipTypeCookie = getCookie(\"membershipType\");\n\n // Check if the cookies exist and set the text of the fields accordingly\n if (locationCookie) {\n $('#nh-buildmemberform-membership-location').text(locationCookie);\n $('.nh-location-calc').find('.ginput_container input').val(locationCookie);\n }\n if (membershipTypeCookie) {\n $('#nh-buildmemberform-membership-type').text(membershipTypeCookie);\n $('.nh-membership-calc').find('.ginput_container input').val(membershipTypeCookie);\n }\n\n // build member form submit button text\n if ($('.nh-buildmemberform').length > 0) {\n // if fieldset with class nh-radio-salon has class of active\n if ($('#nh-buildmemberform-membership-type').text().toLowerCase().includes('salon')) {\n // find closes submit button and change value to Apply\n $('#gform_submit_button_35').val('Apply');\n }\n // if fieldset with class nh-radio-resident has class of active\n if ($('#nh-buildmemberform-membership-type').text().toLowerCase().includes('resident')) {\n // find closes submit button and change value to Apply\n $('#gform_submit_button_35').val('Submit');\n }\n\n // show the right image\n // remove the word 'salon' or 'resident' from the membership type\n var membershipType = $('#nh-buildmemberform-membership-type').text().toLowerCase();\n membershipType = membershipType.replace('salon', '');\n membershipType = membershipType.replace('resident', '');\n membershipType = membershipType.trim();\n\n //slugify location, replaces spaces with dashes\n var _location = $('#nh-buildmemberform-membership-location').text().toLowerCase();\n _location = _location.replace(/\\s+/g, '-');\n\n // console.log(location, membershipType);\n\n $('.__buildmembership .form__img[data-location=\"' + _location + '\"][data-membership=\"' + membershipType + '\"]').addClass('active').removeClass('hidden');\n $('.__buildmembership .selection_text[data-location=\"' + _location + '\"][data-membership=\"' + membershipType + '\"]').addClass('active');\n if (viewportWidth < 1024) {\n $('#gform_' + formId).closest('.dynamic-enabled').find('.__buildmembership').each(function () {\n // console.log($(this))\n // $(currentPage).closest('.dyanmic-enabled').find('.__buildmembership').each(function(){\n var $this = $(this);\n var currentHeight = $this.height();\n var autoHeight = $this.css('height', 'auto').height();\n $this.height(currentHeight); // Reset to original height\n\n $this.animate({\n height: autoHeight\n }, 400); // Adjust the duration as needed\n $this.addClass('active');\n });\n } else {\n $('#gform_' + formId).closest('.dynamic-enabled').find('.__buildmembership').each(function () {\n if ($(this).hasClass('active')) {\n $(this).height('auto');\n }\n });\n }\n }\n }\n formDefaultChecked();\n nhMemberFormClicks();\n });\n\n // set location cookie without click\n setTimeout(function () {\n if ($('.gform_page').hasClass('nh-buildmemberform')) {\n if ($('.nh-radio-buildmember.location').hasClass('active')) {\n location = $('.nh-radio-buildmember.location .gfield-choice-input:checked').val();\n if (location == 'madison-square') {\n location = 'Madison Square';\n } else if (location == 'hollywood') {\n location = 'Hollywood';\n } else if (location == 'venice-beach') {\n location = 'Venice Beach';\n }\n var now = new Date();\n now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000); // 1 year from now\n var expires = \"expires=\" + now.toUTCString();\n document.cookie = \"location=\" + location + \";\" + expires + \";path=/\";\n }\n }\n }, 800);\n\n // form split load default checked on membership pages\n function formDefaultChecked() {\n if ($('.nh-radio-button').length > 0) {\n $('.nh-radio-button').each(function () {\n var radioChecked = $(this).find('.gfield-choice-input:checked').closest('.gchoice');\n radioChecked.addClass('checked');\n radioChecked.closest('.nh-radio-button').addClass('active');\n });\n }
108\n // if no gchoice items have class checked, add class nh-radio-membership-default to the element with class nh-radio-membership\n if ($('.nh-radio-membership .gchoice.checked').length == 0) {\n $('.nh-radio-membership').addClass('nh-radio-membership-default');\n }\n\n // become member form\n if ($('.nh-becomemember-form').length > 0) {\n // if fieldset with class nh-radio-salon has class of active\n if ($('.nh-becomemember-form .nh-radio-salon').hasClass('active')) {\n // find closes submit button and change value to Apply\n $('.nh-becomemember-form input[type=\"submit\"]').val('Apply');\n }\n // if fieldset with class nh-radio-resident has class of active\n if ($(this).closest('.nh-radio-resident').hasClass('active')) {\n // find closes submit button and change value to Apply\n $('.nh-becomemember-form input[type=\"submit\"]').val('Submit');\n }\n }\n }\n formDefaultChecked();\n $('.nh-radio-button .gfield_radio .gchoice').hover(function () {\n $(this).closest('.nh-radio-button').toggleClass('hover');\n });\n\n // save important form inputs to Dom to use in redirect\n function nhGfCollectInputs(formIdNum) {\n // console.log('collecting inputs');\n var gformIds = ['34', '35'];\n if ($('#gform_' + formIdNum + '_validation_container').hasClass('gform_validation_error') || !gformIds.includes(formIdNum)) {\n return;\n }\n var $formId = $('#gform_' + formIdNum);\n\n // if form id not found return\n if ($formId.length == 0) {\n return;\n }\n var salonCheck = false;\n var locationTarget, membershipTarget;\n if (formIdNum == 35) {\n locationTarget = $('#nh-buildmemberform-membership-location').text().toLowerCase();\n membershipTarget = $('#nh-buildmemberform-membership-type').text().toLowerCase();\n salonCheck = membershipTarget.includes('salon');\n }\n if (formIdNum == 34) {\n locationTarget = $formId.find('.nh-radio-location input:checked').val();\n membershipTarget = $formId.find('.nh-radio-salon').hasClass('active') ? 'salon' : 'resident';\n salonCheck = membershipTarget.toLowerCase().includes('salon');\n }\n $formId.closest('.form-split-section').attr('data-location-target', locationTarget);\n $formId.closest('.form-split-section').attr('data-membership-target', membershipTarget.toLowerCase());\n $formId.closest('.form-split-section').attr('data-salon-check', salonCheck);\n }\n\n // collection inputs on form submission\n $('body').on('click', 'input[id^=\"gform_submit_button_\"]', function (e) {\n // Get the button's ID\n var buttonId = $(this).attr('id');\n // Extract the number from the ID\n var formNumber = buttonId.replace('gform_submit_button_', '');\n nhGfCollectInputs(formNumber);\n });\n\n // still not sure show form\n $('body').on('click', '#still-not-sure', function (e) {\n e.preventDefault();\n $(this).closest('.contact_form').find('.gfield_error').removeClass('gfield_error'); // Remove error class from fields\n $(this).closest('.contact_form').find('.validation_message').hide(); // Hide validation messages\n $(this).closest('.contact_form').find('.validation_error').hide(); // Hide the form-wide validation error message\n $(this).closest('.contact_form').find('.gform_validation_errors').hide(); // Hide the form-wide validation error message\n\n $(this).closest('.form-split-section').find('.contact_form-not-sure').show();\n $(this).closest('.contact_form').hide();\n });\n\n // still not sure hide form\n $('body').on('click', '#still-not-sure-off', function (e) {\n e.preventDefault();\n $(this).closest('.contact_form').find('.gfield_error').removeClass('gfield_error'); // Remove error class from fields\n $(this).closest('.contact_form').find('.validation_message').hide(); // Hide validation messages\n $(this).closest('.contact_form').find('.validation_error').hide(); // Hide the form-wide validation error message\n $(this).closest('.contact_form').find('.gform_validation_errors').hide(); // Hide the form-wide validation error message\n\n $(this).closest('.form-split-section').find('.contact_form').show();\n $(this).closest('.form-split-section').find('.contact_form-not-sure').hide();\n //closest contact_form without class .contact_form-not-sure\n });\n\n ///////////////////////////////////////\n // dynamic form data\n ///////////////////////////////////////\n // Bind click event to .gfield-choice-input and .gchoice elements\n $('.gfield-choice-input, .gchoice').on('click', function (e) {\n // Find the closest form-split-section parent\n var section = $(this).closest('.form-split-section');\n nhFormActiveInputs(section);\n });\n function nhFormActiveInputs(section) {\n // find the child input of nh-radio-membership and nh-radio-location that are checked within the section\n var membershipChecked = section.find('.nh-radio-membership .gfield-choice-input:checked').val();\n var locationChecked = section.find('.nh-radio-location .gfield-choice-input:checked').val();\n\n // console.log(membershipChecked, locationChecked);\n\n // Scope to the section with class 'form-split-section'\n section.find('.form__img').each(function () {\n if ($(this).data('membership') == membershipChecked && $(this).data('location') == locationChecked || $(this).data('membership') == 'any' && $(this).data('location') == locationChecked) {\n $(this).removeClass('hidden').addClass('active');\n\n // animate section height on mobile\n var viewportWidth = $(window).width();\n var $sectionText = section.find('.form-split-section__text');\n if (viewportWidth < 768) {\n section.find('.form-split-section__images').addClass('active').animate({\n height: '170'\n });\n } else if (viewportWidth < 1024) {\n section.find('.form-split-section__images').addClass('active').animate({\n height: '220'\n });\n if (!$sectionText.hasClass('active')) {\n section.find('.form-split-section__text').each(function () {\n var $this = $(this);\n var tallestHeight = 0;\n\n // Find the tallest p.selection_text\n $this.find('p.selection_text').each(function () {\n var textHeight = $(this).height();\n if (textHeight > tallestHeight) {\n tallestHeight = textHeight;\n }\n });\n $this.css('height', '0'); // Reset to original height of 0\n\n $this.animate({\n height: tallestHeight\n }, 400); // Adjust the duration as needed\n $this.addClass('active');\n });\n }\n }\n }
108 else if (!$(this).hasClass('hidden')) {\n $(this).addClass('hidden').removeClass('active');\n }\n });\n section.find('.selection_text').each(function () {\n if ($(this).data('membership') == membershipChecked && $(this).data('location') == locationChecked) {\n $(this).addClass('active');\n } else {\n $(this).removeClass('active');\n }\n });\n }\n\n // Debounce function\n function debounce(func, wait) {\n var timeout;\n return function () {\n var _this = this;\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var later = function later() {\n clearTimeout(timeout);\n func.apply(_this, args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n }\n\n // Function to update the tallest height and reapply the function on window resize\n function updateTallestHeight() {\n var viewportWidth = $(window).width();\n if (viewportWidth < 1024) {\n // become member\n $('.dynamic-enabled').each(function () {\n if ($(this).find('.__becomemember').length > 0) {\n if ($(this).find('.form-split-section__images').hasClass('active')) {\n $(this).find('.form-split-section__images.active').css('height', '170px');\n } else {\n $(this).find('.form-split-section__images').css('height', '0');\n }\n var tallestHeight = 0;\n $(this).find('p.selection_text').each(function () {\n var textHeight = $(this).height();\n if (textHeight > tallestHeight) {\n tallestHeight = textHeight;\n }\n });\n var textContainer = $(this).find('.form-split-section__text');\n if (textContainer.hasClass('active')) {\n textContainer.animate({\n height: tallestHeight\n }, 400); // Animate to the tallest height\n }\n }\n if ($(this).find('.__buildmembership').length > 0) {\n if ($(this).find('.__buildmembership').hasClass('active')) {\n $(this).find('.__buildmembership').css('height', 'auto');\n } else {\n $(this).find('.__buildmembership').css('height', '0');\n }\n }\n });\n }\n if (viewportWidth > 1024) {\n $('.dynamic-enabled').each(function () {\n if ($(this).find('.__becomemember').length > 0) {\n $(this).find('.form-split-section__images').css('height', 'auto');\n $(this).find('.form-split-section__text').css('height', 'auto');\n }\n if ($(this).find('.__buildmembership').length > 0) {\n $(this).find('.__buildmembership').css('height', 'auto');\n }\n });\n }\n }\n\n // Bind the debounced function to window resize\n $(window).resize(debounce(updateTallestHeight, 200));\n function equalizeHeaderHeights() {\n var $headers = $('.comparison-child-header');\n var maxHeight = 0;\n var tallestHeader = null;\n\n // Reset heights and log initial state\n $headers.each(function (index) {\n $(this).css('height', 'auto');\n var currentHeight = $(this).outerHeight();\n if (currentHeight > maxHeight) {\n maxHeight = currentHeight;\n tallestHeader = $(this);\n }\n });\n\n // Set all headers to the height of the tallest header\n $headers.height(maxHeight);\n }\n // Run after a short delay to ensure content is loaded\n setTimeout(equalizeHeaderHeights, 100);\n\n // Run on window resize, but wait until resize is finished\n var resizeTimer;\n $(window).on('resize', function () {\n clearTimeout(resizeTimer);\n resizeTimer = setTimeout(equalizeHeaderHeights, 250);\n });\n\n // If you're using any image lazy-loading, run after images load\n // $('img').on('load', equalizeHeaderHeights);\n});\n\n// Create iframes after page load\ndocument.addEventListener('DOMContentLoaded', function () {\n var placeholders = document.querySelectorAll('.video-embed-placeholder');
108\n placeholders.forEach(function (placeholder) {\n var _iframe$classList;\n var iframe = document.createElement('iframe');\n\n // Initially set opacity to 0\n // iframe.style.opacity = '0';\n // iframe.style.transition = 'opacity 1s ease-in-out';\n\n // Set the src attribute\n iframe.src = placeholder.dataset.src;\n\n // Set additional attributes\n var attributes = placeholder.dataset.attributes.split(' ');\n attributes.forEach(function (attr) {\n var _attr$split = attr.split('='),\n _attr$split2 = _slicedToArray(_attr$split, 2),\n key = _attr$split2[0],\n value = _attr$split2[1];\n iframe.setAttribute(key, value || '');\n });\n\n // Add classes\n var classes = placeholder.dataset.classes.split(' ');\n (_iframe$classList = iframe.classList).add.apply(_iframe$classList, _toConsumableArray(classes));\n\n // Add load event listener\n iframe.addEventListener('load', function () {\n // Fade in the iframe\n // iframe.style.opacity = '1';\n iframe.classList.add('loaded');\n });\n\n // Replace placeholder with iframe\n placeholder.parentNode.replaceChild(iframe, placeholder);\n });\n});\n\n// Email popup and tracking opt-in handling\ndocument.addEventListener('DOMContentLoaded', function () {\n setTimeout(function () {\n // Check if tracking opt-in div exists on page load and if cookie exists\n var emailPopup = document.getElementById('email-popup');\n if (emailPopup && !checkCookie('email-popup-closed')) {\n if (!document.getElementById('pi_tracking_opt_in_div')) {\n emailPopup.classList.add('pi-inactive');\n }\n emailPopup.classList.add('loaded');\n } else {\n emailPopup.classList.add('d-none');\n }\n }, 2000);\n});\nsetTimeout(function () {\n var trackingDiv = document.getElementById('pi_tracking_opt_in_div');\n if (trackingDiv) {\n // Create a MutationObserver to watch for style changes\n var observer = new MutationObserver(function (mutations) {\n mutations.forEach(function (mutation) {\n if (mutation.type === 'attributes' && mutation.attributeName === 'style') {\n // Check if the div is now hidden\n if (trackingDiv.style.display === 'none') {\n var emailPopup = document.getElementById('email-popup');\n if (emailPopup) {\n emailPopup.classList.add('pi-inactive');\n }\n // Disconnect the observer since we no longer need to watch\n observer.disconnect();\n }\n }\n });\n });\n\n // Start observing the tracking div for style changes\n observer.observe(trackingDiv, {\n attributes: true,\n attributeFilter: ['style']\n });\n }\n}, 1000);\n\n// Email popup close button\ndocument.addEventListener('DOMContentLoaded', function () {\n var emailPopup = document.getElementById('email-popup');\n if (emailPopup) {\n var closeButton = emailPopup.querySelector('.email-popup__close');\n closeButton.addEventListener('click', function () {\n emailPopup.classList.remove('loaded');\n\n // Create cookie that expires in 30 days\n createCookie('email-popup-closed', 'true', 30);\n setTimeout(function () {\n emailPopup.classList.add('d-none');\n }, 1000);\n });\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvc2NyaXB0cy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9qcy9zY3JpcHRzLmpzP2U1ZjEiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KHIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhyKSB8fCBfaXRlcmFibGVUb0FycmF5KHIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShyKSB7IGlmIChcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgb
108nVsbCAhPSByW1N5bWJvbC5pdGVyYXRvcl0gfHwgbnVsbCAhPSByW1wiQEBpdGVyYXRvclwiXSkgcmV0dXJuIEFycmF5LmZyb20ocik7IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhyKSB7IGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkocik7IH1cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KHIsIGUpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQociwgZSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIsIGUpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGwpIHsgdmFyIHQgPSBudWxsID09IHIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTsgaWYgKG51bGwgIT0gdCkgeyB2YXIgZSwgbiwgaSwgdSwgYSA9IFtdLCBmID0gITAsIG8gPSAhMTsgdHJ5IHsgaWYgKGkgPSAodCA9IHQuY2FsbChyKSkubmV4dCwgMCA9PT0gbCkgeyBpZiAoT2JqZWN0KHQpICE9PSB0KSByZXR1cm47IGYgPSAhMTsgfSBlbHNlIGZvciAoOyAhKGYgPSAoZSA9IGkuY2FsbCh0KSkuZG9uZSkgJiYgKGEucHVzaChlLnZhbHVlKSwgYS5sZW5ndGggIT09IGwpOyBmID0gITApOyB9IGNhdGNoIChyKSB7IG8gPSAhMCwgbiA9IHI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghZiAmJiBudWxsICE9IHQucmV0dXJuICYmICh1ID0gdC5yZXR1cm4oKSwgT2JqZWN0KHUpICE9PSB1KSkgcmV0dXJuOyB9IGZpbmFsbHkgeyBpZiAobykgdGhyb3cgbjsgfSB9IHJldHVybiBhOyB9IH1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhyKSB7IGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gcjsgfVxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIociwgZSkgeyB2YXIgdCA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgcltcIkBAaXRlcmF0b3JcIl07IGlmICghdCkgeyBpZiAoQXJyYXkuaXNBcnJheShyKSB8fCAodCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyKSkgfHwgZSAmJiByICYmIFwibnVtYmVyXCIgPT0gdHlwZW9mIHIubGVuZ3RoKSB7IHQgJiYgKHIgPSB0KTsgdmFyIF9uID0gMCwgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgcmV0dXJuIF9uID49IHIubGVuZ3RoID8geyBkb25lOiAhMCB9IDogeyBkb25lOiAhMSwgdmFsdWU6IHJbX24rK10gfTsgfSwgZTogZnVuY3Rpb24gZShyKSB7IHRocm93IHI7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG8sIGEgPSAhMCwgdSA9ICExOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyB0ID0gdC5jYWxsKHIpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgciA9IHQubmV4dCgpOyByZXR1cm4gYSA9IHIuZG9uZSwgcjsgfSwgZTogZnVuY3Rpb24gZShyKSB7IHUgPSAhMCwgbyA9IHI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGEgfHwgbnVsbCA9PSB0LnJldHVybiB8fCB0LnJldHVybigpOyB9IGZpbmFsbHkgeyBpZiAodSkgdGhyb3cgbzsgfSB9IH07IH1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBhKSB7IGlmIChyKSB7IGlmIChcInN0cmluZ1wiID09IHR5cGVvZiByKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkociwgYSk7IHZhciB0ID0ge30udG9TdHJpbmcuY2FsbChyKS5zbGljZSg4LCAtMSk7IHJldHVybiBcIk9iamVjdFwiID09PSB0ICYmIHIuY29uc3RydWN0b3IgJiYgKHQgPSByLmNvbnN0cnVjdG9yLm5hbWUpLCBcIk1hcFwiID09PSB0IHx8IFwiU2V0XCIgPT09IHQgPyBBcnJheS5mcm9tKHIpIDogXCJBcmd1bWVudHNcIiA9PT0gdCB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSA/IF9hcnJheUxpa2VUb0FycmF5KHIsIGEpIDogdm9pZCAwOyB9IH1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KHIsIGEpIHsgKG51bGwgPT0gYSB8fCBhID4gci5sZW5ndGgpICYmIChhID0gci5sZW5ndGgpOyBmb3IgKHZhciBlID0gMCwgbiA9IEFycmF5KGEpOyBlIDwgYTsgZSsrKSBuW2VdID0gcltlXTsgcmV0dXJuIG47IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0KSB7IHJldHVybiAociA9IF90b1Byb3BlcnR5S2V5KHIpKSBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIHsgdmFsdWU6IHQsIGVudW1lcmFibGU6ICEwLCBjb25maWd1cmFibGU6ICEwLCB3cml0YWJsZTogITAgfSkgOiBlW3JdID0gdCwgZTsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbmltcG9ydCB7
108IGdyb3VwRXZlbnRMaXN0ZW5lciB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IExhenlMb2FkIGZyb20gJy4vbGF6eWxvYWQnO1xuaWYgKHdpbmRvdy5Ob2RlTGlzdCAmJiAhTm9kZUxpc3QucHJvdG90eXBlLmZvckVhY2gpIHtcbiAgTm9kZUxpc3QucHJvdG90eXBlLmZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaDtcbn1cbmlmICh3aW5kb3cuRWxlbWVudCAmJiAhRWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdCkge1xuICBFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0ID0gZnVuY3Rpb24gKHMpIHtcbiAgICB2YXIgbWF0Y2hlcyA9ICh0aGlzLmRvY3VtZW50IHx8IHRoaXMub3duZXJEb2N1bWVudCkucXVlcnlTZWxlY3RvckFsbChzKSxcbiAgICAgIGksXG4gICAgICBlbCA9IHRoaXM7XG4gICAgZG8ge1xuICAgICAgaSA9IG1hdGNoZXMubGVuZ3RoO1xuICAgICAgd2hpbGUgKC0taSA+PSAwICYmIG1hdGNoZXMuaXRlbShpKSAhPT0gZWwpIHt9XG4gICAgICA7XG4gICAgfSB3aGlsZSAoaSA8IDAgJiYgKGVsID0gZWwucGFyZW50RWxlbWVudCkpO1xuICAgIHJldHVybiBlbDtcbiAgfTtcbn1cblxuLy8gSGVhZGVyIEV2ZW50c1xudmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuJChkb2N1bWVudCkub24oJ3JlYWR5JywgZnVuY3Rpb24gKCkge1xuICBpZiAoZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3BhZ2UtdGVtcGxhdGUtcGFnZS1mYXEnKSkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBmaXhlZEhlYWRlcik7XG4gIH1cblxuICAvLyBJZiBTdWJuYXYgRXhzaXN0c1xuICBpZiAoZG9jdW1lbnQuYm9keS5jb250YWlucyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVhZGVyLS1zdWJuYXYnKSkpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgZml4ZWRIZWFkZXIpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1zdWJuYXYtdG9nZ2xlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVTdWJOYXYpO1xuICAgIGdyb3VwRXZlbnRMaXN0ZW5lcignY2xpY2snLCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3VibmF2IGEnKSwgY2xvc2VTdWJOYXYpO1xuICAgIGdyb3VwRXZlbnRMaXN0ZW5lcignY2xpY2snLCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3VibmF2X19pdGVtLWxpbmsnKSwgc2V0QWN0aXZlTGluayk7XG4gIH1cbiAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1wbGF5JykpIHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtcGxheScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdG9nZ2xlVmlkZW8pO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5idG4tLXBsYXknKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRvZ2dsZVBsYXkpO1xuICB9XG4gIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1tb2RhbCcpKSB8fCBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygnc2VhcmNoJykpIHtcbiAgICBncm91cEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLW1vZGFsJyksIHRvZ2dsZU1vZGFsKTtcbiAgICBncm91cEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLWNsb3NlLW1vZGFsJyksIGNsb3NlTW9kYWwpO1xuICB9XG4gIGlmIChkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygnc2luZ2xlLW5ldWVqb3VybmFsJykpIHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtY2xpcGJvYXJkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjb3B5VG9DbGlwYm9hcmQpO1xuICB9XG4gIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uZXdzbGV0dGVyLXBvcHVwJykpKSB7XG4gICAgdG9nZ2xlTmV3c2xldHRlcigpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgTmV3c2xldHRlciBNb2RhbCBoYXMgYW55IHJlc3BvbnNlcyBhZnRlciBTdWJtaXNzaW9uIC0tIFNob3cgTW9kYWwgd2l0aFxuICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5ld3NsZXR0ZXItcG9wdXAgLm1jNHdwLWFsZXJ0JykpIHtcbiAgICB2YXIgbW9kYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiW2RhdGEtbW9kYWwtd2luZG93PVxcXCJuZXdzbGV0dGVyXFxcIl1cIik7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgYWRkTW9kYWxDbG9zZUV2ZW50KG1vZGFsKTtcbiAgfVxufSk7XG5pZiAoZG9jdW1lbnQuYm9keS5jb250YWlucyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGFtYnVyZ2VyJykpKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oYW1idXJnZXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5Nb2JpbGVOYXYpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVhZGVyLS1tb2JpbGUgLmJ0bi0tY2xvc2UnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTW9iaWxlTmF2KTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFyaWEtZXhwYW5kZWQtdG9nZ2xlJykuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVBcmlhRXhwYW5kZWQpO1xuICB9KTtcbiAgdmFyIG1vYmlsZU1lbnVJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oZWFkZXItLW1vYmlsZSAubWVudS1pdGVtLWhhcy1jaGlsZHJlbicpO1xuICBtb2JpbGVNZW51SXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVTdWJNZW51KTtcbiAgfSk7XG59IGVsc2Uge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYXJpYS1leHBhbmRlZC10b2dnbGUnKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0b2dnbGVBcmlhRXhwYW5kZWQpO1xuICB9KTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFyaWEtZXhwYW5kZWQtdG9nZ2xlJykuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCB0b2dnbGVBcmlhRXhwYW5kZWQpO1xuICB9KTtcbn1cblxuLy8gRXhwYW5kIE1vZHVsZVxuZ3JvdXBFdmVudExpc3RlbmVyKCdjbGljaycsIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1leHBhbmQnKSwgZXhwYW5kTW9kdWxlKTtcbmdyb3VwRXZlbnRMaXN0ZW5lcignY2xpY2snLCBkb2
108N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtdG9nZ2xlLWxpc3QnKSwgdG9nZ2xlTGlzdCk7XG5mdW5jdGlvbiBvcGVuTW9iaWxlTmF2KCkge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVhZGVyLS1tb2JpbGUnKS5jbGFzc0xpc3QuYWRkKCctaXMtb3BlbicpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnRuLS1jbG9zZScpLmZvY3VzKCk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5jbGFzc0xpc3QuYWRkKCctaGlkZS1wYWdlLW92ZXJmbG93Jyk7XG59XG5mdW5jdGlvbiBjbG9zZU1vYmlsZU5hdigpIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhlYWRlci0tbW9iaWxlJykuY2xhc3NMaXN0LnJlbW92ZSgnLWlzLW9wZW4nKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmNsYXNzTGlzdC5yZW1vdmUoJy1oaWRlLXBhZ2Utb3ZlcmZsb3cnKTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZVN1Yk1lbnUoZXZlbnQpIHtcbiAgdGhpcy5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnKTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZUFyaWFFeHBhbmRlZChldmVudCkge1xuICB2YXIgZXhwYW5kZWQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpID09ICd0cnVlJyA/ICdmYWxzZScgOiAndHJ1ZSc7XG4gIHRoaXMuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgZXhwYW5kZWQpO1xufVxuZnVuY3Rpb24gdG9nZ2xlU3ViTmF2KGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIHRoaXMuY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJyk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdWJuYXYnKS5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnKTtcbiAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCctaGlkZS1wYWdlLW92ZXJmbG93Jyk7XG59XG5mdW5jdGlvbiBjbG9zZVN1Yk5hdihldmVudCkge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVhZGVyX190b2dnbGUnKS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN1Ym5hdicpLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJy1oaWRlLXBhZ2Utb3ZlcmZsb3cnKTtcbn1cbmZ1bmN0aW9uIHNldEFjdGl2ZUxpbmsoZXZlbnQpIHtcbiAgaWYgKGRvY3VtZW50LmJvZHkuY29udGFpbnMoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN1Ym5hdl9faXRlbS1saW5rLmFjdGl2ZScpKSkge1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdWJuYXZfX2l0ZW0tbGluay5hY3RpdmUnKS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgfVxuICBldmVudC5jdXJyZW50VGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xufVxuZnVuY3Rpb24gZml4ZWRIZWFkZXIoKSB7XG4gIGlmICh3aW5kb3cucGFnZVlPZmZzZXQgPj0gNzUpIHtcbiAgICBib2R5LmNsYXNzTGlzdC5hZGQoJy1oYXMtZml4ZWQtaGVhZGVyJyk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhlYWRlci0tc3VibmF2JykuY2xhc3NMaXN0LmFkZCgnLWlzLWZpeGVkJyk7XG4gIH0gZWxzZSB7XG4gICAgYm9keS5jbGFzc0xpc3QucmVtb3ZlKCctaGFzLWZpeGVkLWhlYWRlcicpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oZWFkZXItLXN1Ym5hdicpLmNsYXNzTGlzdC5yZW1vdmUoJy1pcy1maXhlZCcpO1xuICB9XG59XG5mdW5jdGlvbiB0b2dnbGVNb2RhbCgpIHtcbiAgdmFyIG1vZGFsVHlwZSA9IHRoaXMuZGF0YXNldC5tb2RhbDtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIltkYXRhLW1vZGFsLXdpbmRvdz1cXFwiXCIuY29uY2F0KG1vZGFsVHlwZSwgXCJcXFwiXVwiKSkuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnLWhpZGUtcGFnZS1vdmVyZmxvdycpO1xufVxuZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHtcbiAgdmFyIG1vZGFsVHlwZSA9IHRoaXMuZGF0YXNldC5tb2RhbENsb3NlO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiW2RhdGEtbW9kYWwtd2luZG93PVxcXCJcIi5jb25jYXQobW9kYWxUeXBlLCBcIlxcXCJdXCIpKS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCctaGlkZS1wYWdlLW92ZXJmbG93Jyk7XG59XG5mdW5jdGlvbiBjb3B5VG9DbGlwYm9hcmQoKSB7XG4gIHZhciBjb3B5VGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb3B5LWxpbmsnKTtcbiAgY29weVRleHQuc2VsZWN0KCk7XG4gIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5idG4tLWNvcHknKS5jbGFzc0xpc3QuYWRkKCdjb3BpZWQnKTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZVZpZGVvKGV2ZW50KSB7XG4gIGlmICh0aGlzLnBhdXNlZCkge1xuICAgIHRoaXMucGxheSgpO1xuICAgIHRoaXMubXV0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ3BsYXlpbmcnKTtcbiAgICAkKHRoaXMpLnNpYmxpbmdzKCcuYnRuLS1wbGF5JykuYWRkQ2xhc3MoJ2Qtbm9uZScpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMucGF1c2UoKTtcbiAgICB0aGlzLm11dGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoJ3BsYXlpbmcnKTtcbiAgICAkKHRoaXMpLnNpYmxpbmdzKCcuYnRuLS1wbGF5JykucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpO1xuICB9XG59XG5mdW5jdGlvbiB0b2dnbGVQbGF5KGV2ZW50KSB7XG4gIHZhciAkdmlkZW8gPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNpYmxpbmdzKCcudmlkZW8tZWxlbWVudCcpO1xuICBpZiAoJHZpZGVvWzBdLnBhdXNlZCkge1xuICAgICR2aWRlb1swXS5wbGF5KCk7XG4gICAgJHZpZGVvWzBdLm11dGVkID0gZmFsc2U7XG4gICAgJHZpZGVvWzBdLmNsYXNzTGlzdC5hZGQoJ3BsYXlpbmcnKTtcbiAgICBldmVudC50YXJnZXQuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gIH0gZWxzZSB7XG4gICAgJHZpZGVvWzBdLnBhdXNlKCk7XG4gICAgJHZpZGVvWzBdLm11dGVkID0gZmFsc2U7XG4gICAgJHZpZGVvWzBdLmNsYXNzTGlzdC5yZW1vdmUoJ3BsYXlpbmcnKTtcbiAgICBldmVudC50YXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XG4gIH1cbn1cbmZ1bmN0aW9uIHRvZ2dsZU5ld3NsZXR0ZXIoKSB7XG4gIGlmIChjaGVja0Nvb2tpZSgnaG9tZS1uZXdzbGV0dGVyJykgIT0gJ29uJykge1xuICAgIHZhciBtb2RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJbZGF0YS1tb2RhbC13aW5kb3c9XFxcIm5ld3NsZXR0ZXJcXFwiXVwiKTtcbiAgICBpZiAoY2hlY2tDb29raWUoJ2hvbWUtbmV3c2xldHRlcicpICE9ICdvbicpIHtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgY3JlYXRlQ29va2llKCdob21lLW5ld3NsZXR0ZXInLCAnb24nLCA3KTtcbiAgICB9XG4gICAgYWRkTW9kYWxDbG9zZUV2ZW50KG1vZGFsKTtcbiAgfVxufVxuZnVuY3Rpb24gYWRkTW9kYWxDbG9zZUV2ZW50KG1vZGFsKSB7XG4gIHdpbmRvdy5vbmNsaWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCA9PSBtb2RhbCkge1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICBkb2
108N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJy1oaWRlLXBhZ2Utb3ZlcmZsb3cnKTtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDb29raWUobmFtZSwgdmFsdWUsIGRheXMpIHtcbiAgaWYgKGRheXMpIHtcbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpICsgZGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuICAgIHZhciBleHBpcmVzID0gXCI7IGV4cGlyZXM9XCIgKyBkYXRlLnRvR01UU3RyaW5nKCk7XG4gIH0gZWxzZSB2YXIgZXhwaXJlcyA9IFwiXCI7XG4gIGlmICh0cnVlKSB7XG4gICAgLy8gQ2hhbmdlIHRydWUgdG8gZmFsc2UgdG8gZGlzYWJsZSB0aGUgY29va2llIGZvciBoZWxwIGluIGxvY2FsIGRldlxuICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyBcIj1cIiArIHZhbHVlICsgZXhwaXJlcyArIFwiOyBwYXRoPS9cIjtcbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tDb29raWUobmFtZSkge1xuICB2YXIgbmFtZUVRID0gbmFtZSArIFwiPVwiO1xuICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjID0gY2FbaV07XG4gICAgd2hpbGUgKGMuY2hhckF0KDApID09ICcgJykgYyA9IGMuc3Vic3RyaW5nKDEsIGMubGVuZ3RoKTtcbiAgICBpZiAoYy5pbmRleE9mKG5hbWVFUSkgPT0gMCkgcmV0dXJuIGMuc3Vic3RyaW5nKG5hbWVFUS5sZW5ndGgsIGMubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gU2xpZGVyXG4kKCcuc2VjdGlvbi1zbGlkZXIgLnNlY3Rpb24tc2xpZGVyX19zbGlkZXMnKS5lYWNoKGZ1bmN0aW9uIChpZHgsIGl0ZW0pIHtcbiAgdmFyIHNsaWRlQ291bnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbGlkZScpLmxlbmd0aDtcbiAgdmFyIHNsaWRlcklkID0gXCJzbGlkZXJcIiArIGlkeDtcbiAgdGhpcy5pZCA9IHNsaWRlcklkO1xuICAkKHRoaXMpLmF0dHIoJ2lkJywgc2xpZGVySWQpO1xuICAkKHRoaXMpLmFkZENsYXNzKHNsaWRlcklkKTtcbiAgaWYgKHNsaWRlQ291bnQgPiAxKSB7XG4gICAgJCgnIycgKyBzbGlkZXJJZCkuc2xpY2soe1xuICAgICAgZG90czogdHJ1ZSxcbiAgICAgIGFycm93czogZmFsc2UsXG4gICAgICBpbmZpbml0ZTogdHJ1ZSxcbiAgICAgIHNsaWRlc1RvU2Nyb2xsOiAxLFxuICAgICAgZmFkZTogdHJ1ZVxuICAgIH0pO1xuICB9XG59KTtcblxuLy8gRnVsbCBTbGlkZXJcbiQoJy5zZWN0aW9uLWZ1bGxfc2xpZGVyIC5zZWN0aW9uLXNsaWRlcl9fc2xpZGVzJykuZWFjaChmdW5jdGlvbiAoaWR4LCBpdGVtKSB7XG4gIHZhciBzbGlkZUNvdW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCcuc2xpZGUnKS5sZW5ndGg7XG4gIHZhciBzbGlkZXJJZCA9IFwic2xpZGVyXCIgKyBpZHg7XG4gIHRoaXMuaWQgPSBzbGlkZXJJZDtcbiAgaWYgKHNsaWRlQ291bnQgPiAxKSB7XG4gICAgJCh0aGlzKS5zbGljayh7XG4gICAgICBkb3RzOiB0cnVlLFxuICAgICAgYXJyb3dzOiBmYWxzZSxcbiAgICAgIGluZmluaXRlOiB0cnVlLFxuICAgICAgZmFkZTogdHJ1ZSxcbiAgICAgIGF1dG9wbGF5OiB0cnVlLFxuICAgICAgYXV0b3BsYXlTcGVlZDogMzAwMCxcbiAgICAgIHNsaWRlc1RvU2Nyb2xsOiAxLFxuICAgICAgYWRhcHRpdmVIZWlnaHQ6IGZhbHNlLFxuICAgICAgcGF1c2VPbkhvdmVyOiBmYWxzZSxcbiAgICAgIHBhdXNlT25Gb2N1czogZmFsc2VcbiAgICB9KTtcbiAgfVxufSk7XG5cbi8vIFF1b3RlIFNsaWRlclxuJCgnLnNlY3Rpb24tcXVvdGUnKS5lYWNoKGZ1bmN0aW9uIChpZHgsIGl0ZW0pIHtcbiAgdmFyIHNsaWRlQ291bnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWN0aW9uLXF1b3RlIGJsb2NrcXVvdGUnKS5sZW5ndGg7XG4gIHZhciBzbGlkZXJJZCA9IFwic2xpZGVyXCIgKyBpZHg7XG4gIHRoaXMuaWQgPSBzbGlkZXJJZDtcbiAgaWYgKHNsaWRlQ291bnQgPiAxKSB7XG4gICAgJCh0aGlzKS5zbGljayh7XG4gICAgICBzbGlkZTogJ2Jsb2NrcXVvdGUnLFxuICAgICAgZG90czogZmFsc2UsXG4gICAgICBhcnJvd3M6IGZhbHNlLFxuICAgICAgaW5maW5pdGU6IHRydWUsXG4gICAgICBmYWRlOiB0cnVlLFxuICAgICAgc3BlZWQ6IDEwMDAsXG4gICAgICBhdXRvcGxheTogZmFsc2UsXG4gICAgICBhdXRvcGxheVNwZWVkOiA0MDAwLFxuICAgICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4gICAgICBhZGFwdGl2ZUhlaWdodDogZmFsc2UsXG4gICAgICBwYXVzZU9uSG92ZXI6IGZhbHNlLFxuICAgICAgcGF1c2VPbkZvY3VzOiBmYWxzZSxcbiAgICAgIHJlc3BvbnNpdmU6IFt7XG4gICAgICAgIGJyZWFrcG9pbnQ6IDEwMjQsXG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgYXV0b3BsYXk6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1dXG4gICAgfSk7XG4gIH1cbn0pO1xuXG4vLyBQcml2YXRlIEV2ZW50cyBTbGlkZXJcbiQoJy5zZWN0aW9uLXNsaWRlcl9ncm91cCAuc2xpZGVyX19zbGlkZXMnKS5lYWNoKGZ1bmN0aW9uIChpZHgsIGl0ZW0pIHtcbiAgdmFyIHNsaWRlcklkID0gXCJzbGlkZXJcIiArIGlkeDtcbiAgdGhpcy5pZCA9IHNsaWRlcklkO1xuICAkKHRoaXMpLnNsaWNrKF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHtcbiAgICBkb3RzOiB0cnVlLFxuICAgIGluZmluaXRlOiB0cnVlLFxuICAgIGZhZGU6IHRydWUsXG4gICAgYXV0b3BsYXk6IGZhbHNlLFxuICAgIGF1dG9wbGF5U3BlZWQ6IDMwMDAsXG4gICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4gICAgYWRhcHRpdmVIZWlnaHQ6IGZhbHNlLFxuICAgIHBhdXNlT25Ib3ZlcjogZmFsc2UsXG4gICAgcGF1c2VPbkZvY3VzOiBmYWxzZVxuICB9LCBcImRvdHNcIiwgZmFsc2UpLCBcImFycm93c1wiLCB0cnVlKSwgXCJyZXNwb25zaXZlXCIsIFt7XG4gICAgYnJlYWtwb2ludDogMTAyNCxcbiAgICBzZXR0aW5nczoge1xuICAgICAgZG90czogdHJ1ZSxcbiAgICAgIGFycm93czogZmFsc2UsXG4gICAgICBwYXVzZU9uSG92ZXI6IGZhbHNlLFxuICAgICAgcGF1c2VPbkZvY3VzOiBmYWxzZVxuICAgIH1cbiAgfV0pKTtcbn0pO1xuJCgnLnNlY3Rpb24tc2xpZGVyX2dyb3VwIC5zbGlkZXJfX3NsaWRlcycpLm9uKCdiZWZvcmVDaGFuZ2UnLCBmdW5jdGlvbiAoZXZlbnQsIHNsaWNrLCBjdXJyZW50U2xpZGUsIG5leHRTbGlkZSkge1xuICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd2aWRlbycpKSB7XG4gICAgdGhpcy5xdWVyeVNlbGVjdG9yKCd2aWRlbycpLnBhdXNlKCk7XG4gIH1cbn0pO1xuXG4vLyBNZW1iZXJzaGlwIFNsaWRlclxuJCgnLnNlY3Rpb24tbWVtYmVyc2hpcCAuc2xpZGVyX19zbGlkZXMnKS5lYWNoKGZ1bmN0aW9uIChpZHgsIGl0ZW0pIHtcbiAgdmFyIHNsaWRlcklkID0gXCJtZW1iZXJzaGlwLXNsaWRlci1cIiArIGlkeDtcbiAgdGhpcy5pZCA9IHNsaWRlcklkO1xuICAkKHRoaXMpLnNsaWNrKHtcbiAgICBkb3RzOiB0cnVlLFxuICAgIGFwcGVuZERvdHM6ICcuc2xpZGVyX19zbGlkZXMgLnNsaWNrLWxpc3QnLFxuICAgIGluZmluaXRlOiB0cnVlLFxuICAgIGF1dG9wbGF5OiB0cnVlLFxuICAgIGF1dG9wbGF5U3BlZWQ6IDMwMDAsXG4gICAgZmFkZTogdHJ1ZSxcbiAgICBzbGlkZXNUb1Njcm9sbDogMSxcbiAgICBhZGFwdGl2ZUhlaWdodDogZmFsc2UsXG4gICAgcGF1c2VPbkhvdmVyOiBmYWxzZSxcbiAgICBwYXVzZU9uRm9jdXM6IGZhbHNlXG4gI
108H0pO1xufSk7XG5cbi8vIEdyaWQgU2xpZGVyXG4kKCcuc2VjdGlvbi1ncmlkIC5ibG9jaycpLmVhY2goZnVuY3Rpb24gKGlkeCwgaXRlbSkge1xuICB2YXIgc2xpZGVyV3JhcCA9IHRoaXMucXVlcnlTZWxlY3RvcignLmdyaWRfX3NsaWRlcicpO1xuICB2YXIgc2xpZGVzID0gJChzbGlkZXJXcmFwKS5jaGlsZHJlbigpOyAvLyBHZXQgYWxsIHRoZSBjaGlsZHJlbiBzbGlkZXNcblxuICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBzbGlkZVxuICBpZiAoc2xpZGVzLmxlbmd0aCA+IDEpIHtcbiAgICB2YXIgc2xpZGVyTmV4dEJ1dHRvbiA9ICQoc2xpZGVyV3JhcCkuc2libGluZ3MoJy5ncmlkX19zbGlkZXJfX25hdicpLmZpbmQoJy5zbGlkZXItbmV4dCcpO1xuICAgIHZhciBzbGlkZXJQcmV2QnV0dG9uID0gJChzbGlkZXJXcmFwKS5zaWJsaW5ncygnLmdyaWRfX3NsaWRlcl9fbmF2JykuZmluZCgnLnNsaWRlci1wcmV2Jyk7XG4gICAgdmFyIHNsaWRlcklkID0gXCJzbGlkZXJcIiArIGlkeDtcbiAgICBzbGlkZXJXcmFwLmlkID0gc2xpZGVySWQ7XG4gICAgc2xpZGVyTmV4dEJ1dHRvbi5hdHRyKCdpZCcsICduZXh0LScgKyBzbGlkZXJJZCk7XG4gICAgc2xpZGVyUHJldkJ1dHRvbi5hdHRyKCdpZCcsICdwcmV2LScgKyBzbGlkZXJJZCk7XG4gICAgJChzbGlkZXJXcmFwKS5zbGljayh7XG4gICAgICBkb3RzOiBmYWxzZSxcbiAgICAgIGFycm93czogdHJ1ZSxcbiAgICAgIHByZXZBcnJvdzogJyMnICsgc2xpZGVyUHJldkJ1dHRvbi5hdHRyKCdpZCcpLFxuICAgICAgLy8gQ3VzdG9tIHByZXZpb3VzIGJ1dHRvbiBzZWxlY3RvclxuICAgICAgbmV4dEFycm93OiAnIycgKyBzbGlkZXJOZXh0QnV0dG9uLmF0dHIoJ2lkJyksXG4gICAgICAvLyBDdXN0b20gbmV4dCBidXR0b24gc2VsZWN0b3JcbiAgICAgIGluZmluaXRlOiB0cnVlLFxuICAgICAgZmFkZTogdHJ1ZSxcbiAgICAgIGF1dG9wbGF5OiBmYWxzZSxcbiAgICAgIHNsaWRlc1RvU2Nyb2xsOiAxLFxuICAgICAgYWRhcHRpdmVIZWlnaHQ6IGZhbHNlLFxuICAgICAgcGF1c2VPbkhvdmVyOiBmYWxzZSxcbiAgICAgIHBhdXNlT25Gb2N1czogZmFsc2VcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPcHRpb25hbGx5IGhhbmRsZSBjYXNlcyB3aXRoIG9ubHkgb25lIHNsaWRlLCBlLmcuLCBkaXNhYmxlIG5hdmlnYXRpb24sIG5vIG5lZWQgZm9yIGEgc2xpZGVyLCBldGMuXG4gICAgJChzbGlkZXJXcmFwKS5zbGljayh7XG4gICAgICBkb3RzOiBmYWxzZSxcbiAgICAgIGFycm93czogZmFsc2UsXG4gICAgICAvLyBEaXNhYmxlIGFycm93cyB3aGVuIG9ubHkgb25lIHNsaWRlXG4gICAgICBpbmZpbml0ZTogZmFsc2UsXG4gICAgICBmYWRlOiB0cnVlLFxuICAgICAgYXV0b3BsYXk6IGZhbHNlLFxuICAgICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4gICAgICBhZGFwdGl2ZUhlaWdodDogdHJ1ZSxcbiAgICAgIHBhdXNlT25Ib3ZlcjogdHJ1ZSxcbiAgICAgIHBhdXNlT25Gb2N1czogdHJ1ZVxuICAgIH0pO1xuICB9XG59KTtcblxuLy8gU2xpZGVyIHdpdGggTmF2XG4kKCcuc2VjdGlvbi1zbGlkZXJfd2l0aF9uYXYgLnNsaWRlcl9fc2xpZGVzJykub24oJ2JlZm9yZUNoYW5nZScsIGZ1bmN0aW9uIChldmVudCwgc2xpY2ssIGN1cnJlbnRTbGlkZSwgbmV4dFNsaWRlKSB7XG4gIHZhciBuYXZMaXN0ID0gc2xpY2sub3B0aW9ucy5hc05hdkZvcjtcbiAgaWYgKGN1cnJlbnRTbGlkZSA9PT0gc2xpY2suc2xpZGVDb3VudCAtIDEpIHtcbiAgICAkKG5hdkxpc3QpLnNsaWNrKCdzbGlja0dvVG8nLCAwKTtcbiAgfSBlbHNlIGlmIChjdXJyZW50U2xpZGUgPT09IDApIHtcbiAgICAkKG5hdkxpc3QpLnNsaWNrKCdzbGlja0dvVG8nLCBzbGljay5zbGlkZUNvdW50KTtcbiAgfVxufSk7XG4kKCcuc2VjdGlvbi1zbGlkZXJfd2l0aF9uYXYgLnNsaWRlcl9fc2xpZGVzJykuZWFjaChmdW5jdGlvbiAoaWR4LCBpdGVtKSB7XG4gIHZhciBzbGlkZUNvdW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCcuc2xpZGVyX19zbGlkZScpLmxlbmd0aDtcbiAgdmFyIHNsaWRlcklkID0gXCJzbGlkZXItXCIgKyBpZHg7XG4gIHRoaXMuaWQgPSBzbGlkZXJJZDtcbiAgaWYgKHNsaWRlQ291bnQgPiAxKSB7XG4gICAgJCh0aGlzKS5zbGljayh7XG4gICAgICBkb3RzOiB0cnVlLFxuICAgICAgaW5maW5pdGU6IHRydWUsXG4gICAgICBmYWRlOiB0cnVlLFxuICAgICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4gICAgICBhZGFwdGl2ZUhlaWdodDogdHJ1ZSxcbiAgICAgIGFzTmF2Rm9yOiAkKHRoaXMpLnBhcmVudHMoJy5zZWN0aW9uLXNsaWRlcl93aXRoX25hdicpLmZpbmQoJy5zbGlkZXItbmF2IHVsJyksXG4gICAgICBtb2JpbGVGaXJzdDogdHJ1ZSxcbiAgICAgIHJlc3BvbnNpdmU6IFt7XG4gICAgICAgIGJyZWFrcG9pbnQ6IDEwMjQsXG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgZG90czogZmFsc2UsXG4gICAgICAgICAgcHJldkFycm93OiAnPGJ1dHRvbiBjbGFzcz1cInNsaWNrLXByZXYgc2xpY2stYXJyb3cgYXJyb3ctLXByZXZcIiBhcmlhLWxhYmVsPVwiUHJldmlvdXNcIiB0eXBlPVwiYnV0dG9uXCI+PC9idXR0b24+JyxcbiAgICAgICAgICBuZXh0QXJyb3c6ICc8YnV0dG9uIGNsYXNzPVwic2xpY2stbmV4dCBzbGljay1hcnJvdyBhcnJvdy0tbmV4dFwiIGFyaWEtbGFiZWw9XCJOZXh0XCIgdHlwZT1cImJ1dHRvblwiPjwvYnV0dG9uPidcbiAgICAgICAgfVxuICAgICAgfV1cbiAgICB9KTtcbiAgfVxufSk7XG4kKCcuc2VjdGlvbi1zbGlkZXJfd2l0aF9uYXYgLnNsaWRlci1uYXYgdWwnKS5lYWNoKGZ1bmN0aW9uIChpZHgsIGl0ZW0pIHtcbiAgdmFyIHNsaWRlck5hdklkID0gXCJzbGlkZXJOYXYtXCIgKyBpZHg7XG4gIHRoaXMuaWQgPSBzbGlkZXJOYXZJZDtcbiAgJCh0aGlzKS5zbGljayh7XG4gICAgYXNOYXZGb3I6ICQodGhpcykucGFyZW50cygnLnNlY3Rpb24tc2xpZGVyX3dpdGhfbmF2JykuZmluZCgnLnNsaWRlcl9fc2xpZGVzJyksXG4gICAgc2xpZGVzVG9TaG93OiAxLFxuICAgIGZvY3VzT25TZWxlY3Q6IHRydWUsXG4gICAgYXJyb3dzOiBmYWxzZSxcbiAgICBjZW50ZXJNb2RlOiB0cnVlLFxuICAgIHZhcmlhYmxlV2lkdGg6IHRydWUsXG4gICAgaW5maW5pdGU6ICQoJy5zbGlkZXItbmF2Jykud2lkdGgoKSA+IHRoaXMubGlzdFdpZHRoLFxuICAgIG1vYmlsZUZpcnN0OiB0cnVlLFxuICAgIHJlc3BvbnNpdmU6IFt7XG4gICAgICBicmVha3BvaW50OiAxMDI0LFxuICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgaW5maW5pdGU6IGZhbHNlLFxuICAgICAgICBzbGlkZXNUb1Nob3c6IHRoaXMuc2xpZGVDb3VudCxcbiAgICAgICAgY2VudGVyTW9kZTogZmFsc2UsXG4gICAgICAgI
108HZlcnRpY2FsOiB0cnVlXG4gICAgICB9XG4gICAgfV1cbiAgfSk7XG59KTtcblxuLy8gSG9tZXBhZ2UgRmVhdHVyZWQgUG9zdHMgU2xpZGVyXG4kKCcuZmVhdHVyZWQtcG9zdHNfX2ltYWdlcycpLmVhY2goZnVuY3Rpb24gKGlkeCwgaXRlbSkge1xuICB2YXIgc2xpZGVySWQgPSBcImZlYXR1cmVkX3Bvc3RzLXNsaWRlci1cIiArIGlkeDtcbiAgdGhpcy5pZCA9IHNsaWRlcklkO1xuICAkKHRoaXMpLnNsaWNrKHtcbiAgICBkb3RzOiBmYWxzZSxcbiAgICBhcnJvd3M6IGZhbHNlLFxuICAgIGluZmluaXRlOiB0cnVlLFxuICAgIHNsaWRlc1RvU2Nyb2xsOiAxLFxuICAgIGFkYXB0aXZlSGVpZ2h0OiBmYWxzZSxcbiAgICBwYXVzZU9uSG92ZXI6IGZhbHNlLFxuICAgIHBhdXNlT25Gb2N1czogZmFsc2UsXG4gICAgbW9iaWxlRmlyc3Q6IHRydWUsXG4gICAgYXNOYXZGb3I6ICcuZmVhdHVyZWQtcG9zdHNfX2RldGFpbHMnLFxuICAgIGZhZGU6IHRydWUsXG4gICAgcmVzcG9uc2l2ZTogW3tcbiAgICAgIGJyZWFrcG9pbnQ6IDEwMjQsXG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBkb3RzOiB0cnVlLFxuICAgICAgICBhcHBlbmREb3RzOiAnLmZlYXR1cmVkLXBvc3RzX19pbWFnZXMgLnNsaWNrLWxpc3QnLFxuICAgICAgICBmYWRlOiB0cnVlLFxuICAgICAgICBhdXRvcGxheTogdHJ1ZSxcbiAgICAgICAgcGF1c2VPbkhvdmVyOiBmYWxzZSxcbiAgICAgICAgcGF1c2VPbkZvY3VzOiBmYWxzZVxuICAgICAgfVxuICAgIH1dXG4gIH0pO1xufSk7XG4kKCcuZmVhdHVyZWQtcG9zdHNfX2RldGFpbHMnKS5lYWNoKGZ1bmN0aW9uIChpZHgsIGl0ZW0pIHtcbiAgdmFyIHNsaWRlcklkID0gXCJmZWF0dXJlZF9wb3N0c19kZXRhaWwtc2xpZGVyLVwiICsgaWR4O1xuICB0aGlzLmlkID0gc2xpZGVySWQ7XG4gICQodGhpcykuc2xpY2soe1xuICAgIGRvdHM6IGZhbHNlLFxuICAgIGFycm93czogZmFsc2UsXG4gICAgaW5maW5pdGU6IHRydWUsXG4gICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4gICAgYWRhcHRpdmVIZWlnaHQ6IGZhbHNlLFxuICAgIHBhdXNlT25Ib3ZlcjogZmFsc2UsXG4gICAgcGF1c2VPbkZvY3VzOiBmYWxzZSxcbiAgICBtb2JpbGVGaXJzdDogdHJ1ZSxcbiAgICBhc05hdkZvcjogJy5mZWF0dXJlZC1wb3N0c19faW1hZ2VzJyxcbiAgICBmYWRlOiB0cnVlLFxuICAgIHJlc3BvbnNpdmU6IFt7XG4gICAgICBicmVha3BvaW50OiAxMDI0LFxuICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgZmFkZTogdHJ1ZSxcbiAgICAgICAgYXV0b3BsYXk6IHRydWUsXG4gICAgICAgIHBhdXNlT25Ib3ZlcjogZmFsc2UsXG4gICAgICAgIHBhdXNlT25Gb2N1czogZmFsc2VcbiAgICAgIH1cbiAgICB9XVxuICB9KTtcbn0pO1xuXG4vLyBTbGlkZXIgd2l0aCBRdW90ZVxuJCgnLnNlY3Rpb24tc2xpZGVyX3dpdGhfcXVvdGUgLnNsaWRlcl9fc2xpZGVzJykub24oJ2JlZm9yZUNoYW5nZScsIGZ1bmN0aW9uIChldmVudCwgc2xpY2ssIGN1cnJlbnRTbGlkZSwgbmV4dFNsaWRlKSB7XG4gIHZhciBuYXZMaXN0ID0gc2xpY2sub3B0aW9ucy5hc05hdkZvcjtcbiAgaWYgKGN1cnJlbnRTbGlkZSA9PT0gc2xpY2suc2xpZGVDb3VudCAtIDEpIHtcbiAgICAkKG5hdkxpc3QpLnNsaWNrKCdzbGlja0dvVG8nLCAwKTtcbiAgfSBlbHNlIGlmIChjdXJyZW50U2xpZGUgPT09IDApIHtcbiAgICAkKG5hdkxpc3QpLnNsaWNrKCdzbGlja0dvVG8nLCBzbGljay5zbGlkZUNvdW50KTtcbiAgfVxufSk7XG4kKCcuc2VjdGlvbi1zbGlkZXJfd2l0aF9xdW90ZSAuc2xpZGVyX19zbGlkZXMnKS5lYWNoKGZ1bmN0aW9uIChpZHgsIGl0ZW0pIHtcbiAgdmFyIHNsaWRlQ291bnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbGlkZXJfX3NsaWRlJykubGVuZ3RoO1xuICB2YXIgc2xpZGVySWQgPSBcInNsaWRlci1cIiArIGlkeDtcbiAgdGhpcy5pZCA9IHNsaWRlcklkO1xuICBpZiAoc2xpZGVDb3VudCA+IDEpIHtcbiAgICAkKHRoaXMpLnNsaWNrKHtcbiAgICAgIGRvdHM6IGZhbHNlLFxuICAgICAgaW5maW5pdGU6IHRydWUsXG4gICAgICBmYWRlOiB0cnVlLFxuICAgICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4gICAgICBhZGFwdGl2ZUhlaWdodDogZmFsc2UsXG4gICAgICBhc05hdkZvcjogJCh0aGlzKS5wYXJlbnRzKCcuc2VjdGlvbi1zbGlkZXJfd2l0aF9xdW90ZScpLmZpbmQoJy5zbGlkZXItYXNpZGVfX3F1b3RlcycpLFxuICAgICAgbW9iaWxlRmlyc3Q6IHRydWUsXG4gICAgICByZXNwb25zaXZlOiBbe1xuICAgICAgICBicmVha3BvaW50OiA3NjcsXG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgZG90czogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XVxuICAgIH0pO1xuICB9XG59KTtcbiQoJy5zZWN0aW9uLXNsaWRlcl93aXRoX3F1b3RlIC5zbGlkZXItYXNpZGVfX3F1b3RlcycpLmVhY2goZnVuY3Rpb24gKGlkeCwgaXRlbSkge1xuICB2YXIgc2xpZGVyTmF2SWQgPSBcInNsaWRlck5hdi1cIiArIGlkeDtcbiAgdGhpcy5pZCA9IHNsaWRlck5hdklkO1xuICAkKHRoaXMpLnNsaWNrKHtcbiAgICBhc05hdkZvcjogJCh0aGlzKS5wYXJlbnRzKCcuc2VjdGlvbi1zbGlkZXJfd2l0aF9xdW90ZScpLmZpbmQoJy5zbGlkZXJfX3NsaWRlcycpLFxuICAgIHNsaWRlc1RvU2hvdzogMSxcbiAgICBmb2N1c09uU2VsZWN0OiB0cnVlLFxuICAgIGFycm93czogZmFsc2UsXG4gICAgZmFkZTogdHJ1ZSxcbiAgICBpbmZpbml0ZTogdHJ1ZSxcbiAgICBtb2JpbGVGaXJzdDogdHJ1ZSxcbiAgICBkb3RzOiB0cnVlLFxuICAgIHJlc3BvbnNpdmU6IFt7XG4gICAgICBicmVha3BvaW50OiA3NjcsXG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBkb3RzOiBmYWxzZVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGJyZWFrcG9pbnQ6IDEwMjQsXG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBkb3RzOiBmYWxzZSxcbiAgICAgICAgc2xpZGVzVG9TaG93OiB0aGlzLnNsaWRlQ291bnQsXG4gICAgICAgIGNlbnRlck1vZGU6IGZhbHNlXG4gICAgICB9XG4gICAgfV1cbiAgfSk7XG59KTtcblxuLy8gRmVhdHVyZSBHcm91cCBTbGlkZXJcbiQoJy5mZWF0dXJlX2dyb3VwLXNsaWRlcycpLmVhY2goZnVuY3Rpb24gKGlkeCwgaXRlbSkge1xuICB2YXIgc2xpZGVDb3VudCA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgnLnNlY3Rpb24tZmVhdHVyZV9ncm91cF9faW1hZ2UnKS5sZW5ndGg7XG4gIHZhciBzbGlkZXJJZCA9IFwic2xpZGVyXCIgKyBpZHg7XG4gIHRoaXMuaWQgPSBzbGlkZXJJZDtcbiAgaWYgKHNsaWRlQ291bnQgPiAxKSB7XG4gICAgJCh0aGlzKS5zbGljayh7XG4gICAgICBkb3RzOiB0cnVlLFxuICAgICAgYXJyb3dzOiBmYWxzZSxcbiAgICAgIGluZmluaXRlOiB0cnVlLFxuICAgICAgZmFkZTogdHJ1ZSxcbiAgICAgIGF1dG9wbGF5OiBmYWxzZSxcbiAgICAgIGF1dG9wbGF5U3BlZWQ6IDMwMDAsXG4gICAgICBzbGlkZXNUb1Njcm9sbDogMSxcbiAgICAgIGFkYXB0aXZlSGVpZ2h0OiBmYWxzZSxcbiAgICAgIHBhdXNlT25Ib3ZlcjogZmFsc2UsXG4gICAgICBwYXVzZU9uRm9jdXM6IGZhbHNlLFxuICAgICAgbW9iaWxlRmlyc3Q6IHRydWUsXG4gICAgICByZXNwb25zaXZlOiBbe1xuICAgICAgICBicmVha3BvaW50OiAxMDI0LFxuICAgICAgICBzZXR0aW5nczogJ3Vuc2xpY2snXG4gICAgICB9XVxuICAgIH0pO1xuICB9XG59KTtcblxuLy8gUXVvdGUgQ2Fyb3VzZWwgU2xpZGVyXG4kKCcucXVvdGUtY2Fyb3VzZWwtc2xpZGVyJykuZWFjaChmdW5jdGlvbiAoaWR4LCBpdGVtKSB7XG4gIHZhciBzbGlkZUNvdW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCcucXVvdGUtc2xpZGUnKS5sZW5ndGg7XG4gIHZhciBzbGlkZXJJZCA9IFwic2xpZGVyXCIgKyBpZHg7XG4gIHRoaXMuaWQgPSBzbGlkZXJJZDtcbiAgaWYgKHNsaWRlQ291bnQgPiAxKSB7XG4gICAgJCh0aGlzKS5zbGljayh7XG4gICAgICBkb3RzOiB0cnVlLFxuICAgICAgYXJyb3dzOiBmYWxzZSxcbiAgICAgIGluZmluaXRlOiB0cnVlLFxuICAgICAgZmFkZTogdHJ1ZSxcbiAgICAgIGF1dG9wbGF5OiBmYWxzZSxcbiAgICAgIGF1dG9wbGF5U3BlZWQ6IDMwMDAsXG4gICAgICBzbGlkZXNUb1Njcm9sbDogMSxcbiAgICAgIGFkYXB0aXZlSGVpZ2h0OiBmYWxzZSxcbiAgICAgIHBhdXNlT25Ib3ZlcjogZmFsc2UsXG4gICAgICBwYXVzZU9uRm9jdXM6IGZhbHNlLFxuICAgICAgbW9iaWxlRmlyc3Q6IHRydWVcbiAgICAgIC8vIHJlc3BvbnNpdmU6IFtcbiAgICAgIC8vICAge1xuICAgICAgLy8gICAgIGJyZWFrcG9pbnQ6IDEwMjQsXG4gICAgICAvLyAgICAgc2V0dGluZ3M6ICd1bnNsaWNrJ1xuICAgICAgLy8gICB9XG4gICAgICAvLyBdXG4gICAgfSk7XG4gIH1cbn0pO1xuXG4vLyBjb21wYXJpc29uIGNoYXJ0IHNsaWRlclxuJCgnLmNvbXBhcmlzb24tc2xpZGVyLWlubmVyJykuc2xpY2soe1xuICAvLyBZb3VyIFNsaWNrIHNsaWRlciBvcHRpb25zIGhlcmVcbiAgZG90czogdHJ1ZSxcbiAgYXJyb3dzOiB0cnVlLFxuICBpbmZpbml0ZTogZmFsc2UsXG4gIHNwZWVkOiAzMDAsXG4gIHNsaWRlc1RvU2hvdzogMSxcbiAgYWRhcHRpdmVIZWlnaHQ6IHRydWUsXG4gIHByZXZBcnJvdzogZmFsc2UsXG4gIG5leHRBcnJvdzogZmFsc2Vcbn0pO1xuXG4vLyBFeHBhbmRhYmxlIE1vZHVsZXM6XG4vLyAxLiBGZWF0dXJlcyBNb2R1bGVcblxuZnVuY3Rpb24gZXhwYW5kTW9kdWxlKCkge1xuICB2YXIgb3BlblRvZ2dsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy4taXMtZXhwYW5kZWQnKTtcbiAgaWYgKG9wZW5Ub2dnbGUgJiYgb3BlblRvZ2dsZSAhPSB0aGlzKSBvcGVuVG9nZ2xlLmNsYXNzTGlzdC5yZW1vdmUoJy1pcy1leHBhbmRlZCcpO1xuICB0aGlzLmNsYXNzTGlzdC50b2dnbGUoJy1pcy1leHBhbmRlZCcpO1xufVxuaWYgKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdwYWdlLXRlbXBsYXRlLXBhZ2UtZXZlbnQtbGlzdGluZycpKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldC5jbG9zZXN0KCcuanMtZXhwYW5kJykpIHJldHVybjtcbiAgICBkb2
108N1bWVudC5xdWVyeVNlbGVjdG9yKCcuLWlzLWV4cGFuZGVkJykuY2xhc3NMaXN0LnJlbW92ZSgnLWlzLWV4cGFuZGVkJyk7XG4gIH0sIGZhbHNlKTtcbn1cblxuLy8gVG9nZ2xlIExpc3RcbmZ1bmN0aW9uIHRvZ2dsZUxpc3QoKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5saXN0LWV4cGFuZCcpLmNsYXNzTGlzdC50b2dnbGUoJy1pcy1leHBhbmRlZCcpO1xufVxuXG4vLyBBbmltYXRpb25zXG5pZiAoZG9jdW1lbnQuYm9keS5jb250YWlucyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29weV9faGVhZGluZycpKSkge1xuICB2YXIgc3BlZWQgPSA0MDtcbiAgdmFyIGhlYWRpbmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29weV9faGVhZGluZycpO1xuICB2YXIgZGVsYXkgPSBoZWFkaW5nLmlubmVySFRNTC5sZW5ndGggKiBzcGVlZCArIHNwZWVkO1xufVxuZnVuY3Rpb24gdHlwZUVmZmVjdChlbGVtZW50LCBzcGVlZCkge1xuICB2YXIgdGV4dCA9IGVsZW1lbnQuaW5uZXJIVE1MO1xuICBlbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XG4gIHZhciBpID0gMDtcbiAgdmFyIHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpIDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgIGVsZW1lbnQuYXBwZW5kKHRleHQuY2hhckF0KGkpKTtcbiAgICAgIGkrKztcbiAgICB9IGVsc2Uge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7XG4gICAgfVxuICB9LCBzcGVlZCk7XG59XG5cbi8vIExhenkgTG9hZCBpbiBWaWV3cG9ydFxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgZnVuY3Rpb24gKCkge1xuICB2YXIgYW5pbWF0ZUVsZW1lbnRzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYW5pbWF0ZScpKTtcbiAgdmFyIG9wdGlvbnMgPSB7XG4gICAgdGhyZXNob2xkOiAuNFxuICB9O1xuICBpZiAoXCJJbnRlcnNlY3Rpb25PYnNlcnZlclwiIGluIHdpbmRvdykge1xuICAgIHZhciBhbmltYXRlRWxPYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbiAoZW50cmllcywgb2JzZXJ2ZXIpIHtcbiAgICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgdmFyIGFuaW1hdGVFbCA9IGVudHJ5LnRhcmdldDtcbiAgICAgICAgICBhbmltYXRlRWwuY2xhc3NMaXN0LmFkZCgnLWlzLXZpc2libGUnKTtcbiAgICAgICAgICBhbmltYXRlRWxPYnNlcnZlci51bm9ic2VydmUoYW5pbWF0ZUVsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgb3B0aW9ucyk7XG4gICAgYW5pbWF0ZUVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGFuaW1hdGVFbCkge1xuICAgICAgYW5pbWF0ZUVsT2JzZXJ2ZXIub2JzZXJ2ZShhbmltYXRlRWwpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrIGhlcmVcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGxhenlMb2FkRmFsbGJhY2spO1xuICB9XG59KTtcblxuLy9WaXNpb24gRnVsbCBTZWN0aW9uXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBmdW5jdGlvbiAoKSB7XG4gIHZhciB2aXNpb25FbGVtZW50ID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYW5pbWF0ZS0tY292ZXInKSk7XG4gIGlmIChcIkludGVyc2VjdGlvbk9ic2VydmVyXCIgaW4gd2luZG93KSB7XG4gICAgdmFyIHZpc2lvbkVsT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMsIG9ic2VydmVyKSB7XG4gICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgIHZhciB2aXNpb25FbCA9IGVudHJ5LnRhcmdldDtcbiAgICAgICAgICB2aXNpb25FbC5jbGFzc0xpc3QuYWRkKCctaXMtdmlzaWJsZScpO1xuICAgICAgICAgIHZpc2lvbkVsT2JzZXJ2ZXIudW5vYnNlcnZlKHZpc2lvbkVsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdmlzaW9uRWxlbWVudC5mb3JFYWNoKGZ1bmN0aW9uICh2aXNpb25FbCkge1xuICAgICAgdmlzaW9uRWxPYnNlcnZlci5vYnNlcnZlKHZpc2lvbkVsKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGxhenlMb2FkRmFsbGJhY2spO1xuICB9XG59KTtcblxuLy8gUGFyYWxsYXhcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIHBhcmFsbGF4RWxlbWVudHMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWN0aW9uLWNvbGxlY3Rpb25fX2ltYWdlJykpO1xuICB2YXIgb3B0aW9ucyA9IHtcbiAgICAvLyB0aHJlc2hvbGQ6IC41XG4gICAgdHJhY2tWaXNpYmlsaXR5OiB0cnVlLFxuICAgIGRlbGF5OiAxMDBcbiAgfTtcbiAgaWYgKFwiSW50ZXJzZWN0aW9uT2JzZXJ2ZXJcIiBpbiB3aW5kb3cpIHtcbiAgICB2YXIgcGFyYWxsYXhFbE9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChlbnRyaWVzLCBvYnNlcnZlcikge1xuICAgICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICB2Y
108XIgcGFyYWxsYXhFbCA9IGVudHJ5LnRhcmdldDtcbiAgICAgICAgaWYgKGVudHJ5LmludGVyc2VjdGlvblJhdGlvID4gMCkge1xuICAgICAgICAgIHBhcmFsbGF4RWwuY2xhc3NMaXN0LmFkZCgnLWlzLXZpc2libGUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJhbGxheEVsLmNsYXNzTGlzdC5yZW1vdmUoJy1pcy12aXNpYmxlJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIG9wdGlvbnMpO1xuICAgIHBhcmFsbGF4RWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAocGFyYWxsYXhFbCkge1xuICAgICAgcGFyYWxsYXhFbE9ic2VydmVyLm9ic2VydmUocGFyYWxsYXhFbCk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2sgaGVyZVxuICAgIGxhenlMb2FkRmFsbGJhY2soKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGxhenlMb2FkRmFsbGJhY2spO1xuICB9XG59KTtcbmZ1bmN0aW9uIGxhenlMb2FkRmFsbGJhY2soKSB7XG4gIHZhciBhbmltYXRlRWxlbWVudHMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hbmltYXRlLCAuYW5pbWF0ZS0tY292ZXIsIC5zZWN0aW9uLWNvbGxlY3Rpb25fX2ltYWdlJykpO1xuICBhbmltYXRlRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoYW5pbWF0ZUVsKSB7XG4gICAgaWYgKGFuaW1hdGVFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgPD0gd2luZG93LmlubmVySGVpZ2h0ICYmIGFuaW1hdGVFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gPj0gMCkge1xuICAgICAgYW5pbWF0ZUVsLmNsYXNzTGlzdC5hZGQoJy1pcy12aXNpYmxlJyk7XG4gICAgfVxuICB9KTtcbn1cbiQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcub3B0LWluX19jbG9zZScsIGNsb3NlQ29va2llQmFubmVyKTtcbmZ1bmN0aW9uIGNsb3NlQ29va2llQmFubmVyKCkge1xuICAkKCcjcGlfdHJhY2tpbmdfb3B0X2luX2RpdicpLmFkZENsYXNzKCdoaWRlJyk7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICQoJyNwaV90cmFja2luZ19vcHRfaW5fbm8nKS5jbGljaygpO1xuICB9LCA1MDApO1xufVxuJCgnLndwY2Y3LWZvcm0nKS5yZW1vdmVBdHRyKCdub3ZhbGlkYXRlJyk7XG4kKCcud3BjZjctdmFsaWRhdGVzLWFzLXJlcXVpcmVkJykucHJvcCgncmVxdWlyZWQnLCB0cnVlKTtcblxuLy8gQWRqdXN0IENvbnRhY3QgRm9ybSA3IERlZmF1bHQgQmVoYXZpb3JcbiQoJy53cGNmNy1mb3JtJykub24oJ3N1Ym1pdCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAvLyB2YXIgJHN1Y2Nlc3NFbGVtZW50ID0gJCgnLndwY2Y3LXJlc3BvbnNlLW91dHB1dCcpO1xuICAvLyAkc3VjY2Vzc0VsZW1lbnQudGV4dCgnVGhhbmsgeW91IGZvciB5b3VyIHN1Ym1pc3Npb24nKTtcbiAgLy8gJHN1Y2Nlc3NFbGVtZW50LnNob3coKTtcblxuICAkKCcud3BjZjctZm9ybScpLmFkZENsYXNzKCctaXMtbG9hZGluZycpO1xuICAkKCcubG9hZGVyJykuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xufSk7XG5cbi8vIE1hcFxuZ3JvdXBFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLWhvdHNwb3RdXCIpLCBzaG93TG9jYXRpb25zKTtcbmdyb3VwRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1ob3RzcG90XVwiKSwgaGlkZUxvY2F0aW9ucyk7XG5mdW5jdGlvbiBzaG93TG9jYXRpb25zKGV2ZW50KSB7XG4gIHZhciBob3RzcG90ID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuaG90c3BvdDtcbiAgdmFyIGl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLWxvY2F0aW9uPVxcXCJcIi5jb25jYXQoaG90c3BvdCwgXCJcXFwiXVwiKSk7XG4gIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBpdGVtLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGhpZGVMb2NhdGlvbnMoZXZlbnQpIHtcbiAgdmFyIGhvdHNwb3QgPSBldmVudC50YXJnZXQuZGF0YXNldC5ob3RzcG90O1xuICB2YXIgaXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtbG9jYXRpb249XFxcIlwiLmNvbmNhdChob3RzcG90LCBcIlxcXCJdXCIpKTtcbiAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gIH0pO1xufVxuXG4vLyBDdXN0b20gVmlkZW8gY29udHJvbHNcbiQod2luZG93KS5sb2FkKGZ1bmN0aW9uICgpIHtcbiAgJCgnLnNsaWRlX19jb250cm9sLW92ZXJsYXknKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAkKHRoaXMpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZhciBzbGljayA9ICQodGhpcykuY2xvc2VzdCgnLnNlY3Rpb24tc2xpZGVyX19zbGlkZXMnKTtcbiAgICAgIHZhciBzbGlkZSA9ICQodGhpcykuY2xvc2VzdCgnLnNsaWRlJyk7XG4gICAgICB2Y
108XIgb3ZlcmxheSA9ICQodGhpcyk7XG4gICAgICBpZiAoJChvdmVybGF5KS5oYXNDbGFzcygncGF1c2VkJykpIHtcbiAgICAgICAgJChvdmVybGF5KS5yZW1vdmVDbGFzcygncGF1c2VkJyk7XG4gICAgICAgICQob3ZlcmxheSkuYWRkQ2xhc3MoJ3BsYXlpbmcnKTtcbiAgICAgICAgcGxheVZpZGVvKHNsaWRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQob3ZlcmxheSkucmVtb3ZlQ2xhc3MoJ3BsYXlpbmcnKTtcbiAgICAgICAgJChvdmVybGF5KS5hZGRDbGFzcygncGF1c2VkJyk7XG4gICAgICAgIHBhdXNlVmlkZW8oc2xpZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn0pO1xuZnVuY3Rpb24gcGxheVZpZGVvKHNsaWRlKSB7XG4gIGlmICgkKHNsaWRlKS5oYXMoJy5zbGlkZV9fZW1iZWQnKS5sZW5ndGgpIHtcbiAgICB2YXIgaWZyYW1lID0gJChzbGlkZSkuZmluZCgnaWZyYW1lJylbMF07XG4gICAgdmFyIGRhdGEgPSB7XG4gICAgICBtZXRob2Q6IFwicGxheVwiXG4gICAgfTtcbiAgICBpZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShkYXRhKSwgXCIqXCIpO1xuICB9IGVsc2Uge1xuICAgIHZhciB2aWRlbyA9ICQoc2xpZGUpLmZpbmQoJ3ZpZGVvJyk7XG4gICAgdmlkZW9bMF0ucGxheSgpO1xuICB9XG59XG5mdW5jdGlvbiBwYXVzZVZpZGVvKHNsaWRlKSB7XG4gIGlmICgkKHNsaWRlKS5oYXMoJy5zbGlkZV9fZW1iZWQnKS5sZW5ndGgpIHtcbiAgICB2YXIgaWZyYW1lID0gJChzbGlkZSkuZmluZCgnaWZyYW1lJylbMF07XG4gICAgdmFyIGRhdGEgPSB7XG4gICAgICBtZXRob2Q6IFwicGF1c2VcIlxuICAgIH07XG4gICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoZGF0YSksIFwiKlwiKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdmlkZW8gPSAkKHNsaWRlKS5maW5kKCd2aWRlbycpO1xuICAgIHZpZGVvWzBdLnBhdXNlKCk7XG4gIH1cbn1cblxuLy8gSG9tZSBIZXJvIENhcm91c2VsXG5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdpc0xvb3BpbmdIZXJvQ2Fyb3VzZWwnLCBcImZhbHNlXCIpO1xuaWYgKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSA9PT0gXCIvXCIpIHtcbiAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcImlzTG9vcGluZ0hlcm9DYXJvdXNlbFwiLCBcInRydWVcIik7XG59IGVsc2Uge1xuICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwiaXNMb29waW5nSGVyb0Nhcm91c2VsXCIsIFwiZmFsc2VcIik7XG59XG5cbi8vIGhvbWUgZHJhZ2dhYmxlIHNlY3Rpb25cbnZhciBtb3VzZURvd24gPSBmYWxzZTtcbnZhciBzdGFydFgsIHNjcm9sbExlZnQ7XG52YXIgc2xpZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3dyYXAtd2hhdHMtb24tZ3JpZCcpO1xudmFyIGRyYWdnZWQgPSBmYWxzZTtcbnZhciBzdGFydERyYWdnaW5nID0gZnVuY3Rpb24gc3RhcnREcmFnZ2luZyhlKSB7XG4gIGUucHJldmVudERlZmF1bHQoKTtcbiAgbW91c2VEb3duID0gdHJ1ZTtcbiAgc3RhcnRYID0gZS5wYWdlWCAtIHNsaWRlci5vZmZzZXRMZWZ0O1xuICBzY3JvbGxMZWZ0ID0gc2xpZGVyLnNjcm9sbExlZnQ7XG59O1xudmFyIHN0b3BEcmFnZ2luZyA9IGZ1bmN0aW9uIHN0b3BEcmFnZ2luZyhlKSB7XG4gIGUucHJldmVudERlZmF1bHQoKTtcbiAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgbW91c2VEb3duID0gZmFsc2U7XG59O1xudmFyIG1vdmUgPSBmdW5jdGlvbiBtb3ZlKGUpIHtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICBpZiAoIW1vdXNlRG93bikge1xuICAgIGRyYWdnZWQgPSBmYWxzZTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSB7XG4gICAgZHJhZ2dlZCA9IHRydWU7XG4gICAgdmFyIHggPSBlLnBhZ2VYIC0gc2xpZGVyLm9mZnNldExlZnQ7XG4gICAgdmFyIHNjcm9sbCA9IHggLSBzdGFydFg7XG4gICAgc2xpZGVyLnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0IC0gc2Nyb2xsO1xuICB9XG59O1xudmFyIG5vRm9sbG93TGluayA9IGZ1bmN0aW9uIG5vRm9sbG93TGluayhlKSB7XG4gIGlmIChkcmFnZ2VkKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH1cbn07XG5cbi8vIEZlYXR1cmUgR3JvdXAgU2xpZGVyXG4vLyAkKCcuZmVhdHVyZV9ncm91cC1zbGlkZXMnKS5lYWNoKGZ1bmN0aW9uKGlkeCwgaXRlbSkge1xuLy8gICB2Y
108XIgc2xpZGVDb3VudCA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgnLnNlY3Rpb24tZmVhdHVyZV9ncm91cF9faW1hZ2UnKS5sZW5ndGhcbi8vICAgdmFyIHNsaWRlcklkID0gXCJzbGlkZXJcIiArIGlkeDtcbi8vICAgdGhpcy5pZCA9IHNsaWRlcklkO1xuXG4vLyAgIGlmIChzbGlkZUNvdW50ID4gMSkge1xuLy8gICAgICQodGhpcykuc2xpY2soe1xuLy8gICAgICAgZG90czogdHJ1ZSxcbi8vICAgICAgIGFycm93czogZmFsc2UsXG4vLyAgICAgICBpbmZpbml0ZTogdHJ1ZSxcbi8vICAgICAgIGZhZGU6IHRydWUsXG4vLyAgICAgICBhdXRvcGxheTogZmFsc2UsXG4vLyAgICAgICBhdXRvcGxheVNwZWVkOiAzMDAwLFxuLy8gICAgICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4vLyAgICAgICBhZGFwdGl2ZUhlaWdodDogZmFsc2UsXG4vLyAgICAgICBwYXVzZU9uSG92ZXI6IGZhbHNlLFxuLy8gICAgICAgcGF1c2VPbkZvY3VzOiBmYWxzZSxcbi8vICAgICAgIG1vYmlsZUZpcnN0OiB0cnVlLFxuLy8gICAgICAgcmVzcG9uc2l2ZTogW1xuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgYnJlYWtwb2ludDogMTAyNCxcbi8vICAgICAgICAgICBzZXR0aW5nczogJ3Vuc2xpY2snXG4vLyAgICAgICAgIH1cbi8vICAgICAgIF1cbi8vICAgICB9KVxuLy8gICB9XG4vLyB9KTtcblxuZnVuY3Rpb24gaW5pdGlhbGl6ZVByaWNpbmdTbGljaygpIHtcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCQod2luZG93KS53aWR0aCgpID4gMTAwMCkge1xuICAgICAgaWYgKCQoJy5yb3ctcHJpY2luZycpLmhhc0NsYXNzKCdzbGljay1pbml0aWFsaXplZCcpKSB7XG4gICAgICAgICQoJy5yb3ctcHJpY2luZycpLnNsaWNrKCd1bnNsaWNrJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgkKHdpbmRvdykud2lkdGgoKSA8IDEwMDApIHtcbiAgICAgIGlmICgkKCcucm93LXByaWNpbmcnKS5oYXNDbGFzcygnc2xpY2staW5pdGlhbGl6ZWQnKSkge1xuICAgICAgICAkKCcucm93LXByaWNpbmcnKS5zbGljaygndW5zbGljaycpO1xuICAgICAgfVxuICAgICAgJCgnLnJvdy1wcmljaW5nJykuc2xpY2soe1xuICAgICAgICBkb3RzOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIDApO1xufVxuJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xuICBpbml0aWFsaXplUHJpY2luZ1NsaWNrKCk7XG59KTtcbnZhciBwcmV2aW91c1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4kKHdpbmRvdykub24oJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIGN1cnJlbnRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICBpZiAoY3VycmVudFdpZHRoICE9PSBwcmV2aW91c1dpZHRoKSB7XG4gICAgaW5pdGlhbGl6ZVByaWNpbmdTbGljaygpO1xuICAgIC8vIFVwZGF0ZSB0aGUgcHJldmlvdXMgd2lkdGhcbiAgICBwcmV2aW91c1dpZHRoID0gY3VycmVudFdpZHRoO1xuICB9XG59KTtcblxuLy8gQWRkIHRoZSBldmVudCBsaXN0ZW5lcnNcbmlmIChzbGlkZXIpIHtcbiAgc2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbm9Gb2xsb3dMaW5rLCBmYWxzZSk7XG4gIHNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBtb3ZlLCBmYWxzZSk7XG4gIHNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBzdGFydERyYWdnaW5nLCBmYWxzZSk7XG4gIHNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgc3RvcERyYWdnaW5nLCBmYWxzZSk7XG4gIHNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgc3RvcERyYWdnaW5nLCBmYWxzZSk7XG59XG5mdW5jdGlvbiB3cml0ZVBhcmFtc1RvSW5wdXRzKCkge1xuICAvLyBGdW5jdGlvbiB0byBnZXQgdGhlIHZhbHVlIG9mIGEgY29va2llIGJ5IG5hbWVcbiAgZnVuY3Rpb24gZ2V0Q29va2llKG5hbWUpIHtcbiAgICB2YXIgY29va2llQXJyID0gZG9jdW1lbnQuY29va2llLnNwbGl0KFwiO1wiKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb2tpZUFyci5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNvb2tpZVBhaXIgPSBjb29raWVBcnJbaV0uc3BsaXQoXCI9XCIpO1xuICAgICAgaWYgKG5hbWUgPT0gY29va2llUGFpclswXS50cmltKCkpIHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChjb29raWVQYWlyWzFdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBGdW5jdGlvbiB0byBnZXQgdGhlIHZhbHVlIG9mIGEgVVJMIHBhcmFtZXRlciBieSBuYW1lXG4gIGZ1bmN0aW9uIGdldFVybFBhcmFtZXRlcihuYW1lKSB7XG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvW1xcW1xcXV0vZywgJ1xcXFwkJicpO1xuICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAoJ1s/Jl0nICsgbmFtZSArICcoPShbXiYjXSopfCZ8I3wkKScpLFxuICAgICAgcmVzdWx0cyA9IHJlZ2V4LmV4ZWMod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIGlmICghcmVzdWx0cykgcmV0dXJuIG51bGw7XG4gICAgaWYgKCFyZXN1bHRzWzJdKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChyZXN1bHRzWzJdLnJlcGxhY2UoL1xcKy9nLCAnICcpKTtcbiAgfVxuXG4gIC8vIExpc3Qgb2YgcGFyYW1ldGVycyB0byBjaGVja1xuICB2YXIgcGFyYW1zID0gWydnY2xpZCcsICd1dG1fc291cmNlJywgJ3V0bV9jYW1wYWlnbicsICd1dG1fbWVkaXVtJ107XG5cbiAgLy8gRmluZCBhbmQgc2V0IHRoZSB2YWx1ZSBmb3IgZWFjaCBwYXJhbWV0ZXJcbiAgcGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgdmFyIHZhbHVlID0gZ2V0VXJsUGFyYW1ldGVyKHBhcmFtKSB8fCBnZXRDb29raWUocGFyYW0pO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdmFyIGxhYmVscyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsYWJlbCcpO1xuICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGxhYmVscyksXG4gICAgICAgIF9zdGVwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2Y
108XIgbGFiZWwgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICBpZiAobGFiZWwudGV4dENvbnRlbnQudHJpbSgpID09PSBwYXJhbSkge1xuICAgICAgICAgICAgdmFyIGdpbnB1dENvbnRhaW5lciA9IGxhYmVsLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgIGlmIChnaW5wdXRDb250YWluZXIgJiYgZ2lucHV0Q29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucygnZ2lucHV0X2NvbnRhaW5lcicpKSB7XG4gICAgICAgICAgICAgIHZhciBpbnB1dCA9IGdpbnB1dENvbnRhaW5lci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXTtcbiAgICAgICAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IuZigpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8vIENhbGwgdGhlIGZ1bmN0aW9uXG5pZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmdmb3JtLWJvZHknKSkge1xuICB3cml0ZVBhcmFtc1RvSW5wdXRzKCk7XG59XG4kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XG4gIC8vIGZ1bmN0aW9uIGxvZ0VsZW1lbnRFdmVudChldmVudE5hbWUsIGVsZW1lbnQpIHtcbiAgLy8gICBjb25zb2xlLmxvZyhEYXRlLm5vdygpLCBldmVudE5hbWUsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1zcmNcIikpO1xuICAvLyB9XG4gIC8vIHZhciBjYWxsYmFja19lbnRlciA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIC8vICAgbG9nRWxlbWVudEV2ZW50KFwi8J+UkSBFTlRFUkVEXCIsIGVsZW1lbnQpO1xuICAvLyB9O1xuICAvLyB2YXIgY2FsbGJhY2tfZXhpdCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIC8vICAgbG9nRWxlbWVudEV2ZW50KFwi8J+aqiBFWElURURcIiwgZWxlbWVudCk7XG4gIC8vIH07XG4gIC8vIHZhciBjYWxsYmFja19sb2FkaW5nID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgLy8gICBsb2dFbGVtZW50RXZlbnQoXCLijJogTE9BRElOR1wiLCBlbGVtZW50KTtcbiAgLy8gfTtcbiAgLy8gdmFyIGNhbGxiYWNrX2xvYWRlZCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIC8vICAgbG9nRWxlbWVudEV2ZW50KFwi8J+RjSBMT0FERURcIiwgZWxlbWVudCk7XG4gIC8vIH07XG4gIC8vIHZhciBjYWxsYmFja19lcnJvciA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIC8vICAgbG9nRWxlbWVudEV2ZW50KFwi8J+SgCBFUlJPUlwiLCBlbGVtZW50KTtcbiAgLy8gICBlbGVtZW50LnNyYyA9IFwiaHR0cHM6Ly92aWEucGxhY2Vob2xkZXIuY29tLzQ0MHg1NjAvP3RleHQ9RXJyb3IrUGxhY2Vob2xkZXJcIjtcbiAgLy8gfTtcbiAgLy8gdmFyIGNhbGxiYWNrX2ZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gICBsb2dFbGVtZW50RXZlbnQoXCLinJTvuI8gRklOSVNIRURcIiwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgLy8gfTtcbiAgLy8gdmFyIGNhbGxiYWNrX2NhbmNlbCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIC8vICAgbG9nRWxlbWVudEV2ZW50KFwi8J+UpSBDQU5DRUxcIiwgZWxlbWVudCk7XG4gIC8vIH07XG5cbiAgdmFyIHdpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gIHZhciB0aHJlc2hvbGQgPSAtMjAwO1xuICBpZiAod2luZG93V2lkdGggPCAxMDI0KSB7XG4gICAgdGhyZXNob2xkID0gMDtcbiAgfVxuICB2YXIgbGwgPSBuZXcgTGF6eUxvYWQoe1xuICAgIHRocmVzaG9sZDogdGhyZXNob2xkLFxuICAgIC8vIHVzZV9uYXRpdmU6IHRydWUsIC8vIHVzZSBuYXRpdmUgbGF6eSBsb2FkaW5nIHdoZW4gYnJvd3NlciBjb21wYXRpYmxlXG4gICAgZWxlbWVudHNfc2VsZWN0b3I6IFwiLmxhenlcIixcbiAgICB1c2VfbmF0aXZlOiB0cnVlLFxuICAgIGNhbGxiYWNrX2xvYWRlZDogZnVuY3Rpb24gY2FsbGJhY2tfbG9hZGVkKGVsKSB7XG4gICAgICAvLyBPcHRpb25hbDogaGFuZGxlIHdoZW4gaW1hZ2VzIGFyZSBsb2FkZWRcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2xvYWRlZCcpO1xuICAgIH1cblxuICAgIC8vIGNsYXNzX2FwcGxpZWQ6IFwibHotYXBwbGllZFwiLFxuICAgIC8vIGNsYXNzX2xvYWRpbmc6IFwibHotbG9hZGluZ1wiLFxuICAgIC8vIGNsYXNzX2xvYWRlZDogXCJsei1sb2FkZWRcIixcbiAgICAvLyBjbGFzc19lcnJvcjogXCJsei1lcnJvclwiLFxuICAgIC8vIGNsYXNzX2VudGVyZWQ6IFwibHotZW50ZXJlZFwiLFxuICAgIC8vIGNsYXNzX2V4aXRlZDogXCJsei1leGl0ZWRcIixcbiAgICAvLyBBc3NpZ24gdGhlIGNhbGxiYWNrcyBkZWZpbmVkIGFib3ZlXG4gICAgLy8gY2FsbGJhY2tfZW50ZXI6IGNhbGxiYWNrX2VudGVyLFxuICAgIC8vIGNhbGxiYWNrX2V4aXQ6IGNhbGxiYWNrX2V4aXQsXG4gICAgLy8gY2FsbGJhY2tfY2FuY2VsOiBjYWxsYmFja19jYW5jZWwsXG4gICAgLy8gY2FsbGJhY2tfbG9hZGluZzogY2FsbGJhY2tfbG9hZGluZyxcbiAgICAvLyBjYWxsYmFja19sb2FkZWQ6IGNhbGxiYWNrX2xvYWRlZCxcbiAgICAvLyBjYWxsYmFja19lcnJvcjogY2FsbGJhY2tfZXJyb3IsXG4gICAgLy8gY2FsbGJhY2tfZmluaXNoOiBjYWxsYmFja19maW5pc2hcbiAgfSk7XG4gICQoZG9jdW1lbnQpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgLy8gY29uc29sZS5sb2coZS50YXJnZXQpXG4gIH0pO1xuICAkKCcjcGxhbi1jb21wYXJlLXByZXYsICNwbGFuLWNvbXBhcmUtbmV4dCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTsgLy8gU3RvcCB0aGUgZXZlbnQgZnJvbSBidWJibGluZyB1cCB0byBwYXJlbnQgZWxlbWVudHNcblxuICAgIHZhciB0YXJnZXRBbmltYXRlID0gJCgnLnBsYW4td3JhcCcpO1xuICAgIHZhciB0YXJnZXRTZWN0aW9uID0gJCgnLnNlY3Rpb24tcGxhbi1jb21wYXJpc29uJyk7XG4gICAgdmFyIGNsaWNrZWRJZCA9ICQodGhpcykuYXR0cignaWQnKTsgLy8gVXNlICQodGhpcykgdG8gZ2V0IHRoZSBpZCBvZiB0aGUgY2xpY2tlZCBlbGVtZW50XG5cbiAgICBpZiAoY2xpY2tlZElkID09PSAncGxhbi1jb21wYXJlLXByZXYnICYmIHRhcmdldFNlY3Rpb24uaGFzQ2xhc3MoJ2FjdGl2ZScpKSB7XG4gICAgICB0YXJnZXRBbmltYXRlLmFuaW1hdGUoe1xuICAgICAgICBzY3JvbGxMZWZ0OiAwXG4gICAgICB9LCAyMDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gQW5pbWF0aW9uIGNvbXBsZXRlLCByZW1vdmUgdGhlIGFjdGl2ZSBjbGFzc1xuICAgICAgICB0YXJnZXRTZWN0aW9uLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoY2xpY2tlZElkID09PSAncGxhbi1jb21wYXJlLW5leHQnICYmICF0YXJnZXRTZWN0aW9uLmhhc0NsYXNzKCdhY3RpdmUnKSkge1xuICAgICAgdGFyZ2V0U2VjdGlvbi5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIG1heGltdW0gc2Nyb2xsIHBvc2l0aW9uXG4gICAgICB2Y
108XIgbWF4U2Nyb2xsTGVmdCA9IHRhcmdldEFuaW1hdGVbMF0uc2Nyb2xsV2lkdGggLSB0YXJnZXRBbmltYXRlLm91dGVyV2lkdGgoKTtcbiAgICAgIC8vIEFuaW1hdGUgc2Nyb2xsIHRvIHRoZSBtYXhpbXVtIHNjcm9sbCBwb3NpdGlvblxuICAgICAgdGFyZ2V0QW5pbWF0ZS5hbmltYXRlKHtcbiAgICAgICAgc2Nyb2xsTGVmdDogbWF4U2Nyb2xsTGVmdFxuICAgICAgfSwgMjAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIHRhcmdldFNlY3Rpb24ucmVtb3ZlQ2xhc3MoJ3Njcm9sbGluZycpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBWYXJpYWJsZSB0byBob2xkIHRoZSBsYXN0IGhvcml6b250YWwgc2Nyb2xsIHBvc2l0aW9uXG4gIHZhciBsYXN0U2Nyb2xsTGVmdCA9IDA7XG5cbiAgLy8gVmFyaWFibGUgdG8gaG9sZCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBkZWJvdW5jZSB0aW1lb3V0XG4gIHZhciBkZWJvdW5jZVRpbWVvdXQgPSBudWxsO1xuICB2YXIgZGVib3VuY2VEZWxheSA9IDEwMDsgLy8gRGVsYXkgaW4gbWlsbGlzZWNvbmRzXG5cbiAgJCgnLnBsYW4td3JhcCcpLm9uKCdzY3JvbGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gQ2xlYXIgdGhlIHByZXZpb3VzIHRpbWVvdXQgdG8gcmVzZXQgdGhlIGRlYm91bmNlIHRpbWVyXG4gICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlVGltZW91dCk7XG5cbiAgICAvLyBTZXQgYSBuZXcgdGltZW91dFxuICAgIGRlYm91bmNlVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IGhvcml6b250YWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICB2Y
108XIgY3VycmVudFNjcm9sbExlZnQgPSAkKCcucGxhbi13cmFwJykuc2Nyb2xsTGVmdCgpO1xuICAgICAgdmFyIHRhcmdldEFuaW1hdGUgPSAkKCcucGxhbi13cmFwJyk7XG4gICAgICB2YXIgdGFyZ2V0U2VjdGlvbiA9ICQoJy5zZWN0aW9uLXBsYW4tY29tcGFyaXNvbicpO1xuXG4gICAgICAvLyBDaGVjayBpZiBzY3JvbGxpbmcgZnJvbSByaWdodCB0byBsZWZ0XG4gICAgICBpZiAoY3VycmVudFNjcm9sbExlZnQgPCBsYXN0U2Nyb2xsTGVmdCkge1xuICAgICAgICBpZiAodGFyZ2V0U2VjdGlvbi5oYXNDbGFzcygnYWN0aXZlJykpIHtcbiAgICAgICAgICB0YXJnZXRBbmltYXRlLmFuaW1hdGUoe1xuICAgICAgICAgICAgc2Nyb2xsTGVmdDogMFxuICAgICAgICAgIH0sIDIwMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gQW5pbWF0aW9uIGNvbXBsZXRlLCByZW1vdmUgdGhlIGFjdGl2ZSBjbGFzc1xuICAgICAgICAgICAgdGFyZ2V0U2VjdGlvbi5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFNlY3Rpb24uYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG1heGltdW0gc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgIHZhciBtYXhTY3JvbGxMZWZ0ID0gdGFyZ2V0QW5pbWF0ZVswXS5zY3JvbGxXaWR0aCAtIHRhcmdldEFuaW1hdGUub3V0ZXJXaWR0aCgpO1xuICAgICAgICAvLyBBbmltYXRlIHNjcm9sbCB0byB0aGUgbWF4aW11bSBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgdGFyZ2V0QW5pbWF0ZS5hbmltYXRlKHtcbiAgICAgICAgICBzY3JvbGxMZWZ0OiBtYXhTY3JvbGxMZWZ0XG4gICAgICAgIH0sIDIwMCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgbGFzdCBzY3JvbGwgcG9zaXRpb24gdG8gdGhlIGN1cnJlbnQgb25lIGZvciB0aGUgbmV4dCBzY3JvbGwgZXZlbnRcbiAgICAgIGxhc3RTY3JvbGxMZWZ0ID0gY3VycmVudFNjcm9sbExlZnQ7XG4gICAgfSwgZGVib3VuY2VEZWxheSk7XG4gIH0pO1xuXG4gIC8vIG1ha2UgbmF2IGRhcmsgaWYgZmlyc3QgZWxlbWVudCBpcyBkYXJrXG4gIHZhciBtYWluQm9keVRoZW1lID0gJCgnI2NvbnRlbnQgPjpmaXJzdC1jaGlsZCcpLmF0dHIoJ2RhdGEtdGhlbWUnKTtcbiAgaWYgKG1haW5Cb2R5VGhlbWUgJiYgbWFpbkJvZHlUaGVtZSA9PSAnZGFyaycpIHtcbiAgICAkKCcjaGVhZGVyJykuYXR0cignZGF0YS10aGVtZScsICdkYXJrJyk
1087XG4gIH1cblxuICAvLyBmb3JtIHNwbGl0IHRyaWdnZXIgY2xpY2tcbiAgdmFyIGxvY2F0aW9uLCB1c2FnZSwgZGVza3MsIHNlYXRzO1xuICB2YXIgbWVtUGFyZW50LCBtZW1DaGlsZDtcbiAgLy8gJCgnLmZvcm0tc3BsaXQtc2VjdGlvbiAubmgtcmFkaW8tYnV0dG9uIC5nZmllbGRfcmFkaW8gPiAuZ2Nob2ljZScpLmNsaWNrKGZ1bmN0aW9uKGUpIHtcbiAgZnVuY3Rpb24gbmhNZW1iZXJGb3JtQ2xpY2tzKCkge1xuICAgICQoJy5mb3JtLXNwbGl0LXNlY3Rpb24gLm5oLXJhZGlvLWJ1dHRvbiAuZ2ZpZWxkX3JhZGlvID4gLmdjaG9pY2UnKS5jbGljayhmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gY2hlY2sgaWYgY2xpY2sgbG9jYXRpb24gYnV0dG9uIG9yIG1lbWJlcnNoaXAgdHlwZSBidXR0b25cbiAgICAgIGlmICgkKHRoaXMpLmNsb3Nlc3QoJy5uaC1yYWRpby1tZW1iZXJzaGlwJykubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyByZW1vdmUgYWN0aXZlIGZyb20gcGFyZW50IG5oIHJhZGlvIGJ1dHRvbnNcbiAgICAgICAgJCgnLm5oLXJhZGlvLW1lbWJlcnNoaXAnKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgICQoJy5uaC1yYWRpby1tZW1iZXJzaGlwJykucmVtb3ZlQ2xhc3MoJ25oLXJhZGlvLW1lbWJlcnNoaXAtZGVmYXVsdCcpO1xuXG4gICAgICAgIC8vIFVuY2hlY2sgYWxsIHJhZGlvIGJ1dHRvbnMgaW5zaWRlIGFsbCBkaXZzIHdpdGggdGhlIGNsYXNzIG5oLXJhZGlvLWxvY2F0aW9uXG4gICAgICAgICQodGhpcykuY2xvc2VzdCgnLm5oLXJhZGlvLW1lbWJlcnNoaXAnKS5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgICQoJy5uaC1yYWRpby1tZW1iZXJzaGlwJykuZmluZCgnLmdmaWVsZC1jaG9pY2UtaW5wdXQnKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuICAgICAgICAkKCcubmgtcmFkaW8tbWVtYmVyc2hpcCcpLmZpbmQoJy5nZmllbGQtY2hvaWNlLWlucHV0JykuY2hhbmdlKCk7XG4gICAgICAgICQoJy5uaC1yYWRpby1tZW1iZXJzaGlwIC5nY2hvaWNlJykucmVtb3ZlQ2xhc3MoJ2NoZWNrZWQnKTtcblxuICAgICAgICAvLyBUaGVuLCBjaGVjayB0aGUgcmFkaW8gYnV0dG9uIHdpdGhpbiB0aGUgY2xpY2tlZCAuZ2Nob2ljZVxuICAgICAgICAkKHRoaXMpLmZpbmQoJy5nZmllbGQtY2hvaWNlLWlucHV0JykucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xuICAgICAgICAkKHRoaXMpLmZpbmQoJy5nZmllbGQtY2hvaWNlLWlucHV0JykuY2hhbmdlKCk7XG4gICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2NoZWNrZWQnKTtcbiAgICAgIH0gZWxzZSBpZiAoJCh0aGlzKS5jbG9zZXN0KCcubmgtcmFkaW8tbG9jYXRpb24nKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIEZpcnN0LCB1bmNoZWNrIGFsbCByYWRpbyBidXR0b25zIGluIHRoZSBzYW1lIGdyb3VwXG4gICAgICAgICQodGhpcykuc2libGluZ3MoKS5maW5kKCcuZ2ZpZWxkLWNob2ljZS1pbnB1dCcpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG4gICAgICAgICQodGhpcykuc2libGluZ3MoKS5yZW1vdmVDbGFzcygnY2hlY2tlZCcpO1xuICAgICAgICAvLyBUaGVuLCBjaGVjayB0aGUgcmFkaW8gYnV0dG9uIHdpdGhpbiB0aGUgY2xpY2tlZCAuZ2Nob2ljZVxuICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJy5uaC1yYWRpby1sb2NhdGlvbicpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgJCh0aGlzKS5maW5kKCcuZ2ZpZWxkLWNob2ljZS1pbnB1dCcpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcbiAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnY2hlY2tlZCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmlyc3QsIHVuY2hlY2sgYWxsIHJhZGlvIGJ1dHRvbnMgaW4gdGhlIHNhbWUgZ3JvdXBcbiAgICAgICAgJCh0aGlzKS5zaWJsaW5ncygpLmZpbmQoJy5nZmllbGQtY2hvaWNlLWlucHV0JykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcbiAgICAgICAgJCh0aGlzKS5zaWJsaW5ncygpLnJlbW92ZUNsYXNzKCdjaGVja2VkJyk7XG4gICAgICAgIC8vIFRoZW4sIGNoZWNrIHRoZSByYWRpbyBidXR0b24gd2l0aGluIHRoZSBjbGlja2VkIC5nY2hvaWNlXG4gICAgICAgICQodGhpcykuY2xvc2VzdCgnLm5oLXJhZGlvLWJ1dHRvbicpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgJCh0aGlzKS5maW5kKCcuZ2ZpZWxkLWNob2ljZS1pbnB1dCcpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcbiAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnY2hlY2tlZCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBiZWNvbWUgbWVtYmVyIGZvcm1cbiAgICAgIGlmICgkKHRoaXMpLmNsb3Nlc3QoJy5uaC1iZWNvbWVtZW1iZXItZm9ybScpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gaWYgZmllbGRzZXQgd2l0aCBjbGFzcyBuaC1yYWRpby1zYWxvbiBoYXMgY2xhc3Mgb2YgYWN0aXZlXG4gICAgICAgIGlmICgkKHRoaXMpLmNsb3Nlc3QoJy5uaC1yYWRpby1zYWxvbicpLmhhc0NsYXNzKCdhY3RpdmUnKSkge1xuICAgICAgICAgIC8vIGZpbmQgY2xvc2VzIHN1Ym1pdCBidXR0b24gYW5kIGNoYW5nZSB2YWx1ZSB0byBBcHBseVxuICAgICAgICAgICQoJyNnZm9ybV9zdWJtaXRfYnV0dG9uXzM0JykudmFsKCdBcHBseScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGZpZWxkc2V0IHdpdGggY2xhc3MgbmgtcmFkaW8tcmVzaWRlbnQgaGFzIGNsYXNzIG9mIGFjdGl2ZVxuICAgICAgICBpZiAoJCh0aGlzKS5jbG9zZXN0KCcubmgtcmFkaW8tcmVzaWRlbnQnKS5oYXNDbGFzcygnYWN0aXZlJykpIHtcbiAgICAgICAgICAvLyBmaW5kIGNsb3NlcyBzdWJtaXQgYnV0dG9uIGFuZCBjaGFuZ2UgdmFsdWUgdG8gQXBwbHlcbiAgICAgICAgICAkKCcjZ2Zvcm1fc3VibWl0X2J1dHRvbl8zNCcpLnZhbCgnU3VibWl0Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gYnVpbGQgbWVtYmVyc2hpcCBmb3JtXG4gICAgICBpZiAoJCh0aGlzKS5jbG9zZXN0KCcubmgtcmFkaW8tYnVpbGRtZW1iZXInKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICgkKHRoaXMpLmNsb3Nlc3QoJy5uaC1yYWRpby1idWlsZG1lbWJlcicpLmhhc0NsYXNzKCdsb2NhdGlvbic
108pKSB7XG4gICAgICAgICAgbG9jYXRpb24gPSAkKHRoaXMpLmZpbmQoJy5nZmllbGQtY2hvaWNlLWlucHV0JykudmFsKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoJCh0aGlzKS5jbG9zZXN0KCcubmgtcmFkaW8tYnVpbGRtZW1iZXInKS5oYXNDbGFzcygndXNhZ2UnKSkge1xuICAgICAgICAgIHVzYWdlID0gJCh0aGlzKS5maW5kKCcuZ2ZpZWxkLWNob2ljZS1pbnB1dCcpLnZhbCgpO1xuICAgICAgICB9IGVsc2UgaWYgKCQodGhpcykuY2xvc2VzdCgnLm5oLXJhZGlvLWJ1aWxkbWVtYmVyJykuaGFzQ2xhc3MoJ2Rlc2tzJykpIHtcbiAgICAgICAgICBkZXNrcyA9ICQodGhpcykuZmluZCgnLmdmaWVsZC1jaG9pY2UtaW5wdXQnKS52YWwoKTtcbiAgICAgICAgfSBlbHNlIGlmICgkKHRoaXMpLmNsb3Nlc3QoJy5uaC1yYWRpby1idWlsZG1lbWJlcicpLmhhc0NsYXNzKCdzZWF0cycpKSB7XG4gICAgICAgICAgc2VhdHMgPSAkKHRoaXMpLmZpbmQoJy5nZmllbGQtY2hvaWNlLWlucHV0JykudmFsKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2F0aW9uID09ICdtYWRpc29uLXNxdWFyZScpIHtcbiAgICAgICAgICBsb2NhdGlvbiA9ICdNYWRpc29uIFNxdWFyZSc7XG4gICAgICAgIH0gZWxzZSBpZiAobG9jYXRpb24gPT0gJ2hvbGx5d29vZCcpIHtcbiAgICAgICAgICBsb2NhdGlvbiA9ICdIb2xseXdvb2QnO1xuICAgICAgICB9IGVsc2UgaWYgKGxvY2F0aW9uID09ICd2ZW5pY2UtYmVhY2gnKSB7XG4gICAgICAgICAgbG9jYXRpb24gPSAnVmVuaWNlIEJlYWNoJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVza3MgPT0gJ2RlZGljYXRlZC1kZXNrJykge1xuICAgICAgICAgIG1lbVBhcmVudCA9ICdSZXNpZGVudCc7XG4gICAgICAgICAgbWVtQ2hpbGQgPSAnQXRlbGllcic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlc2tzID09ICdwcml2YXRlLXNwYWNlJykge1xuICAgICAgICAgIG1lbVBhcmVudCA9ICdSZXNpZGVudCc7XG4gICAgICAgICAgbWVtQ2hpbGQgPSAnU3R1ZGlvJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVza3MgPT0gJ2ZsZXhpYmxlLXNlYXRpbmcnKSB7XG4gICAgICAgICAgaWYgKHVzYWdlID09ICd1bmxpbWl0ZWQnKSB7XG4gICAgICAgICAgICBtZW1QYXJlbnQgPSAnUmVzaWRlbnQnO1xuICAgICAgICAgICAgbWVtQ2hpbGQgPSAnR2FsbGVyeSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1lbVBhcmVudCA9ICdTYWxvbic7XG4gICAgICAgICAgICBpZiAoc2VhdHMgPT0gJzEnIHx8IHNlYXRzID09ICcyLTQnKSB7XG4gICAgICAgICAgICAgIG1lbUNoaWxkID0gJ0luZGl2aWR1YWwnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWVtQ2hpbGQgPSAnVGVhbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBjb29raWVzXG4gICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBub3cuc2V0VGltZShub3cuZ2V0VGltZSgpICsgMzY1ICogMjQgKiA2MCAqIDYwICogMTAwMCk7IC8vIDEgeWVhciBmcm9tIG5vd1xuICAgICAgICB2Y
108XIgZXhwaXJlcyA9IFwiZXhwaXJlcz1cIiArIG5vdy50b1VUQ1N0cmluZygpO1xuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBcImxvY2F0aW9uPVwiICsgbG9jYXRpb24gKyBcIjtcIiArIGV4cGlyZXMgKyBcIjtwYXRoPS9cIjtcbiAgICAgICAgdmFyIG1lbWJlcnNoaXBUeXBlID0gbWVtUGFyZW50ICsgJyAnICsgbWVtQ2hpbGQ7XG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IFwibWVtYmVyc2hpcFR5cGU9XCIgKyBtZW1iZXJzaGlwVHlwZSArIFwiO1wiICsgZXhwaXJlcyArIFwiO3BhdGg9L1wiO1xuICAgICAgfVxuICAgIH0pOyAvLyBjbG9zZSBjbGljayBldmVudCBoYW5kbGVyXG4gIH0gLy8gY2xvc2UgbmhNZW1iZXJGb3JtQ2xpY2tzIGZ1bmN0aW9uXG4gIG5oTWVtYmVyRm9ybUNsaWNrcygpO1xuICBmdW5jdGlvbiBnZXRDb29raWUobmFtZSkge1xuICAgIHZhciBjb29raWVBcnIgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoXCI7XCIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29va2llQXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY29va2llUGFpciA9IGNvb2tpZUFycltpXS5zcGxpdChcIj1cIik7XG4gICAgICBpZiAobmFtZSA9PSBjb29raWVQYWlyWzBdLnRyaW0oKSkge1xuICAgICAgICAvLyBEZWNvZGUgdGhlIGNvb2tpZSB2YWx1ZSBhbmQgcmV0dXJuXG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoY29va2llUGFpclsxXSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFJldHVybiBudWxsIGlmIG5vdCBmb3VuZFxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gc2V0IGNvb2tpZXMgdG8gdXNlIG9uIG5leHQgcGFnZSBvZiBmb3JtXG4gICQoZG9jdW1lbnQpLm9uKCdnZm9ybV9wYWdlX2xvYWRlZCcsIGZ1bmN0aW9uIChldmVudCwgZm9ybUlkLCBjdXJyZW50UGFnZSkge1xuICAgICQoJy5fX2J1aWxkbWVtYmVyc2hpcCAuZm9ybV9faW1nJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICAgIGlmICghJCh0aGlzKS5oYXNDbGFzcygnaGlkZGVuJykpIHtcbiAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgJCgnLl9fYnVpbGRtZW1iZXJzaGlwIC5zZWxlY3Rpb25fdGV4dCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG4gICAgfSk7XG4gICAgdmFyIHZpZXdwb3J0V2lkdGggPSAkKHdpbmRvdykud2lkdGgoKTtcbiAgICBpZiAodmlld3BvcnRXaWR0aCA8IDEwMjQpIHtcbiAgICAgICQoJy5fX2J1aWxkbWVtYmVyc2hpcCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgJCh0aGlzKS5oZWlnaHQoMCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnRQYWdlID09IDIpIHtcbiAgICAgIC8vIFJldHJpZXZlIGNvb2tpZSB2YWx1ZXNcbiAgICAgIHZhciBsb2NhdGlvbkNvb2tpZSA9IGdldENvb2tpZShcImxvY2F0aW9uXCIpO1xuICAgICAgdmFyIG1lbWJlcnNoaXBUeXBlQ29va2llID0gZ2V0Q29va2llKFwibWVtYmVyc2hpcFR5cGVcIik7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBjb29raWVzIGV4aXN0IGFuZCBzZXQgdGhlIHRleHQgb2YgdGhlIGZpZWxkcyBhY2NvcmRpbmdseVxuICAgICAgaWYgKGxvY2F0aW9uQ29va2llKSB7XG4gICAgICAgICQoJyNuaC1idWlsZG1lbWJlcmZvcm0tbWVtYmVyc2hpcC1sb2NhdGlvbicpLnRleHQobG9jYXRpb25Db29raWUpO1xuICAgICAgICAkKCcubmgtbG9jYXRpb24tY2FsYycpLmZpbmQoJy5naW5wdXRfY29udGFpbmVyIGlucHV0JykudmFsKGxvY2F0aW9uQ29va2llKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZW1iZXJzaGlwVHlwZUNvb2tpZSkge1xuICAgICAgICAkKCcjbmgtYnVpbGRtZW1iZXJmb3JtLW1lbWJlcnNoaXAtdHlwZScpLnRleHQobWVtYmVyc2hpcFR5cGVDb29raWUpO1xuICAgICAgICAkKCcubmgtbWVtYmVyc2hpcC1jYWxjJykuZmluZCgnLmdpbnB1dF9jb250YWluZXIgaW5wdXQnKS52YWwobWVtYmVyc2hpcFR5cGVDb29raWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBidWlsZCBtZW1iZXIgZm9ybSBzdWJtaXQgYnV0dG9uIHRleHRcbiAgICAgIGlmICgkKCcubmgtYnVpbGRtZW1iZXJmb3JtJykubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBpZiBmaWVsZHNldCB3aXRoIGNsYXNzIG5oLXJhZGlvLXNhbG9uIGhhcyBjbGFzcyBvZiBhY3RpdmVcbiAgICAgICAgaWYgKCQoJyNuaC1idWlsZG1lbWJlcmZvcm0tbWVtYmVyc2hpcC10eXBlJykudGV4dCgpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3NhbG9uJykpIHtcbiAgICAgICAgICAvLyBmaW5kIGNsb3NlcyBzdWJtaXQgYnV0dG9uIGFuZCBjaGFuZ2UgdmFsdWUgdG8gQXBwbHlcbiAgICAgICAgICAkKCcjZ2Zvcm1fc3VibWl0X2J1dHRvbl8zNScpLnZhbCgnQXBwbHknKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBmaWVsZHNldCB3aXRoIGNsYXNzIG5oLXJhZGlvLXJlc2lkZW50IGhhcyBjbGFzcyBvZiBhY3RpdmVcbiAgICAgICAgaWYgKCQoJyNuaC1idWlsZG1lbWJlcmZvcm0tbWVtYmVyc2hpcC10eXBlJykudGV4dCgpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3Jlc2lkZW50JykpIHtcbiAgICAgICAgICAvLyBmaW5kIGNsb3NlcyBzdWJtaXQgYnV0dG9uIGFuZCBjaGFuZ2UgdmFsdWUgdG8gQXBwbHlcbiAgICAgICAgICAkKCcjZ2Zvcm1fc3VibWl0X2J1dHRvbl8zNScpLnZhbCgnU3VibWl0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaG93IHRoZSByaWdodCBpbWFnZVxuICAgICAgICAvLyByZW1vdmUgdGhlIHdvcmQgJ3NhbG9uJyBvciAncmVzaWRlbnQnIGZyb20gdGhlIG1lbWJlcnNoaXAgdHlwZVxuICAgICAgICB2Y
108XIgbWVtYmVyc2hpcFR5cGUgPSAkKCcjbmgtYnVpbGRtZW1iZXJmb3JtLW1lbWJlcnNoaXAtdHlwZScpLnRleHQoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBtZW1iZXJzaGlwVHlwZSA9IG1lbWJlcnNoaXBUeXBlLnJlcGxhY2UoJ3NhbG9uJywgJycpO1xuICAgICAgICBtZW1iZXJzaGlwVHlwZSA9IG1lbWJlcnNoaXBUeXBlLnJlcGxhY2UoJ3Jlc2lkZW50JywgJycpO1xuICAgICAgICBtZW1iZXJzaGlwVHlwZSA9IG1lbWJlcnNoaXBUeXBlLnRyaW0oKTtcblxuICAgICAgICAvL3NsdWdpZnkgbG9jYXRpb24sIHJlcGxhY2VzIHNwYWNlcyB3aXRoIGRhc2hlc1xuICAgICAgICB2YXIgX2xvY2F0aW9uID0gJCgnI25oLWJ1aWxkbWVtYmVyZm9ybS1tZW1iZXJzaGlwLWxvY2F0aW9uJykudGV4dCgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIF9sb2NhdGlvbiA9IF9sb2NhdGlvbi5yZXBsYWNlKC9cXHMrL2csICctJyk7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2cobG9jYXRpb24sIG1lbWJlcnNoaXBUeXBlKTtcblxuICAgICAgICAkKCcuX19idWlsZG1lbWJlcnNoaXAgLmZvcm1fX2ltZ1tkYXRhLWxvY2F0aW9uPVwiJyArIF9sb2NhdGlvbiArICdcIl1bZGF0YS1tZW1iZXJzaGlwPVwiJyArIG1lbWJlcnNoaXBUeXBlICsgJ1wiXScpLmFkZENsYXNzKCdhY3RpdmUnKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICQoJy5fX2J1aWxkbWVtYmVyc2hpcCAuc2VsZWN0aW9uX3RleHRbZGF0YS1sb2NhdGlvbj1cIicgKyBfbG9jYXRpb24gKyAnXCJdW2RhdGEtbWVtYmVyc2hpcD1cIicgKyBtZW1iZXJzaGlwVHlwZSArICdcIl0nKS5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgIGlmICh2aWV3cG9ydFdpZHRoIDwgMTAyNCkge1xuICAgICAgICAgICQoJyNnZm9ybV8nICsgZm9ybUlkKS5jbG9zZXN0KCcuZHluYW1pYy1lbmFibGVkJykuZmluZCgnLl9fYnVpbGRtZW1iZXJzaGlwJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygkKHRoaXMpKVxuICAgICAgICAgICAgLy8gJChjdXJyZW50UGFnZSkuY2xvc2VzdCgnLmR5YW5taWMtZW5hYmxlZCcpLmZpbmQoJy5fX2J1aWxkbWVtYmVyc2hpcCcpLmVhY2goZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7XG4gICAgICAgICAgICB2Y
108XIgY3VycmVudEhlaWdodCA9ICR0aGlzLmhlaWdodCgpO1xuICAgICAgICAgICAgdmFyIGF1dG9IZWlnaHQgPSAkdGhpcy5jc3MoJ2hlaWdodCcsICdhdXRvJykuaGVpZ2h0KCk7XG4gICAgICAgICAgICAkdGhpcy5oZWlnaHQoY3VycmVudEhlaWdodCk7IC8vIFJlc2V0IHRvIG9yaWdpbmFsIGhlaWdodFxuXG4gICAgICAgICAgICAkdGhpcy5hbmltYXRlKHtcbiAgICAgICAgICAgICAgaGVpZ2h0OiBhdXRvSGVpZ2h0XG4gICAgICAgICAgICB9LCA0MDApOyAvLyBBZGp1c3QgdGhlIGR1cmF0aW9uIGFzIG5lZWRlZFxuICAgICAgICAgICAgJHRoaXMuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICQoJyNnZm9ybV8nICsgZm9ybUlkKS5jbG9zZXN0KCcuZHluYW1pYy1lbmFibGVkJykuZmluZCgnLl9fYnVpbGRtZW1iZXJzaGlwJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnYWN0aXZlJykpIHtcbiAgICAgICAgICAgICAgJCh0aGlzKS5oZWlnaHQoJ2F1dG8nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3JtRGVmYXVsdENoZWNrZWQoKTtcbiAgICBuaE1lbWJlckZvcm1DbGlja3MoKTtcbiAgfSk7XG5cbiAgLy8gc2V0IGxvY2F0aW9uIGNvb2tpZSB3aXRob3V0IGNsaWNrXG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGlmICgkKCcuZ2Zvcm1fcGFnZScpLmhhc0NsYXNzKCduaC1idWlsZG1lbWJlcmZvcm0nKSkge1xuICAgICAgaWYgKCQoJy5uaC1yYWRpby1idWlsZG1lbWJlci5sb2NhdGlvbicpLmhhc0NsYXNzKCdhY3RpdmUnKSkge1xuICAgICAgICBsb2NhdGlvbiA9ICQoJy5uaC1yYWRpby1idWlsZG1lbWJlci5sb2NhdGlvbiAuZ2ZpZWxkLWNob2ljZS1pbnB1dDpjaGVja2VkJykudmFsKCk7XG4gICAgICAgIGlmIChsb2NhdGlvbiA9PSAnbWFkaXNvbi1zcXVhcmUnKSB7XG4gICAgICAgICAgbG9jYXRpb24gPSAnTWFkaXNvbiBTcXVhcmUnO1xuICAgICAgICB9IGVsc2UgaWYgKGxvY2F0aW9uID09ICdob2xseXdvb2QnKSB7XG4gICAgICAgICAgbG9jYXRpb24gPSAnSG9sbHl3b29kJztcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhdGlvbiA9PSAndmVuaWNlLWJlYWNoJykge1xuICAgICAgICAgIGxvY2F0aW9uID0gJ1ZlbmljZSBCZWFjaCc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgIG5vdy5zZXRUaW1lKG5vdy5nZXRUaW1lKCkgKyAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwKTsgLy8gMSB5ZWFyIGZyb20gbm93XG4gICAgICAgIHZhciBleHBpcmVzID0gXCJleHBpcmVzPVwiICsgbm93LnRvVVRDU3RyaW5nKCk7XG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IFwibG9jYXRpb249XCIgKyBsb2NhdGlvbiArIFwiO1wiICsgZXhwaXJlcyArIFwiO3BhdGg9L1wiO1xuICAgICAgfVxuICAgIH1cbiAgfSwgODAwKTtcblxuICAvLyBmb3JtIHNwbGl0IGxvYWQgZGVmYXVsdCBjaGVja2VkIG9uIG1lbWJlcnNoaXAgcGFnZXNcbiAgZnVuY3Rpb24gZm9ybURlZmF1bHRDaGVja2VkKCkge1xuICAgIGlmICgkKCcubmgtcmFkaW8tYnV0dG9uJykubGVuZ3RoID4gMCkge1xuICAgICAgJCgnLm5oLXJhZGlvLWJ1dHRvbicpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2Y
108XIgcmFkaW9DaGVja2VkID0gJCh0aGlzKS5maW5kKCcuZ2ZpZWxkLWNob2ljZS1pbnB1dDpjaGVja2VkJykuY2xvc2VzdCgnLmdjaG9pY2UnKTtcbiAgICAgICAgcmFkaW9DaGVja2VkLmFkZENsYXNzKCdjaGVja2VkJyk7XG4gICAgICAgIHJhZGlvQ2hlY2tlZC5jbG9zZXN0KCcubmgtcmFkaW8tYnV0dG9uJykuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGlmIG5vIGdjaG9pY2UgaXRlbXMgaGF2ZSBjbGFzcyBjaGVja2VkLCBhZGQgY2xhc3MgbmgtcmFkaW8tbWVtYmVyc2hpcC1kZWZhdWx0IHRvIHRoZSBlbGVtZW50IHdpdGggY2xhc3MgbmgtcmFkaW8tbWVtYmVyc2hpcFxuICAgIGlmICgkKCcubmgtcmFkaW8tbWVtYmVyc2hpcCAuZ2Nob2ljZS5jaGVja2VkJykubGVuZ3RoID09IDApIHtcbiAgICAgICQoJy5uaC1yYWRpby1tZW1iZXJzaGlwJykuYWRkQ2xhc3MoJ25oLXJhZGlvLW1lbWJlcnNoaXAtZGVmYXVsdCcpO1xuICAgIH1cblxuICAgIC8vIGJlY29tZSBtZW1iZXIgZm9ybVxuICAgIGlmICgkKCcubmgtYmVjb21lbWVtYmVyLWZvcm0nKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBpZiBmaWVsZHNldCB3aXRoIGNsYXNzIG5oLXJhZGlvLXNhbG9uIGhhcyBjbGFzcyBvZiBhY3RpdmVcbiAgICAgIGlmICgkKCcubmgtYmVjb21lbWVtYmVyLWZvcm0gLm5oLXJhZGlvLXNhbG9uJykuaGFzQ2xhc3MoJ2FjdGl2ZScpKSB7XG4gICAgICAgIC8vIGZpbmQgY2xvc2VzIHN1Ym1pdCBidXR0b24gYW5kIGNoYW5nZSB2YWx1ZSB0byBBcHBseVxuICAgICAgICAkKCcubmgtYmVjb21lbWVtYmVyLWZvcm0gaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScpLnZhbCgnQXBwbHknKTtcbiAgICAgIH1cbiAgICAgIC8vIGlmIGZpZWxkc2V0IHdpdGggY2xhc3MgbmgtcmFkaW8tcmVzaWRlbnQgaGFzIGNsYXNzIG9mIGFjdGl2ZVxuICAgICAgaWYgKCQodGhpcykuY2xvc2VzdCgnLm5oLXJhZGlvLXJlc2lkZW50JykuaGFzQ2xhc3MoJ2FjdGl2ZScpKSB7XG4gICAgICAgIC8vIGZpbmQgY2xvc2VzIHN1Ym1pdCBidXR0b24gYW5kIGNoYW5nZSB2YWx1ZSB0byBBcHBseVxuICAgICAgICAkKCcubmgtYmVjb21lbWVtYmVyLWZvcm0gaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScpLnZhbCgnU3VibWl0Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZvcm1EZWZhdWx0Q2hlY2tlZCgpO1xuICAkKCcubmgtcmFkaW8tYnV0dG9uIC5nZmllbGRfcmFkaW8gLmdjaG9pY2UnKS5ob3ZlcihmdW5jdGlvbiAoKSB7XG4gICAgJCh0aGlzKS5jbG9zZXN0KCcubmgtcmFkaW8tYnV0dG9uJykudG9nZ2xlQ2xhc3MoJ2hvdmVyJyk7XG4gIH0pO1xuXG4gIC8vIHNhdmUgaW1wb3J0YW50IGZvcm0gaW5wdXRzIHRvIERvbSB0byB1c2UgaW4gcmVkaXJlY3RcbiAgZnVuY3Rpb24gbmhHZkNvbGxlY3RJbnB1dHMoZm9ybUlkTnVtKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2NvbGxlY3RpbmcgaW5wdXRzJyk7XG4gICAgdmFyIGdmb3JtSWRzID0gWyczNCcsICczNSddO1xuICAgIGlmICgkKCcjZ2Zvcm1fJyArIGZvcm1JZE51bSArICdfdmFsaWRhdGlvbl9jb250YWluZXInKS5oYXNDbGFzcygnZ2Zvcm1fdmFsaWRhdGlvbl9lcnJvcicpIHx8ICFnZm9ybUlkcy5pbmNsdWRlcyhmb3JtSWROdW0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciAkZm9ybUlkID0gJCgnI2dmb3JtXycgKyBmb3JtSWROdW0pO1xuXG4gICAgLy8gaWYgZm9ybSBpZCBub3QgZm91bmQgcmV0dXJuXG4gICAgaWYgKCRmb3JtSWQubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHNhbG9uQ2hlY2sgPSBmYWxzZTtcbiAgICB2YXIgbG9jYXRpb25UYXJnZXQsIG1lbWJlcnNoaXBUYXJnZXQ7XG4gICAgaWYgKGZvcm1JZE51bSA9PSAzNSkge1xuICAgICAgbG9jYXRpb25UYXJnZXQgPSAkKCcjbmgtYnVpbGRtZW1iZXJmb3JtLW1lbWJlcnNoaXAtbG9jYXRpb24nKS50ZXh0KCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIG1lbWJlcnNoaXBUYXJnZXQgPSAkKCcjbmgtYnVpbGRtZW1iZXJmb3JtLW1lbWJlcnNoaXAtdHlwZScpLnRleHQoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgc2Fsb25DaGVjayA9IG1lbWJlcnNoaXBUYXJnZXQuaW5jbHVkZXMoJ3NhbG9uJyk7XG4gICAgfVxuICAgIGlmIChmb3JtSWROdW0gPT0gMzQpIHtcbiAgICAgIGxvY2F0aW9uVGFyZ2V0ID0gJGZvcm1JZC5maW5kKCcubmgtcmFkaW8tbG9jYXRpb24gaW5wdXQ6Y2hlY2tlZCcpLnZhbCgpO1xuICAgICAgbWVtYmVyc2hpcFRhcmdldCA9ICRmb3JtSWQuZmluZCgnLm5oLXJhZGlvLXNhbG9uJykuaGFzQ2xhc3MoJ2FjdGl2ZScpID8gJ3NhbG9uJyA6ICdyZXNpZGVudCc7XG4gICAgICBzYWxvbkNoZWNrID0gbWVtYmVyc2hpcFRhcmdldC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdzYWxvbicpO1xuICAgIH1cbiAgICAkZm9ybUlkLmNsb3Nlc3QoJy5mb3JtLXNwbGl0LXNlY3Rpb24nKS5hdHRyKCdkYXRhLWxvY2F0aW9uLXRhcmdldCcsIGxvY2F0aW9uVGFyZ2V0KTtcbiAgICAkZm9ybUlkLmNsb3Nlc3QoJy5mb3JtLXNwbGl0LXNlY3Rpb24nKS5hdHRyKCdkYXRhLW1lbWJlcnNoaXAtdGFyZ2V0JywgbWVtYmVyc2hpcFRhcmdldC50b0xvd2VyQ2FzZSgpKTtcbiAgICAkZm9ybUlkLmNsb3Nlc3QoJy5mb3JtLXNwbGl0LXNlY3Rpb24nKS5hdHRyKCdkYXRhLXNhbG9uLWNoZWNrJywgc2Fsb25DaGVjayk7XG4gIH1cblxuICAvLyBjb2xsZWN0aW9uIGlucHV0cyBvbiBmb3JtIHN1Ym1pc3Npb25cbiAgJCgnYm9keScpLm9uKCdjbGljaycsICdpbnB1dFtpZF49XCJnZm9ybV9zdWJtaXRfYnV0dG9uX1wiXScsIGZ1bmN0aW9uIChlKSB7XG4gICAgLy8gR2V0IHRoZSBidXR0b24ncyBJRFxuICAgIHZhciBidXR0b25JZCA9ICQodGhpcykuYXR0cignaWQnKTtcbiAgICAvLyBFeHRyYWN0IHRoZSBudW1iZXIgZnJvbSB0aGUgSURcbiAgICB2YXIgZm9ybU51bWJlciA9IGJ1dHRvbklkLnJlcGxhY2UoJ2dmb3JtX3N1Ym1pdF9idXR0b25fJywgJycpO1xuICAgIG5oR2ZDb2xsZWN0SW5wdXRzKGZvcm1OdW1iZXIpO1xuICB9KTtcblxuICAvLyBzdGlsbCBub3Qgc3VyZSBzaG93IGZvcm1cbiAgJCgnYm9keScpLm9uKCdjbGljaycsICcjc3RpbGwtbm90LXN1cmUnLCBmdW5jdGlvbiAoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAkKHRoaXMpLmNsb3Nlc3QoJy5jb250YWN0X2Zvcm0nKS5maW5kKCcuZ2ZpZWxkX2Vycm9yJykucmVtb3ZlQ2xhc3MoJ2dmaWVsZF9lcnJvcicpOyAvLyBSZW1vdmUgZXJyb3IgY2xhc3MgZnJvbSBmaWVsZHNcbiAgICAkKHRoaXMpLmNsb3Nlc3QoJy5jb250YWN0X2Zvcm0nKS5maW5kKCcudmFsaWRhdGlvbl9tZXNzYWdlJykuaGlkZSgpOyAvLyBIaWRlIHZhbGlkYXRpb24gbWVzc2FnZXNcbiAgICAkKHRoaXMpLmNsb3Nlc3QoJy5jb250YWN0X2Zvcm0nKS5maW5kKCcudmFsaWRhdGlvbl9lcnJvcicpLmhpZGUoKTsgLy8gSGlkZSB0aGUgZm9ybS13aWRlIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZVxuICAgICQo
108dGhpcykuY2xvc2VzdCgnLmNvbnRhY3RfZm9ybScpLmZpbmQoJy5nZm9ybV92YWxpZGF0aW9uX2Vycm9ycycpLmhpZGUoKTsgLy8gSGlkZSB0aGUgZm9ybS13aWRlIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZVxuXG4gICAgJCh0aGlzKS5jbG9zZXN0KCcuZm9ybS1zcGxpdC1zZWN0aW9uJykuZmluZCgnLmNvbnRhY3RfZm9ybS1ub3Qtc3VyZScpLnNob3coKTtcbiAgICAkKHRoaXMpLmNsb3Nlc3QoJy5jb250YWN0X2Zvcm0nKS5oaWRlKCk7XG4gIH0pO1xuXG4gIC8vIHN0aWxsIG5vdCBzdXJlIGhpZGUgZm9ybVxuICAkKCdib2R5Jykub24oJ2NsaWNrJywgJyNzdGlsbC1ub3Qtc3VyZS1vZmYnLCBmdW5jdGlvbiAoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAkKHRoaXMpLmNsb3Nlc3QoJy5jb250YWN0X2Zvcm0nKS5maW5kKCcuZ2ZpZWxkX2Vycm9yJykucmVtb3ZlQ2xhc3MoJ2dmaWVsZF9lcnJvcicpOyAvLyBSZW1vdmUgZXJyb3IgY2xhc3MgZnJvbSBmaWVsZHNcbiAgICAkKHRoaXMpLmNsb3Nlc3QoJy5jb250YWN0X2Zvcm0nKS5maW5kKCcudmFsaWRhdGlvbl9tZXNzYWdlJykuaGlkZSgpOyAvLyBIaWRlIHZhbGlkYXRpb24gbWVzc2FnZXNcbiAgICAkKHRoaXMpLmNsb3Nlc3QoJy5jb250YWN0X2Zvcm0nKS5maW5kKCcudmFsaWRhdGlvbl9lcnJvcicpLmhpZGUoKTsgLy8gSGlkZSB0aGUgZm9ybS13aWRlIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZVxuICAgICQodGhpcykuY2xvc2VzdCgnLmNvbnRhY3RfZm9ybScpLmZpbmQoJy5nZm9ybV92YWxpZGF0aW9uX2Vycm9ycycpLmhpZGUoKTsgLy8gSGlkZSB0aGUgZm9ybS13aWRlIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZVxuXG4gICAgJCh0aGlzKS5jbG9zZXN0KCcuZm9ybS1zcGxpdC1zZWN0aW9uJykuZmluZCgnLmNvbnRhY3RfZm9ybScpLnNob3coKTtcbiAgICAkKHRoaXMpLmNsb3Nlc3QoJy5mb3JtLXNwbGl0LXNlY3Rpb24nKS5maW5kKCcuY29udGFjdF9mb3JtLW5vdC1zdXJlJykuaGlkZSgpO1xuICAgIC8vY2xvc2VzdCBjb250YWN0X2Zvcm0gd2l0aG91dCBjbGFzcyAuY29udGFjdF9mb3JtLW5vdC1zdXJlXG4gIH0pO1xuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvLyBkeW5hbWljIGZvcm0gZGF0YVxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gQmluZCBjbGljayBldmVudCB0byAuZ2ZpZWxkLWNob2ljZS1pbnB1dCBhbmQgLmdjaG9pY2UgZWxlbWVudHNcbiAgJCgnLmdmaWVsZC1jaG9pY2UtaW5wdXQsIC5nY2hvaWNlJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IGZvcm0tc3BsaXQtc2VjdGlvbiBwYXJlbnRcbiAgICB2YXIgc2VjdGlvbiA9ICQodGhpcykuY2xvc2VzdCgnLmZvcm0tc3BsaXQtc2VjdGlvbicpO1xuICAgIG5oRm9ybUFjdGl2ZUlucHV0cyhzZWN0aW9uKTtcbiAgfSk7XG4gIGZ1bmN0aW9uIG5oRm9ybUFjdGl2ZUlucHV0cyhzZWN0aW9uKSB7XG4gICAgLy8gZmluZCB0aGUgY2hpbGQgaW5wdXQgb2YgbmgtcmFkaW8tbWVtYmVyc2hpcCBhbmQgbmgtcmFkaW8tbG9jYXRpb24gdGhhdCBhcmUgY2hlY2tlZCB3aXRoaW4gdGhlIHNlY3Rpb25cbiAgICB2YXIgbWVtYmVyc2hpcENoZWNrZWQgPSBzZWN0aW9uLmZpbmQoJy5uaC1yYWRpby1tZW1iZXJzaGlwIC5nZmllbGQtY2hvaWNlLWlucHV0OmNoZWNrZWQnKS52YWwoKTtcbiAgICB2YXIgbG9jYXRpb25DaGVja2VkID0gc2VjdGlvbi5maW5kKCcubmgtcmFkaW8tbG9jYXRpb24gLmdmaWVsZC1jaG9pY2UtaW5wdXQ6Y2hlY2tlZCcpLnZhbCgpO1xuXG4gICAgLy8gY29uc29sZS5sb2cobWVtYmVyc2hpcENoZWNrZWQsIGxvY2F0aW9uQ2hlY2tlZCk7XG5cbiAgICAvLyBTY29wZSB0byB0aGUgc2VjdGlvbiB3aXRoIGNsYXNzICdmb3JtLXNwbGl0LXNlY3Rpb24nXG4gICAgc2VjdGlvbi5maW5kKCcuZm9ybV9faW1nJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoJCh0aGlzKS5kYXRhKCdtZW1iZXJzaGlwJykgPT0gbWVtYmVyc2hpcENoZWNrZWQgJiYgJCh0aGlzKS5kYXRhKCdsb2NhdGlvbicpID09IGxvY2F0aW9uQ2hlY2tlZCB8fCAkKHRoaXMpLmRhdGEoJ21lbWJlcnNoaXAnKSA9PSAnYW55JyAmJiAkKHRoaXMpLmRhdGEoJ2xvY2F0aW9uJykgPT0gbG9jYXRpb25DaGVja2VkKSB7XG4gICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpLmFkZENsYXNzKCdhY3RpdmUnKTtcblxuICAgICAgICAvLyBhbmltYXRlIHNlY3Rpb24gaGVpZ2h0IG9uIG1vYmlsZVxuICAgICAgICB2Y
108XIgdmlld3BvcnRXaWR0aCA9ICQod2luZG93KS53aWR0aCgpO1xuICAgICAgICB2YXIgJHNlY3Rpb25UZXh0ID0gc2VjdGlvbi5maW5kKCcuZm9ybS1zcGxpdC1zZWN0aW9uX190ZXh0Jyk7XG4gICAgICAgIGlmICh2aWV3cG9ydFdpZHRoIDwgNzY4KSB7XG4gICAgICAgICAgc2VjdGlvbi5maW5kKCcuZm9ybS1zcGxpdC1zZWN0aW9uX19pbWFnZXMnKS5hZGRDbGFzcygnYWN0aXZlJykuYW5pbWF0ZSh7XG4gICAgICAgICAgICBoZWlnaHQ6ICcxNzAnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodmlld3BvcnRXaWR0aCA8IDEwMjQpIHtcbiAgICAgICAgICBzZWN0aW9uLmZpbmQoJy5mb3JtLXNwbGl0LXNlY3Rpb25fX2ltYWdlcycpLmFkZENsYXNzKCdhY3RpdmUnKS5hbmltYXRlKHtcbiAgICAgICAgICAgIGhlaWdodDogJzIyMCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoISRzZWN0aW9uVGV4dC5oYXNDbGFzcygnYWN0aXZlJykpIHtcbiAgICAgICAgICAgIHNlY3Rpb24uZmluZCgnLmZvcm0tc3BsaXQtc2VjdGlvbl9fdGV4dCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpO1xuICAgICAgICAgICAgICB2YXIgdGFsbGVzdEhlaWdodCA9IDA7XG5cbiAgICAgICAgICAgICAgLy8gRmluZCB0aGUgdGFsbGVzdCBwLnNlbGVjdGlvbl90ZXh0XG4gICAgICAgICAgICAgICR0aGlzLmZpbmQoJ3Auc2VsZWN0aW9uX3RleHQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2Y
108XIgdGV4dEhlaWdodCA9ICQodGhpcykuaGVpZ2h0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRleHRIZWlnaHQgPiB0YWxsZXN0SGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICB0YWxsZXN0SGVpZ2h0ID0gdGV4dEhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAkdGhpcy5jc3MoJ2hlaWdodCcsICcwJyk7IC8vIFJlc2V0IHRvIG9yaWdpbmFsIGhlaWdodCBvZiAwXG5cbiAgICAgICAgICAgICAgJHRoaXMuYW5pbWF0ZSh7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0YWxsZXN0SGVpZ2h0XG4gICAgICAgICAgICAgIH0sIDQwMCk7IC8vIEFkanVzdCB0aGUgZHVyYXRpb24gYXMgbmVlZGVkXG4gICAgICAgICAgICAgICR0aGlzLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghJCh0aGlzKS5oYXNDbGFzcygnaGlkZGVuJykpIHtcbiAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnaGlkZGVuJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHNlY3Rpb24uZmluZCgnLnNlbGVjdGlvbl90ZXh0JykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoJCh0aGlzKS5kYXRhKCdtZW1iZXJzaGlwJykgPT0gbWVtYmVyc2hpcENoZWNrZWQgJiYgJCh0aGlzKS5kYXRhKCdsb2NhdGlvbicpID09IGxvY2F0aW9uQ2hlY2tlZCkge1xuICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gRGVib3VuY2UgZnVuY3Rpb25cbiAgZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCkge1xuICAgIHZhciB0aW1lb3V0O1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB2Y
108XIgX3RoaXMgPSB0aGlzO1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG4gICAgICB2YXIgbGF0ZXIgPSBmdW5jdGlvbiBsYXRlcigpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBmdW5jLmFwcGx5KF90aGlzLCBhcmdzKTtcbiAgICAgIH07XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgdGFsbGVzdCBoZWlnaHQgYW5kIHJlYXBwbHkgdGhlIGZ1bmN0aW9uIG9uIHdpbmRvdyByZXNpemVcbiAgZnVuY3Rpb24gdXBkYXRlVGFsbGVzdEhlaWdodCgpIHtcbiAgICB2YXIgdmlld3BvcnRXaWR0aCA9ICQod2luZG93KS53aWR0aCgpO1xuICAgIGlmICh2aWV3cG9ydFdpZHRoIDwgMTAyNCkge1xuICAgICAgLy8gYmVjb21lIG1lbWJlclxuICAgICAgJCgnLmR5bmFtaWMtZW5hYmxlZCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoJCh0aGlzKS5maW5kKCcuX19iZWNvbWVtZW1iZXInKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKCQodGhpcykuZmluZCgnLmZvcm0tc3BsaXQtc2VjdGlvbl9faW1hZ2VzJykuaGFzQ2xhc3MoJ2FjdGl2ZScpKSB7XG4gICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5mb3JtLXNwbGl0LXNlY3Rpb25fX2ltYWdlcy5hY3RpdmUnKS5jc3MoJ2hlaWdodCcsICcxNzBweCcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5mb3JtLXNwbGl0LXNlY3Rpb25fX2ltYWdlcycpLmNzcygnaGVpZ2h0JywgJzAnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHRhbGxlc3RIZWlnaHQgPSAwO1xuICAgICAgICAgICQodGhpcykuZmluZCgncC5zZWxlY3Rpb25fdGV4dCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRleHRIZWlnaHQgPSAkKHRoaXMpLmhlaWdodCgpO1xuICAgICAgICAgICAgaWYgKHRleHRIZWlnaHQgPiB0YWxsZXN0SGVpZ2h0KSB7XG4gICAgICAgICAgICAgIHRhbGxlc3RIZWlnaHQgPSB0ZXh0SGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciB0ZXh0Q29udGFpbmVyID0gJCh0aGlzKS5maW5kKCcuZm9ybS1zcGxpdC1zZWN0aW9uX190ZXh0Jyk7XG4gICAgICAgICAgaWYgKHRleHRDb250YWluZXIuaGFzQ2xhc3MoJ2FjdGl2ZScpKSB7XG4gICAgICAgICAgICB0ZXh0Q29udGFpbmVyLmFuaW1hdGUoe1xuICAgICAgICAgICAgICBoZWlnaHQ6IHRhbGxlc3RIZWlnaHRcbiAgICAgICAgICAgIH0sIDQwMCk7IC8vIEFuaW1hdGUgdG8gdGhlIHRhbGxlc3QgaGVpZ2h0XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICgkKHRoaXMpLmZpbmQoJy5fX2J1aWxkbWVtYmVyc2hpcCcpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAoJCh0aGlzKS5maW5kKCcuX19idWlsZG1lbWJlcnNoaXAnKS5oYXNDbGFzcygnYWN0aXZlJykpIHtcbiAgICAgICAgICAgICQodGhpcykuZmluZCgnLl9fYnVpbGRtZW1iZXJzaGlwJykuY3NzKCdoZWlnaHQnLCAnYXV0bycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5fX2J1aWxkbWVtYmVyc2hpcCcpLmNzcygnaGVpZ2h0JywgJzAnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodmlld3BvcnRXaWR0aCA+IDEwMjQpIHtcbiAgICAgICQoJy5keW5hbWljLWVuYWJsZWQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCQodGhpcykuZmluZCgnLl9fYmVjb21lbWVtYmVyJykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICQodGhpcykuZmluZCgnLmZvcm0tc3BsaXQtc2VjdGlvbl9faW1hZ2VzJykuY3NzKCdoZWlnaHQnLCAnYXV0bycpO1xuICAgICAgICAgICQodGhpcykuZmluZCgnLmZvcm0tc3BsaXQtc2VjdGlvbl9fdGV4dCcpLmNzcygnaGVpZ2h0JywgJ2F1dG8nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJCh0aGlzKS5maW5kKCcuX19idWlsZG1lbWJlcnNoaXAnKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgJCh0aGlzKS5maW5kKCcuX19idWlsZG1lbWJlcnNoaXAnKS5jc3MoJ2hlaWdodCcsICdhdXRvJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEJpbmQgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB0byB3aW5kb3cgcmVzaXplXG4gICQod2luZG93KS5yZXNpemUoZGVib3VuY2UodXBkYXRlVGFsbGVzdEhlaWdodCwgMjAwKSk7XG4gIGZ1bmN0aW9uIGVxdWFsaXplSGVhZGVySGVpZ2h0cygpIHtcbiAgICB2YXIgJGhlYWRlcnMgPSAkKCcuY29tcGFyaXNvbi1jaGlsZC1oZWFkZXInKTtcbiAgICB2YXIgbWF4SGVpZ2h0ID0gMDtcbiAgICB2YXIgdGFsbGVzdEhlYWRlciA9IG51bGw7XG5cbiAgICAvLyBSZXNldCBoZWlnaHRzIGFuZCBsb2cgaW5pdGlhbCBzdGF0ZVxuICAgICRoZWFkZXJzLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAkKHRoaXMpLmNzcygnaGVpZ2h0JywgJ2F1dG8nKTtcbiAgICAgIHZhciBjdXJyZW50SGVpZ2h0ID0gJCh0aGlzKS5vdXRlckhlaWdodCgpO1xuICAgICAgaWYgKGN1cnJlbnRIZWlnaHQgPiBtYXhIZWlnaHQpIHtcbiAgICAgICAgbWF4SGVpZ2h0ID0gY3VycmVudEhlaWdodDtcbiAgICAgICAgdGFsbGVzdEhlYWRlciA9ICQodGhpcyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTZXQgYWxsIGhlYWRlcnMgdG8gdGhlIGhlaWdodCBvZiB0aGUgdGFsbGVzdCBoZWFkZXJcbiAgICAkaGVhZGVycy5oZWlnaHQobWF4SGVpZ2h0KTtcbiAgfVxuICAvLyBSdW4gYWZ0ZXIgYSBzaG9ydCBkZWxheSB0byBlbnN1cmUgY29udGVudCBpcyBsb2FkZWRcbiAgc2V0VGltZW91dChlcXVhbGl6ZUhlYWRlckhlaWdodHMsIDEwMCk7XG5cbiAgLy8gUnVuIG9uIHdpbmRvdyByZXNpemUsIGJ1dCB3YWl0IHVudGlsIHJlc2l6ZSBpcyBmaW5pc2hlZFxuICB2YXIgcmVzaXplVGltZXI7XG4gICQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgIGNsZWFyVGltZW91dChyZXNpemVUaW1lcik7XG4gICAgcmVzaXplVGltZXIgPSBzZXRUaW
1081lb3V0KGVxdWFsaXplSGVhZGVySGVpZ2h0cywgMjUwKTtcbiAgfSk7XG5cbiAgLy8gSWYgeW91J3JlIHVzaW5nIGFueSBpbWFnZSBsYXp5LWxvYWRpbmcsIHJ1biBhZnRlciBpbWFnZXMgbG9hZFxuICAvLyAkKCdpbWcnKS5vbignbG9hZCcsIGVxdWFsaXplSGVhZGVySGVpZ2h0cyk7XG59KTtcblxuLy8gQ3JlYXRlIGlmcmFtZXMgYWZ0ZXIgcGFnZSBsb2FkXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xuICB2YXIgcGxhY2Vob2xkZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnZpZGVvLWVtYmVkLXBsYWNlaG9sZGVyJyk7XG4gIHBsYWNlaG9sZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChwbGFjZWhvbGRlcikge1xuICAgIHZhciBfaWZyYW1lJGNsYXNzTGlzdDtcbiAgICB2YXIgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG5cbiAgICAvLyBJbml0aWFsbHkgc2V0IG9wYWNpdHkgdG8gMFxuICAgIC8vIGlmcmFtZS5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgIC8vIGlmcmFtZS5zdHlsZS50cmFuc2l0aW9uID0gJ29wYWNpdHkgMXMgZWFzZS1pbi1vdXQnO1xuXG4gICAgLy8gU2V0IHRoZSBzcmMgYXR0cmlidXRlXG4gICAgaWZyYW1lLnNyYyA9IHBsYWNlaG9sZGVyLmRhdGFzZXQuc3JjO1xuXG4gICAgLy8gU2V0IGFkZGl0aW9uYWwgYXR0cmlidXRlc1xuICAgIHZhciBhdHRyaWJ1dGVzID0gcGxhY2Vob2xkZXIuZGF0YXNldC5hdHRyaWJ1dGVzLnNwbGl0KCcgJyk7XG4gICAgYXR0cmlidXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgICB2Y
108XIgX2F0dHIkc3BsaXQgPSBhdHRyLnNwbGl0KCc9JyksXG4gICAgICAgIF9hdHRyJHNwbGl0MiA9IF9zbGljZWRUb0FycmF5KF9hdHRyJHNwbGl0LCAyKSxcbiAgICAgICAga2V5ID0gX2F0dHIkc3BsaXQyWzBdLFxuICAgICAgICB2YWx1ZSA9IF9hdHRyJHNwbGl0MlsxXTtcbiAgICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSB8fCAnJyk7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgY2xhc3Nlc1xuICAgIHZhciBjbGFzc2VzID0gcGxhY2Vob2xkZXIuZGF0YXNldC5jbGFzc2VzLnNwbGl0KCcgJyk7XG4gICAgKF9pZnJhbWUkY2xhc3NMaXN0ID0gaWZyYW1lLmNsYXNzTGlzdCkuYWRkLmFwcGx5KF9pZnJhbWUkY2xhc3NMaXN0LCBfdG9Db25zdW1hYmxlQXJyYXkoY2xhc3NlcykpO1xuXG4gICAgLy8gQWRkIGxvYWQgZXZlbnQgbGlzdGVuZXJcbiAgICBpZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEZhZGUgaW4gdGhlIGlmcmFtZVxuICAgICAgLy8gaWZyYW1lLnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICBpZnJhbWUuY2xhc3NMaXN0LmFkZCgnbG9hZGVkJyk7XG4gICAgfSk7XG5cbiAgICAvLyBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggaWZyYW1lXG4gICAgcGxhY2Vob2xkZXIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaWZyYW1lLCBwbGFjZWhvbGRlcik7XG4gIH0pO1xufSk7XG5cbi8vIEVtYWlsIHBvcHVwIGFuZCB0cmFja2luZyBvcHQtaW4gaGFuZGxpbmdcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIC8vIENoZWNrIGlmIHRyYWNraW5nIG9wdC1pbiBkaXYgZXhpc3RzIG9uIHBhZ2UgbG9hZCBhbmQgaWYgY29va2llIGV4aXN0c1xuICAgIHZhciBlbWFpbFBvcHVwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXBvcHVwJyk7XG4gICAgaWYgKGVtYWlsUG9wdXAgJiYgIWNoZWNrQ29va2llKCdlbWFpbC1wb3B1cC1jbG9zZWQnKSkge1xuICAgICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGlfdHJhY2tpbmdfb3B0X2luX2RpdicpKSB7XG4gICAgICAgIGVtYWlsUG9wdXAuY2xhc3NMaXN0LmFkZCgncGktaW5hY3RpdmUnKTtcbiAgICAgIH1cbiAgICAgIGVtYWlsUG9wdXAuY2xhc3NMaXN0LmFkZCgnbG9hZGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtYWlsUG9wdXAuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgfVxuICB9LCAyMDAwKTtcbn0pO1xuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gIHZhciB0cmFja2luZ0RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaV90cmFja2luZ19vcHRfaW5fZGl2Jyk7XG4gIGlmICh0cmFja2luZ0Rpdikge1xuICAgIC8vIENyZWF0ZSBhIE11dGF0aW9uT2JzZXJ2ZXIgdG8gd2F0Y2ggZm9yIHN0eWxlIGNoYW5nZXNcbiAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAobXV0YXRpb25zKSB7XG4gICAgICBtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAobXV0YXRpb24pIHtcbiAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdhdHRyaWJ1dGVzJyAmJiBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSAnc3R5bGUnKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRpdiBpcyBub3cgaGlkZGVuXG4gICAgICAgICAgaWYgKHRyYWNraW5nRGl2LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykge1xuICAgICAgICAgICAgdmFyIGVtYWlsUG9wdXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtcG9wdXAnKTtcbiAgICAgICAgICAgIGlmIChlbWFpbFBvcHVwKSB7XG4gICAgICAgICAgICAgIGVtYWlsUG9wdXAuY2xhc3NMaXN0LmFkZCgncGktaW5hY3RpdmUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIERpc2Nvbm5lY3QgdGhlIG9ic2VydmVyIHNpbmNlIHdlIG5vIGxvbmdlciBuZWVkIHRvIH
108dhdGNoXG4gICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFN0YXJ0IG9ic2VydmluZyB0aGUgdHJhY2tpbmcgZGl2IGZvciBzdHlsZSBjaGFuZ2VzXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0cmFja2luZ0Rpdiwge1xuICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydzdHlsZSddXG4gICAgfSk7XG4gIH1cbn0sIDEwMDApO1xuXG4vLyBFbWFpbCBwb3B1cCBjbG9zZSBidXR0b25cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbWFpbFBvcHVwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXBvcHVwJyk7XG4gIGlmIChlbWFpbFBvcHVwKSB7XG4gICAgdmFyIGNsb3NlQnV0dG9uID0gZW1haWxQb3B1cC5xdWVyeVNlbGVjdG9yKCcuZW1haWwtcG9wdXBfX2Nsb3NlJyk7XG4gICAgY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICBlbWFpbFBvcHVwLmNsYXNzTGlzdC5yZW1vdmUoJ2xvYWRlZCcpO1xuXG4gICAgICAvLyBDcmVhdGUgY29va2llIHRoYXQgZXhwaXJlcyBpbiAzMCBkYXlzXG4gICAgICBjcmVhdGVDb29raWUoJ2VtYWlsLXBvcHVwLWNsb3NlZCcsICd0cnVlJywgMzApO1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGVtYWlsUG9wdXAuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9KTtcbiAgfVxufSk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/js/scripts.js\n"); 109 110/***/ }), 111
112/***/ "./src/js/utils.js": 113/*!*************************!*\ 114 !*** ./src/js/utils.js ***! 115 \*************************/ 116/*! exports provided: groupEventListener, getPreviousSibling, classChain, isInViewport, isOutOfViewport */ 117/***/ (function(module, __webpack_exports__, __webpack_require__) { 118 119"use strict"; 120eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"groupEventListener\", function() { return groupEventListener; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getPreviousSibling\", function() { return getPreviousSibling; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"classChain\", function() { return classChain; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isInViewport\", function() { return isInViewport; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isOutOfViewport\", function() { return isOutOfViewport; });\nfunction groupEventListener(event, selector, callback) {\n for (var i = 0; i < selector.length; i++) {\n selector[i].addEventListener(event, callback);\n }\n}\nfunction getPreviousSibling(elem, selector) {\n // Get the next sibling element\n var sibling = elem.previousElementSibling;\n\n // If there's no selector, return the first sibling\n if (!selector) return sibling;\n\n // If the sibling matches our selector, use it\n // If not, jump to the next sibling and continue the loop\n while (sibling) {\n if (sibling.matches(selector)) return sibling;\n sibling = sibling.previousElementSibling;\n }\n}\n;\nfunction classChain(elt) {\n var list = elt.classList;\n return {\n toggle: function toggle(c) {\n list.toggle(c);\n return this;\n },\n add: function add(c) {\n list.add(c);\n return this;\n },\n remove: function remove(c) {\n list.remove(c);\n return this;\n }\n };\n}\nfunction isInViewport(elem) {\n var bounding = elem.getBoundingClientRect();\n return bounding.top >= 0 && bounding.left >= 0 && bounding.bottom <= (window.innerHeight || document.documentElement.clientHeight) && bounding.right <= (window.innerWidth || document.documentElement.clientWidth);\n}\n;\nfunction isOutOfViewport(elem) {\n // Get element's bounding\n var bounding = elem.getBoundingClientRect();\n\n // Check if it's out of the viewport on each side\n var out = {};\n out.top = bounding.top < 0;\n out.left = bounding.left < 0;\n out.bottom = bounding.bottom > (window.innerHeight || document.documentElement.clientHeight);\n out.right = bounding.right > (window.innerWidth || document.documentElement.clientWidth);\n out.any = out.top || out.left || out.bottom || out.right;\n out.all = out.top && out.left && out.bottom && out.right;\n return out;\n}\n;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvdXRpbHMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvanMvdXRpbHMuanM/MzJlMCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZ3JvdXBFdmVudExpc3RlbmVyKGV2ZW50LCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3Rvci5sZW5ndGg7IGkrKykge1xuICAgIHNlbGVjdG9yW2ldLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGNhbGxiYWNrKTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFByZXZpb3VzU2libGluZyhlbGVtLCBzZWxlY3Rvcikge1xuICAvLyBHZXQgdGhlIG5leHQgc2libGluZyBlbGVtZW50XG4gIHZhciBzaWJsaW5nID0gZWxlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuXG4gIC8vIElmIHRoZXJlJ3Mgbm8gc2VsZWN0b3IsIHJldHVybiB0aGUgZmlyc3Qgc2libGluZ1xuICBpZiAoIXNlbGVjdG9yKSByZXR1cm4gc2libGluZztcblxuICAvLyBJZiB0aGUgc2libGluZyBtYXRjaGVzIG91ciBzZWxlY3RvciwgdXNlIGl0XG4gIC8vIElmIG5vdCwganVtcCB0byB0aGUgbmV4dCBzaWJsaW5nIGFuZCBjb250aW51ZSB0aGUgbG9vcFxuICB3aGlsZSAoc2libGluZykge1xuICAgIGlmIChzaWJsaW5nLm1hdGNoZXMoc2VsZWN0b3IpKSByZXR1cm4gc2libGluZztcbiAgICBzaWJsaW5nID0gc2libGluZy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICB9XG59XG47XG5leHBvcnQgZnVuY3Rpb24gY2xhc3NDaGFpbihlbHQpIHtcbiAgdmFyIGxpc3QgPSBlbHQuY2xhc3NMaXN0O1xuICByZXR1cm4ge1xuICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKGMpIHtcbiAgICAgIGxpc3QudG9nZ2xlKGMpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBhZGQ6IGZ1bmN0aW9uIGFkZChjKSB7XG4gICAgICBsaXN0LmFkZChjKTtcbiAgICAgIHJldHVybi
120B0aGlzO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoYykge1xuICAgICAgbGlzdC5yZW1vdmUoYyk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJblZpZXdwb3J0KGVsZW0pIHtcbiAgdmFyIGJvdW5kaW5nID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIGJvdW5kaW5nLnRvcCA+PSAwICYmIGJvdW5kaW5nLmxlZnQgPj0gMCAmJiBib3VuZGluZy5ib3R0b20gPD0gKHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSAmJiBib3VuZGluZy5yaWdodCA8PSAod2luZG93LmlubmVyV2lkdGggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTtcbn1cbjtcbmV4cG9ydCBmdW5jdGlvbiBpc091dE9mVmlld3BvcnQoZWxlbSkge1xuICAvLyBHZXQgZWxlbWVudCdzIGJvdW5kaW5nXG4gIHZhciBib3VuZGluZyA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgLy8gQ2hlY2sgaWYgaXQncyBvdXQgb2YgdGhlIHZpZXdwb3J0IG9uIGVhY2ggc2lkZVxuICB2YXIgb3V0ID0ge307XG4gIG91dC50b3AgPSBib3VuZGluZy50b3AgPCAwO1xuICBvdXQubGVmdCA9IGJvdW5kaW5nLmxlZnQgPCAwO1xuICBvdXQuYm90dG9tID0gYm91bmRpbmcuYm90dG9tID4gKHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KTtcbiAgb3V0LnJpZ2h0ID0gYm91bmRpbmcucmlnaHQgPiAod2luZG93LmlubmVyV2lkdGggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTtcbiAgb3V0LmFueSA9IG91dC50b3AgfHwgb3V0LmxlZnQgfHwgb3V0LmJvdHRvbSB8fCBvdXQucmlnaHQ7XG4gIG91dC5hbGwgPSBvdXQudG9wICYmIG91dC5sZWZ0ICYmIG91dC5ib3R0b20gJiYgb3V0LnJpZ2h0O1xuICByZXR1cm4gb3V0O1xufVxuOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/js/utils.js\n"
vendor: 26 bytes, lines 120-124
120); 121 122/***/ }) 123 124/******/ });
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.