{"version":3,"file":"main.min.js","sources":["../../../Frontend/js/utils/windowResize.js","../../../Frontend/js/utils/scroll.js","../../../Frontend/js/utils/onReady.js","../../../Frontend/js/utils/elementProperties.js","../../../Frontend/js/utils/scrollLock.js","../../../Frontend/js/components/nav.js","../../../Frontend/js/utils/stickyNavOnScroll.js","../../../node_modules/promise-polyfill/src/finally.js","../../../node_modules/promise-polyfill/src/index.js","../../../node_modules/promise-polyfill/src/polyfill.js","../../../Frontend/js/utils/lazyImage.js","../../../Frontend/js/utils/animation.js","../../../Frontend/js/components/accordion.js","../../../Frontend/js/components/video.js","../../../Frontend/js/utils/helpers.js","../../../Frontend/js/utils/scrollTo.js","../../../Frontend/js/components/anchors.js","../../../Frontend/js/components/overlay.js","../../../Frontend/js/components/filter.js","../../../Frontend/js/components/image-to-video.js","../../../Frontend/js/components/tabs.js","../../../Frontend/js/components/entrances.js","../../../Frontend/js/components/newslist.js","../../../Frontend/js/components/gallery.js","../../../Frontend/js/components/calendarFilter.js","../../../Frontend/js/components/calendar.js","../../../Frontend/js/main.js","../../../Frontend/js/components/calendarAccordion.js"],"sourcesContent":["import settings from '../../settings.json';\r\n\r\nexport const breakpoints = settings.breakpoints;\r\nexport const breakpointKeys = Object.keys(breakpoints);\r\nexport let currentWindowWidth = window.innerWidth;\r\nexport let currentWindowHeight = window.innerHeight;\r\nexport let currentBreakpoint;\r\nexport let currentBreakpointIndex = 0;\r\nlet resizeTimer;\r\n\r\nconst resizeFunctions = [];\r\n\r\n/**\r\n * Get various window sizes - width, height etc.\r\n * This function is fired automatically upon page load. and run each time the window changes size.\r\n *\r\n */\r\nfunction getWindowSizes() {\r\n currentWindowWidth = window.innerWidth;\r\n currentWindowHeight = window.innerHeight;\r\n\r\n // Calculate which breakpoint is currently active, based on the screen width compared to the breakpoint definitions.\r\n\r\n let lastFoundWidth = 0;\r\n\r\n breakpointKeys.forEach((key, index) => {\r\n const width = breakpoints[key];\r\n if (currentWindowWidth >= width && width > lastFoundWidth) {\r\n lastFoundWidth = width;\r\n currentBreakpoint = key;\r\n currentBreakpointIndex = index;\r\n }\r\n });\r\n}\r\n\r\nfunction resizeHandler() {\r\n clearTimeout(resizeTimer);\r\n resizeTimer = setTimeout(() => {\r\n getWindowSizes();\r\n resizeFunctions.forEach(funcRef => funcRef());\r\n }, 100);\r\n}\r\n\r\nexport function onWindowResize(handler) {\r\n if (!currentBreakpoint) {\r\n initWindowResize();\r\n }\r\n\r\n resizeFunctions.push(handler);\r\n}\r\n\r\nexport function initWindowResize() { \r\n getWindowSizes();\r\n window.addEventListener('resize', resizeHandler);\r\n window.addEventListener('orientationchange', resizeHandler);\r\n}\r\n","export let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;\r\n\r\nlet ticking = false;\r\nconst scrollFunctions = [];\r\n\r\nfunction animate() {\r\n scrollFunctions.forEach(funcRef => funcRef());\r\n\r\n ticking = false;\r\n}\r\n\r\nanimate();\r\n\r\nfunction requestTick() {\r\n if (!ticking) {\r\n requestAnimationFrame(animate);\r\n ticking = true;\r\n }\r\n}\r\n\r\nfunction scrollHandler() {\r\n scrollTop = document.documentElement.scrollTop || document.body.scrollTop;\r\n requestTick();\r\n}\r\n\r\nexport function onScroll(handler) {\r\n scrollFunctions.push(handler);\r\n}\r\n\r\nexport function initScroll() {\r\n window.addEventListener('scroll', scrollHandler);\r\n}","/**\r\n * Handler to trigger callbacks once the browser is ready for them.\r\n *\r\n * You can keep adding references using onReady() even after the page is loaded. In that case they will be\r\n * run at once.\r\n *\r\n * @example\r\n * import { onReady } from './utils/events/onReady';\r\n *\r\n * onReady(yourFunctionHere);\r\n *\r\n */\r\n\r\nlet functionReferences = [];\r\n\r\n// Set the initial readyState based on the browser's current state. If the script has been loaded\r\n// asynchronously, the DOM might be ready for us already, in which case there's no reason to delay\r\n// any further processing. The following will evaluate as true if the DOM is ready, or the page is\r\n// complete.\r\nlet readyState = document.readyState === 'interactive' || document.readyState === 'complete';\r\n\r\n// Defines whether or not the window.onReady event has been bound, so we won't do it twice. That\r\n// would just be stupid.\r\nlet readyEventBound = false;\r\n\r\n/**\r\n * Run the given array of callback functions.\r\n *\r\n * @private\r\n * @param {Array} funcArray\r\n */\r\nfunction runFunctionArray(funcArray) {\r\n funcArray.forEach(funcRef => funcRef());\r\n}\r\n\r\n/**\r\n * Empty the callback arrays\r\n *\r\n * @private\r\n */\r\nfunction emptyCallbackArrays() {\r\n // Keep iterating through the function references until there are none left.\r\n while (functionReferences.length) {\r\n // Set up a temporary array that mirrors the list of callbacks, and empty the real one.\r\n const tempArray = functionReferences.slice(0);\r\n functionReferences = [];\r\n\r\n // Run the callbacks. The callbacks themselves may set up more callbacks, which\r\n // is why we keep looping the array until we're done.\r\n runFunctionArray(tempArray);\r\n }\r\n\r\n // At this point we'll assume we're ready for anything!\r\n readyState = true;\r\n}\r\n\r\n/**\r\n * Make sure the \"ready\"-event is set.\r\n *\r\n * @private\r\n */\r\nfunction bindReadyEvent() {\r\n if (!readyEventBound) {\r\n if (document.readyState === 'loading') {\r\n // loading yet, wait for the event\r\n document.addEventListener('DOMContentLoaded', emptyCallbackArrays);\r\n } else {\r\n // DOM is ready!\r\n emptyCallbackArrays();\r\n }\r\n\r\n readyEventBound = true;\r\n }\r\n}\r\n\r\n/**\r\n * Register a function to run when the page is ready.\r\n *\r\n * @param {Function} functionReference - The function you want to run.\r\n */\r\nexport function onReady(functionReference) {\r\n if (typeof functionReference === 'function') {\r\n if (readyState) {\r\n functionReference();\r\n } else {\r\n bindReadyEvent();\r\n\r\n functionReferences.push(functionReference);\r\n }\r\n }\r\n}\r\n","/**\r\n * Utilities for checking properties and states of elements.\r\n */\r\n\r\n/**\r\n * Check if an element is empty.\r\n *\r\n * @param {Node} element - Check if this element is empty.\r\n * @param {boolean} [strict=true] - Set this to **false** to ignore nodes with whitespace.\r\n * @returns {boolean} **True** if the element is empty.\r\n */\r\nexport function elementIsEmpty(element, strict = true) {\r\n return strict ? !element.childNodes.length : !element.innerHTML.trim().length;\r\n}\r\n\r\n/**\r\n * Check if an element is hidden in the DOM with `display: none;`\r\n *\r\n * @param {HTMLElement} element - The element to check.\r\n * @returns {boolean} **True** if element is hidden, otherwise **false**.\r\n */\r\nexport function elementIsHidden(element) {\r\n return element.offsetParent === null;\r\n}\r\n\r\n/**\r\n * Check if an element is in the viewport\r\n * \r\n * @param {HTMLElement} elem - The element to check \r\n */\r\nexport function isVisible(elem) {\r\n return !!elem && !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);\r\n}\r\n\r\n/**\r\n * Find out whether or not the given argument is an element that would react somewhat normally to DOM-manipulations.\r\n *\r\n * @param {*} element - The element to check.\r\n * @returns {boolean} `true` if the given argument is an element (or document, or window), and `false` otherwise.\r\n */\r\nexport function isElement(element) {\r\n return element instanceof Element || element instanceof Document || element instanceof Window;\r\n}\r\n\r\n/**\r\n * Return the position of an element\r\n *\r\n * @param {Element|String} element - The HTML element to work with or its ID\r\n * @param {Element|String|Window} [relativeTo=window] - The HTML element to return the position relative to or its ID\r\n * @returns {{top: Number, left: Number}} An object with top and left positions in pixels\r\n *\r\n *\r\n * @example Basic usage:\r\n * import { getElementPosition } from './utils/dom/elementProperties';\r\n *\r\n * const element = document.querySelector('.anElement');\r\n * getElementPosition(element);\r\n *\r\n *\r\n * @example Perform a search for an element with an ID equal to the string, i.e. 'elementId', and get the position of that:\r\n * import { getElementPosition } from './utils/dom/elementProperties';\r\n *\r\n * getElementPosition('elementId');\r\n */\r\nexport function getElementPosition(element, relativeTo = window) {\r\n const useElement = typeof element === 'string' ? document.getElementById(element) : element;\r\n\r\n // Throw error if element wasn't found\r\n if (!useElement) {\r\n throw 'getElementPosition did not find an element.';\r\n }\r\n\r\n const useRelativeTo = typeof relativeTo === 'string' ? document.getElementById(relativeTo) : relativeTo;\r\n\r\n // Throw error if relative element wasn't found\r\n if (!useRelativeTo) {\r\n throw 'getElementPosition did not find an element to show the position relative to.';\r\n }\r\n\r\n if (relativeTo === window) {\r\n // Return position relative to window\r\n const rect = useElement.getBoundingClientRect();\r\n return {\r\n top: rect.top + (window.pageYOffset || document.documentElement.scrollTop),\r\n left: rect.left + (window.pageXOffset || document.documentElement.scrollLeft)\r\n };\r\n } else {\r\n // Return position relative to declared element\r\n return {\r\n top: useElement.offsetTop - relativeTo.offsetTop,\r\n left: useElement.offsetLeft - relativeTo.offsetLeft\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Get the current scroll values of the given element (or window). Will return an object containing\r\n * \"left\" and \"top\" properties, which are set to the scroll values, or false if no compatible element\r\n * was given.\r\n *\r\n * @param {Element|Window} [element=window]\r\n * @returns {{ left: number, top: number } | boolean}\r\n */\r\nexport function getElementScroll(element = window) {\r\n if (isElement(element)) {\r\n if (element instanceof Window) {\r\n return {\r\n left: element.pageXOffset || document.documentElement.scrollLeft,\r\n top: element.pageYOffset || document.documentElement.scrollTop\r\n };\r\n } else {\r\n return {\r\n left: element.scrollX || element.scrollLeft,\r\n top: element.scrollY || element.scrollTop\r\n };\r\n }\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Get both width and height of element\r\n *\r\n * @param {Element} element - The HTML element to work with\r\n * @param {Object} [options={}] - Object of options\r\n * @param {boolean} [options.includePadding=false] - Get size including padding (defaults to true)\r\n * @param {boolean} [options.includeBorder=false] - Get size including border (defaults to true)\r\n * @param {boolean} [options.includeMargin=true] - Get size including margin (defaults to false)\r\n * @param {null|':before'|':after'} [options.pseudoElement=null] - Get size of pseudo element ':before' or ':after'\r\n * @returns {{width: number, height: number}} An object with the width and height as numbers\r\n */\r\nexport function getElementSize(element, options = {}) {\r\n // Get styles\r\n const elementStyle = window.getComputedStyle(element, options.pseudoElement);\r\n\r\n return {\r\n width: getElementWidth(element, options, elementStyle),\r\n height: getElementHeight(element, options, elementStyle)\r\n };\r\n}\r\n\r\n/**\r\n * Get width of element\r\n *\r\n * @param {Element} element - The HTML element to work with\r\n * @param {Object} [options={}] - Object of options\r\n * @param {boolean} [options.includeMargin=false] - Get width including margin (defaults to false)\r\n * @param {boolean} [options.includeBorder=true] - Get width including border (defaults to true)\r\n * @param {boolean} [options.includePadding=true] - Get width including padding (defaults to true)\r\n * @param {null|':before'|':after'} [options.pseudoElement=null] - Get width of pseudo element ':before' or ':after'\r\n * @param {CSSStyleDeclaration} [elementStyle] - Style declaration of element (in case you already have called .getComputedStyle(), pass its returned value here)\r\n * @returns {number} The width as a number\r\n */\r\nexport function getElementWidth(element, options = {}, elementStyle = null) {\r\n // Keep supplied values or set to defaults\r\n options.includeMargin = options.includeMargin === true;\r\n options.includeBorder = options.includeBorder !== false;\r\n options.includePadding = options.includePadding !== false;\r\n\r\n // Get styles\r\n const style = elementStyle || window.getComputedStyle(element, options.pseudoElement);\r\n\r\n // Get width including border and padding\r\n let width = element.offsetWidth;\r\n\r\n // Calculate width with margin\r\n if (options.includeMargin) {\r\n width += parseFloat(style.marginLeft) + parseFloat(style.marginRight);\r\n }\r\n\r\n // Calculate width without border\r\n if (!options.includeBorder) {\r\n width -= parseFloat(style.borderLeftWidth) + parseFloat(style.borderRightWidth);\r\n }\r\n\r\n // Calculate width without padding\r\n if (!options.includePadding) {\r\n width -= parseFloat(style.paddingLeft) + parseFloat(style.paddingRight);\r\n }\r\n\r\n return width;\r\n}\r\n\r\n/**\r\n * Get height of element\r\n *\r\n * @param {Element} element - The HTML element to work with\r\n * @param {Object} [options={}] - Object of options\r\n * @param {boolean} [options.includeMargin=false] - Get height including margin (defaults to false)\r\n * @param {boolean} [options.includeBorder=true] - Get height including border (defaults to true)\r\n * @param {boolean} [options.includePadding=true] - Get height including padding (defaults to true)\r\n * @param {null|':before'|':after'} [options.pseudoElement=null] - Get height of pseudo element ':before' or ':after'\r\n * @param {CSSStyleDeclaration} [elementStyle] - Style declaration of element (in case you already have called .getComputedStyle(), pass its returned value here)\r\n * @returns {number} The height as a number\r\n */\r\nexport function getElementHeight(element, options = {}, elementStyle = null) {\r\n // Keep supplied values or set to defaults\r\n options.includeMargin = options.includeMargin === true;\r\n options.includeBorder = options.includeBorder !== false;\r\n options.includePadding = options.includePadding !== false;\r\n\r\n // Get styles\r\n const style = elementStyle || window.getComputedStyle(element, options.pseudoElement);\r\n\r\n // Get height including border and padding\r\n let height = element.offsetHeight;\r\n\r\n // Calculate height with margin\r\n if (options.includeMargin) {\r\n height += parseFloat(style.marginTop) + parseFloat(style.marginBottom);\r\n }\r\n\r\n // Calculate height without border\r\n if (!options.includeBorder) {\r\n height -= parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth);\r\n }\r\n\r\n // Calculate height without padding\r\n if (!options.includePadding) {\r\n height -= parseFloat(style.paddingTop) + parseFloat(style.paddingBottom);\r\n }\r\n\r\n return height;\r\n}\r\n","/**\r\n * A utility to **lock the viewport** at the current position in order to **stop scrolling**.\r\n *\r\n * @example Basic usage\r\n * import { enableScrollLock, disableScrollLock } from './utils/dom/scrollLock';\r\n *\r\n * enableScrollLock();\r\n * window.setTimeout(disableScrollLock, 3000);\r\n */\r\n\r\nimport { getElementScroll } from './elementProperties';\r\n\r\nconst className = 'scroll-lock';\r\nlet scrollTop = 0;\r\n\r\n/**\r\n * Get the current state of the scroll lock. `true` if the scroll lock is enabled, otherwise `false`.\r\n *\r\n * @type {boolean}\r\n */\r\nexport let scrollLocked = false;\r\n\r\n/**\r\n * Enable the scroll lock.\r\n */\r\nexport function enableScrollLock() {\r\n if (!scrollLocked) {\r\n // Get scroll position\r\n const scrollPosition = getElementScroll();\r\n\r\n // Reset scroll position\r\n window.scrollTo(scrollPosition.left, 0);\r\n\r\n const htmlTag = document.documentElement;\r\n htmlTag.classList.add(className);\r\n htmlTag.style.marginTop = `${-scrollPosition.top}px`;\r\n htmlTag.style.position = 'fixed';\r\n htmlTag.style.overflow = 'hidden';\r\n htmlTag.style.width = '100%';\r\n document.body.style.overflowY = 'scroll';\r\n\r\n // Remember state\r\n scrollLocked = true;\r\n scrollTop = scrollPosition.top;\r\n }\r\n}\r\n\r\n/**\r\n * @type {function}\r\n * @ignore\r\n */\r\nexport const enable = enableScrollLock;\r\n\r\n/**\r\n * Disable the scroll lock\r\n */\r\nexport function disableScrollLock() {\r\n if (scrollLocked) {\r\n const scrollPosition = getElementScroll();\r\n\r\n const htmlTag = document.documentElement;\r\n htmlTag.classList.remove(className);\r\n htmlTag.style.marginTop = '';\r\n htmlTag.style.position = '';\r\n htmlTag.style.overflow = '';\r\n htmlTag.style.width = '';\r\n document.body.removeAttribute('style');\r\n // Set the scroll position to what it was before\r\n window.scrollTo(scrollPosition.left, scrollTop);\r\n\r\n // Remember state\r\n scrollLocked = false;\r\n }\r\n}\r\n\r\n/**\r\n * @type {function}\r\n * @ignore\r\n */\r\nexport const disable = disableScrollLock;\r\n\r\n/**\r\n * Toggle the scroll lock between on and off\r\n */\r\nexport function toggleScrollLock() {\r\n if (scrollLocked) {\r\n disableScrollLock();\r\n } else {\r\n enableScrollLock();\r\n }\r\n}\r\n\r\n/**\r\n * @type {function}\r\n * @ignore\r\n */\r\nexport const toggle = toggleScrollLock;\r\n\r\nexport default {\r\n enable,\r\n disable,\r\n toggle\r\n};\r\n","import { stickyNavOnScroll } from '../utils/stickyNavOnScroll';\r\nimport { enableScrollLock, disableScrollLock } from '../utils/scrollLock';\r\nimport { currentBreakpoint } from '../utils/windowResize';\r\n\r\nexport let nav;\r\nexport let navWidth;\r\n\r\nlet firstNavItem = -1;\r\nlet navItemsWithChildren = -1;\r\n\r\nexport function toggleMenuOpen() {\r\n if (nav.classList.contains('nav--open')) {\r\n disableScrollLock();\r\n nav.classList.remove('nav--opened')\r\n nav.classList.remove('nav--open');\r\n\r\n const activeItem = Array.prototype.slice.call(navItemsWithChildren).filter(x => x.classList.contains('js-active'));\r\n\r\n if (firstNavItem != undefined && currentBreakpoint != 'xxs' && currentBreakpoint != 'xs') {\r\n if (firstNavItem != activeItem) {\r\n firstNavItem.classList.add('js-active');\r\n }\r\n } else if (currentBreakpoint == 'xxs' || currentBreakpoint == 'xs') {\r\n if (activeItem.length == 1) {\r\n activeItem[0].classList.remove('js-active');\r\n }\r\n\r\n firstNavItem.classList.remove('js-active');\r\n nav.classList.add('js-none-selected');\r\n }\r\n\r\n if (window.pageYOffset > 50) {\r\n setTimeout(() => nav.classList.add('going-up'), 40);\r\n }\r\n } else {\r\n enableScrollLock();\r\n nav.classList.add('nav--open');\r\n }\r\n}\r\n\r\nexport function setupNav(selector = '.nav', sticky = true) {\r\n nav = document.body.querySelector(selector);\r\n\r\n if (nav) {\r\n navWidth = nav.offsetWidth;\r\n const navBtn = nav.querySelector('.nav__btn');\r\n const navItems = nav.querySelectorAll('.nav__item');\r\n navItemsWithChildren = Array.prototype.slice.call(navItems).filter(x => x.hasAttribute('data-has-children'));\r\n firstNavItem = nav.querySelector('.nav__menu > .icon-nav-active + .nav__item');\r\n const lastNavItem = nav.querySelector('.nav__menu > .nav__item:last-child');\r\n const firstSubItem = nav.querySelector('.nav__menu .nav__sub li:first-child');\r\n const navSearch = nav.querySelector('.nav__item--search');\r\n const navActiveIcon = nav.querySelector('.icon-nav-active');\r\n const mobileBack = nav.querySelector('.nav__mobile-back');\r\n const navBottomBar = nav.querySelector('.nav__bottom-bar');\r\n\r\n function toggleSubMenuActive(e) {\r\n const item = e.target.closest('li');\r\n const activeItem = Array.prototype.slice.call(navItemsWithChildren).filter(x => x.classList.contains('js-active'));\r\n\r\n if (activeItem.length == 1) {\r\n if (item != activeItem[0]) {\r\n activeItem[0].classList.remove('js-active');\r\n updateItem(item);\r\n }\r\n } else {\r\n updateItem(item);\r\n }\r\n\r\n function updateItem(item) {\r\n item.classList.add('js-active');\r\n\r\n let diff = item.getBoundingClientRect().top.toFixed(0) - firstNavItem.getBoundingClientRect().top;\r\n diff = diff < 0 ? diff * -1 : diff;\r\n\r\n if ((currentBreakpoint != 'xxs' && currentBreakpoint != 'xs')) {\r\n navActiveIcon.style.transform = `translate3d(0,${diff}px,0)`;\r\n }\r\n\r\n if (currentBreakpoint == 'xxs' || currentBreakpoint == 'xs') {\r\n nav.classList.remove('js-none-selected');\r\n }\r\n\r\n const itemUl = item.querySelector('ul');\r\n\r\n if (itemUl != undefined && (currentBreakpoint == 'xxs' || currentBreakpoint == 'xs')) {\r\n itemUl.style.height = `${itemUl.scrollHeight}px`;\r\n }\r\n }\r\n }\r\n\r\n navBtn.addEventListener('click', toggleMenuOpen);\r\n\r\n if (sticky) {\r\n stickyNavOnScroll(nav, 'nav--sticky', 30, 'going-up');\r\n }\r\n\r\n for (let a = 0, l = navItemsWithChildren.length; a < l; a++) {\r\n navItemsWithChildren[a].addEventListener('click',toggleSubMenuActive);\r\n }\r\n\r\n if (lastNavItem != undefined) {\r\n lastNavItem.addEventListener('transitionend', function () {\r\n if (nav.classList.contains('nav--open')) {\r\n nav.classList.add('nav--opened')\r\n }\r\n });\r\n }\r\n\r\n if ((currentBreakpoint != 'xxs' && currentBreakpoint != 'xs' && currentBreakpoint != 'sm' && currentBreakpoint != 'md') && (navSearch != undefined && firstSubItem != undefined)) {\r\n let diff = navSearch.getBoundingClientRect().left.toFixed(0) - firstSubItem.getBoundingClientRect().left.toFixed(0);\r\n diff = diff < 0 ? diff * -1 : diff;\r\n\r\n navSearch.style.marginLeft = `${diff}px`;\r\n }\r\n\r\n if (navBottomBar != undefined) {\r\n if (navSearch != undefined) {\r\n const navSearchInput = navSearch.querySelector('input');\r\n\r\n if (navSearchInput != undefined) {\r\n function toggleSearch() {\r\n if (currentBreakpoint == 'xxs' || currentBreakpoint == 'xs') {\r\n if (navSearchInput == document.activeElement) {\r\n navBottomBar.classList.add('js-search');\r\n } else {\r\n navBottomBar.classList.remove('js-search');\r\n }\r\n }\r\n }\r\n\r\n navSearchInput.addEventListener('focus', toggleSearch);\r\n navSearchInput.addEventListener('blur', toggleSearch);\r\n }\r\n }\r\n }\r\n\r\n if (firstNavItem != undefined && currentBreakpoint != 'xxs' && currentBreakpoint != 'xs') {\r\n firstNavItem.classList.add('js-active');\r\n } else {\r\n nav.classList.add('js-none-selected');\r\n }\r\n\r\n if (currentBreakpoint == 'xxs' || currentBreakpoint == 'xs') {\r\n for (let a = 0, l = navItems.length; a < l; a++) {\r\n const h = navItems[a].offsetHeight;\r\n navItems[a].style.height = `${h}px`;\r\n }\r\n }\r\n\r\n if (mobileBack != undefined) {\r\n mobileBack.addEventListener('click',function() {\r\n const activeItem = Array.prototype.slice.call(navItemsWithChildren).filter(x => x.classList.contains('js-active'));\r\n\r\n if (activeItem.length == 1) {\r\n activeItem[0].classList.remove('js-active');\r\n nav.classList.add('js-none-selected');\r\n }\r\n });\r\n }\r\n }\r\n}\r\n","import { getElementScroll } from './elementProperties';\r\nimport { scrollLocked } from './scrollLock';\r\n\r\n/**\r\n * \r\n * @param {HTMLElement} element - element to add sticky class to\r\n * @param {string} className - sticky class name to add on scroll\r\n * @param {number} scrollInPixels - number of pixels before activating scroll\r\n * @param {string} goingUpClass - class added when scrolling up\r\n */\r\nexport function stickyNavOnScroll(element, className = 'nav--sticky', scrollInPixels = 30, goingUpClass = 'nav--going-up') {\r\n let scrollTimer;\r\n let lastScrollPosition;\r\n\r\n const scrollHandler = () => {\r\n\r\n clearTimeout(scrollTimer);\r\n\r\n if (!scrollLocked) {\r\n scrollTimer = setTimeout(() => {\r\n const windowScroll = getElementScroll();\r\n \r\n if (windowScroll.top > scrollInPixels) {\r\n element.classList.add(className);\r\n \r\n if (lastScrollPosition > windowScroll.top) {\r\n element.classList.add(goingUpClass);\r\n } else {\r\n element.classList.remove(goingUpClass);\r\n }\r\n \r\n lastScrollPosition = windowScroll.top;\r\n } else {\r\n element.classList.remove(className);\r\n element.classList.remove(goingUpClass);\r\n }\r\n }, 30);\r\n }\r\n\r\n };\r\n\r\n scrollHandler();\r\n window.addEventListener('scroll', scrollHandler);\r\n}\r\n","/**\n * @this {Promise}\n */\nfunction finallyConstructor(callback) {\n var constructor = this.constructor;\n return this.then(\n function(value) {\n // @ts-ignore\n return constructor.resolve(callback()).then(function() {\n return value;\n });\n },\n function(reason) {\n // @ts-ignore\n return constructor.resolve(callback()).then(function() {\n // @ts-ignore\n return constructor.reject(reason);\n });\n }\n );\n}\n\nexport default finallyConstructor;\n","import promiseFinally from './finally';\n\n// Store setTimeout reference so promise-polyfill will be unaffected by\n// other code modifying setTimeout (like sinon.useFakeTimers())\nvar setTimeoutFunc = setTimeout;\n\nfunction isArray(x) {\n return Boolean(x && typeof x.length !== 'undefined');\n}\n\nfunction noop() {}\n\n// Polyfill for Function.prototype.bind\nfunction bind(fn, thisArg) {\n return function() {\n fn.apply(thisArg, arguments);\n };\n}\n\n/**\n * @constructor\n * @param {Function} fn\n */\nfunction Promise(fn) {\n if (!(this instanceof Promise))\n throw new TypeError('Promises must be constructed via new');\n if (typeof fn !== 'function') throw new TypeError('not a function');\n /** @type {!number} */\n this._state = 0;\n /** @type {!boolean} */\n this._handled = false;\n /** @type {Promise|undefined} */\n this._value = undefined;\n /** @type {!Array} */\n this._deferreds = [];\n\n doResolve(fn, this);\n}\n\nfunction handle(self, deferred) {\n while (self._state === 3) {\n self = self._value;\n }\n if (self._state === 0) {\n self._deferreds.push(deferred);\n return;\n }\n self._handled = true;\n Promise._immediateFn(function() {\n var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n return;\n }\n var ret;\n try {\n ret = cb(self._value);\n } catch (e) {\n reject(deferred.promise, e);\n return;\n }\n resolve(deferred.promise, ret);\n });\n}\n\nfunction resolve(self, newValue) {\n try {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self)\n throw new TypeError('A promise cannot be resolved with itself.');\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = newValue.then;\n if (newValue instanceof Promise) {\n self._state = 3;\n self._value = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(bind(then, newValue), self);\n return;\n }\n }\n self._state = 1;\n self._value = newValue;\n finale(self);\n } catch (e) {\n reject(self, e);\n }\n}\n\nfunction reject(self, newValue) {\n self._state = 2;\n self._value = newValue;\n finale(self);\n}\n\nfunction finale(self) {\n if (self._state === 2 && self._deferreds.length === 0) {\n Promise._immediateFn(function() {\n if (!self._handled) {\n Promise._unhandledRejectionFn(self._value);\n }\n });\n }\n\n for (var i = 0, len = self._deferreds.length; i < len; i++) {\n handle(self, self._deferreds[i]);\n }\n self._deferreds = null;\n}\n\n/**\n * @constructor\n */\nfunction Handler(onFulfilled, onRejected, promise) {\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, self) {\n var done = false;\n try {\n fn(\n function(value) {\n if (done) return;\n done = true;\n resolve(self, value);\n },\n function(reason) {\n if (done) return;\n done = true;\n reject(self, reason);\n }\n );\n } catch (ex) {\n if (done) return;\n done = true;\n reject(self, ex);\n }\n}\n\nPromise.prototype['catch'] = function(onRejected) {\n return this.then(null, onRejected);\n};\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n // @ts-ignore\n var prom = new this.constructor(noop);\n\n handle(this, new Handler(onFulfilled, onRejected, prom));\n return prom;\n};\n\nPromise.prototype['finally'] = promiseFinally;\n\nPromise.all = function(arr) {\n return new Promise(function(resolve, reject) {\n if (!isArray(arr)) {\n return reject(new TypeError('Promise.all accepts an array'));\n }\n\n var args = Array.prototype.slice.call(arr);\n if (args.length === 0) return resolve([]);\n var remaining = args.length;\n\n function res(i, val) {\n try {\n if (val && (typeof val === 'object' || typeof val === 'function')) {\n var then = val.then;\n if (typeof then === 'function') {\n then.call(\n val,\n function(val) {\n res(i, val);\n },\n reject\n );\n return;\n }\n }\n args[i] = val;\n if (--remaining === 0) {\n resolve(args);\n }\n } catch (ex) {\n reject(ex);\n }\n }\n\n for (var i = 0; i < args.length; i++) {\n res(i, args[i]);\n }\n });\n};\n\nPromise.resolve = function(value) {\n if (value && typeof value === 'object' && value.constructor === Promise) {\n return value;\n }\n\n return new Promise(function(resolve) {\n resolve(value);\n });\n};\n\nPromise.reject = function(value) {\n return new Promise(function(resolve, reject) {\n reject(value);\n });\n};\n\nPromise.race = function(arr) {\n return new Promise(function(resolve, reject) {\n if (!isArray(arr)) {\n return reject(new TypeError('Promise.race accepts an array'));\n }\n\n for (var i = 0, len = arr.length; i < len; i++) {\n Promise.resolve(arr[i]).then(resolve, reject);\n }\n });\n};\n\n// Use polyfill for setImmediate for performance gains\nPromise._immediateFn =\n // @ts-ignore\n (typeof setImmediate === 'function' &&\n function(fn) {\n // @ts-ignore\n setImmediate(fn);\n }) ||\n function(fn) {\n setTimeoutFunc(fn, 0);\n };\n\nPromise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n if (typeof console !== 'undefined' && console) {\n console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console\n }\n};\n\nexport default Promise;\n","import Promise from './index';\nimport promiseFinally from './finally';\n\n/** @suppress {undefinedVars} */\nvar globalNS = (function() {\n // the only reliable means to get the global object is\n // `Function('return this')()`\n // However, this causes CSP violations in Chrome apps.\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n throw new Error('unable to locate global object');\n})();\n\nif (!('Promise' in globalNS)) {\n globalNS['Promise'] = Promise;\n} else if (!globalNS.Promise.prototype['finally']) {\n globalNS.Promise.prototype['finally'] = promiseFinally;\n}\n","import { breakpointKeys, currentBreakpointIndex } from '../utils/windowResize';\r\nimport { onWindowResize } from './windowResize';\r\nimport 'promise-polyfill/src/polyfill';\r\n//import \"objectFitPolyfill\";\r\n\r\nlet lastUsedScreenWidth;\r\nlet lazyArray = [];\r\n\r\nlet options = {\r\n className: 'lazy',\r\n loadedClass: 'lazy--loaded',\r\n loadClass: 'lazy--loading',\r\n decodeImg: true, // This option requires promises support\r\n oldIe11Fit: false, // This option requires objectFit support\r\n offset: 0\r\n};\r\n\r\nexport function setupLazyLoading(customOptions = {}) {\r\n lastUsedScreenWidth = -1;\r\n options = { ...options, ...customOptions };\r\n lazyArray = document.body.getElementsByClassName(options.className);\r\n\r\n // onWindowsResize set before first lazyLoad, to insure currentBreakPoint is set \r\n onWindowResize(lazyLoad);\r\n\r\n lazyLoad();\r\n\r\n window.addEventListener('scroll', lazyLoad);\r\n}\r\n\r\nfunction lazyLoad() {\r\n // If our current screen mode does not match the one we used the last time we made an image lookup,\r\n // perform a new one now. Otherwise, what would be the point?\r\n \r\n if (lastUsedScreenWidth < currentBreakpointIndex) {\r\n \r\n for (let i = 0; i < lazyArray.length; i++) {\r\n const lazyElem = lazyArray[i];\r\n\r\n if (isInViewport(lazyElem)) {\r\n lazyElem.classList.add(options.loadClass);\r\n if (lazyElem.classList.contains('lazy--bg')) {\r\n loadBgImage(lazyElem);\r\n } else {\r\n loadLazyImage(lazyElem);\r\n }\r\n }\r\n }\r\n\r\n cleanLazy();\r\n }\r\n}\r\n\r\nfunction cleanLazy() {\r\n lazyArray = Array.prototype.filter.call(lazyArray, l => !l.classList.contains(options.loadClass));\r\n}\r\n\r\nfunction isInViewport(el) {\r\n const rect = el.getBoundingClientRect();\r\n\r\n return (\r\n rect.bottom >= 0 &&\r\n rect.right >= 0 &&\r\n rect.top - options.offset <= (window.innerHeight || document.documentElement.clientHeight) &&\r\n rect.left - options.offset <= (window.innerWidth || document.documentElement.clientWidth)\r\n );\r\n}\r\n\r\n/**\r\n * This function gets the image wrapper data attributes src and alt text\r\n * and creates an new image tag to download the image.\r\n * It then uses the src as a background-image.\r\n *\r\n * @param {HTMLElement} bgContainer - Image wrapper element\r\n */\r\nexport function loadBgImage(bgContainer) {\r\n const src = getImageSrc(bgContainer);\r\n const handleLoadedBg = () => {\r\n bgContainer.style.backgroundImage = formattedSrc;\r\n bgContainer.classList.add(options.loadedClass);\r\n bgContainer.classList.remove(options.loadClass);\r\n };\r\n\r\n // If no usable source was returned, abort at once.\r\n if (!src) {\r\n return;\r\n }\r\n\r\n const formattedSrc = `url(${src})`;\r\n\r\n if (bgContainer.style.backgroundImage === formattedSrc) {\r\n return;\r\n }\r\n\r\n if (options.decodeImg) {\r\n // Start loading the new image.\r\n loadImage(src).then(handleLoadedBg);\r\n } else {\r\n handleLoadedBg();\r\n }\r\n}\r\n\r\n/**\r\n * This function gets the container data attributes src.\r\n * If the container is an image it sets the src of it.\r\n * If the container is not an image it creates a new image tag and inserts it into the given container.\r\n *\r\n * @param {HTMLElement} container - Image wrapper element\r\n */\r\nexport function loadLazyImage(container) {\r\n const src = getImageSrc(container);\r\n\r\n // If no usable source was returned, abort mission.\r\n if (!src) {\r\n return;\r\n }\r\n\r\n if (options.decodeImg) {\r\n // We don't want to start processing if the new URL matches the old one.\r\n const oldImage = container.querySelector('img');\r\n if (oldImage && container.classList.contains(options.loadedClass)) {\r\n if (oldImage.getAttribute('src') === src) {\r\n if (options.oldIe11Fit) {\r\n window.objectFitPolyfill(oldImage);\r\n }\r\n return;\r\n } else {\r\n container.removeChild(oldImage);\r\n }\r\n }\r\n\r\n // Start loading the new image.\r\n loadImage(src).then(newImageTag => {\r\n // Set src and ALT text if defined.\r\n if (container.tagName === 'IMG') {\r\n container.src = src;\r\n } else {\r\n const altText = container.getAttribute('data-alt') || '';\r\n newImageTag.setAttribute('alt', altText);\r\n\r\n container.appendChild(newImageTag);\r\n }\r\n\r\n container.classList.add(options.loadedClass);\r\n container.classList.remove(options.loadClass);\r\n\r\n // oldIE object-fit polyfill placed here to take resize into account\r\n if (options.oldIe11Fit) {\r\n window.objectFitPolyfill(newImageTag);\r\n }\r\n });\r\n } else {\r\n container.src = src;\r\n container.classList.add(options.loadedClass);\r\n container.classList.remove(options.loadClass);\r\n }\r\n}\r\n\r\n/**\r\n * Try to decode the image, after it's loaded, and resolve the Promise.\r\n *\r\n * @param {Element} newImage\r\n * @returns {Promise}\r\n */\r\nfunction decodeImage(newImage) {\r\n return 'decode' in newImage ? newImage.decode().then(() => newImage) : Promise.resolve(newImage);\r\n}\r\n\r\n/**\r\n * Load an image, and return a Promise that resolves once the image is loaded.\r\n *\r\n * @param {string} path\r\n * @returns {Promise} Promise that will resolve with the loaded image once it's ready.\r\n */\r\nexport function loadImage(path) {\r\n const newImage = new Image();\r\n\r\n return new Promise(resolve => {\r\n newImage.addEventListener('load', () => decodeImage(newImage).then(image => resolve(image)), false);\r\n newImage.src = path;\r\n });\r\n}\r\n\r\n/**\r\n * This function gets the data-src from the image wrapper, based on width of the browser window.\r\n *\r\n * @param {HTMLElement} container - Image wrapper element\r\n * @returns {string}\r\n */\r\nfunction getImageSrc(container) {\r\n let src = '';\r\n let largestBreakpointFound = 0;\r\n\r\n if (container.getAttribute('data-src')) {\r\n src = container.getAttribute('data-src');\r\n container.removeAttribute('data-src');\r\n } else {\r\n breakpointKeys.forEach((breakpointName, index) => {\r\n if (currentBreakpointIndex >= index) {\r\n if (index === 0 || index > largestBreakpointFound) {\r\n const srcAttribute = `data-src-${breakpointName}`;\r\n src = container.getAttribute(srcAttribute) || src;\r\n\r\n container.removeAttribute(srcAttribute);\r\n\r\n // Make sure we won't set the size to a smaller breakpoint later, in case they're not properly ordered.\r\n largestBreakpointFound = index;\r\n }\r\n }\r\n });\r\n }\r\n\r\n return src;\r\n}\r\n","export const transitionEndEventName = detectTransitionEndEventName();\r\n\r\nexport function detectTransitionEndEventName() {\r\n const transitions = {\r\n transition: 'transitionend',\r\n OTransition: 'oTransitionEnd',\r\n MozTransition: 'transitionend',\r\n WebkitTransition: 'webkitTransitionEnd'\r\n };\r\n\r\n const el = document.createElement('div');\r\n\r\n for (const t in transitions) {\r\n if (el.style[t] !== undefined) {\r\n return transitions[t];\r\n }\r\n }\r\n return '';\r\n}\r\n\r\nexport function cssAnimateNewHeight(container, classTarget = container, classOnBoth = false) {\r\n let newHeight;\r\n const prevHeight = container.offsetHeight;\r\n\r\n const delayedClose = () => {\r\n if (classOnBoth) {\r\n container.classList.remove('open');\r\n classTarget.classList.remove('open');\r\n } else {\r\n classTarget.classList.remove('open');\r\n }\r\n\r\n classTarget.blur(); // removes focus if its a button\r\n container.removeEventListener(transitionEndEventName, delayedClose);\r\n };\r\n\r\n container.removeAttribute('style');\r\n\r\n if (classTarget.classList.contains('open')) {\r\n newHeight = 0;\r\n container.addEventListener(transitionEndEventName, delayedClose);\r\n\r\n if (classOnBoth) {\r\n classTarget.classList.remove('open');\r\n }\r\n } else {\r\n classTarget.classList.add('open');\r\n\r\n if (classOnBoth) {\r\n container.classList.add('open');\r\n }\r\n\r\n newHeight = container.offsetHeight;\r\n }\r\n\r\n container.style.height = `${prevHeight}px`;\r\n\r\n setTimeout(() => {\r\n container.style.height = `${newHeight}px`;\r\n }, 10);\r\n}\r\n","import { cssAnimateNewHeight } from '../utils/animation';\r\n\r\nlet activeAccordion;\r\nlet index = 0;\r\n\r\n/**\r\n * The Accordion class uses the cssAnimateNewHeight function to reveal hidden content.\r\n * Default element selector is data-action*=\"accordion\"\r\n * If data-action is set to \"accordion-switch\", active accordions will close when another is opened.\r\n * \r\n * @param {HTMLElement} trigger\r\n * @constructor\r\n */\r\nexport class Accordion {\r\n \r\n /**\r\n * The constructor is fired once the class is instantiated.\r\n *\r\n * @param {HTMLElement} trigger\r\n */\r\n constructor(trigger) {\r\n this.dom = {\r\n trigger,\r\n container: trigger.parentNode.querySelector('.accordion__content') || trigger.nextElementSibling\r\n };\r\n\r\n this.settings = {\r\n type: trigger.getAttribute('data-action')\r\n };\r\n\r\n this.index = index;\r\n\r\n index++;\r\n\r\n this.dom.trigger.addEventListener('click', e => {\r\n e.preventDefault();\r\n if (activeAccordion && this.index !== activeAccordion.index) {\r\n // Dobbelt check added to prevent delayed dobbelt opening\r\n if (activeAccordion.dom.container.classList.contains('open')) {\r\n cssAnimateNewHeight(activeAccordion.dom.container, activeAccordion.dom.trigger, true);\r\n activeAccordion.dom.trigger.setAttribute('aria-expanded', 'false');\r\n }\r\n }\r\n\r\n cssAnimateNewHeight(this.dom.container, this.dom.trigger, true);\r\n\r\n // Set the inverted value of aria-expanded\r\n const ariaExpanded = this.dom.trigger.getAttribute('aria-expanded');\r\n this.dom.trigger.setAttribute('aria-expanded', ariaExpanded === 'false');\r\n\r\n if (this.settings.type === 'accordion-switch') {\r\n activeAccordion = this;\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction openAccordByHashId() {\r\n if (window.location.hash.indexOf('accordion') > -1) {\r\n const accordionContent = document.getElementById(window.location.hash.replace('#', ''));\r\n if (accordionContent) {\r\n const accord = document.getElementById(accordionContent.getAttribute('aria-labelledby'));\r\n accord.click();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Initialise Accordions with this function\r\n * Will only run if given selector elements are found in DOM\r\n * \r\n * @param {string} selector - element selector string\r\n */\r\n\r\nexport function setupAccordions(selector = '[data-action*=\"accordion\"]') {\r\n const accordions = document.body.querySelectorAll(selector);\r\n\r\n if (accordions) {\r\n for (let i = 0; i < accordions.length; i++) {\r\n void new Accordion(accordions[i]);\r\n }\r\n\r\n openAccordByHashId();\r\n }\r\n}\r\n","/*global YT */\r\nimport { isElement } from '../utils/elementProperties';\r\n\r\nlet loadingVideoId;\r\nlet activePlayer;\r\n\r\nfunction loadYouTubeApi() {\r\n const tag = document.createElement('script');\r\n\r\n tag.src = `${window.location.protocol}//www.youtube.com/iframe_api`;\r\n const firstScriptTag = document.getElementsByTagName('script')[0];\r\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\r\n}\r\n\r\n/**\r\n * Sets up YouTube Player via YT API using YouTube id\r\n * Does the following as video is ready:\r\n * Forces hd720 quality\r\n * Mutes video\r\n * Autoplays video\r\n *\r\n * @param {string} youtubeId - YouTube video ID\r\n * @param {boolean} allowCookies - Set to false to force use of youtube-nocookie\r\n */\r\n\r\nfunction generateYoutubeIframe(youtubeId, allowCookies = true) {\r\n const youtubeContainer = document.getElementById(youtubeId);\r\n\r\n if (youtubeContainer) {\r\n let ytPlayerHost = 'https://www.youtube-nocookie.com';\r\n\r\n if ((window.CookieInformation && CookieInformation.getConsentGivenFor('cookie_cat_statistic') && allowCookies)) {\r\n ytPlayerHost = 'https://www.youtube.com';\r\n }\r\n\r\n void new YT.Player(youtubeId, {\r\n videoId: youtubeId,\r\n host: ytPlayerHost,\r\n playerVars: {\r\n autoplay: 1,\r\n rel: 0,\r\n controls: 0,\r\n muted: 0\r\n },\r\n\r\n events: {\r\n onReady: event => {\r\n event.target.setPlaybackQuality('hd720');\r\n /*event.target.mute();*/\r\n event.target.playVideo();\r\n },\r\n onStateChange: event => {\r\n const YTP = event.target; // YouTube Player\r\n const resumePlayback = function(e) {\r\n e.preventDefault();\r\n\r\n if (activePlayer) {\r\n activePlayer.playVideo();\r\n }\r\n };\r\n\r\n if (event.data === YT.PlayerState.BUFFERING) {\r\n // Force better quality video\r\n YTP.setPlaybackQuality('hd720');\r\n }\r\n\r\n // TODO: Review if pause abillity makes sense in this module\r\n\r\n // Sets pause class\r\n // By default this hides video iframe and shows media__content\r\n\r\n if (event.data === YT.PlayerState.PAUSED) {\r\n if (YTP.h) {\r\n activePlayer = YTP;\r\n YTP.h.parentNode.addEventListener('click', resumePlayback);\r\n YTP.h.parentNode.classList.add('video--paused');\r\n }\r\n } else if (event.data === YT.PlayerState.PLAYING) {\r\n if (YTP.h && YTP.h.parentNode.classList.contains('video--paused')) {\r\n YTP.h.parentNode.classList.remove('video--paused');\r\n YTP.h.parentNode.removeEventListener('click', resumePlayback);\r\n\r\n } else {\r\n onIframeReady(YTP.h.parentNode);\r\n\r\n // Fix to black screen on loop in background-video\r\n // Bug found in Chrome 78 and Safari 13\r\n // ---------------------------------------------------\r\n const remains = YTP.getDuration() - YTP.getCurrentTime();\r\n\r\n if (window.rewindTO) {\r\n clearTimeout(window.rewindTO);\r\n }\r\n\r\n window.rewindTO = setTimeout(() => {\r\n YTP.seekTo(0);\r\n }, (remains - 0.01) * 1000);\r\n }\r\n } else if (event.data === YT.PlayerState.ENDED) {\r\n YTP.playVideo();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Static standard youtube ready function\r\n * run from YouTube Iframe API when it is done loading\r\n *\r\n */\r\n\r\nwindow.onYouTubeIframeAPIReady = function() {\r\n if (loadingVideoId) {\r\n generateYoutubeIframe(loadingVideoId);\r\n }\r\n};\r\n\r\nfunction onIframeReady(container) {\r\n container.classList.remove('video--loading');\r\n container.classList.add('video--loaded');\r\n}\r\n\r\nfunction extractVideoIdFromUrl(url) {\r\n const videoIdRegExp = /^.*((youtu.be\\/|vimeo.com\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#&?]*).*/;\r\n const match = url.match(videoIdRegExp);\r\n\r\n if (match && match[7]) {\r\n return match[7];\r\n } else {\r\n console.warn(url, 'Invalid Video URL');\r\n }\r\n}\r\n\r\n/**\r\n * Loads iframe video inside video target\r\n * in element or data-target attribute depending on given trigger\r\n *\r\n * Generates YouTube or Vimeo iframe detected in videoLink set as data-video-link.\r\n *\r\n * @param {obejct|HTMLElement|string} trigger - event obj, element or selector string of video component\r\n */\r\n\r\nexport function initIframeVideoBg(trigger) {\r\n let videoTrigger;\r\n\r\n if (trigger) {\r\n if (isElement(trigger)) {\r\n videoTrigger = trigger;\r\n } else if (typeof trigger === 'object') {\r\n trigger.preventDefault();\r\n videoTrigger = trigger.target;\r\n videoTrigger.removeEventListener('click', initIframeVideoBg);\r\n } else if (typeof trigger === 'string') {\r\n videoTrigger = document.body.querySelector(trigger);\r\n } else {\r\n window.console.warn('trigger in initIframeVideoBg is wrong type of thing');\r\n }\r\n } else {\r\n window.console.warn(\r\n `Type: ${typeof trigger} not compatiple with initIframeVideoBg.. what is this kind of nonsans ?`\r\n );\r\n }\r\n\r\n const videoTarget = videoTrigger.getAttribute('data-target')\r\n ? document.getElementById(videoTrigger.getAttribute('data-target'))\r\n : videoTrigger;\r\n\r\n if (videoTarget) {\r\n const videoLink = videoTrigger.href ? videoTrigger.href : videoTrigger.getAttribute('data-video-link');\r\n const isVimeo = videoTrigger.getAttribute('data-action') === 'video-vimeo' || videoLink.indexOf('vimeo') > -1;\r\n\r\n if (videoLink) {\r\n let videoId = videoLink.indexOf('/') !== -1 ? extractVideoIdFromUrl(videoLink) : videoLink;\r\n\r\n if (isVimeo) {\r\n const iframe = document.createElement('iframe');\r\n iframe.setAttribute('frameborder', 0);\r\n iframe.setAttribute('allowtransparency', 'true');\r\n iframe.setAttribute('playsinline', 'true');\r\n iframe.setAttribute('allow','accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share');\r\n\r\n iframe.addEventListener('load', () => {\r\n const classElem = iframe ? iframe.parentNode : this.parentNode;\r\n onIframeReady(classElem);\r\n });\r\n\r\n videoId += videoLink.indexOf('?') ? '?' : '&';\r\n\r\n //iframe.src = `https://player.vimeo.com/video/${videoId}background=1`;\r\n // We dont want the background feature on this solutions as it always autoplays. Instead we want to use the API to play the video when image above is scrolled \"into\" the video.\r\n /*iframe.src = `https://player.vimeo.com/video/${videoId}controls=0&muted=1&loop=1&autoplay=1`;*/\r\n iframe.src = `https://player.vimeo.com/video/${videoId}controls=1&loop=1&autoplay=1`;\r\n\r\n videoTarget.classList.add('video--loading');\r\n videoTarget.appendChild(iframe);\r\n } else {\r\n const player = document.createElement('div');\r\n player.id = videoId;\r\n videoTarget.appendChild(player);\r\n videoTarget.classList.add('video--loading');\r\n\r\n if (!window.YT) {\r\n loadingVideoId = videoId;\r\n\r\n loadYouTubeApi();\r\n } else {\r\n generateYoutubeIframe(videoId, false);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Sets up Video components found\r\n * As click eventListener or direct inizialiser depending on 'data-target'\r\n * Note - Will only run if given selector elements are found in DOM\r\n *\r\n * @param {string} selector - element selector string\r\n */\r\nexport function setupVideos(selector = '[data-action^=\"video\"]') {\r\n const videoElems = document.body.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < videoElems.length; i++) {\r\n const videoElem = videoElems[i];\r\n\r\n if (videoElem.getAttribute('data-target')) {\r\n videoElem.addEventListener('click', initIframeVideoBg);\r\n } else {\r\n initIframeVideoBg(videoElem);\r\n }\r\n }\r\n}\r\n","export const body = document.body;\r\nexport const qs = (s, o = body) => o.querySelector(s);\r\nexport const qsa = (s, o = body) => o.querySelectorAll(s);\r\n\r\n\r\n/**\r\n * Sets a custom CSS variable to ensure precise vh unit mesuarment\r\n *\r\n */\r\n\r\nexport function setVhProp() {\r\n // First we get the viewport height and we multiple it by 1% to get a value for a vh unit\r\n const vh = window.innerHeight * 0.01;\r\n // Then we set the value in the --vh custom property to the root of the document\r\n document.documentElement.style.setProperty('--vh', `${vh}px`);\r\n}\r\n\r\nexport function initVhUnitOverwrite() {\r\n setVhProp();\r\n window.addEventListener('resize', setVhProp);\r\n}\r\n\r\nexport function canUseWebP() {\r\n const elem = document.createElement('canvas');\r\n\r\n if (elem.getContext && elem.getContext('2d')) {\r\n // was able or not to get WebP representation\r\n return elem.toDataURL('image/webp').indexOf('data:image/webp') === 0;\r\n }\r\n\r\n // very old browser like IE 8, canvas not supported\r\n return false;\r\n}\r\n\r\n/**\r\n * Add a to the head\r\n */\r\nexport function addPrefetch(kind, url, as) {\r\n const linkElem = document.createElement('link');\r\n linkElem.rel = kind;\r\n linkElem.href = url;\r\n if (as) {\r\n linkElem.as = as;\r\n }\r\n linkElem.crossorigin = true;\r\n document.head.append(linkElem);\r\n}\r\n\r\n/**\r\n * Format number sparated with commas per thousand.\r\n *\r\n * @param {Number} num - Number you want to format\r\n *\r\n * @returns {string} - Returns the number formatet with commas\r\n *\r\n * @example:\r\n * console.info(formatNumber(2665)) // 2,665\r\n * console.info(formatNumber(102665)) // 102,665\r\n * console.info(formatNumber(1240.5)) // 1,240.5\r\n */\r\n\r\nexport function formatNumber(num) {\r\n return num.toString().replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1,');\r\n}\r\n\r\nexport function isTouch() {\r\n return 'ontouchstart' in window ? true : false;\r\n}\r\n","const easeInOutQuad = function(currentTime, start, change, duration) {\r\n let time = currentTime;\r\n time /= duration / 2;\r\n if (time < 1) {\r\n return (change / 2) * time * time + start;\r\n }\r\n time--;\r\n return (-change / 2) * (time * (time - 2) - 1) + start;\r\n};\r\n\r\nconst easeInOutQuintic = function(currentTime, start, change, duration) {\r\n let time = currentTime;\r\n const ts = (time /= duration) * time,\r\n tc = ts * time;\r\n return start + change * (6 * tc * ts + -15 * ts * ts + 10 * tc);\r\n};\r\n\r\nexport function scrollTo(to, duration = 750, callback) {\r\n function move(amount) {\r\n if (document.scrollingElement) {\r\n document.scrollingElement.scrollTop = amount;\r\n } else {\r\n document.documentElement.scrollTop = amount;\r\n document.body.parentNode.scrollTop = amount;\r\n document.body.scrollTop = amount;\r\n }\r\n }\r\n function position() {\r\n return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop;\r\n }\r\n\r\n const start = position(),\r\n change = to instanceof Element ? to.getBoundingClientRect().top - start : to - start,\r\n increment = 20;\r\n \r\n\r\n let currentTime = 0;\r\n\r\n const animateScroll = function() {\r\n // increment the time\r\n currentTime += increment;\r\n // find the value with the quadratic in-out easing function\r\n const val = easeInOutQuintic(currentTime, start, change, duration);\r\n // move the document.body\r\n move(val);\r\n // do the animation unless its over\r\n if (currentTime < duration) {\r\n requestAnimationFrame(animateScroll);\r\n } else {\r\n if (callback && typeof callback === 'function') {\r\n // the animation is done so lets callback\r\n if (typeof callback === 'function') {\r\n callback();\r\n }\r\n }\r\n }\r\n };\r\n animateScroll();\r\n}\r\n","import { scrollTo } from '../utils/scrollTo';\r\n\r\n/**\r\n * This function strips relative site path from hashlink \r\n * \r\n * @param {string} hashLink \r\n * \r\n * @returns {HTMLElement}\r\n */\r\nfunction returnHashElement(hashLink) {\r\n if (hashLink.indexOf(window.location.pathname) !== -1) {\r\n return document.getElementById(hashLink.replace(window.location.pathname, '').replace('#', ''));\r\n } else {\r\n return document.getElementById(hashLink.replace('#', ''));\r\n }\r\n}\r\n\r\n/**\r\n * Scrolls the viewport to an hash-id\r\n * if found in querystring\r\n */\r\nexport function scrollToUrlHash() {\r\n if (window.location.hash) {\r\n const element = document.getElementById(window.location.hash.replace('#', ''));\r\n\r\n if (element) {\r\n scrollTo(element);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Activate Anchor Link Scroll with this function\r\n * Will only run if given selector elements are found in DOM\r\n * \r\n * @param {string} triggerSelector \r\n */\r\n\r\nexport function setupAnchorLinkScroll(triggerSelector = '[data-action*=\"anchor\"], a[href^=\"#\"]:not([href=\"#\"]):not([role=\"tab\"]):not([data-action*=\"accordion\"])') {\r\n\r\n const triggers = document.querySelectorAll(triggerSelector);\r\n\r\n for (let i = 0; i < triggers.length; i++) {\r\n const trigger = triggers[i];\r\n const hashLink = trigger.getAttribute('href') || trigger.getAttribute('data-target');\r\n\r\n if (hashLink) {\r\n const element = returnHashElement(hashLink);\r\n\r\n trigger.addEventListener('click', e => {\r\n e.preventDefault();\r\n scrollTo(element);\r\n });\r\n }\r\n }\r\n}\r\n","import { isVisible } from '../utils/elementProperties';\r\nimport { enableScrollLock, disableScrollLock } from '../utils/scrollLock';\r\n\r\nlet activeOverlay;\r\nlet activeOverlayContent;\r\nlet activeOverlayCloseBtn;\r\n\r\nconst openClass = 'overlay--active';\r\n\r\nfunction outsideClickListener(e) { \r\n if (!activeOverlayContent.contains(e.target) && isVisible(activeOverlayContent)) {\r\n // or use: event.target.closest(selector) === null\r\n overlayClose(e);\r\n activeOverlay.removeEventListener('click', outsideClickListener);\r\n }\r\n}\r\n\r\nfunction overlayOpen(e, lockScroll = true) {\r\n const targetId = e.target ? e.target.getAttribute('data-target') : e;\r\n activeOverlay = document.getElementById(targetId);\r\n \r\n typeof e.preventDefault == 'function' ? e.preventDefault() : null;\r\n\r\n if (activeOverlay) {\r\n activeOverlay.classList.add(openClass);\r\n activeOverlayContent = activeOverlay.querySelector('.overlay__box');\r\n\r\n activeOverlayCloseBtn = activeOverlay.querySelector('[data-action=\"overlay-close\"]');\r\n activeOverlayCloseBtn.addEventListener('click', overlayClose);\r\n\r\n if (lockScroll) {\r\n enableScrollLock();\r\n }\r\n\r\n if (activeOverlayContent) {\r\n activeOverlay.addEventListener('click', outsideClickListener);\r\n }\r\n } else {\r\n console.warn('Overlay data-target missing or id not found');\r\n }\r\n}\r\n\r\nfunction overlayClose(e) {\r\n e.preventDefault();\r\n disableScrollLock();\r\n activeOverlay.classList.remove(openClass);\r\n activeOverlayCloseBtn.removeEventListener('click', overlayClose);\r\n}\r\n\r\nexport function setupOverlay(selector = '[data-action=\"overlay-open\"]') {\r\n const overlayButtonOpen = document.body.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < overlayButtonOpen.length; i++) {\r\n overlayButtonOpen[i].addEventListener('click', overlayOpen);\r\n }\r\n}\r\n\r\nwindow.showCookieBanner = (selector = 'cookiebanner') => {\r\n if (!window.declaration || (window.declaration && window.declaration > 1)) {\r\n overlayOpen(selector, false);\r\n } else {\r\n window.declaration = 2;\r\n }\r\n};\r\n\r\nwindow.hideCookieBanner = e => overlayClose(e);\r\n","\r\nconst classNames = {\r\n activeBtn: 'filter__tab--active',\r\n hiddenItem: 'hidden'\r\n};\r\n\r\n/**\r\n *\r\n * @param {HTMLElement} container\r\n *\r\n * @constructor\r\n */\r\nexport class Filter {\r\n\r\n /**\r\n * The constructor is fired once the class is instantiated.\r\n *\r\n * @param {HTMLElement} container - Element containing filter options (Could be .filter__tabs or .filter__select)\r\n */\r\n constructor(container) {\r\n if (container) {\r\n this.dom = {\r\n container,\r\n filters: container.querySelectorAll('[data-filter]'),\r\n targetContainer: document.body.querySelector(container.getAttribute('data-target-container'))\r\n };\r\n\r\n this.settings = {\r\n filterType: container.getAttribute('data-action')\r\n };\r\n\r\n if (this.dom.targetContainer) {\r\n for (let i = 0; i < this.dom.filters.length; i++) {\r\n\r\n const filter = this.dom.filters[i];\r\n const itemCountReplace = filter.getAttribute('data-item-count-replace');\r\n\r\n if (filter.tagName === 'BUTTON') {\r\n filter.addEventListener('click', e => this.filterHandler(e));\r\n } else {\r\n filter.addEventListener('change', e => this.filterHandler(e));\r\n\r\n if (itemCountReplace) {\r\n this.replaceWithNumberOfItems(filter, itemCountReplace);\r\n }\r\n }\r\n }\r\n\r\n } else {\r\n window.console.warn('Can\\'t find [data-target-container] on filter container: ', container);\r\n }\r\n } else {\r\n window.console.warn('Filter container missing');\r\n }\r\n }\r\n\r\n static deselectRadio(e) {\r\n e.target.checked = !e.target.checked;\r\n e.target.removeEventListener('click', Filter.deselectRadio);\r\n\r\n this.filterHandler(e);\r\n }\r\n\r\n /**\r\n * Filter function that compares selected filter values with filter-values on filter-item.\r\n * Added hidden-class to items that hasn't got the selected filter value.\r\n *\r\n * @param {HTMLElement} e - event (click or change event\r\n */\r\n filterHandler(e) {\r\n const filter = e.target;\r\n const filterItems = this.dom.targetContainer.querySelectorAll('[data-filter-value]');\r\n const isButton = filter.tagName === 'BUTTON';\r\n const filterValue = isButton ? filter.getAttribute('data-filter') : filter.value;\r\n \r\n\r\n if (isButton) {\r\n if (this.settings.filterType === 'filter-switch') {\r\n\r\n for (let i = 0; i < this.dom.filters.length; i++) {\r\n this.dom.filters[i].classList.remove(classNames.activeBtn);\r\n }\r\n\r\n filter.classList.add(classNames.activeBtn);\r\n } else {\r\n this.dom.targetContainer.classList.add(classNames.transitionItems);\r\n\r\n if (!filter.classList.contains(classNames.activeBtn)) {\r\n filter.classList.add(classNames.activeBtn);\r\n } else {\r\n filter.classList.remove(classNames.activeBtn);\r\n }\r\n }\r\n } else if (filter.type === 'radio') {\r\n const name = filter.name;\r\n const siblingRadios = this.dom.container.querySelectorAll(`[name=\"${name}\"]`);\r\n\r\n for (let r = 0; r < siblingRadios.length; r++) {\r\n const radio = siblingRadios[r];\r\n radio.removeEventListener('click', Filter.deselectRadio);\r\n }\r\n\r\n filter.addEventListener('click', Filter.deselectRadio.bind(this));\r\n }\r\n\r\n if (this.settings.filterType === 'filter-switch') {\r\n for (let i = 0; i < filterItems.length; i++) {\r\n const item = filterItems[i];\r\n let itemFilterValues = item.getAttribute('data-filter-value').split(',');\r\n const cleanFilterValue = filterValue.trim().toLowerCase();\r\n itemFilterValues = itemFilterValues.map(value => value.trim().toLowerCase());\r\n\r\n if (filterValue !== '*' && itemFilterValues.indexOf(cleanFilterValue) === -1) {\r\n item.classList.add(classNames.hiddenItem);\r\n } else {\r\n item.classList.remove(classNames.hiddenItem);\r\n }\r\n }\r\n } else {\r\n const filterValues = Filter.getSetValues(this.dom.filters);\r\n\r\n for (let i = 0; i < filterItems.length; i++) {\r\n const item = filterItems[i];\r\n let itemFilterValues = item.getAttribute('data-filter-value').split(',');\r\n let showItem = true;\r\n\r\n itemFilterValues = itemFilterValues.map(value => value.trim().toLowerCase());\r\n\r\n filterValues.forEach(value => {\r\n const cleanValue = value.trim().toLowerCase();\r\n if (itemFilterValues.indexOf(cleanValue) === -1) {\r\n showItem = false;\r\n }\r\n });\r\n\r\n if (!showItem) {\r\n item.classList.add(classNames.hiddenItem);\r\n } else {\r\n item.classList.remove(classNames.hiddenItem);\r\n }\r\n }\r\n }\r\n }\r\n\r\n static getSetValues(filters) {\r\n const valArray = [];\r\n\r\n // loop through list of filters\r\n for (let i = 0, len = filters.length; i < len; i++) {\r\n const filter = filters[i];\r\n if (filter.tagName === 'SELECT') {\r\n if (filter.value !== '*' && filter.value !== '') {\r\n valArray.push(filter.value);\r\n }\r\n } else if (filter.tagName === 'BUTTON') {\r\n if (filter.classList.contains(classNames.activeBtn)) {\r\n valArray.push(filter.getAttribute('data-filter'));\r\n }\r\n } else {\r\n if (filter.checked && filter.value !== '*') { // radio checked?\r\n valArray.push(filter.value); // if so, add its value to array\r\n }\r\n }\r\n }\r\n return valArray; // return value of checked radio or undefined if none checked\r\n }\r\n\r\n replaceWithNumberOfItems(element, replaceValue) {\r\n const options = element.children;\r\n const items = this.dom.targetContainer.querySelectorAll('[data-filter-value]');\r\n\r\n if (options) {\r\n for (let i = 0; i < options.length; i++) {\r\n const option = options[i];\r\n\r\n if (option.value !== '*' && option.value !== '') {\r\n let count = 0;\r\n const optionStr = option.innerText;\r\n\r\n for (let i = 0; i < items.length; i++) {\r\n let itemFilterValues = items[i].getAttribute('data-filter-value').split(',');\r\n\r\n itemFilterValues = itemFilterValues.map(value => value.trim().toLowerCase());\r\n\r\n const cleanValue = option.value.trim().toLowerCase();\r\n\r\n if (itemFilterValues.indexOf(cleanValue) > -1) {\r\n count++;\r\n }\r\n }\r\n\r\n option.innerText = optionStr.replace(replaceValue, count);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function setupFilters(selector = '[data-action*=\"filter\"]') {\r\n const filterContainers = document.body.querySelectorAll(selector);\r\n\r\n for (let i = 0; i < filterContainers.length; i++) {\r\n void new Filter(filterContainers[i]);\r\n }\r\n}\r\n","import { scrollTop, onScroll } from '../utils/scroll';\r\nimport { currentBreakpoint } from '../utils/windowResize';\r\nimport { navWidth } from './nav';\r\n\r\nexport let windowWidth;\r\nexport let windowHeight;\r\n\r\nexport function setupImageToVideo() {\r\n windowWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\r\n windowHeight = window.innerHeight;\r\n\r\n if (currentBreakpoint != 'xxs' && currentBreakpoint != 'xs') {\r\n const imageToVideos = document.querySelectorAll('.image-and-text--image-to-video');\r\n const images = document.querySelectorAll('.image-and-text--image-to-video .image-and-text__image-wrap__inner');\r\n const allImages = document.querySelectorAll('img');\r\n let loadedImages = 0;\r\n let notLoadedImages = 0;\r\n\r\n function initImageToVideo() {\r\n onScroll(() => {\r\n for (let a = 0, l = images.length; a < l; a++) {\r\n const image = images[a];\r\n const imageToVideo = image.closest('.image-and-text--image-to-video');\r\n const videoIframe = -1;\r\n\r\n if (imageToVideo != undefined) {\r\n const video = imageToVideos[a].nextElementSibling;\r\n const isNextVideo = !!video.classList.contains('media');\r\n\r\n if (isNextVideo && image.hasAttribute('data-top')) {\r\n const imageHeight = image.getAttribute('data-height');\r\n const imageCenterY = (windowHeight - imageHeight) / 2;\r\n const videoTop = parseInt(video.getAttribute('data-top'));\r\n const addWidthPrPx = image.getAttribute('data-add-width-pr-px');\r\n const addHeightPrPx = image.getAttribute('data-add-height-pr-px');\r\n const translateYPrPx = image.getAttribute('data-translate-y-pr-px');\r\n const translateXPrPx = image.getAttribute('data-translate-x-pr-px');\r\n const imageFixedTop = image.getAttribute('data-image-fixed-top');\r\n const imageFixedLeft = image.getAttribute('data-image-fixed-left');\r\n const addWidth = (scrollTop - (videoTop - windowHeight)) * addWidthPrPx;\r\n const addHeight = (scrollTop - (videoTop - windowHeight)) * addHeightPrPx;\r\n let translateY = (scrollTop - (videoTop - windowHeight)) * translateYPrPx;\r\n let translateX = (scrollTop - (videoTop - windowHeight)) * translateXPrPx;\r\n let newWidth = parseInt(image.getAttribute('data-width')) + addWidth;\r\n let newHeight = parseInt(image.getAttribute('data-height')) + addHeight;\r\n const imageMaxWidth = parseInt(image.getAttribute('data-max-width'));\r\n const imageMaxHeight = parseInt(image.getAttribute('data-max-height'));\r\n const translateYMax = image.getAttribute('data-translate-y-max');\r\n const translateXMax = image.getAttribute('data-translate-x-max');\r\n\r\n newWidth = newWidth > imageMaxWidth ? imageMaxWidth : newWidth;\r\n newHeight = newHeight > imageMaxHeight ? imageMaxHeight : newHeight;\r\n translateY = translateY < translateYMax ? translateYMax : translateY;\r\n translateX = translateX < translateXMax ? translateXMax : translateX;\r\n\r\n const imageNode = image.querySelector('img');\r\n const imageNodeMarginLeft = getComputedStyle(imageNode).marginLeft.replace('px','');\r\n const nodeTranslateXPrPx = imageNode.getAttribute('data-translate-x-pr-px');\r\n let nodeTranslateX = (scrollTop - (videoTop - windowHeight)) * nodeTranslateXPrPx;\r\n\r\n if (nodeTranslateX > (imageNodeMarginLeft * -1)) {\r\n nodeTranslateX = nodeTranslateX * -1;\r\n }\r\n\r\n videoIframe = video.querySelector('iframe');\r\n const player = new Vimeo.Player(videoIframe);\r\n\r\n function setAbsolute() {\r\n image.style.width = `${imageMaxWidth}px`;\r\n image.style.height = `${imageMaxHeight}px`;\r\n image.style.position = 'absolute';\r\n image.style.top = '100%';\r\n image.style.left = '0';\r\n image.style.zIndex = '1000';\r\n image.style.transform = null;\r\n image.style.opacity = '0';\r\n\r\n imageNode.style.transform = `translate3d(${imageNodeMarginLeft * - 1}px,0,0)`;\r\n\r\n video.style.opacity = 1;\r\n\r\n player.play();\r\n }\r\n\r\n function setFixed() {\r\n image.style.width = `${newWidth}px`;\r\n image.style.height = `${newHeight}px`;\r\n image.style.position = 'fixed';\r\n image.style.top = `${imageFixedTop}px`;\r\n image.style.left = `${imageFixedLeft}px`;\r\n image.style.zIndex = '1000';\r\n //image.style.transform = `translate3d(${translateX}px,${translateY}px,0)`;\r\n image.style.transform = `translate3d(${translateX}px,0,0)`;\r\n image.style.opacity = null;\r\n\r\n imageNode.style.transform = `translate3d(${nodeTranslateX}px,0,0)`;\r\n\r\n video.style.opacity = null;\r\n\r\n player.pause();\r\n }\r\n\r\n function removeFixed() {\r\n image.style.width = null;\r\n image.style.height = null;\r\n image.style.position = null;\r\n image.style.top = null;\r\n image.style.left = null;\r\n image.style.zIndex = null;\r\n image.style.transform = null;\r\n image.style.opacity = null;\r\n\r\n imageNode.style.transform = null;\r\n\r\n video.style.opacity = null;\r\n\r\n player.pause();\r\n }\r\n\r\n if (scrollTop >= (videoTop - windowHeight) && (scrollTop < videoTop - imageFixedTop)) {\r\n setFixed();\r\n } else if (scrollTop < (videoTop - windowHeight)) {\r\n removeFixed();\r\n } else if (scrollTop >= (videoTop - imageFixedTop)) {\r\n setAbsolute();\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n for (let a = 0, l = imageToVideos.length; a < l; a++) {\r\n const image = imageToVideos[a].querySelector('.image-and-text__image-wrap__inner');\r\n\r\n if (image != undefined) {\r\n const video = imageToVideos[a].nextElementSibling;\r\n const isNextVideo = !!video.classList.contains('media');\r\n\r\n if (isNextVideo) {\r\n /*const height = parseFloat(getComputedStyle(imageToVideos[a], null).height.replace('px', ''));\r\n imageToVideos[a].style.height = `${height}px`;*/\r\n\r\n // RP, 09-03-2020\r\n // We need to add 16/9 height of windowwiidth - 95px (nav) to the element and set margin-top on video to minus this value\r\n // We need this because we want text to be sticky down to the video....\r\n\r\n const testHeight = parseFloat(getComputedStyle(imageToVideos[a], null).height.replace('px', '')) + ((windowWidth - navWidth) * 0.5625);\r\n imageToVideos[a].style.height = `${testHeight}px`;\r\n\r\n const videoMarginTop = ((windowWidth - navWidth) * 0.5625) * -1;\r\n video.style.marginTop = `${videoMarginTop}px`;\r\n\r\n const imageTop = image.getBoundingClientRect().top + scrollTop;\r\n const imageFixedTop = windowHeight - (video.getBoundingClientRect().top - image.getBoundingClientRect().top);\r\n const videoTop = video.getBoundingClientRect().top + scrollTop;\r\n const imageFixedLeft = image.getBoundingClientRect().left;\r\n const imageWidth = image.offsetWidth;\r\n const imageHeight = image.offsetHeight;\r\n const videoWidth = video.offsetWidth;\r\n const videoHeight = video.offsetHeight;\r\n const widthDiff = videoWidth - imageWidth;\r\n const heightDiff = videoHeight - imageHeight;\r\n\r\n const imageCenterY = (windowHeight - imageHeight) / 2;\r\n\r\n const addWidthPrPx = widthDiff / (videoTop - imageTop);\r\n const addHeightPrPx = heightDiff / (videoTop - imageTop);\r\n const translateX = (image.getBoundingClientRect().left - video.getBoundingClientRect().left);\r\n //const translateYPrPx = (imageFixedTop / (videoTop - (imageTop))) * -1;\r\n const translateYPrPx = (imageCenterY / (videoTop - (imageTop - imageFixedTop)) * -1);\r\n const translateXPrPx = (translateX / (videoTop - (imageTop))) * -1;\r\n\r\n video.setAttribute('data-top', videoTop);\r\n image.setAttribute('data-top', imageTop);\r\n image.setAttribute('data-width', imageWidth);\r\n image.setAttribute('data-height', imageHeight);\r\n image.setAttribute('data-max-width', videoWidth);\r\n image.setAttribute('data-max-height', videoHeight);\r\n image.setAttribute('data-add-width-pr-px',addWidthPrPx);\r\n image.setAttribute('data-add-height-pr-px', addHeightPrPx);\r\n image.setAttribute('data-image-fixed-top', imageFixedTop);\r\n image.setAttribute('data-image-fixed-left', imageFixedLeft);\r\n image.setAttribute('data-translate-x-pr-px', translateXPrPx);\r\n image.setAttribute('data-translate-y-pr-px', translateYPrPx);\r\n image.setAttribute('data-translate-y-max', parseInt(imageFixedTop * -1));\r\n image.setAttribute('data-translate-x-max', (translateX * -1));\r\n\r\n const imageNode = image.querySelector('img');\r\n const imageNodeMarginLeft = getComputedStyle(imageNode).marginLeft.replace('px','');\r\n const nodeTranslateXPrPx = ((imageNodeMarginLeft * -1) / (videoTop - (imageTop)));\r\n\r\n imageNode.setAttribute('data-translate-x-pr-px',nodeTranslateXPrPx);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (imageToVideos.length > 0) {\r\n for (let a = 0, l = allImages.length; a < l; a++) {\r\n const image = allImages[a];\r\n\r\n function imageLoaded() {\r\n loadedImages++;\r\n }\r\n\r\n function imageNotLoaded() {\r\n notLoadedImages++;\r\n }\r\n\r\n if (image.complete) {\r\n loadedImages++;\r\n } else {\r\n image.addEventListener('load', imageLoaded);\r\n image.addEventListener('error', imageNotLoaded);\r\n }\r\n }\r\n\r\n const checkImagesAndVimeoAPI = setInterval(function () {\r\n if (loadedImages + notLoadedImages == allImages.length && Vimeo != undefined) {\r\n clearInterval(checkImagesAndVimeoAPI);\r\n initImageToVideo();\r\n }\r\n }, 100);\r\n }\r\n }\r\n}","/**\r\n * Function that opens new tab\r\n * and hides the activeTab if found\r\n * \r\n * @param {object|HTMLElement} e - click event or tab element\r\n */\r\n\r\nfunction openTab(e) {\r\n const tab = e.target ? e.target : e;\r\n\r\n if (e.target) {\r\n e.preventDefault();\r\n }\r\n \r\n const tabContent = document.getElementById(tab.getAttribute('aria-controls').replace('#', ''));\r\n \r\n if (tabContent) {\r\n const activeTab = tab.parentNode.parentNode.querySelector('.tab--active');\r\n\r\n if (activeTab) {\r\n activeTab.classList.remove('tab--active');\r\n activeTab.setAttribute('aria-selected', false); \r\n\r\n const activeTabContent = document.getElementById(activeTab.getAttribute('aria-controls').replace('#', ''));\r\n if (activeTabContent) {\r\n activeTabContent.classList.remove('tab__content--active');\r\n }\r\n }\r\n\r\n tab.classList.add('tab--active');\r\n tab.setAttribute('aria-selected', true);\r\n tabContent.classList.add('tab__content--active');\r\n }\r\n}\r\n\r\nfunction openTabByHashId() {\r\n if (window.location.hash.indexOf('tab') > -1) {\r\n const tabContent = document.getElementById(window.location.hash.replace('#', ''));\r\n if (tabContent) {\r\n const tab = document.getElementById(tabContent.getAttribute('aria-labelledby'));\r\n openTab(tab);\r\n }\r\n }\r\n}\r\n\r\n\r\n/**\r\n* Initialise Tabs with this function\r\n* Will only run if given selector elements are found in DOM\r\n* \r\n* @param {string} selector - element selector string \r\n*/\r\nexport function setupTabs(selector = '[data-action=\"tabs\"]') {\r\n const tabsContainer = document.body.querySelectorAll(selector);\r\n\r\n if (tabsContainer) {\r\n for (let i = 0; i < tabsContainer.length; i++) {\r\n const tabs = tabsContainer[i].querySelectorAll('[role=\"tab\"]');\r\n \r\n for (let t = 0; t < tabs.length; t++) {\r\n tabs[t].addEventListener('click', openTab);\r\n }\r\n }\r\n }\r\n \r\n openTabByHashId();\r\n\r\n window.addEventListener('hashchange', openTabByHashId, false);\r\n}\r\n","function setLinkListHeights(linkLists) {\r\n for (var a = 0, l = linkLists.length; a < l; a++) {\r\n linkLists[a].setAttribute('data-height',linkLists[a].scrollHeight);\r\n }\r\n}\r\n\r\nexport function setupEntrances() {\r\n const entrancesItems = document.querySelectorAll('.entrances__list > .entrances__item');\r\n const entrancesLinkLists = document.querySelectorAll('.entrances .entrances__link-list');\r\n\r\n setLinkListHeights(entrancesLinkLists);\r\n\r\n function clickEntrance(e) {\r\n const item = e.target.closest('.entrances__item');\r\n const itemList = e.target.closest('.entrances__list');\r\n\r\n if (item != undefined && itemList != undefined) {\r\n const allItems = itemList.querySelectorAll('.entrances__item');\r\n const currentActiveItem = Array.prototype.slice.call(allItems).filter(x => x.classList.contains('js-active'));\r\n\r\n function updateListview(itemList,item) {\r\n itemList.classList.add('js-open');\r\n item.classList.add('js-active');\r\n }\r\n\r\n if (currentActiveItem.length == 1) {\r\n if (currentActiveItem != item) {\r\n currentActiveItem[0].classList.remove('js-active');\r\n\r\n const activeItemLinkList = currentActiveItem[0].querySelector('.entrances__link-list');\r\n\r\n if (activeItemLinkList != undefined) {\r\n activeItemLinkList.style.height = '0';\r\n }\r\n\r\n updateListview(itemList, item);\r\n }\r\n } else {\r\n updateListview(itemList, item);\r\n }\r\n\r\n const itemLinkList = item.querySelector('.entrances__link-list');\r\n\r\n if (itemLinkList != undefined) {\r\n itemLinkList.style.height = `${itemLinkList.getAttribute('data-height')}px`;\r\n }\r\n }\r\n }\r\n\r\n for (let a = 0, l = entrancesItems.length; a < l; a++) {\r\n entrancesItems[a].addEventListener('click', clickEntrance);\r\n }\r\n}","import { currentBreakpoint } from '../utils/windowResize';\r\nimport { isTouch } from '../utils/helpers';\r\n\r\nexport function setupNewslist() {\r\n const newslists = document.querySelectorAll('.newslist__list');\r\n\r\n function initNewslist(newslist) {\r\n const newslistParent = newslist.closest('.newslist');\r\n\r\n if (newslistParent != undefined) {\r\n const newslistNext = newslistParent.querySelector('.icon-wrap--next');\r\n const newslistPrev = newslistParent.querySelector('.icon-wrap--prev');\r\n const newslistNavItems = newslistParent.querySelectorAll('.newslist__nav__item');\r\n const newslistWrap = newslistParent.querySelector('.newslist__list-wrap');\r\n\r\n if (newslistNext != undefined && newslistWrap != undefined) {\r\n const minTranslate = ((newslist.offsetWidth - newslistWrap.offsetWidth - 25)) * -1;\r\n const firstItem = newslist.querySelectorAll('.newslist__item')[0];\r\n const itemCount = newslist.querySelectorAll('.newslist__item').length;\r\n\r\n let index = 0;\r\n let startTime = -1;\r\n let startX = -1;\r\n let startY = -1;\r\n\r\n let endTime = -1;\r\n let moveX = -1;\r\n let moveY = -1;\r\n\r\n let distanceX = -1;\r\n let direction = -1;\r\n let time = -1;\r\n let translateX = -1;\r\n let moved = false;\r\n let pxMoved = 0;\r\n\r\n function updateNavList() {\r\n const activeItem = Array.prototype.slice.call(newslistNavItems).filter(x => x.classList.contains('js-active'));\r\n\r\n if (activeItem.length == 1) {\r\n const newNavIndex = index;\r\n\r\n if (newNavIndex < newslistNavItems.length) {\r\n const newActiveItem = newslistNavItems[newNavIndex];\r\n\r\n if (newActiveItem != activeItem[0]) {\r\n activeItem[0].classList.remove('js-active');\r\n newActiveItem.classList.add('js-active');\r\n }\r\n }\r\n }\r\n }\r\n\r\n function bounceList() {\r\n if (direction == 'left') {\r\n newslist.classList.add('js-bounce-left');\r\n } else if (direction == 'right') {\r\n newslist.classList.add('js-bounce-right');\r\n }\r\n }\r\n\r\n function moveListTo(moveIndex) {\r\n index = moveIndex;\r\n\r\n const newX = ((index) * firstItem.offsetWidth) * -1;\r\n newslist.style.transform = `translate3d(${newX}px,0,0`;\r\n pxMoved = newX;\r\n\r\n updateNavList();\r\n }\r\n\r\n function moveList(e) {\r\n if (isTouch && direction != -1) {\r\n //if (currentBreakpoint == 'xxs' || currentBreakpoint == 'xs') {\r\n let newX = -1;\r\n\r\n if (direction == 'left' && index + 1 < itemCount) {\r\n newX = ((index + 1) * firstItem.offsetWidth) * -1;\r\n index++;\r\n } else if (direction == 'right' && index > 0) {\r\n newX = ((index - 1) * firstItem.offsetWidth) * -1;\r\n index--;\r\n }\r\n\r\n if (newX != -1) {\r\n newX = newX > 0 ? 0 : newX;\r\n newX = newX < minTranslate ? minTranslate : newX;\r\n\r\n newslist.style.transform = `translate3d(${newX}px,0,0`;\r\n pxMoved = newX;\r\n } else {\r\n bounceList();\r\n }\r\n } else {\r\n direction = e.target.closest('.icon-wrap--prev') != undefined ? 'left' : 'right';\r\n\r\n if (direction == 'left') {\r\n if (index > 0) {\r\n const newX = ((index - 1) * firstItem.offsetWidth) * -1;\r\n pxMoved = newX;\r\n\r\n newslist.style.transform = `translate3d(${newX}px,0,0`;\r\n index--;\r\n }\r\n } else {\r\n if (index + 1 < itemCount) {\r\n const newX = ((index + 1) * firstItem.offsetWidth) * -1;\r\n pxMoved = newX;\r\n\r\n newslist.style.transform = `translate3d(${newX}px,0,0`;\r\n index++;\r\n }\r\n }\r\n\r\n direction = -1;\r\n }\r\n\r\n updateNavList();\r\n }\r\n\r\n //if (currentBreakpoint == 'xs' || currentBreakpoint == 'xxs') {\r\n if (isTouch) {\r\n function listAnimationEnd() {\r\n newslist.classList.remove('js-bounce-left');\r\n newslist.classList.remove('js-bounce-right');\r\n }\r\n\r\n function touchStart(e) {\r\n if (e.touches.length == 1) {\r\n newslist.classList.remove('js-bounce-left');\r\n newslist.classList.remove('js-bounce-right');\r\n newslist.style.transition = null;\r\n startX = e.changedTouches[0].pageX;\r\n startY = e.changedTouches[0].pageY;\r\n startTime = new Date();\r\n }\r\n }\r\n\r\n function touchMove(e) {\r\n if (e.touches.length == 1) {\r\n moveX = e.targetTouches[0].pageX;\r\n moveY = e.targetTouches[0].pageY;\r\n\r\n distanceX = startX - moveX;\r\n let distanceY = startY - moveY;\r\n\r\n direction = startX > moveX ? 'left' : 'right';\r\n\r\n distanceX = distanceX < 0 ? distanceX * -1 : distanceX;\r\n distanceY = distanceY < 0 ? distanceY * -1 : distanceY;\r\n\r\n if (distanceX > distanceY) {\r\n e.preventDefault();\r\n\r\n translateX = direction == 'left' ? distanceX * -1 : distanceX;\r\n let newTranslateX = translateX + pxMoved;\r\n newTranslateX = newTranslateX > 0 ? 0 : newTranslateX;\r\n newTranslateX = newTranslateX < minTranslate ? minTranslate : newTranslateX;\r\n\r\n newslist.style.transform = `translate3d(${newTranslateX}px,0,0)`;\r\n\r\n moved = true;\r\n translateX = newTranslateX;\r\n }\r\n }\r\n }\r\n\r\n function touchEnd(e) {\r\n if (moved) {\r\n pxMoved = translateX;\r\n\r\n endTime = new Date();\r\n time = (endTime.getTime() - startTime.getTime()) / 1000;\r\n\r\n if (isTouch) {\r\n //if (currentBreakpoint == 'xxs' || currentBreakpoint == 'xs') {\r\n moveList();\r\n }\r\n\r\n startTime = -1;\r\n startX = -1;\r\n startY = -1;\r\n\r\n endTime = -1;\r\n moveX = -1;\r\n moveY = -1;\r\n\r\n distanceX = -1;\r\n direction = -1;\r\n time = -1;\r\n translateX = -1;\r\n moved = false;\r\n }\r\n }\r\n\r\n function touchCancel(e) {\r\n startTime = -1;\r\n startX = -1;\r\n startY = -1;\r\n\r\n endTime = -1;\r\n moveX = -1;\r\n moveY = -1;\r\n\r\n distanceX = -1;\r\n direction = -1;\r\n time = -1;\r\n translateX = -1;\r\n moved = false;\r\n }\r\n\r\n newslist.addEventListener('animationend', listAnimationEnd);\r\n newslist.addEventListener('touchstart', touchStart, {passive: true});\r\n newslist.addEventListener('touchmove', touchMove);\r\n newslist.addEventListener('touchend', touchEnd, {passive: true});\r\n newslist.addEventListener('touchcancel', touchCancel);\r\n }\r\n\r\n newslistPrev.addEventListener('click', moveList);\r\n newslistNext.addEventListener('click', moveList);\r\n\r\n function clickNavItem(e) {\r\n const navItem = e.target.closest('.newslist__nav__item');\r\n const clickedIndex = Array.prototype.slice.call(newslistNavItems).indexOf(navItem);\r\n\r\n moveListTo(clickedIndex);\r\n }\r\n\r\n for (let a = 0, l = newslistNavItems.length; a < l; a++) {\r\n newslistNavItems[a].addEventListener('click', clickNavItem);\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (let a = 0, l = newslists.length; a < l; a++) {\r\n initNewslist(newslists[a]);\r\n }\r\n}","import { currentBreakpoint } from '../utils/windowResize';\r\nimport { isTouch } from '../utils/helpers';\r\n\r\nexport function setupGallery() {\r\n const galleries = document.querySelectorAll('.gallery__list');\r\n\r\n function initGallery(gallery) {\r\n const galleryParent = gallery.closest('.gallery');\r\n\r\n if (galleryParent != undefined) {\r\n const gallerytNext = galleryParent.querySelector('.icon-wrap--next');\r\n const gallerytPrev = galleryParent.querySelector('.icon-wrap--prev');\r\n const galleryNavItems = galleryParent.querySelectorAll('.gallery__nav__item');\r\n const galleryWrap = galleryParent.querySelector('.gallery__list-wrap');\r\n\r\n if (gallerytNext != undefined && galleryWrap != undefined) {\r\n const minTranslate = ((gallery.offsetWidth - galleryWrap.offsetWidth - 25)) * -1;\r\n const firstItem = gallery.querySelectorAll('.gallery__item')[0];\r\n const itemCount = gallery.querySelectorAll('.gallery__item').length;\r\n\r\n let index = 0;\r\n let startTime = -1;\r\n let startX = -1;\r\n let startY = -1;\r\n\r\n let endTime = -1;\r\n let moveX = -1;\r\n let moveY = -1;\r\n\r\n let distanceX = -1;\r\n let direction = -1;\r\n let time = -1;\r\n let translateX = -1;\r\n let moved = false;\r\n let pxMoved = 0;\r\n\r\n function updateNavList() {\r\n const activeItem = Array.prototype.slice.call(galleryNavItems).filter(x => x.classList.contains('js-active'));\r\n\r\n if (activeItem.length == 1) {\r\n const newNavIndex = index;\r\n\r\n if (newNavIndex < galleryNavItems.length) {\r\n const newActiveItem = galleryNavItems[newNavIndex];\r\n\r\n if (newActiveItem != activeItem[0]) {\r\n activeItem[0].classList.remove('js-active');\r\n newActiveItem.classList.add('js-active');\r\n }\r\n }\r\n }\r\n }\r\n\r\n function bounceList() {\r\n if (direction == 'left') {\r\n gallery.classList.add('js-bounce-left');\r\n } else if (direction == 'right') {\r\n gallery.classList.add('js-bounce-right');\r\n }\r\n }\r\n\r\n function moveListTo(moveIndex) {\r\n index = moveIndex;\r\n\r\n const newX = ((index) * firstItem.offsetWidth) * -1;\r\n gallery.style.transform = `translate3d(${newX}px,0,0`;\r\n pxMoved = newX;\r\n\r\n updateNavList();\r\n }\r\n\r\n function moveList(e) {\r\n if (isTouch && direction != -1) {\r\n let newX = -1;\r\n\r\n if (direction == 'left' && index + 1 < itemCount) {\r\n newX = ((index + 1) * firstItem.offsetWidth) * -1;\r\n index++;\r\n } else if (direction == 'right' && index > 0) {\r\n newX = ((index - 1) * firstItem.offsetWidth) * -1;\r\n index--;\r\n }\r\n\r\n if (newX != -1) {\r\n newX = newX > 0 ? 0 : newX;\r\n newX = newX < minTranslate ? minTranslate : newX;\r\n\r\n gallery.style.transform = `translate3d(${newX}px,0,0`;\r\n pxMoved = newX;\r\n } else {\r\n bounceList();\r\n }\r\n } else {\r\n direction = e.target.closest('.icon-wrap--prev') != undefined ? 'left' : 'right';\r\n\r\n if (direction == 'left') {\r\n if (index > 0) {\r\n const newX = ((index - 1) * firstItem.offsetWidth) * -1;\r\n pxMoved = newX;\r\n\r\n gallery.style.transform = `translate3d(${newX}px,0,0`;\r\n index--;\r\n }\r\n } else {\r\n if (index + 1 < itemCount) {\r\n const newX = ((index + 1) * firstItem.offsetWidth) * -1;\r\n pxMoved = newX;\r\n\r\n gallery.style.transform = `translate3d(${newX}px,0,0`;\r\n index++;\r\n }\r\n }\r\n\r\n direction = -1;\r\n }\r\n\r\n updateNavList();\r\n }\r\n\r\n //if (currentBreakpoint == 'xs' || currentBreakpoint == 'xxs') {\r\n if (isTouch) {\r\n function listAnimationEnd() {\r\n gallery.classList.remove('js-bounce-left');\r\n gallery.classList.remove('js-bounce-right');\r\n }\r\n\r\n function touchStart(e) {\r\n if (e.touches.length == 1) {\r\n gallery.classList.remove('js-bounce-left');\r\n gallery.classList.remove('js-bounce-right');\r\n gallery.style.transition = null;\r\n startX = e.changedTouches[0].pageX;\r\n startY = e.changedTouches[0].pageY;\r\n startTime = new Date();\r\n }\r\n }\r\n\r\n function touchMove(e) {\r\n if (e.touches.length == 1) {\r\n moveX = e.targetTouches[0].pageX;\r\n moveY = e.targetTouches[0].pageY;\r\n\r\n distanceX = startX - moveX;\r\n let distanceY = startY - moveY;\r\n\r\n direction = startX > moveX ? 'left' : 'right';\r\n\r\n distanceX = distanceX < 0 ? distanceX * -1 : distanceX;\r\n distanceY = distanceY < 0 ? distanceY * -1 : distanceY;\r\n\r\n if (distanceX > distanceY) {\r\n e.preventDefault();\r\n\r\n translateX = direction == 'left' ? distanceX * -1 : distanceX;\r\n let newTranslateX = translateX + pxMoved;\r\n newTranslateX = newTranslateX > 0 ? 0 : newTranslateX;\r\n newTranslateX = newTranslateX < minTranslate ? minTranslate : newTranslateX;\r\n\r\n gallery.style.transform = `translate3d(${newTranslateX}px,0,0)`;\r\n\r\n moved = true;\r\n translateX = newTranslateX;\r\n }\r\n }\r\n }\r\n\r\n function touchEnd(e) {\r\n if (moved) {\r\n pxMoved = translateX;\r\n\r\n endTime = new Date();\r\n time = (endTime.getTime() - startTime.getTime()) / 1000;\r\n\r\n //if (currentBreakpoint == 'xxs' || currentBreakpoint == 'xs') {\r\n if (isTouch) {\r\n moveList();\r\n }\r\n\r\n startTime = -1;\r\n startX = -1;\r\n startY = -1;\r\n\r\n endTime = -1;\r\n moveX = -1;\r\n moveY = -1;\r\n\r\n distanceX = -1;\r\n direction = -1;\r\n time = -1;\r\n translateX = -1;\r\n moved = false;\r\n }\r\n }\r\n\r\n function touchCancel(e) {\r\n startTime = -1;\r\n startX = -1;\r\n startY = -1;\r\n\r\n endTime = -1;\r\n moveX = -1;\r\n moveY = -1;\r\n\r\n distanceX = -1;\r\n direction = -1;\r\n time = -1;\r\n translateX = -1;\r\n moved = false;\r\n }\r\n\r\n gallery.addEventListener('animationend', listAnimationEnd);\r\n gallery.addEventListener('touchstart', touchStart, {passive: true});\r\n gallery.addEventListener('touchmove', touchMove);\r\n gallery.addEventListener('touchend', touchEnd, {passive: true});\r\n gallery.addEventListener('touchcancel', touchCancel);\r\n }\r\n\r\n gallerytPrev.addEventListener('click', moveList);\r\n gallerytNext.addEventListener('click', moveList);\r\n\r\n function clickNavItem(e) {\r\n const navItem = e.target.closest('.gallery__nav__item');\r\n const clickedIndex = Array.prototype.slice.call(galleryNavItems).indexOf(navItem);\r\n\r\n moveListTo(clickedIndex);\r\n }\r\n\r\n for (let a = 0, l = galleryNavItems.length; a < l; a++) {\r\n galleryNavItems[a].addEventListener('click', clickNavItem);\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (let a = 0, l = galleries.length; a < l; a++) {\r\n initGallery(galleries[a]);\r\n }\r\n}","export function setupCalendarFilter() {\r\n const startDateField = document.getElementById('startDateField');\r\n const endDateField = document.getElementById('endDateField');\r\n const typeField = document.getElementById('typeField');\r\n const eventItems = document.querySelectorAll('.calendar__day,.calendar__item');\r\n\r\n if (\r\n startDateField != undefined &&\r\n endDateField != undefined &&\r\n typeField != undefined &&\r\n eventItems.length > 0\r\n ) {\r\n function filterEvents(updateUrl) {\r\n const selectedType = typeField.selectedIndex != 0 ? typeField.options[typeField.selectedIndex].value : '';\r\n const selectedStartDateString = startDateField.value;\r\n const selectedEndDateString = endDateField.value;\r\n\r\n const startParts = selectedStartDateString.split('.');\r\n const startDay = parseInt(startParts[0], 10);\r\n const startMonth = parseInt(startParts[1], 10) - 1;\r\n const startYear = parseInt(startParts[2], 10);\r\n const selectedDateStart = new Date(startYear, startMonth, startDay);\r\n\r\n const endParts = selectedEndDateString.split('.');\r\n const endDay = parseInt(endParts[0], 10);\r\n const endMonth = parseInt(endParts[1], 10) - 1;\r\n const endYear = parseInt(endParts[2], 10);\r\n const selectedDateEnd = new Date(endYear, endMonth, endDay);\r\n\r\n let currentDay = -1;\r\n let dayEventCounter = 0;\r\n\r\n for (let a = 0, l = eventItems.length; a < l; a++) {\r\n const eventItem = eventItems[a];\r\n\r\n if (eventItem.classList.contains('calendar__day')) {\r\n if (dayEventCounter == 0 && currentDay != -1) {\r\n currentDay.classList.add('js-hide');\r\n } else if (currentDay != -1) {\r\n currentDay.classList.remove('js-hide');\r\n }\r\n\r\n currentDay = eventItem;\r\n dayEventCounter = 0;\r\n }\r\n\r\n if (eventItem.classList.contains('calendar__item')) {\r\n const eventTypes = eventItem.getAttribute('data-type');\r\n const eventDateStartString = eventItem.getAttribute('data-date-start');\r\n const eParts = eventDateStartString.split('.');\r\n const eDay = parseInt(eParts[0], 10);\r\n const eMonth = parseInt(eParts[1], 10) - 1;\r\n const eYear = parseInt(eParts[2], 10);\r\n const eventDateStart = new Date(eYear, eMonth, eDay);\r\n\r\n if (\r\n (eventTypes.includes(selectedType) || selectedType == '') &&\r\n eventDateStart >= selectedDateStart &&\r\n eventDateStart <= selectedDateEnd\r\n ) {\r\n eventItem.classList.remove('js-hide');\r\n dayEventCounter++;\r\n } else {\r\n eventItem.classList.add('js-hide');\r\n }\r\n }\r\n }\r\n\r\n if (dayEventCounter == 0 && currentDay != -1) {\r\n currentDay.classList.add('js-hide');\r\n } else if (currentDay != -1) {\r\n currentDay.classList.remove('js-hide');\r\n }\r\n\r\n if (updateUrl) {\r\n let pushState = `${location.protocol}//${location.host}${location.pathname}`;\r\n let parameterAdded = false;\r\n\r\n if (selectedType != '') {\r\n pushState += `?type=${selectedType}`;\r\n parameterAdded = true;\r\n }\r\n\r\n history.pushState({}, document.title, pushState);\r\n }\r\n }\r\n\r\n let startDate = -1;\r\n let endDate = -1;\r\n\r\n let checkPikaday = setInterval(function () {\r\n if (typeof Pikaday != 'undefined') {\r\n clearInterval(checkPikaday);\r\n createDateFields();\r\n }\r\n }, 10);\r\n\r\n function createDateFields() {\r\n let defaultDatesSet = false;\r\n\r\n const startDateField = document.getElementById('startDateField');\r\n const endDateField = document.getElementById('endDateField');\r\n\r\n const updateStartDate = function () {\r\n startPicker.setStartRange(startDate);\r\n endPicker.setStartRange(startDate);\r\n endPicker.setMinDate(startDate);\r\n };\r\n\r\n const updateEndDate = function () {\r\n startPicker.setEndRange(endDate);\r\n startPicker.setMaxDate(endDate);\r\n endPicker.setEndRange(endDate);\r\n };\r\n\r\n const startPicker = new Pikaday({\r\n field: startDateField,\r\n firstDay: 1,\r\n i18n: {\r\n previousMonth: 'Forrige måned',\r\n nextMonth: 'Næste måned',\r\n months: ['Januar', 'Februar', 'Marts', 'April', 'Maj', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'December'],\r\n weekdays: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'],\r\n weekdaysShort: ['Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør']\r\n },\r\n toString(date, format) {\r\n let day = date.getDate().toString();\r\n let month = date.getMonth() + 1;\r\n month = month.toString();\r\n const year = date.getFullYear();\r\n\r\n if (day.length == 1) {\r\n day = `0${day}`;\r\n }\r\n\r\n if (month.length == 1) {\r\n month = `0${month}`;\r\n }\r\n\r\n return `${day}.${month}.${year}`;\r\n },\r\n onSelect () {\r\n startDate = this.getDate();\r\n updateStartDate();\r\n\r\n if (defaultDatesSet) {\r\n filterEvents(true);\r\n }\r\n },\r\n parse(dateString, format) {\r\n const parts = dateString.split('/');\r\n const day = parseInt(parts[0], 10);\r\n const month = parseInt(parts[1], 10) - 1;\r\n const year = parseInt(parts[2], 10);\r\n\r\n return new Date(year, month, day);\r\n }\r\n });\r\n\r\n const endPicker = new Pikaday({\r\n field: endDateField,\r\n firstDay: 1,\r\n i18n: {\r\n previousMonth: 'Forrige måned',\r\n nextMonth: 'Næste måned',\r\n months: ['Januar', 'Februar', 'Marts', 'April', 'Maj', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'December'],\r\n weekdays: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'],\r\n weekdaysShort: ['Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør']\r\n },\r\n toString(date, format) {\r\n let day = date.getDate().toString();\r\n let month = date.getMonth() + 1;\r\n month = month.toString();\r\n const year = date.getFullYear();\r\n\r\n if (day.length == 1) {\r\n day = `0${day}`;\r\n }\r\n\r\n if (month.length == 1) {\r\n month = `0${month}`;\r\n }\r\n\r\n return `${day}.${month}.${year}`;\r\n },\r\n onSelect () {\r\n endDate = this.getDate();\r\n updateEndDate();\r\n\r\n if (defaultDatesSet) {\r\n filterEvents(true);\r\n }\r\n },\r\n parse(dateString, format) {\r\n const parts = dateString.split('/');\r\n const day = parseInt(parts[0], 10);\r\n const month = parseInt(parts[1], 10) - 1;\r\n const year = parseInt(parts[2], 10);\r\n\r\n return new Date(year, month, day);\r\n }\r\n });\r\n\r\n const startEndDate = new Date();\r\n startEndDate.setMonth(startEndDate.getMonth() + 6);\r\n\r\n startPicker.setDate(new Date());\r\n endPicker.setDate(startEndDate);\r\n\r\n defaultDatesSet = true;\r\n\r\n const _startDate = startPicker.getDate();\r\n const _endDate = endPicker.getDate();\r\n\r\n if (_startDate) {\r\n startDate = _startDate;\r\n updateStartDate();\r\n }\r\n\r\n if (_endDate) {\r\n endDate = _endDate;\r\n updateEndDate();\r\n }\r\n\r\n typeField.addEventListener('change',function() {\r\n filterEvents(true);\r\n });\r\n\r\n filterEvents(false);\r\n }\r\n }\r\n}","export function setupCalendar(triggerSelector = '[data-action*=\"anchor\"], a[href^=\"#\"]:not([href=\"#\"]):not([role=\"tab\"]):not([data-action*=\"accordion\"])') {\r\n const checkPikaday = setInterval(function () {\r\n if (typeof Pikaday != 'undefined') {\r\n clearInterval(checkPikaday);\r\n createCalendar();\r\n }\r\n }, 10);\r\n\r\n const documentLanguage = document.documentElement.lang;\r\n const pikadayLabels = [];\r\n\r\n pikadayLabels['en-GB'] = {\r\n previousMonth: 'Previous month',\r\n nextMonth: 'Next month',\r\n months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\r\n monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'],\r\n weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\r\n weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']\r\n };\r\n pikadayLabels['da-DK'] = {\r\n previousMonth: 'Forrige måned',\r\n nextMonth: 'Næste måned',\r\n months: ['Januar', 'Februar', 'Marts', 'April', 'Maj', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'December'],\r\n monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Juni', 'Juli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dec'],\r\n weekdays: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'],\r\n weekdaysShort: ['Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør']\r\n };\r\n\r\n const createCalendar = () => {\r\n\r\n const eventItems = Array.from(document.querySelectorAll('.calendar-v2 .item'));\r\n const eventDates = [];\r\n const container = document.querySelector('.datepicker');\r\n\r\n container.classList.add('testing')\r\n\r\n function filterItems(date) {\r\n eventItems.forEach(eventItem => {\r\n const eventDate = new Date(eventItem.getAttribute('data-date'));\r\n\r\n if (\r\n eventDate.getFullYear() == date.getFullYear() &&\r\n eventDate.getMonth() == date.getMonth() &&\r\n eventDate.getDate() == date.getDate()\r\n ) {\r\n eventItem.classList.remove('js-hide');\r\n } else {\r\n eventItem.classList.add('js-hide');\r\n }\r\n });\r\n }\r\n\r\n eventItems.forEach(eventItem => {\r\n const eventDate = eventItem.getAttribute('data-date');\r\n eventDates.push(eventDate);\r\n });\r\n\r\n const startDate = new Date();\r\n\r\n const picker = new Pikaday({\r\n events: eventDates,\r\n firstDay: 1,\r\n i18n: pikadayLabels[documentLanguage],\r\n minDate: new Date(),\r\n onSelect: function (date) {\r\n filterItems(date);\r\n }\r\n });\r\n\r\n picker.setDate(startDate);\r\n\r\n container.appendChild(picker.el);\r\n };\r\n}","import { initWindowResize, onWindowResize, currentBreakpoint, currentBreakpointIndex } from './utils/windowResize';\r\nimport { initScroll } from './utils/scroll';\r\nimport { onReady } from './utils/onReady';\r\nimport { setupNav } from './components/nav';\r\nimport { setupLazyLoading } from './utils/lazyImage';\r\nimport { setupAccordions } from './components/accordion';\r\nimport { setupVideos } from './components/video';\r\nimport { isTouch, initVhUnitOverwrite } from './utils/helpers';\r\nimport pkg from '../../package.json';\r\nimport { setupAnchorLinkScroll } from './components/anchors';\r\nimport { setupFilters } from './components/filter';\r\nimport { setupOverlay } from './components/overlay';\r\nimport { setupTabs } from './components/tabs';\r\nimport { setupEntrances } from './components/entrances';\r\nimport { setupImageToVideo } from './components/image-to-video';\r\nimport { setupNewslist } from './components/newslist';\r\nimport { setupGallery } from './components/gallery';\r\nimport { setupCalendarFilter } from './components/calendarFilter';\r\nimport { setupCalendarAccordion } from './components/calendarAccordion';\r\nimport { setupCalendar } from './components/calendar';\r\n\r\n// Below are example of how to use import libraries installed via npm.\r\n// import \"intersection-observer\"; // Polyfill used for sal.js animations\r\n// import {sal} from \"sal.js\";\r\n\r\nfunction init() {\r\n document.body.classList.remove('standby');\r\n document.body.setAttribute('data-is-touch',isTouch());\r\n\r\n setupAnchorLinkScroll();\r\n\r\n initWindowResize();\r\n\r\n initScroll();\r\n\r\n setupNav('.nav', false);\r\n\r\n onReady(() => {\r\n initVhUnitOverwrite();\r\n\r\n setupLazyLoading();\r\n\r\n setupAccordions();\r\n\r\n setupFilters();\r\n\r\n setupOverlay();\r\n\r\n setupVideos();\r\n\r\n setupTabs();\r\n\r\n setupEntrances();\r\n\r\n setupImageToVideo();\r\n\r\n setupNewslist();\r\n\r\n setupGallery();\r\n\r\n setupCalendarFilter();\r\n\r\n setupCalendarAccordion();\r\n\r\n setupCalendar();\r\n });\r\n\r\n // Simulated CookieBot function-call via GTM\r\n window.showCookieBanner('cookiebanner-2');\r\n}\r\n\r\ninit();\r\n","export function setupCalendarAccordion() {\r\n const calendarItems = document.querySelectorAll('.calendar__item');\r\n const locationHash = window.location.hash.toString();\r\n\r\n if (locationHash.length > 0) {\r\n const element = document.querySelector(locationHash);\r\n\r\n if (element) {\r\n const elementReadMoreText = element.querySelector('.richtext--readmore');\r\n\r\n if (elementReadMoreText) {\r\n elementReadMoreText.style.height = `${elementReadMoreText.scrollHeight}px`;\r\n elementReadMoreText.classList.add('js-open');\r\n }\r\n }\r\n }\r\n\r\n function clickReadMoreBtn(e) {\r\n const link = e.currentTarget;\r\n const calendarItem = link.closest('.calendar__item');\r\n\r\n if (calendarItem) {\r\n const readMoreText = calendarItem.querySelector('.richtext--readmore');\r\n\r\n if (readMoreText) {\r\n if (readMoreText.classList.contains('js-open')) {\r\n readMoreText.style.height = null;\r\n readMoreText.classList.remove('js-open');\r\n } else {\r\n readMoreText.style.height = `${readMoreText.scrollHeight}px`;\r\n readMoreText.classList.add('js-open');\r\n }\r\n }\r\n }\r\n }\r\n\r\n Array.from(calendarItems).forEach(item => {\r\n const readMoreBtn = item.querySelector('.btn + a');\r\n readMoreBtn.addEventListener('click',clickReadMoreBtn);\r\n });\r\n}"],"names":["currentBreakpoint","resizeTimer","breakpoints","breakpointKeys","Object","keys","currentWindowWidth","window","innerWidth","currentBreakpointIndex","resizeFunctions","getWindowSizes","lastFoundWidth","forEach","key","index","width","resizeHandler","clearTimeout","setTimeout","funcRef","initWindowResize","addEventListener","scrollTop","document","documentElement","body","ticking","scrollFunctions","animate","scrollHandler","requestAnimationFrame","functionReferences","readyState","readyEventBound","emptyCallbackArrays","length","tempArray","slice","onReady","functionReference","push","isElement","element","Element","Document","Window","getElementScroll","left","pageXOffset","scrollLeft","top","pageYOffset","scrollX","scrollY","nav","navWidth","className","scrollLocked","enableScrollLock","scrollPosition","scrollTo","htmlTag","classList","add","style","marginTop","position","overflow","overflowY","disableScrollLock","remove","removeAttribute","firstNavItem","navItemsWithChildren","toggleMenuOpen","contains","activeItem","Array","prototype","call","filter","x","undefined","setupNav","selector","sticky","querySelector","toggleSubMenuActive","e","item","target","closest","updateItem","diff","getBoundingClientRect","toFixed","navActiveIcon","transform","itemUl","height","scrollHeight","offsetWidth","navBtn","navItems","querySelectorAll","hasAttribute","lastNavItem","firstSubItem","navSearch","mobileBack","navBottomBar","scrollTimer","windowScroll","scrollInPixels","lastScrollPosition","goingUpClass","stickyNavOnScroll","a","l","marginLeft","navSearchInput","toggleSearch","activeElement","h","offsetHeight","finallyConstructor","callback","constructor","this","then","value","resolve","reason","reject","setTimeoutFunc","isArray","Boolean","noop","Promise","fn","TypeError","_state","_handled","_value","_deferreds","doResolve","handle","self","deferred","_immediateFn","cb","onFulfilled","onRejected","ret","promise","newValue","finale","thisArg","apply","arguments","_unhandledRejectionFn","i","len","Handler","done","ex","prom","promiseFinally","all","arr","args","remaining","res","val","race","setImmediate","err","console","warn","lastUsedScreenWidth","globalNS","global","Error","lazyArray","options","loadedClass","loadClass","decodeImg","oldIe11Fit","offset","setupLazyLoading","handler","getElementsByClassName","lazyLoad","lazyElem","rect","bottom","right","innerHeight","clientHeight","clientWidth","loadBgImage","loadLazyImage","bgContainer","handleLoadedBg","backgroundImage","formattedSrc","src","getImageSrc","loadImage","container","oldImage","getAttribute","objectFitPolyfill","removeChild","newImageTag","tagName","altText","setAttribute","appendChild","path","newImage","Image","decode","image","largestBreakpointFound","breakpointName","srcAttribute","activeAccordion","transitionEndEventName","transitions","transition","OTransition","MozTransition","WebkitTransition","el","createElement","t","detectTransitionEndEventName","cssAnimateNewHeight","newHeight","classTarget","classOnBoth","prevHeight","delayedClose","blur","removeEventListener","loadingVideoId","activePlayer","Accordion","trigger","dom","parentNode","nextElementSibling","settings","type","preventDefault","_this","ariaExpanded","setupAccordions","accordions","location","hash","indexOf","accordionContent","getElementById","replace","click","openAccordByHashId","generateYoutubeIframe","youtubeId","allowCookies","ytPlayerHost","CookieInformation","getConsentGivenFor","YT","Player","videoId","host","playerVars","autoplay","rel","controls","muted","events","event","setPlaybackQuality","playVideo","onStateChange","resumePlayback","YTP","data","PlayerState","BUFFERING","PAUSED","PLAYING","onIframeReady","remains","getDuration","getCurrentTime","rewindTO","seekTo","ENDED","initIframeVideoBg","videoTrigger","_typeof","videoTarget","videoLink","href","isVimeo","url","match","extractVideoIdFromUrl","iframe","player","id","tag","protocol","firstScriptTag","getElementsByTagName","insertBefore","loadYouTubeApi","setVhProp","vh","setProperty","isTouch","onYouTubeIframeAPIReady","easeInOutQuintic","currentTime","start","change","duration","time","ts","tc","to","animateScroll","amount","scrollingElement","setupAnchorLinkScroll","triggerSelector","triggers","hashLink","pathname","activeOverlay","activeOverlayContent","activeOverlayCloseBtn","classNames","activeBtn","hiddenItem","Filter","filters","targetContainer","filterType","itemCountReplace","filterHandler","replaceWithNumberOfItems","checked","deselectRadio","valArray","filterItems","isButton","filterValue","transitionItems","name","siblingRadios","r","bind","itemFilterValues","split","cleanFilterValue","trim","toLowerCase","map","filterValues","getSetValues","showItem","cleanValue","replaceValue","children","items","option","count","optionStr","innerText","windowWidth","windowHeight","openClass","outsideClickListener","elem","getClientRects","overlayClose","overlayOpen","lockScroll","targetId","openTab","tab","tabContent","activeTab","activeTabContent","openTabByHashId","setupEntrances","entrancesItems","clickEntrance","itemList","updateListview","allItems","currentActiveItem","activeItemLinkList","itemLinkList","linkLists","setLinkListHeights","setupImageToVideo","Math","max","initImageToVideo","images","videoIframe","video","imageToVideos","videoTop","parseInt","addWidthPrPx","addHeightPrPx","translateXPrPx","imageFixedTop","imageFixedLeft","addWidth","addHeight","translateX","newWidth","imageMaxWidth","imageMaxHeight","translateXMax","imageNode","imageNodeMarginLeft","getComputedStyle","nodeTranslateXPrPx","nodeTranslateX","Vimeo","zIndex","opacity","pause","play","testHeight","parseFloat","videoMarginTop","imageTop","imageWidth","imageHeight","videoWidth","videoHeight","imageCenterY","translateYPrPx","allImages","loadedImages","notLoadedImages","complete","checkImagesAndVimeoAPI","setInterval","clearInterval","setupNewslist","newslists","initNewslist","newslist","newslistParent","newslistNext","newslistPrev","newslistNavItems","newslistWrap","updateNavList","newActiveItem","moveList","direction","newX","itemCount","firstItem","minTranslate","pxMoved","clickNavItem","navItem","clickedIndex","startTime","startX","startY","endTime","moveX","moveY","distanceX","moved","touches","changedTouches","pageX","pageY","Date","passive","targetTouches","distanceY","newTranslateX","getTime","setupGallery","galleries","initGallery","gallery","galleryParent","gallerytNext","gallerytPrev","galleryNavItems","galleryWrap","setupCalendarFilter","startDateField","endDateField","typeField","eventItems","filterEvents","updateUrl","selectedType","selectedIndex","selectedStartDateString","selectedEndDateString","startParts","startDay","startMonth","startYear","selectedDateStart","endParts","endDay","endMonth","endYear","selectedDateEnd","currentDay","dayEventCounter","eventItem","eventTypes","eParts","eDay","eMonth","eYear","eventDateStart","includes","pushState","history","title","startDate","endDate","checkPikaday","Pikaday","updateStartDate","startPicker","setStartRange","endPicker","setMinDate","updateEndDate","setEndRange","setMaxDate","defaultDatesSet","field","firstDay","i18n","previousMonth","nextMonth","months","weekdays","weekdaysShort","toString","date","day","getDate","month","getMonth","year","getFullYear","onSelect","parse","dateString","parts","startEndDate","setMonth","setDate","_startDate","_endDate","createDateFields","setupCalendar","createCalendar","documentLanguage","lang","pikadayLabels","monthsShort","from","eventDates","eventDate","picker","minDate","showCookieBanner","declaration","hideCookieBanner","filterContainers","setupFilters","overlayButtonOpen","setupOverlay","videoElems","videoElem","setupVideos","tabsContainer","tabs","setupTabs","calendarItems","locationHash","elementReadMoreText","clickReadMoreBtn","calendarItem","currentTarget","readMoreText","setupCalendarAccordion"],"mappings":"6BAMWA,EAEPC,EANSC,oEACAC,EAAiBC,OAAOC,KAAKH,GAC/BI,EAAqBC,OAAOC,WAG5BC,EAAyB,EAG9BC,EAAkB,GAOxB,SAASC,IACLL,EAAqBC,OAAOC,eAKxBI,EAAiB,EAErBT,EAAeU,QAAQ,SAACC,EAAKC,OACnBC,EAAQd,EAAYY,GACAE,GAAtBV,GAAuCM,EAARI,IAC/BJ,EAAiBI,EACjBhB,EAAoBc,EACpBL,EAAyBM,KAKrC,SAASE,IACLC,aAAajB,GACbA,EAAckB,WAAW,WACrBR,IACAD,EAAgBG,QAAQ,SAAAO,UAAWA,OACpC,KAWA,SAASC,IACZV,IACAJ,OAAOe,iBAAiB,SAAUL,GAClCV,OAAOe,iBAAiB,oBAAqBL,GCtD1C,IAAIM,EAAYC,SAASC,gBAAgBF,WAAaC,SAASE,KAAKH,UAEvEI,GAAU,EACRC,EAAkB,GAExB,SAASC,IACLD,EAAgBf,QAAQ,SAAAO,UAAWA,MAEnCO,GAAU,EAYd,SAASG,IACLP,EAAYC,SAASC,gBAAgBF,WAAaC,SAASE,KAAKH,UAP3DI,IACDI,sBAAsBF,GACtBF,GAAU,GALlBE,ICEA,IAAIG,EAAqB,GAMrBC,EAAqC,gBAAxBT,SAASS,YAAwD,aAAxBT,SAASS,WAI/DC,GAAkB,EAiBtB,SAASC,SAEEH,EAAmBI,QAAQ,KAExBC,EAAYL,EAAmBM,MAAM,GAC3CN,EAAqB,GAIJK,EAjBXxB,QAAQ,SAAAO,UAAWA,MAqB7Ba,GAAa,EA2BV,SAASM,EAAQC,GACa,mBAAtBA,IACHP,EACAO,KArBHN,IAC2B,YAAxBV,SAASS,WAETT,SAASF,iBAAiB,mBAAoBa,GAG9CA,IAGJD,GAAkB,GAgBdF,EAAmBS,KAAKD,KC/C7B,SAASE,EAAUC,UACfA,aAAmBC,SAAWD,aAAmBE,UAAYF,aAAmBG,OA8DpF,SAASC,EAAT,OAA0BJ,+BAA1B,EAAA,EAAoCpC,eACnCmC,EAAUC,KACNA,aAAmBG,OACZ,CACHE,KAAML,EAAQM,aAAezB,SAASC,gBAAgByB,WACtDC,IAAKR,EAAQS,aAAe5B,SAASC,gBAAgBF,WAGlD,CACHyB,KAAML,EAAQU,SAAWV,EAAQO,WACjCC,IAAKR,EAAQW,SAAWX,EAAQpB,YCrGhD,ICRWgC,EACAC,EDOLC,EAAY,cACdlC,EAAY,EAOLmC,GAAe,EAKnB,SAASC,QACPD,EAAc,KAETE,EAAiBb,IAGvBxC,OAAOsD,SAASD,EAAeZ,KAAM,OAE/Bc,EAAUtC,SAASC,gBACzBqC,EAAQC,UAAUC,IAAIP,GACtBK,EAAQG,MAAMC,qBAAgBN,EAAeT,UAC7CW,EAAQG,MAAME,SAAW,QACzBL,EAAQG,MAAMG,SAAW,SACzBN,EAAQG,MAAMjD,MAAQ,OACtBQ,SAASE,KAAKuC,MAAMI,UAAY,SAGhCX,GAAe,EACfnC,EAAYqC,EAAeT,KAa5B,SAASmB,OACRZ,EAAc,KACRE,EAAiBb,IAEjBe,EAAUtC,SAASC,gBACzBqC,EAAQC,UAAUQ,OAAOd,GACzBK,EAAQG,MAAMC,UAAY,GAC1BJ,EAAQG,MAAME,SAAW,GACzBL,EAAQG,MAAMG,SAAW,GACzBN,EAAQG,MAAMjD,MAAQ,GACtBQ,SAASE,KAAK8C,gBAAgB,SAE9BjE,OAAOsD,SAASD,EAAeZ,KAAMzB,GAGrCmC,GAAe,GChEvB,IAAIe,GAAgB,EAChBC,GAAwB,EAErB,SAASC,OACRpB,EAAIQ,UAAUa,SAAS,aAAc,CACrCN,IACAf,EAAIQ,UAAUQ,OAAO,eACrBhB,EAAIQ,UAAUQ,OAAO,iBAEfM,EAAaC,MAAMC,UAAUzC,MAAM0C,KAAKN,GAAsBO,OAAO,SAAAC,UAAKA,EAAEnB,UAAUa,SAAS,eAEjFO,MAAhBV,GAAkD,OAArBzE,GAAmD,MAArBA,EACvDyE,GAAgBI,GAChBJ,EAAaV,UAAUC,IAAI,aAEH,OAArBhE,GAAmD,MAArBA,IACZ,GAArB6E,EAAWzC,QACXyC,EAAW,GAAGd,UAAUQ,OAAO,aAGnCE,EAAaV,UAAUQ,OAAO,aAC9BhB,EAAIQ,UAAUC,IAAI,qBAGG,GAArBzD,OAAO6C,aACPjC,WAAW,kBAAMoC,EAAIQ,UAAUC,IAAI,aAAa,SAGpDL,IACAJ,EAAIQ,UAAUC,IAAI,aAInB,SAASoB,EAAT,EAAA,OAAkBC,+BAAlB,EAAA,EAA6B,OAAQC,iCAArC,IAAA,KACH/B,EAAM/B,SAASE,KAAK6D,cAAcF,GAEzB,KAaIG,EAAT,SAA6BC,OACnBC,EAAOD,EAAEE,OAAOC,QAAQ,MACxBf,EAAaC,MAAMC,UAAUzC,MAAM0C,KAAKN,GAAsBO,OAAO,SAAAC,UAAKA,EAAEnB,UAAUa,SAAS,wBAW5FiB,EAAWH,GAChBA,EAAK3B,UAAUC,IAAI,iBAEf8B,EAAOJ,EAAKK,wBAAwB5C,IAAI6C,QAAQ,GAAKvB,EAAasB,wBAAwB5C,IAC9F2C,EAAOA,EAAO,GAAY,EAARA,EAAYA,EAEJ,OAArB9F,GAAmD,MAArBA,IAC/BiG,EAAchC,MAAMiC,kCAA6BJ,YAG5B,OAArB9F,GAAmD,MAArBA,GAC9BuD,EAAIQ,UAAUQ,OAAO,wBAGnB4B,EAAST,EAAKH,cAAc,MAEpBJ,MAAVgB,GAA6C,OAArBnG,GAAmD,MAArBA,IACtDmG,EAAOlC,MAAMmC,iBAAYD,EAAOE,oBA1Bf,GAArBxB,EAAWzC,OACPsD,GAAQb,EAAW,KACnBA,EAAW,GAAGd,UAAUQ,OAAO,aAC/BsB,EAAWH,IAGfG,EAAWH,IAtBnBlC,EAAWD,EAAI+C,gBACTC,EAAShD,EAAIgC,cAAc,aAC3BiB,EAAWjD,EAAIkD,iBAAiB,cACtC/B,EAAuBI,MAAMC,UAAUzC,MAAM0C,KAAKwB,GAAUvB,OAAO,SAAAC,UAAKA,EAAEwB,aAAa,uBACvFjC,EAAelB,EAAIgC,cAAc,kDAC3BoB,EAAcpD,EAAIgC,cAAc,sCAChCqB,EAAerD,EAAIgC,cAAc,uCACjCsB,EAAYtD,EAAIgC,cAAc,sBAC9BU,EAAgB1C,EAAIgC,cAAc,oBAClCuB,EAAavD,EAAIgC,cAAc,qBAC/BwB,EAAexD,EAAIgC,cAAc,oBAqCvCgB,EAAOjF,iBAAiB,QAASqD,GAE7BW,GCnFL,SAA2B3C,EAA3B,EAAA,EAAA,GAImB,SAAhBb,IAEFZ,aAAa8F,GAERtD,IACDsD,EAAc7F,WAAW,eACf8F,EAAelE,IAEjBkE,EAAa9D,IAAM+D,GACnBvE,EAAQoB,UAAUC,IAAIP,GAElB0D,EAAqBF,EAAa9D,IAClCR,EAAQoB,UAAUC,IAAIoD,GAEtBzE,EAAQoB,UAAUQ,OAAO6C,GAG7BD,EAAqBF,EAAa9D,MAElCR,EAAQoB,UAAUQ,OAAOd,GACzBd,EAAQoB,UAAUQ,OAAO6C,KAE9B,SAzBPJ,EACAG,EAFmC1D,+BAApC,EAAA,EAAgD,cAAeyD,+BAA/D,EAAA,EAAgF,GAAIE,+BAApF,EAAA,EAAmG,gBA+BtGtF,IACAvB,OAAOe,iBAAiB,SAAUQ,GDoD1BuF,CAAkB9D,EAAK,cAAe,GAAI,gBAGzC,IAAI+D,EAAI,EAAGC,EAAI7C,EAAqBtC,OAAQkF,EAAIC,EAAGD,IACpD5C,EAAqB4C,GAAGhG,iBAAiB,QAAQkE,MAGlCL,MAAfwB,GACAA,EAAYrF,iBAAiB,gBAAiB,WACtCiC,EAAIQ,UAAUa,SAAS,cACvBrB,EAAIQ,UAAUC,IAAI,iBAKJ,OAArBhE,GAAmD,MAArBA,GAAkD,MAArBA,GAAkD,MAArBA,GAA4CmF,MAAb0B,GAA0C1B,MAAhByB,EAA4B,KAC1Kd,EAAOe,EAAUd,wBAAwB/C,KAAKgD,QAAQ,GAAKY,EAAab,wBAAwB/C,KAAKgD,QAAQ,GACjHF,EAAOA,EAAO,GAAY,EAARA,EAAYA,EAE9Be,EAAU5C,MAAMuD,qBAAgB1B,WAGhBX,MAAhB4B,GACiB5B,MAAb0B,EAAwB,KAClBY,EAAiBZ,EAAUtB,cAAc,YAEzBJ,MAAlBsC,EAA6B,KACpBC,EAAT,WAC6B,OAArB1H,GAAmD,MAArBA,IAC1ByH,GAAkBjG,SAASmG,cAC3BZ,EAAahD,UAAUC,IAAI,aAE3B+C,EAAahD,UAAUQ,OAAO,eAK1CkD,EAAenG,iBAAiB,QAASoG,GACzCD,EAAenG,iBAAiB,OAAQoG,OAKhCvC,MAAhBV,GAAkD,OAArBzE,GAAmD,MAArBA,EAC3DyE,EAAaV,UAAUC,IAAI,aAE3BT,EAAIQ,UAAUC,IAAI,oBAGG,OAArBhE,GAAmD,MAArBA,MACzB,IAAIsH,EAAI,EAAGC,EAAIf,EAASpE,OAAQkF,EAAIC,EAAGD,IAAK,KACvCM,EAAIpB,EAASc,GAAGO,aACtBrB,EAASc,GAAGrD,MAAMmC,iBAAYwB,QAIpBzC,MAAd2B,GACAA,EAAWxF,iBAAiB,QAAQ,eAC1BuD,EAAaC,MAAMC,UAAUzC,MAAM0C,KAAKN,GAAsBO,OAAO,SAAAC,UAAKA,EAAEnB,UAAUa,SAAS,eAE5E,GAArBC,EAAWzC,SACXyC,EAAW,GAAGd,UAAUQ,OAAO,aAC/BhB,EAAIQ,UAAUC,IAAI,kqCEzJtC,SAAS8D,EAAmBC,GAC1B,IAAIC,EAAcC,KAAKD,YACvB,OAAOC,KAAKC,KACV,SAASC,GAEP,OAAOH,EAAYI,QAAQL,KAAYG,KAAK,WAC1C,OAAOC,KAGX,SAASE,GAEP,OAAOL,EAAYI,QAAQL,KAAYG,KAAK,WAE1C,OAAOF,EAAYM,OAAOD,OCZlC,IAAIE,EAAiBpH,WAErB,SAASqH,EAAQtD,GACf,OAAOuD,QAAQvD,QAAyB,IAAbA,EAAE9C,QAG/B,SAASsG,KAaT,SAASC,EAAQC,GACf,KAAMX,gBAAgBU,GACpB,MAAM,IAAIE,UAAU,wCACtB,GAAkB,mBAAPD,EAAmB,MAAM,IAAIC,UAAU,kBAElDZ,KAAKa,OAAS,EAEdb,KAAKc,UAAW,EAEhBd,KAAKe,YAAS7D,EAEd8C,KAAKgB,WAAa,GAElBC,EAAUN,EAAIX,MAGhB,SAASkB,EAAOC,EAAMC,GACpB,KAAuB,IAAhBD,EAAKN,QACVM,EAAOA,EAAKJ,OAEM,IAAhBI,EAAKN,QAITM,EAAKL,UAAW,EAChBJ,EAAQW,aAAa,WACnB,IAAIC,EAAqB,IAAhBH,EAAKN,OAAeO,EAASG,YAAcH,EAASI,WAC7D,GAAW,OAAPF,EAAJ,CAIA,IAAIG,EACJ,IACEA,EAAMH,EAAGH,EAAKJ,QACd,MAAOvD,GAEP,YADA6C,EAAOe,EAASM,QAASlE,GAG3B2C,EAAQiB,EAASM,QAASD,QAVP,IAAhBN,EAAKN,OAAeV,EAAUE,GAAQe,EAASM,QAASP,EAAKJ,WAPhEI,EAAKH,WAAWxG,KAAK4G,GAqBzB,SAASjB,EAAQgB,EAAMQ,GACrB,IAEE,GAAIA,IAAaR,EACf,MAAM,IAAIP,UAAU,6CACtB,GACEe,IACqB,iBAAbA,GAA6C,mBAAbA,GACxC,CACA,IAAI1B,EAAO0B,EAAS1B,KACpB,GAAI0B,aAAoBjB,EAItB,OAHAS,EAAKN,OAAS,EACdM,EAAKJ,OAASY,OACdC,EAAOT,GAEF,GAAoB,mBAATlB,EAEhB,YADAgB,GApEMN,EAoESV,EApEL4B,EAoEWF,EAnEpB,WACLhB,EAAGmB,MAAMD,EAASE,aAkEkBZ,GAIpCA,EAAKN,OAAS,EACdM,EAAKJ,OAASY,EACdC,EAAOT,GACP,MAAO3D,GACP6C,EAAOc,EAAM3D,GA5EjB,IAAcmD,EAAIkB,EAgFlB,SAASxB,EAAOc,EAAMQ,GACpBR,EAAKN,OAAS,EACdM,EAAKJ,OAASY,EACdC,EAAOT,GAGT,SAASS,EAAOT,GACM,IAAhBA,EAAKN,QAA2C,IAA3BM,EAAKH,WAAW7G,QACvCuG,EAAQW,aAAa,WACdF,EAAKL,UACRJ,EAAQsB,sBAAsBb,EAAKJ,UAKzC,IAAK,IAAIkB,EAAI,EAAGC,EAAMf,EAAKH,WAAW7G,OAAQ8H,EAAIC,EAAKD,IACrDf,EAAOC,EAAMA,EAAKH,WAAWiB,IAE/Bd,EAAKH,WAAa,KAMpB,SAASmB,EAAQZ,EAAaC,EAAYE,GACxC1B,KAAKuB,YAAqC,mBAAhBA,EAA6BA,EAAc,KACrEvB,KAAKwB,WAAmC,mBAAfA,EAA4BA,EAAa,KAClExB,KAAK0B,QAAUA,EASjB,SAAST,EAAUN,EAAIQ,GACrB,IAAIiB,GAAO,EACX,IACEzB,EACE,SAAST,GACHkC,IACJA,GAAO,EACPjC,EAAQgB,EAAMjB,KAEhB,SAASE,GACHgC,IACJA,GAAO,EACP/B,EAAOc,EAAMf,MAGjB,MAAOiC,GACP,GAAID,EAAM,OACVA,GAAO,EACP/B,EAAOc,EAAMkB,MAITvF,UAAiB,MAAI,SAAS0E,GACpC,OAAOxB,KAAKC,KAAK,KAAMuB,MAGjB1E,UAAUmD,KAAO,SAASsB,EAAaC,GAE7C,IAAIc,EAAO,IAAItC,KAAKD,YAAYU,GAGhC,OADAS,EAAOlB,KAAM,IAAImC,EAAQZ,EAAaC,EAAYc,IAC3CA,KAGDxF,UAAmB,QAAIyF,IAEvBC,IAAM,SAASC,GACrB,OAAO,IAAI/B,EAAQ,SAASP,EAASE,GACnC,IAAKE,EAAQkC,GACX,OAAOpC,EAAO,IAAIO,UAAU,iCAG9B,IAAI8B,EAAO7F,MAAMC,UAAUzC,MAAM0C,KAAK0F,GACtC,GAAoB,IAAhBC,EAAKvI,OAAc,OAAOgG,EAAQ,IACtC,IAAIwC,EAAYD,EAAKvI,OAErB,SAASyI,EAAIX,EAAGY,GACd,IACE,GAAIA,IAAuB,iBAARA,GAAmC,mBAARA,GAAqB,CACjE,IAAI5C,EAAO4C,EAAI5C,KACf,GAAoB,mBAATA,EAQT,YAPAA,EAAKlD,KACH8F,EACA,SAASA,GACPD,EAAIX,EAAGY,IAETxC,GAKNqC,EAAKT,GAAKY,EACU,KAAdF,GACJxC,EAAQuC,GAEV,MAAOL,GACPhC,EAAOgC,IAIX,IAAK,IAAIJ,EAAI,EAAGA,EAAIS,EAAKvI,OAAQ8H,IAC/BW,EAAIX,EAAGS,EAAKT,SAKV9B,QAAU,SAASD,GACzB,OAAIA,GAA0B,iBAAVA,GAAsBA,EAAMH,cAAgBW,EACvDR,EAGF,IAAIQ,EAAQ,SAASP,GAC1BA,EAAQD,QAIJG,OAAS,SAASH,GACxB,OAAO,IAAIQ,EAAQ,SAASP,EAASE,GACnCA,EAAOH,QAIH4C,KAAO,SAASL,GACtB,OAAO,IAAI/B,EAAQ,SAASP,EAASE,GACnC,IAAKE,EAAQkC,GACX,OAAOpC,EAAO,IAAIO,UAAU,kCAG9B,IAAK,IAAIqB,EAAI,EAAGC,EAAMO,EAAItI,OAAQ8H,EAAIC,EAAKD,IACzCvB,EAAQP,QAAQsC,EAAIR,IAAIhC,KAAKE,EAASE,QAMpCgB,aAEmB,mBAAjB0B,cACN,SAASpC,GAEPoC,aAAapC,KAEjB,SAASA,GACPL,EAAeK,EAAI,MAGfqB,sBAAwB,SAA+BgB,GACtC,oBAAZC,SAA2BA,SACpCA,QAAQC,KAAK,wCAAyCF,ICnP1D,ICCIG,EDDAC,EAAW,WAIb,GAAoB,oBAATjC,KACT,OAAOA,KAET,GAAsB,oBAAX7I,OACT,OAAOA,OAET,GAAsB,oBAAX+K,OACT,OAAOA,OAET,MAAM,IAAIC,MAAM,kCAbH,GAgBT,YAAaF,EAEPA,EAAS1C,QAAQ5D,UAAmB,UAC9CsG,EAAS1C,QAAQ5D,UAAmB,QAAIyF,GAFxCa,EAAkB,QAAI1C,ECfxB,IAAI6C,EAAY,GAEZC,EAAU,CACVhI,UAAW,OACXiI,YAAa,eACbC,UAAW,gBACXC,WAAW,EACXC,YAAY,EACZC,OAAQ,GAGL,SAASC,EAAT,OV0BwBC,EUzB3BZ,GAAuB,EACvBK,OAAeA,kCAFZ,EAAA,EAA0C,IAG7CD,EAAYhK,SAASE,KAAKuK,uBAAuBR,EAAQhI,WVuB9BuI,EUpBZE,GVqBVlM,GACDqB,IAGJX,EAAgB+B,KAAKuJ,GUvBrBE,KAEA3L,OAAOe,iBAAiB,SAAU4K,IAGtC,SAASA,QAIDd,EAAsB3K,EAAwB,KAEzC,IAAIyJ,EAAI,EAAGA,EAAIsB,EAAUpJ,OAAQ8H,IAAK,KACjCiC,EAAWX,EAAUtB,GAwBhB,IAHbkC,EAnBmBD,EAmBTpG,yBAGPsG,QACS,GAAdD,EAAKE,OACLF,EAAKjJ,IAAMsI,EAAQK,SAAWvL,OAAOgM,aAAe/K,SAASC,gBAAgB+K,eAC7EJ,EAAKpJ,KAAOyI,EAAQK,SAAWvL,OAAOC,YAAcgB,SAASC,gBAAgBgL,eAxBrEN,EAASpI,UAAUC,IAAIyH,EAAQE,YAC3BQ,EAASpI,UAAUa,SAAS,YAC5B8H,GAEAC,IAFYR,IAY5BX,EAAY1G,MAAMC,UAAUE,OAAOD,KAAKwG,EAAW,SAAAjE,UAAMA,EAAExD,UAAUa,SAAS6G,EAAQE,aAG1F,IACUS,EAiBH,SAASM,GAAYE,GAED,SAAjBC,IACFD,EAAY3I,MAAM6I,gBAAkBC,EACpCH,EAAY7I,UAAUC,IAAIyH,EAAQC,aAClCkB,EAAY7I,UAAUQ,OAAOkH,EAAQE,eAJnCqB,EAAMC,GAAYL,MAQnBI,OAICD,gBAAsBC,OAExBJ,EAAY3I,MAAM6I,kBAAoBC,IAItCtB,EAAQG,UAERsB,GAAUF,GAAK9E,KAAK2E,GAEpBA,MAWD,SAASF,GAAcQ,OACpBH,EAAMC,GAAYE,MAGnBH,KAIDvB,EAAQG,UAAW,KAEbwB,EAAWD,EAAU5H,cAAc,UACrC6H,GAAYD,EAAUpJ,UAAUa,SAAS6G,EAAQC,aAAc,IAC3D0B,EAASC,aAAa,SAAWL,cAC7BvB,EAAQI,YACRtL,OAAO+M,kBAAkBF,IAI7BD,EAAUI,YAAYH,GAK9BF,GAAUF,GAAK9E,KAAK,SAAAsF,MAEU,QAAtBL,EAAUM,QACVN,EAAUH,IAAMA,MACb,KACGU,EAAUP,EAAUE,aAAa,aAAe,GACtDG,EAAYG,aAAa,MAAOD,GAEhCP,EAAUS,YAAYJ,GAG1BL,EAAUpJ,UAAUC,IAAIyH,EAAQC,aAChCyB,EAAUpJ,UAAUQ,OAAOkH,EAAQE,WAG/BF,EAAQI,YACRtL,OAAO+M,kBAAkBE,UAIjCL,EAAUH,IAAMA,EAChBG,EAAUpJ,UAAUC,IAAIyH,EAAQC,aAChCyB,EAAUpJ,UAAUQ,OAAOkH,EAAQE,WAoBpC,SAASuB,GAAUW,OAChBC,EAAW,IAAIC,aAEd,IAAIpF,QAAQ,SAAAP,GACf0F,EAASxM,iBAAiB,OAAQ,kBAb/B,WADUwM,EAcuCA,GAb1BA,EAASE,SAAS9F,KAAK,kBAAM4F,IAAYnF,QAAQP,QAAQ0F,IAarB5F,KAAK,SAAA+F,UAAS7F,EAAQ6F,KAd5F,IAAqBH,IAcgF,GAC7FA,EAASd,IAAMa,IAUvB,SAASZ,GAAYE,OACbH,EAAM,GACNkB,EAAyB,SAEzBf,EAAUE,aAAa,aACvBL,EAAMG,EAAUE,aAAa,YAC7BF,EAAU3I,gBAAgB,aAE1BrE,EAAeU,QAAQ,SAACsN,EAAgBpN,MACNA,GAA1BN,IACc,IAAVM,GAAuBmN,EAARnN,GAAgC,KACzCqN,qBAA2BD,GACjCnB,EAAMG,EAAUE,aAAae,IAAiBpB,EAE9CG,EAAU3I,gBAAgB4J,GAG1BF,EAAyBnN,KAMlCiM,ECpNJ,ICEHqB,GDFSC,GAEN,eACGC,EAAc,CAChBC,WAAY,gBACZC,YAAa,iBACbC,cAAe,gBACfC,iBAAkB,uBAGhBC,EAAKpN,SAASqN,cAAc,WAE7B,IAAMC,KAAKP,UACQpJ,IAAhByJ,EAAG3K,MAAM6K,UACFP,EAAYO,SAGpB,GAjB2BC,GAoB/B,SAASC,GAAoB7B,EAA7B,EAAA,OACC8B,EADuCC,+BAAxC,EAAA,EAAsD/B,EAAWgC,+BAAjE,GAAA,EAEGC,EAAajC,EAAUtF,aAc7BsF,EAAU3I,gBAAgB,SAEtB0K,EAAYnL,UAAUa,SAAS,SAC/BqK,EAAY,EACZ9B,EAAU7L,iBAAiBgN,GAhBV,SAAfe,IACEF,GACAhC,EAAUpJ,UAAUQ,OAAO,QAC3B2K,EAAYnL,UAAUQ,OAAO,QAKjC2K,EAAYI,OACZnC,EAAUoC,oBAAoBjB,GAAwBe,KASlDF,GACAD,EAAYnL,UAAUQ,OAAO,UAGjC2K,EAAYnL,UAAUC,IAAI,QAEtBmL,GACAhC,EAAUpJ,UAAUC,IAAI,QAG5BiL,EAAY9B,EAAUtF,cAG1BsF,EAAUlJ,MAAMmC,iBAAYgJ,QAE5BjO,WAAW,WACPgM,EAAUlJ,MAAMmC,iBAAY6I,SAC7B,ICxDP,ICAIO,GACAC,GDDA1O,GAAQ,EAUC2O,GAOT,WAAYC,6BACHC,IAAM,CACPD,QAAAA,EACAxC,UAAWwC,EAAQE,WAAWtK,cAAc,wBAA0BoK,EAAQG,yBAG7EC,SAAW,CACZC,KAAOL,EAAQtC,aAAa,qBAG3BtM,MAAQA,GAEbA,UAEK6O,IAAID,QAAQrO,iBAAiB,QAAS,SAAAmE,GACvCA,EAAEwK,iBACE5B,IAAmB6B,EAAKnP,QAAUsN,GAAgBtN,OAE9CsN,GAAgBuB,IAAIzC,UAAUpJ,UAAUa,SAAS,UACjDoK,GAAoBX,GAAgBuB,IAAIzC,UAAWkB,GAAgBuB,IAAID,SAAS,GAChFtB,GAAgBuB,IAAID,QAAQhC,aAAa,gBAAiB,UAIlEqB,GAAoBkB,EAAKN,IAAIzC,UAAW+C,EAAKN,IAAID,SAAS,OAGpDQ,EAAeD,EAAKN,IAAID,QAAQtC,aAAa,iBACnD6C,EAAKN,IAAID,QAAQhC,aAAa,gBAAkC,UAAjBwC,GAEpB,qBAAvBD,EAAKH,SAASC,OACd3B,GAAkB6B,MAuB3B,SAASE,GAAT,OAAyB/K,+BAAzB,EAAA,EAAoC,6BACjCgL,EAAa7O,SAASE,KAAK+E,iBAAiBpB,MAE9CgL,EAAY,KACP,IAAInG,EAAI,EAAGA,EAAImG,EAAWjO,OAAQ8H,IAC9B,IAAIwF,GAAUW,EAAWnG,KAtB1C,eACqD,EAA7C3J,OAAO+P,SAASC,KAAKC,QAAQ,aAAmB,KAC1CC,EAAmBjP,SAASkP,eAAenQ,OAAO+P,SAASC,KAAKI,QAAQ,IAAK,QAC/EF,EACejP,SAASkP,eAAeD,EAAiBpD,aAAa,oBAC9DuD,SAoBXC,ICzDR,SAASC,GAAsBC,EAA/B,OAA0CC,iCAA1C,IAAA,KAC6BxP,SAASkP,eAAeK,GAE3B,KACdE,EAAe,mCAEd1Q,OAAO2Q,mBAAqBA,kBAAkBC,mBAAmB,yBAA2BH,IAC7FC,EAAe,2BAGd,IAAIG,GAAGC,OAAON,EAAW,CAC1BO,QAASP,EACTQ,KAAMN,EACNO,WAAY,CACRC,SAAU,EACVC,IAAK,EACLC,SAAU,EACVC,MAAO,GAGXC,OAAQ,CACJtP,QAAS,SAAAuP,GACLA,EAAMnM,OAAOoM,mBAAmB,SAEhCD,EAAMnM,OAAOqM,aAEjBC,cAAe,SAAAH,GAEY,SAAjBI,EAA0BzM,GAC5BA,EAAEwK,iBAEER,IACAA,GAAauC,gBALfG,EAAML,EAAMnM,UASdmM,EAAMM,OAAShB,GAAGiB,YAAYC,WAE9BH,EAAIJ,mBAAmB,SAQvBD,EAAMM,OAAShB,GAAGiB,YAAYE,OAC1BJ,EAAIvK,KACJ6H,GAAe0C,GACXvK,EAAEiI,WAAWvO,iBAAiB,QAAS4Q,GAC3CC,EAAIvK,EAAEiI,WAAW9L,UAAUC,IAAI,uBAEhC,GAAI8N,EAAMM,OAAShB,GAAGiB,YAAYG,WACjCL,EAAIvK,GAAKuK,EAAIvK,EAAEiI,WAAW9L,UAAUa,SAAS,iBAC7CuN,EAAIvK,EAAEiI,WAAW9L,UAAUQ,OAAO,iBAClC4N,EAAIvK,EAAEiI,WAAWN,oBAAoB,QAAS2C,OAE3C,CACHO,GAAcN,EAAIvK,EAAEiI,gBAKd6C,EAAUP,EAAIQ,cAAgBR,EAAIS,iBAEpCrS,OAAOsS,UACP3R,aAAaX,OAAOsS,UAGxBtS,OAAOsS,SAAW1R,WAAW,WACzBgR,EAAIW,OAAO,IACO,KAAlBJ,EAAU,WAEXZ,EAAMM,OAAShB,GAAGiB,YAAYU,OACrCZ,EAAIH,iBAoB5B,SAASS,GAActF,GACnBA,EAAUpJ,UAAUQ,OAAO,kBAC3B4I,EAAUpJ,UAAUC,IAAI,iBAuBrB,SAASgP,GAAkBrD,OAC1BsD,SAEAtD,EACIjN,EAAUiN,GACVsD,EAAetD,EACW,WAAnBuD,EAAOvD,IACdA,EAAQM,kBACRgD,EAAetD,EAAQhK,QACV4J,oBAAoB,QAASyD,KAChB,iBAAZrD,EACdsD,EAAezR,SAASE,KAAK6D,cAAcoK,GAE3CpP,OAAO2K,QAAQC,KAAK,uDAGxB5K,OAAO2K,QAAQC,uBACKwE,mFAIlBwD,EAAcF,EAAa5F,aAAa,eACxC7L,SAASkP,eAAeuC,EAAa5F,aAAa,gBAClD4F,KAEFE,EAAa,KACPC,EAAYH,EAAaI,KAAOJ,EAAaI,KAAOJ,EAAa5F,aAAa,mBAC9EiG,EAAuD,gBAA7CL,EAAa5F,aAAa,iBAAkE,EAA9B+F,EAAU5C,QAAQ,YAE5F4C,EAAW,KACP9B,GAAsC,IAA5B8B,EAAU5C,QAAQ,KAlD5C,SAA+B+C,OAErBC,EAAQD,EAAIC,MADI,4FAGlBA,GAASA,EAAM,UACRA,EAAM,GAEbtI,QAAQC,KAAKoI,EAAK,qBA2CgCE,CAAsBL,GAAaA,KAE7EE,EAAS,KACHI,EAASlS,SAASqN,cAAc,UACtC6E,EAAO/F,aAAa,cAAe,GACnC+F,EAAO/F,aAAa,oBAAqB,QACzC+F,EAAO/F,aAAa,cAAe,QACnC+F,EAAO/F,aAAa,QAAQ,uGAE5B+F,EAAOpS,iBAAiB,OAAQ,WAE5BmR,GADkBiB,EAASA,EAAO7D,WAAaK,EAAKL,cAIxDyB,GAAW8B,EAAU5C,QAAQ,KAAO,IAAM,IAK1CkD,EAAO1G,6CAAwCsE,kCAE/C6B,EAAYpP,UAAUC,IAAI,kBAC1BmP,EAAYvF,YAAY8F,OACrB,KACGC,EAASnS,SAASqN,cAAc,OACtC8E,EAAOC,GAAKtC,EACZ6B,EAAYvF,YAAY+F,GACxBR,EAAYpP,UAAUC,IAAI,kBAErBzD,OAAO6Q,GAKRN,GAAsBQ,GAAS,IAJ/B9B,GAAiB8B,EAtMrC,eACUuC,EAAMrS,SAASqN,cAAc,UAEnCgF,EAAI7G,cAASzM,OAAO+P,SAASwD,6CACvBC,EAAiBvS,SAASwS,qBAAqB,UAAU,GAC/DD,EAAelE,WAAWoE,aAAaJ,EAAKE,GAmM5BG,OCpMb,SAASC,SAENC,EAA0B,IAArB7T,OAAOgM,YAElB/K,SAASC,gBAAgBwC,MAAMoQ,YAAY,iBAAWD,SAmDnD,SAASE,WACL,iBAAkB/T,OD+C7BA,OAAOgU,wBAA0B,WACzB/E,IACAsB,GAAsBtB,KEzG9B,IAAMgF,GAAmB,SAASC,EAAaC,EAAOC,EAAQC,OACtDC,EAAOJ,EACLK,GAAMD,GAAQD,GAAYC,EAC5BE,EAAKD,EAAKD,SACPH,EAAQC,GAAU,EAAII,EAAKD,GAAM,GAAKA,EAAKA,EAAK,GAAKC,IAGzD,SAASlR,GAASmR,EAAlB,EAAA,OAAsBJ,+BAAtB,EAAA,EAAiC,IAAK7M,qBAAtC,aAcG2M,EAHKlT,SAASC,gBAAgBF,WAAaC,SAASE,KAAKmO,WAAWtO,WAAaC,SAASE,KAAKH,UAIjGoT,EAASK,aAAcpS,QAAUoS,EAAGjP,wBAAwB5C,IAAMuR,EAAQM,EAAKN,EAI/ED,EAAc,GAEI,SAAhBQ,QApBQC,EAwBJpK,EAAM0J,GAFZC,GAPY,GAS8BC,EAAOC,EAAQC,GAxB/CM,EA0BLpK,EAzBDtJ,SAAS2T,iBACT3T,SAAS2T,iBAAiB5T,UAAY2T,GAEtC1T,SAASC,gBAAgBF,UAAY2T,EACrC1T,SAASE,KAAKmO,WAAWtO,UAAY2T,EACrC1T,SAASE,KAAKH,UAAY2T,GAsB1BT,EAAcG,EACd7S,sBAAsBkT,GAElBlN,GAAgC,mBAAbA,GAEK,mBAAbA,GACPA,IAKhBkN,GCnBG,SAASG,GAAT,WAA+BC,+BAA/B,EAAA,EAAiD,0GAE9CC,EAAW9T,SAASiF,iBAAiB4O,GAElCnL,EAAI,EAAGA,EAAIoL,EAASlT,OAAQ8H,IAAK,KAChCyF,EAAU2F,EAASpL,GACnBqL,EAAW5F,EAAQtC,aAAa,SAAWsC,EAAQtC,aAAa,eAElEkI,kBArCeA,EAsCT5S,GArCsC,KAD7B4S,EAsCmBA,GArC7B/E,QAAQjQ,OAAO+P,SAASkF,UAC1BhU,SAASkP,eAAe6E,EAAS5E,QAAQpQ,OAAO+P,SAASkF,SAAU,IAAI7E,QAAQ,IAAK,KAEpFnP,SAASkP,eAAe6E,EAAS5E,QAAQ,IAAK,KAoCjDhB,EAAQrO,iBAAiB,QAAS,SAAAmE,GAC9BA,EAAEwK,iBACFpM,GAASlB,aChDrB8S,GACAC,GACAC,GCJEC,GAAa,CACfC,UAAW,sBACXC,WAAY,UASHC,GAAb,sBAOgB5I,2BACJA,UACKyC,IAAM,CACPzC,UAAAA,EACA6I,QAAS7I,EAAU1G,iBAAiB,iBACpCwP,gBAAiBzU,SAASE,KAAK6D,cAAc4H,EAAUE,aAAa,gCAGnE0C,SAAW,CACZmG,WAAa/I,EAAUE,aAAa,gBAGpCpF,KAAK2H,IAAIqG,oBACJ,IAAI/L,EAAI,EAAGA,EAAIjC,KAAK2H,IAAIoG,QAAQ5T,OAAQ8H,IAAK,KAExCjF,EAASgD,KAAK2H,IAAIoG,QAAQ9L,GAC1BiM,EAAmBlR,EAAOoI,aAAa,2BAEtB,WAAnBpI,EAAOwI,QACPxI,EAAO3D,iBAAiB,QAAS,SAAAmE,UAAKyK,EAAKkG,cAAc3Q,MAEzDR,EAAO3D,iBAAiB,SAAU,SAAAmE,UAAKyK,EAAKkG,cAAc3Q,KAEtD0Q,QACKE,yBAAyBpR,EAAQkR,SAMlD5V,OAAO2K,QAAQC,KAAK,2DAA6DgC,QAGrF5M,OAAO2K,QAAQC,KAAK,wFAIP1F,GACjBA,EAAEE,OAAO2Q,SAAW7Q,EAAEE,OAAO2Q,QAC7B7Q,EAAEE,OAAO4J,oBAAoB,QAASwG,EAAOQ,oBAExCH,cAAc3Q,wCAoFHuQ,WACVQ,EAAW,GAGRtM,EAAK,EAAGC,EAAM6L,EAAQ5T,OAAQ8H,EAAIC,EAAKD,IAAK,KAC3CjF,EAAS+Q,EAAQ9L,GACA,WAAnBjF,EAAOwI,QACc,MAAjBxI,EAAOkD,OAAkC,KAAjBlD,EAAOkD,OAC/BqO,EAAS/T,KAAKwC,EAAOkD,OAEC,WAAnBlD,EAAOwI,QACVxI,EAAOlB,UAAUa,SAASgR,GAAWC,YACrCW,EAAS/T,KAAKwC,EAAOoI,aAAa,gBAGlCpI,EAAOqR,SAA4B,MAAjBrR,EAAOkD,OACzBqO,EAAS/T,KAAKwC,EAAOkD,cAI1BqO,6CA/FG/Q,OACJR,EAASQ,EAAEE,OACX8Q,EAAcxO,KAAK2H,IAAIqG,gBAAgBxP,iBAAiB,uBACxDiQ,EAA8B,WAAnBzR,EAAOwI,QAClBkJ,EAAcD,EAAWzR,EAAOoI,aAAa,eAAiBpI,EAAOkD,SAGvEuO,KACiC,kBAA7BzO,KAAK8H,SAASmG,WAAgC,KAEzC,IAAIhM,EAAI,EAAGA,EAAIjC,KAAK2H,IAAIoG,QAAQ5T,OAAQ8H,SACpC0F,IAAIoG,QAAQ9L,GAAGnG,UAAUQ,OAAOqR,GAAWC,WAGpD5Q,EAAOlB,UAAUC,IAAI4R,GAAWC,qBAE3BjG,IAAIqG,gBAAgBlS,UAAUC,IAAI4R,GAAWgB,iBAE7C3R,EAAOlB,UAAUa,SAASgR,GAAWC,WAGtC5Q,EAAOlB,UAAUQ,OAAOqR,GAAWC,WAFnC5Q,EAAOlB,UAAUC,IAAI4R,GAAWC,gBAKrC,GAAoB,UAAhB5Q,EAAO+K,KAAkB,SAC1B6G,EAAO5R,EAAO4R,KACdC,EAAgB7O,KAAK2H,IAAIzC,UAAU1G,kCAA2BoQ,SAE3DE,EAAI,EAAGA,EAAID,EAAc1U,OAAQ2U,IAAK,CAC7BD,EAAcC,GACtBxH,oBAAoB,QAASwG,EAAOQ,eAG9CtR,EAAO3D,iBAAiB,QAASyU,EAAOQ,cAAcS,KAAK/O,UAG9B,kBAA7BA,KAAK8H,SAASmG,eACT,IAAIhM,EAAI,EAAGA,EAAIuM,EAAYrU,OAAQ8H,IAAK,KACnCxE,EAAO+Q,EAAYvM,GACrB+M,EAAmBvR,EAAK2H,aAAa,qBAAqB6J,MAAM,KAC9DC,EAAmBR,EAAYS,OAAOC,cAC5CJ,EAAmBA,EAAiBK,IAAI,SAAAnP,UAASA,EAAMiP,OAAOC,gBAE1C,MAAhBV,IAAuE,IAAhDM,EAAiBzG,QAAQ2G,GAChDzR,EAAK3B,UAAUC,IAAI4R,GAAWE,YAE9BpQ,EAAK3B,UAAUQ,OAAOqR,GAAWE,yBAInCyB,EAAexB,EAAOyB,aAAavP,KAAK2H,IAAIoG,oBAEzC9L,OACCxE,EAAO+Q,EAAYvM,GACrB+M,EAAmBvR,EAAK2H,aAAa,qBAAqB6J,MAAM,KAChEO,GAAW,EAEfR,EAAmBA,EAAiBK,IAAI,SAAAnP,UAASA,EAAMiP,OAAOC,gBAE9DE,EAAa1W,QAAQ,SAAAsH,OACXuP,EAAavP,EAAMiP,OAAOC,eACc,IAA1CJ,EAAiBzG,QAAQkH,KACzBD,GAAW,KAIdA,EAGD/R,EAAK3B,UAAUQ,OAAOqR,GAAWE,YAFjCpQ,EAAK3B,UAAUC,IAAI4R,GAAWE,aAf7B5L,EAAI,EAAGA,EAAIuM,EAAYrU,OAAQ8H,MAA/BA,oDA8CQvH,EAASgV,OACxBlM,EAAU9I,EAAQiV,SAClBC,EAAQ5P,KAAK2H,IAAIqG,gBAAgBxP,iBAAiB,0BAEpDgF,MACK,IAAIvB,EAAI,EAAGA,EAAIuB,EAAQrJ,OAAQ8H,IAAK,KAC/B4N,EAASrM,EAAQvB,MAEF,MAAjB4N,EAAO3P,OAAkC,KAAjB2P,EAAO3P,MAAc,SACzC4P,EAAQ,EACNC,EAAYF,EAAOG,UAEhB/N,EAAI,EAAGA,EAAI2N,EAAMzV,OAAQ8H,IAAK,KAC/B+M,EAAmBY,EAAM3N,GAAGmD,aAAa,qBAAqB6J,MAAM,KAExED,EAAmBA,EAAiBK,IAAI,SAAAnP,UAASA,EAAMiP,OAAOC,oBAExDK,EAAaI,EAAO3P,MAAMiP,OAAOC,eAEK,EAAxCJ,EAAiBzG,QAAQkH,IACzBK,IAIRD,EAAOG,UAAYD,EAAUrH,QAAQgH,EAAcI,uCAnLvE,GDLA,IEHWG,GACAC,GFELC,GAAY,kBAElB,SAASC,GAAqB5S,GdqBvB,IAAmB6S,GcpBjB5C,GAAqB9Q,SAASa,EAAEE,WdoBf2S,EcpBoC5C,MdqBtC4C,EAAKhS,aAAegS,EAAKzQ,cAAgByQ,EAAKC,iBAAiBnW,WcnB/EoW,GAAa/S,GACbgQ,GAAclG,oBAAoB,QAAS8I,KAInD,SAASI,GAAYhT,OAAGiT,6DACdC,EAAWlT,EAAEE,OAASF,EAAEE,OAAO0H,aAAa,eAAiB5H,EACnEgQ,GAAgBjU,SAASkP,eAAeiI,GAEb,mBAApBlT,EAAEwK,gBAA+BxK,EAAEwK,iBAEtCwF,IACAA,GAAc1R,UAAUC,IAAIoU,IAC5B1C,GAAuBD,GAAclQ,cAAc,kBAEnDoQ,GAAwBF,GAAclQ,cAAc,kCAC9BjE,iBAAiB,QAASkX,IAE5CE,GACA/U,IAGA+R,IACAD,GAAcnU,iBAAiB,QAAS+W,KAG5CnN,QAAQC,KAAK,+CAIrB,SAASqN,GAAa/S,GAClBA,EAAEwK,iBACF3L,IACAmR,GAAc1R,UAAUQ,OAAO6T,IAC/BzC,GAAsBpG,oBAAoB,QAASiJ,IGvCvD,SAASI,GAAQnT,OACPoT,EAAMpT,EAAEE,OAASF,EAAEE,OAASF,EAE9BA,EAAEE,QACFF,EAAEwK,qBAGA6I,EAAatX,SAASkP,eAAemI,EAAIxL,aAAa,iBAAiBsD,QAAQ,IAAK,QAEtFmI,EAAY,KACNC,EAAYF,EAAIhJ,WAAWA,WAAWtK,cAAc,mBAEtDwT,EAAW,CACXA,EAAUhV,UAAUQ,OAAO,eAC3BwU,EAAUpL,aAAa,iBAAiB,OAElCqL,EAAmBxX,SAASkP,eAAeqI,EAAU1L,aAAa,iBAAiBsD,QAAQ,IAAK,KAClGqI,GACAA,EAAiBjV,UAAUQ,OAAO,wBAI1CsU,EAAI9U,UAAUC,IAAI,eAClB6U,EAAIlL,aAAa,iBAAiB,GAClCmL,EAAW/U,UAAUC,IAAI,yBAIjC,SAASiV,SACsC,EAAvC1Y,OAAO+P,SAASC,KAAKC,QAAQ,OAAa,KACpCsI,EAAatX,SAASkP,eAAenQ,OAAO+P,SAASC,KAAKI,QAAQ,IAAK,QACzEmI,EAEAF,GADYpX,SAASkP,eAAeoI,EAAWzL,aAAa,sBCjCjE,SAAS6L,SACNC,EAAiB3X,SAASiF,iBAAiB,gDAKxC2S,EAAc3T,OACbC,EAAOD,EAAEE,OAAOC,QAAQ,oBACxByT,EAAW5T,EAAEE,OAAOC,QAAQ,uBAEtBT,MAARO,GAAiCP,MAAZkU,EAAuB,KAInCC,EAAT,SAAwBD,EAAS3T,GAC7B2T,EAAStV,UAAUC,IAAI,WACvB0B,EAAK3B,UAAUC,IAAI,cALjBuV,EAAWF,EAAS5S,iBAAiB,oBACrC+S,EAAoB1U,MAAMC,UAAUzC,MAAM0C,KAAKuU,GAAUtU,OAAO,SAAAC,UAAKA,EAAEnB,UAAUa,SAAS,kBAOhE,GAA5B4U,EAAkBpX,WACdoX,GAAqB9T,EAAM,CAC3B8T,EAAkB,GAAGzV,UAAUQ,OAAO,iBAEhCkV,EAAqBD,EAAkB,GAAGjU,cAAc,yBAEpCJ,MAAtBsU,IACAA,EAAmBxV,MAAMmC,OAAS,KAGtCkT,EAAeD,EAAU3T,SAG7B4T,EAAeD,EAAU3T,OAGvBgU,EAAehU,EAAKH,cAAc,yBAEpBJ,MAAhBuU,IACAA,EAAazV,MAAMmC,iBAAYsT,EAAarM,aAAa,wBA5CzE,SAA4BsM,OACnB,IAAIrS,EAAI,EAAGC,EAAIoS,EAAUvX,OAAQkF,EAAIC,EAAGD,IACzCqS,EAAUrS,GAAGqG,aAAa,cAAcgM,EAAUrS,GAAGjB,cAQzDuT,CAF2BpY,SAASiF,iBAAiB,yCAyChD,IAAIa,EAAI,EAAGC,EAAI4R,EAAe/W,OAAQkF,EAAIC,EAAGD,IAC9C6R,EAAe7R,GAAGhG,iBAAiB,QAAS8X,GF3C7C,SAASS,KACZ3B,GAAc4B,KAAKC,IAAIvY,SAASC,gBAAgBgL,YAAalM,OAAOC,YAAc,GAClF2X,GAAe5X,OAAOgM,YAEG,OAArBvM,GAAmD,MAArBA,cAO9B,SAASga,IlBOV,IAAkBhO,EAAAA,EkBNJ,8BACI1E,OACC2G,EAAQgM,EAAO3S,GAEf4S,GAAe,KAED/U,MAHC8I,EAAMrI,QAAQ,mCAGJ,KACrBuU,EAAQC,EAAc9S,GAAGwI,wBACTqK,EAAMpW,UAAUa,SAAS,UAE5BqJ,EAAMvH,aAAa,YAAa,CAC3BuH,EAAMZ,aAAa,mBAEjCgN,EAAWC,SAASH,EAAM9M,aAAa,aACvCkN,EAAetM,EAAMZ,aAAa,wBAClCmN,EAAgBvM,EAAMZ,aAAa,yBAEnCoN,GADiBxM,EAAMZ,aAAa,0BACnBY,EAAMZ,aAAa,2BACpCqN,EAAgBzM,EAAMZ,aAAa,wBACnCsN,EAAiB1M,EAAMZ,aAAa,yBACpCuN,GAAYrZ,GAAa8Y,EAAWlC,KAAiBoC,EACrDM,GAAatZ,GAAa8Y,EAAWlC,KAAiBqC,EAExDM,GAAcvZ,GAAa8Y,EAAWlC,KAAiBsC,EACvDM,EAAWT,SAASrM,EAAMZ,aAAa,eAAiBuN,EACxD3L,EAAYqL,SAASrM,EAAMZ,aAAa,gBAAkBwN,EACxDG,EAAgBV,SAASrM,EAAMZ,aAAa,mBAC5C4N,EAAiBX,SAASrM,EAAMZ,aAAa,oBAE7C6N,GADgBjN,EAAMZ,aAAa,wBACnBY,EAAMZ,aAAa,yBAEzC0N,EAAsBC,EAAXD,EAA2BC,EAAgBD,EACtD9L,EAAwBgM,EAAZhM,EAA6BgM,EAAiBhM,EAE1D6L,EAAaA,EAAaI,EAAgBA,EAAgBJ,MAEpDK,EAAYlN,EAAM1I,cAAc,OAChC6V,EAAsBC,iBAAiBF,GAAW3T,WAAWmJ,QAAQ,KAAK,IAC1E2K,EAAqBH,EAAU9N,aAAa,0BAC9CkO,GAAkBha,GAAa8Y,EAAWlC,KAAiBmD,GAElB,EAAvBF,EAAlBG,IACAA,IAAmC,GAGvCrB,EAAcC,EAAM5U,cAAc,cAC5BoO,EAAS,IAAI6H,MAAMnK,OAAO6I,GAsDdG,EAAWlC,IAAzB5W,GAA2CA,EAAY8Y,EAAWK,GAlClEzM,EAAMhK,MAAMjD,gBAAW+Z,QACvB9M,EAAMhK,MAAMmC,iBAAY6I,QACxBhB,EAAMhK,MAAME,SAAW,QACvB8J,EAAMhK,MAAMd,cAASuX,QACrBzM,EAAMhK,MAAMjB,eAAU2X,QACtB1M,EAAMhK,MAAMwX,OAAS,OAErBxN,EAAMhK,MAAMiC,gCAA2B4U,aACvC7M,EAAMhK,MAAMyX,QAAU,KAEtBP,EAAUlX,MAAMiC,gCAA2BqV,aAE3CpB,EAAMlW,MAAMyX,QAAU,KAEtB/H,EAAOgI,SAsBApa,EAAa8Y,EAAWlC,IAlB/BlK,EAAMhK,MAAMjD,MAAQ,KACpBiN,EAAMhK,MAAMmC,OAAS,KACrB6H,EAAMhK,MAAME,SAAW,KACvB8J,EAAMhK,MAAMd,IAAM,KAClB8K,EAAMhK,MAAMjB,KAAO,KACnBiL,EAAMhK,MAAMwX,OAAS,KACrBxN,EAAMhK,MAAMiC,UAAY,KACxB+H,EAAMhK,MAAMyX,QAAU,KAEtBP,EAAUlX,MAAMiC,UAAY,KAE5BiU,EAAMlW,MAAMyX,QAAU,KAEtB/H,EAAOgI,SAOctB,EAAWK,GAAzBnZ,IAvDP0M,EAAMhK,MAAMjD,gBAAWga,QACvB/M,EAAMhK,MAAMmC,iBAAY6U,QACxBhN,EAAMhK,MAAME,SAAW,WACvB8J,EAAMhK,MAAMd,IAAM,OAClB8K,EAAMhK,MAAMjB,KAAO,IACnBiL,EAAMhK,MAAMwX,OAAS,OACrBxN,EAAMhK,MAAMiC,UAAY,KACxB+H,EAAMhK,MAAMyX,QAAU,IAEtBP,EAAUlX,MAAMiC,iCAAmD,EAAxBkV,aAE3CjB,EAAMlW,MAAMyX,QAAU,EAEtB/H,EAAOiI,WA7DdtU,EAAI,EAAGC,EAAI0S,EAAO7X,OAAQkF,EAAIC,EAAGD,MAAjCA,IlBMrB1F,EAAgBa,KAAKuJ,OkByGR,IAAI1E,EAAI,EAAGC,EAAI6S,EAAchY,OAAQkF,EAAIC,EAAGD,IAAK,KAC5C2G,EAAQmM,EAAc9S,GAAG/B,cAAc,yCAEhCJ,MAAT8I,EAAoB,KACdkM,EAAQC,EAAc9S,GAAGwI,wBACTqK,EAAMpW,UAAUa,SAAS,SAE9B,KAQPiX,EAAaC,WAAWT,iBAAiBjB,EAAc9S,GAAI,MAAMlB,OAAOuK,QAAQ,KAAM,KAAmC,OAA1BuH,GAAc1U,GACnH4W,EAAc9S,GAAGrD,MAAMmC,iBAAYyV,YAE7BE,EAA6C,OAA1B7D,GAAc1U,IAAuB,EAC9D2W,EAAMlW,MAAMC,oBAAe6X,YAErBC,EAAW/N,EAAMlI,wBAAwB5C,IAAM5B,EAC/CmZ,EAAgBvC,IAAgBgC,EAAMpU,wBAAwB5C,IAAM8K,EAAMlI,wBAAwB5C,KAClGkX,EAAWF,EAAMpU,wBAAwB5C,IAAM5B,EAC/CoZ,EAAiB1M,EAAMlI,wBAAwB/C,KAC/CiZ,EAAahO,EAAM3H,YACnB4V,EAAcjO,EAAMpG,aACpBsU,EAAahC,EAAM7T,YACnB8V,EAAcjC,EAAMtS,aAIpBwU,GAAgBlE,GAAe+D,GAAe,EAE9C3B,GALY4B,EAAaF,IAKG5B,EAAW2B,GACvCxB,GALa4B,EAAcF,IAKG7B,EAAW2B,GACzClB,EAAc7M,EAAMlI,wBAAwB/C,KAAOmX,EAAMpU,wBAAwB/C,KAEjFsZ,EAAkBD,GAAgBhC,GAAY2B,EAAWtB,KAAmB,EAC5ED,EAAkBK,GAAcT,EAAY2B,IAAe,EAEjE7B,EAAMxM,aAAa,WAAY0M,GAC/BpM,EAAMN,aAAa,WAAYqO,GAC/B/N,EAAMN,aAAa,aAAcsO,GACjChO,EAAMN,aAAa,cAAeuO,GAClCjO,EAAMN,aAAa,iBAAkBwO,GACrClO,EAAMN,aAAa,kBAAmByO,GACtCnO,EAAMN,aAAa,uBAAuB4M,GAC1CtM,EAAMN,aAAa,wBAAyB6M,GAC5CvM,EAAMN,aAAa,uBAAwB+M,GAC3CzM,EAAMN,aAAa,wBAAyBgN,GAC5C1M,EAAMN,aAAa,yBAA0B8M,GAC7CxM,EAAMN,aAAa,yBAA0B2O,GAC7CrO,EAAMN,aAAa,uBAAwB2M,UAA0B,EAAjBI,IACpDzM,EAAMN,aAAa,wBAAuC,EAAdmN,OAEtCK,EAAYlN,EAAM1I,cAAc,OAEhC+V,GAA8C,EADxBD,iBAAiBF,GAAW3T,WAAWmJ,QAAQ,KAAK,KACtB0J,EAAY2B,GAEtEb,EAAUxN,aAAa,yBAAyB2N,UAnL1DlB,EAAgB5Y,SAASiF,iBAAiB,mCAC1CwT,EAASzY,SAASiF,iBAAiB,sEACnC8V,EAAY/a,SAASiF,iBAAiB,OACxC+V,EAAe,EACfC,EAAkB,KAqLK,EAAvBrC,EAAchY,OAAY,KACrB,IAAIkF,EAAI,EAAGC,EAAIgV,EAAUna,OAAQkF,EAAIC,EAAGD,IAAK,KACxC2G,EAAQsO,EAAUjV,GAUpB2G,EAAMyO,SACNF,KAEAvO,EAAM3M,iBAAiB,OAX3B,WACIkb,MAWAvO,EAAM3M,iBAAiB,QAR3B,WACImb,WAWFE,EAAyBC,YAAY,WACnCJ,EAAeC,GAAmBF,EAAUna,QAAmB+C,MAATqW,QACtDqB,cAAcF,GACd3C,MAEL,kBG3NC8C,SACNC,EAAYvb,SAASiF,iBAAiB,4BAEnCuW,EAAaC,OACZC,EAAiBD,EAASrX,QAAQ,gBAElBT,MAAlB+X,EAA6B,KACvBC,EAAeD,EAAe3X,cAAc,oBAC5C6X,EAAeF,EAAe3X,cAAc,oBAC5C8X,EAAmBH,EAAezW,iBAAiB,wBACnD6W,EAAeJ,EAAe3X,cAAc,2BAE9BJ,MAAhBgY,GAA6ChY,MAAhBmY,EAA2B,KAqB/CC,EAAT,eACU1Y,EAAaC,MAAMC,UAAUzC,MAAM0C,KAAKqY,GAAkBpY,OAAO,SAAAC,UAAKA,EAAEnB,UAAUa,SAAS,kBAExE,GAArBC,EAAWzC,OAAa,IACJrB,EAEFsc,EAAiBjb,OAAQ,KACjCob,EAAgBH,EAHNtc,GAKZyc,GAAiB3Y,EAAW,KAC5BA,EAAW,GAAGd,UAAUQ,OAAO,aAC/BiZ,EAAczZ,UAAUC,IAAI,iBAwBnCyZ,EAAT,SAAkBhY,OACe,GAAdiY,EAAiB,KAExBC,GAAQ,EAEK,QAAbD,GAAuB3c,EAAQ,EAAI6c,GACnCD,GAAS5c,EAAQ,GAAK8c,EAAUvX,aAAgB,EAChDvF,KACoB,SAAb2c,GAAgC,EAAR3c,IAC/B4c,GAAS5c,EAAQ,GAAK8c,EAAUvX,aAAgB,EAChDvF,MAGS,GAAT4c,GAEAA,GADAA,EAAc,EAAPA,EAAW,EAAIA,GACRG,EAAeA,EAAeH,EAE5CV,EAAShZ,MAAMiC,gCAA2ByX,YAC1CI,EAAUJ,GAnCD,QAAbD,EACAT,EAASlZ,UAAUC,IAAI,kBACH,SAAb0Z,GACPT,EAASlZ,UAAUC,IAAI,uBAoCpB,IAGc,SAFjB0Z,EAAoDvY,MAAxCM,EAAEE,OAAOC,QAAQ,oBAAmC,OAAS,aAGzD,EAAR7E,EAAW,KACL4c,GAAS5c,EAAQ,GAAK8c,EAAUvX,aAAgB,EACtDyX,EAAUJ,EAEVV,EAAShZ,MAAMiC,gCAA2ByX,YAC1C5c,aAGAA,EAAQ,EAAI6c,EAAW,KACjBD,GAAS5c,EAAQ,GAAK8c,EAAUvX,aAAgB,EACtDyX,EAAUJ,EAEVV,EAAShZ,MAAMiC,gCAA2ByX,YAC1C5c,IAIR2c,GAAa,EAGjBH,KAwGKS,EAAT,SAAsBvY,OA7JZkY,EA8JAM,EAAUxY,EAAEE,OAAOC,QAAQ,wBAC3BsY,EAAepZ,MAAMC,UAAUzC,MAAM0C,KAAKqY,GAAkB7M,QAAQyN,GA/JpEN,GAFN5c,EAmKWmd,GAjKaL,EAAUvX,aAAgB,EAClD2W,EAAShZ,MAAMiC,gCAA2ByX,YAC1CI,EAAUJ,EAEVJ,KApDEO,GAA2E,GAA1Db,EAAS3W,YAAcgX,EAAahX,YAAc,IACnEuX,EAAYZ,EAASxW,iBAAiB,mBAAmB,GACzDmX,EAAYX,EAASxW,iBAAiB,mBAAmBrE,OAE3DrB,EAAQ,EACRod,GAAa,EACbC,GAAU,EACVC,GAAU,EAEVC,GAAW,EACXC,GAAS,EACTC,GAAS,EAETC,GAAa,EACbf,GAAa,EAEb5C,GAAc,EACd4D,GAAQ,EACRX,EAAU,EAiLVd,EAAS3b,iBAAiB,eAzF1B,WACI2b,EAASlZ,UAAUQ,OAAO,kBAC1B0Y,EAASlZ,UAAUQ,OAAO,qBAwF9B0Y,EAAS3b,iBAAiB,aArF1B,SAAoBmE,GACQ,GAApBA,EAAEkZ,QAAQvc,SACV6a,EAASlZ,UAAUQ,OAAO,kBAC1B0Y,EAASlZ,UAAUQ,OAAO,mBAC1B0Y,EAAShZ,MAAMuK,WAAa,KAC5B4P,EAAS3Y,EAAEmZ,eAAe,GAAGC,MAC7BR,EAAS5Y,EAAEmZ,eAAe,GAAGE,MAC7BX,EAAY,IAAIY,OA8E4B,CAACC,SAAS,IAC9D/B,EAAS3b,iBAAiB,YA3E1B,SAAmBmE,MACS,GAApBA,EAAEkZ,QAAQvc,OAAa,CACvBmc,EAAQ9Y,EAAEwZ,cAAc,GAAGJ,MAC3BL,EAAQ/Y,EAAEwZ,cAAc,GAAGH,UAGvBI,EAAYb,EAASG,KAEzBd,EAAqBa,EAATH,EAAiB,OAAS,SAGtCc,EAAYA,EAAY,GAAiB,EAAbA,EAAiBA,IAD7CT,GALAA,EAAYL,EAASG,GAKG,GAAiB,EAAbE,EAAiBA,GAGlB,CACvBhZ,EAAEwK,qBAGEkP,GADJrE,EAA0B,QAAb4C,GAAmC,EAAbe,EAAiBA,GACnBV,EAEjCoB,GADAA,EAAgC,EAAhBA,EAAoB,EAAIA,GACRrB,EAAeA,EAAeqB,EAE9DlC,EAAShZ,MAAMiC,gCAA2BiZ,aAE1CT,GAAQ,EACR5D,EAAaqE,MAoDzBlC,EAAS3b,iBAAiB,WA/C1B,WACQod,IACAX,EAAUjD,EAEVwD,EAAU,IAAIS,KACNT,EAAQc,UAAYjB,EAAUiB,UAIlC3B,IAeJiB,IADA5D,EAFA4C,EADAe,EAFAD,EADAD,EADAD,EAFAD,EADAD,EADAD,GAAa,KAmC2B,CAACa,SAAS,IAC1D/B,EAAS3b,iBAAiB,cApB1B,WAaIod,IADA5D,EAFA4C,EADAe,EAFAD,EADAD,EADAD,EAFAD,EADAD,EADAD,GAAa,KAsBrBf,EAAa9b,iBAAiB,QAASmc,GACvCN,EAAa7b,iBAAiB,QAASmc,OASlC,IAAInW,EAAI,EAAGC,EAAI8V,EAAiBjb,OAAQkF,EAAIC,EAAGD,IAChD+V,EAAiB/V,GAAGhG,iBAAiB,QAAS0c,SAMzD,IAAI1W,EAAI,EAAGC,EAAIwV,EAAU3a,OAAQkF,EAAIC,EAAGD,IACzC0V,EAAaD,EAAUzV,aCzOf+X,SACNC,EAAY9d,SAASiF,iBAAiB,2BAEnC8Y,EAAYC,OACXC,EAAgBD,EAAQ5Z,QAAQ,eAEjBT,MAAjBsa,EAA4B,KACtBC,EAAeD,EAAcla,cAAc,oBAC3Coa,EAAeF,EAAcla,cAAc,oBAC3Cqa,EAAkBH,EAAchZ,iBAAiB,uBACjDoZ,EAAcJ,EAAcla,cAAc,0BAE5BJ,MAAhBua,GAA4Cva,MAAf0a,EAA0B,KAqB9CtC,EAAT,eACU1Y,EAAaC,MAAMC,UAAUzC,MAAM0C,KAAK4a,GAAiB3a,OAAO,SAAAC,UAAKA,EAAEnB,UAAUa,SAAS,kBAEvE,GAArBC,EAAWzC,OAAa,IACJrB,EAEF6e,EAAgBxd,OAAQ,KAChCob,EAAgBoC,EAHN7e,GAKZyc,GAAiB3Y,EAAW,KAC5BA,EAAW,GAAGd,UAAUQ,OAAO,aAC/BiZ,EAAczZ,UAAUC,IAAI,iBAwBnCyZ,EAAT,SAAkBhY,OACe,GAAdiY,EAAiB,KACxBC,GAAQ,EAEK,QAAbD,GAAuB3c,EAAQ,EAAI6c,GACnCD,GAAS5c,EAAQ,GAAK8c,EAAUvX,aAAgB,EAChDvF,KACoB,SAAb2c,GAAgC,EAAR3c,IAC/B4c,GAAS5c,EAAQ,GAAK8c,EAAUvX,aAAgB,EAChDvF,MAGS,GAAT4c,GAEAA,GADAA,EAAc,EAAPA,EAAW,EAAIA,GACRG,EAAeA,EAAeH,EAE5C6B,EAAQvb,MAAMiC,gCAA2ByX,YACzCI,EAAUJ,GAlCD,QAAbD,EACA8B,EAAQzb,UAAUC,IAAI,kBACF,SAAb0Z,GACP8B,EAAQzb,UAAUC,IAAI,uBAmCnB,IAGc,SAFjB0Z,EAAoDvY,MAAxCM,EAAEE,OAAOC,QAAQ,oBAAmC,OAAS,aAGzD,EAAR7E,EAAW,KACL4c,GAAS5c,EAAQ,GAAK8c,EAAUvX,aAAgB,EACtDyX,EAAUJ,EAEV6B,EAAQvb,MAAMiC,gCAA2ByX,YACzC5c,aAGAA,EAAQ,EAAI6c,EAAW,KACjBD,GAAS5c,EAAQ,GAAK8c,EAAUvX,aAAgB,EACtDyX,EAAUJ,EAEV6B,EAAQvb,MAAMiC,gCAA2ByX,YACzC5c,IAIR2c,GAAa,EAGjBH,KAwGKS,EAAT,SAAsBvY,OA5JZkY,EA6JAM,EAAUxY,EAAEE,OAAOC,QAAQ,uBAC3BsY,EAAepZ,MAAMC,UAAUzC,MAAM0C,KAAK4a,GAAiBpP,QAAQyN,GA9JnEN,GAFN5c,EAkKWmd,GAhKaL,EAAUvX,aAAgB,EAClDkZ,EAAQvb,MAAMiC,gCAA2ByX,YACzCI,EAAUJ,EAEVJ,KApDEO,GAAyE,GAAxD0B,EAAQlZ,YAAcuZ,EAAYvZ,YAAc,IACjEuX,EAAY2B,EAAQ/Y,iBAAiB,kBAAkB,GACvDmX,EAAY4B,EAAQ/Y,iBAAiB,kBAAkBrE,OAEzDrB,EAAQ,EACRod,GAAa,EACbC,GAAU,EACVC,GAAU,EAEVC,GAAW,EACXC,GAAS,EACTC,GAAS,EAETC,GAAa,EACbf,GAAa,EAEb5C,GAAc,EACd4D,GAAQ,EACRX,EAAU,EAgLVyB,EAAQle,iBAAiB,eAzFzB,WACIke,EAAQzb,UAAUQ,OAAO,kBACzBib,EAAQzb,UAAUQ,OAAO,qBAwF7Bib,EAAQle,iBAAiB,aArFzB,SAAoBmE,GACQ,GAApBA,EAAEkZ,QAAQvc,SACVod,EAAQzb,UAAUQ,OAAO,kBACzBib,EAAQzb,UAAUQ,OAAO,mBACzBib,EAAQvb,MAAMuK,WAAa,KAC3B4P,EAAS3Y,EAAEmZ,eAAe,GAAGC,MAC7BR,EAAS5Y,EAAEmZ,eAAe,GAAGE,MAC7BX,EAAY,IAAIY,OA8E2B,CAACC,SAAS,IAC7DQ,EAAQle,iBAAiB,YA3EzB,SAAmBmE,MACS,GAApBA,EAAEkZ,QAAQvc,OAAa,CACvBmc,EAAQ9Y,EAAEwZ,cAAc,GAAGJ,MAC3BL,EAAQ/Y,EAAEwZ,cAAc,GAAGH,UAGvBI,EAAYb,EAASG,KAEzBd,EAAqBa,EAATH,EAAiB,OAAS,SAGtCc,EAAYA,EAAY,GAAiB,EAAbA,EAAiBA,IAD7CT,GALAA,EAAYL,EAASG,GAKG,GAAiB,EAAbE,EAAiBA,GAGlB,CACvBhZ,EAAEwK,qBAGEkP,GADJrE,EAA0B,QAAb4C,GAAmC,EAAbe,EAAiBA,GACnBV,EAEjCoB,GADAA,EAAgC,EAAhBA,EAAoB,EAAIA,GACRrB,EAAeA,EAAeqB,EAE9DK,EAAQvb,MAAMiC,gCAA2BiZ,aAEzCT,GAAQ,EACR5D,EAAaqE,MAoDzBK,EAAQle,iBAAiB,WA/CzB,WACQod,IACAX,EAAUjD,EAEVwD,EAAU,IAAIS,KACNT,EAAQc,UAAYjB,EAAUiB,UAIlC3B,IAeJiB,IADA5D,EAFA4C,EADAe,EAFAD,EADAD,EADAD,EAFAD,EADAD,EADAD,GAAa,KAmC0B,CAACa,SAAS,IACzDQ,EAAQle,iBAAiB,cApBzB,WAaIod,IADA5D,EAFA4C,EADAe,EAFAD,EADAD,EADAD,EAFAD,EADAD,EADAD,GAAa,KAsBrBwB,EAAare,iBAAiB,QAASmc,GACvCiC,EAAape,iBAAiB,QAASmc,OASlC,IAAInW,EAAI,EAAGC,EAAIqY,EAAgBxd,OAAQkF,EAAIC,EAAGD,IAC/CsY,EAAgBtY,GAAGhG,iBAAiB,QAAS0c,SAMxD,IAAI1W,EAAI,EAAGC,EAAI+X,EAAUld,OAAQkF,EAAIC,EAAGD,IACzCiY,EAAYD,EAAUhY,aC3OdwY,SACNC,EAAiBve,SAASkP,eAAe,kBACzCsP,EAAexe,SAASkP,eAAe,gBACvCuP,EAAYze,SAASkP,eAAe,aACpCwP,EAAa1e,SAASiF,iBAAiB,qCAGvBtB,MAAlB4a,GACgB5a,MAAhB6a,GACa7a,MAAb8a,GACoB,EAApBC,EAAW9d,WAEF+d,EAAT,SAAsBC,WACZC,EAA0C,GAA3BJ,EAAUK,cAAqBL,EAAUxU,QAAQwU,EAAUK,eAAenY,MAAQ,GACjGoY,EAA0BR,EAAe5X,MACzCqY,EAAwBR,EAAa7X,MAErCsY,EAAaF,EAAwBrJ,MAAM,KAC3CwJ,EAAWpG,SAASmG,EAAW,GAAI,IACnCE,EAAarG,SAASmG,EAAW,GAAI,IAAM,EAC3CG,EAAYtG,SAASmG,EAAW,GAAI,IACpCI,EAAoB,IAAI9B,KAAK6B,EAAWD,EAAYD,GAEpDI,EAAWN,EAAsBtJ,MAAM,KACvC6J,EAASzG,SAASwG,EAAS,GAAI,IAC/BE,EAAW1G,SAASwG,EAAS,GAAI,IAAM,EACvCG,EAAU3G,SAASwG,EAAS,GAAI,IAChCI,EAAkB,IAAInC,KAAKkC,EAASD,EAAUD,GAEhDI,GAAc,EACdC,EAAkB,EAEb9Z,EAAI,EAAGC,EAAI2Y,EAAW9d,OAAQkF,EAAIC,EAAGD,IAAK,KACzC+Z,EAAYnB,EAAW5Y,MAEzB+Z,EAAUtd,UAAUa,SAAS,mBACN,GAAnBwc,IAAuC,GAAfD,EACxBA,EAAWpd,UAAUC,IAAI,YACH,GAAfmd,GACPA,EAAWpd,UAAUQ,OAAO,WAGhC4c,EAAaE,EACbD,EAAkB,GAGlBC,EAAUtd,UAAUa,SAAS,kBAAmB,KAC1C0c,EAAaD,EAAUhU,aAAa,aAEpCkU,EADuBF,EAAUhU,aAAa,mBAChB6J,MAAM,KACpCsK,EAAOlH,SAASiH,EAAO,GAAI,IAC3BE,EAASnH,SAASiH,EAAO,GAAI,IAAM,EACnCG,EAAQpH,SAASiH,EAAO,GAAI,IAC5BI,EAAiB,IAAI5C,KAAK2C,EAAOD,EAAQD,IAG1CF,EAAWM,SAASvB,IAAiC,IAAhBA,IACpBQ,GAAlBc,GACAA,GAAkBT,GAElBG,EAAUtd,UAAUQ,OAAO,WAC3B6c,KAEAC,EAAUtd,UAAUC,IAAI,eAKb,GAAnBod,IAAuC,GAAfD,EACxBA,EAAWpd,UAAUC,IAAI,YACH,GAAfmd,GACPA,EAAWpd,UAAUQ,OAAO,WAG5B6b,EAAW,KACPyB,YAAevR,SAASwD,sBAAaxD,SAASiB,aAAOjB,SAASkF,UAG9C,IAAhB6K,IACAwB,mBAAsBxB,IAI1ByB,QAAQD,UAAU,GAAIrgB,SAASugB,MAAOF,KAI1CG,GAAa,EACbC,GAAW,EAEXC,EAAetF,YAAY,WACL,oBAAXuF,UACPtF,cAAcqF,GAKtB,WAM4B,SAAlBE,IACFC,EAAYC,cAAcN,GAC1BO,EAAUD,cAAcN,GACxBO,EAAUC,WAAWR,GAGH,SAAhBS,IACFJ,EAAYK,YAAYT,GACxBI,EAAYM,WAAWV,GACvBM,EAAUG,YAAYT,OAdtBW,GAAkB,EAEhB7C,EAAiBve,SAASkP,eAAe,kBACzCsP,EAAexe,SAASkP,eAAe,gBAcvC2R,EAAc,IAAIF,QAAQ,CAC5BU,MAAO9C,EACP+C,SAAU,EACVC,KAAM,CACFC,cAAe,gBACfC,UAAW,cACXC,OAAQ,CAAC,SAAU,UAAW,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YACrHC,SAAU,CAAC,SAAU,SAAU,UAAW,SAAU,UAAW,SAAU,UACzEC,cAAe,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAE9DC,kBAASC,OACDC,EAAMD,EAAKE,UAAUH,WACrBI,EAAQH,EAAKI,WAAa,EAC9BD,EAAQA,EAAMJ,eACRM,EAAOL,EAAKM,qBAEA,GAAdL,EAAInhB,SACJmhB,aAAUA,IAGM,GAAhBE,EAAMrhB,SACNqhB,aAAYA,cAGNF,cAAOE,cAASE,IAE9BE,oBACI7B,EAAY/Z,KAAKub,UACjBpB,IAEIQ,GACAzC,GAAa,IAGrB2D,eAAMC,OACIC,EAAQD,EAAW7M,MAAM,KACzBqM,EAAMjJ,SAAS0J,EAAM,GAAI,IACzBP,EAAQnJ,SAAS0J,EAAM,GAAI,IAAM,EACjCL,EAAOrJ,SAAS0J,EAAM,GAAI,WAEzB,IAAIjF,KAAK4E,EAAMF,EAAOF,MAI/BhB,EAAY,IAAIJ,QAAQ,CAC1BU,MAAO7C,EACP8C,SAAU,EACVC,KAAM,CACFC,cAAe,gBACfC,UAAW,cACXC,OAAQ,CAAC,SAAU,UAAW,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YACrHC,SAAU,CAAC,SAAU,SAAU,UAAW,SAAU,UAAW,SAAU,UACzEC,cAAe,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAE9DC,kBAASC,OACDC,EAAMD,EAAKE,UAAUH,WACrBI,EAAQH,EAAKI,WAAa,EAC9BD,EAAQA,EAAMJ,eACRM,EAAOL,EAAKM,qBAEA,GAAdL,EAAInhB,SACJmhB,aAAUA,IAGM,GAAhBE,EAAMrhB,SACNqhB,aAAYA,cAGNF,cAAOE,cAASE,IAE9BE,oBACI5B,EAAUha,KAAKub,UACff,IAEIG,GACAzC,GAAa,IAGrB2D,eAAMC,OACIC,EAAQD,EAAW7M,MAAM,KACzBqM,EAAMjJ,SAAS0J,EAAM,GAAI,IACzBP,EAAQnJ,SAAS0J,EAAM,GAAI,IAAM,EACjCL,EAAOrJ,SAAS0J,EAAM,GAAI,WAEzB,IAAIjF,KAAK4E,EAAMF,EAAOF,MAI/BU,EAAe,IAAIlF,KACzBkF,EAAaC,SAASD,EAAaP,WAAa,GAEhDrB,EAAY8B,QAAQ,IAAIpF,MACxBwD,EAAU4B,QAAQF,GAElBrB,GAAkB,MAEZwB,EAAa/B,EAAYmB,UACzBa,EAAW9B,EAAUiB,UAEvBY,IACApC,EAAYoC,EACZhC,KAGAiC,IACApC,EAAUoC,EACV5B,KAGJxC,EAAU3e,iBAAiB,SAAS,WAChC6e,GAAa,KAGjBA,GAAa,GAvITmE,KAEL,aC/FKC,SACNrC,EAAetF,YAAY,WACP,oBAAXuF,UACPtF,cAAcqF,GACdsC,MAEL,IAEGC,EAAmBjjB,SAASC,gBAAgBijB,KAC5CC,EAAgB,GAEtBA,EAAc,SAAW,CACrB3B,cAAe,iBACfC,UAAW,aACXC,OAAQ,CAAC,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YACvH0B,YAAa,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,MAAO,OAAQ,MAAO,MAAO,OAC9FzB,SAAU,CAAC,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YAC7EC,cAAe,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAE9DuB,EAAc,SAAW,CACrB3B,cAAe,gBACfC,UAAW,cACXC,OAAQ,CAAC,SAAU,UAAW,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YACrH0B,YAAa,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,MAAO,OAAQ,MAAO,MAAO,OAC9FzB,SAAU,CAAC,SAAU,SAAU,UAAW,SAAU,UAAW,SAAU,UACzEC,cAAe,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,YAGxDoB,EAAiB,eAEbtE,EAAapb,MAAM+f,KAAKrjB,SAASiF,iBAAiB,uBAClDqe,EAAa,GACb3X,EAAY3L,SAAS+D,cAAc,eAEzC4H,EAAUpJ,UAAUC,IAAI,WAkBxBkc,EAAWrf,QAAQ,SAAAwgB,OACT0D,EAAY1D,EAAUhU,aAAa,aACzCyX,EAAWriB,KAAKsiB,SAGd/C,EAAY,IAAIjD,KAEhBiG,EAAS,IAAI7C,QAAQ,CACvBtQ,OAAQiT,EACRhC,SAAU,EACVC,KAAM4B,EAAcF,GACpBQ,QAAS,IAAIlG,KACb8E,SAAU,SAAUP,OA5BHA,EAAAA,EA6BDA,EA5BhBpD,EAAWrf,QAAQ,SAAAwgB,OACT0D,EAAY,IAAIhG,KAAKsC,EAAUhU,aAAa,cAG9C0X,EAAUnB,eAAiBN,EAAKM,eAChCmB,EAAUrB,YAAcJ,EAAKI,YAC7BqB,EAAUvB,WAAaF,EAAKE,UAE5BnC,EAAUtd,UAAUQ,OAAO,WAE3B8c,EAAUtd,UAAUC,IAAI,gBAsBpCghB,EAAOb,QAAQnC,GAEf7U,EAAUS,YAAYoX,EAAOpW,KRdrCrO,OAAO2kB,iBAAmB,eAAC7f,yDAAW,gBAC7B9E,OAAO4kB,aAAgB5kB,OAAO4kB,aAAoC,EAArB5kB,OAAO4kB,YACrD1M,GAAYpT,GAAU,GAEtB9E,OAAO4kB,YAAc,GAI7B5kB,OAAO6kB,iBAAmB,SAAA3f,UAAK+S,GAAa/S,ISvCxCjE,SAASE,KAAKqC,UAAUQ,OAAO,WAC/B/C,SAASE,KAAKiM,aAAa,gBAAgB2G,MAE3Cc,KAEA/T,IzBDAd,OAAOe,iBAAiB,SAAUQ,GyBKlCsD,EAAS,QAAQ,GAEjB7C,EAAQ,WZnBR4R,KACA5T,OAAOe,iBAAiB,SAAU6S,IYqB9BpI,IAEAqE,KR4JD,SAAA,WAAsB/K,+BAAtB,EAAA,EAAiC,0BAC9BggB,EAAmB7jB,SAASE,KAAK+E,iBAAiBpB,GAE/C6E,EAAI,EAAGA,EAAImb,EAAiBjjB,OAAQ8H,IACpC,IAAI6L,GAAOsP,EAAiBnb,IQ9JjCob,GTKD,SAAA,WAAsBjgB,+BAAtB,EAAA,EAAiC,+BAC9BkgB,EAAoB/jB,SAASE,KAAK+E,iBAAiBpB,GAEhD6E,EAAI,EAAGA,EAAIqb,EAAkBnjB,OAAQ8H,IAC1Cqb,EAAkBrb,GAAG5I,iBAAiB,QAASmX,ISP/C+M,GbgLD,SAAA,WAAqBngB,+BAArB,EAAA,EAAgC,yBAC7BogB,EAAajkB,SAASE,KAAK+E,iBAAiBpB,GAEzC6E,EAAI,EAAGA,EAAIub,EAAWrjB,OAAQ8H,IAAK,KAClCwb,EAAYD,EAAWvb,GAEzBwb,EAAUrY,aAAa,eACvBqY,EAAUpkB,iBAAiB,QAAS0R,IAEpCA,GAAkB0S,IavLtBC,GNID,SAAA,OAAmBtgB,+BAAnB,EAAA,EAA8B,uBAC3BugB,EAAgBpkB,SAASE,KAAK+E,iBAAiBpB,MAEjDugB,MACK,IAAI1b,EAAI,EAAGA,EAAI0b,EAAcxjB,OAAQ8H,YAChC2b,EAAOD,EAAc1b,GAAGzD,iBAAiB,gBAEtCqI,EAAI,EAAGA,EAAI+W,EAAKzjB,OAAQ0M,IAC7B+W,EAAK/W,GAAGxN,iBAAiB,QAASsX,IAK9CK,KAEA1Y,OAAOe,iBAAiB,aAAc2X,IAAiB,GMjBnD6M,GAEA5M,KAEAW,KAEAiD,KAEAuC,KAEAS,oBC3DEiG,EAAgBvkB,SAASiF,iBAAiB,mBAC1Cuf,EAAezlB,OAAO+P,SAASC,KAAK8S,cAEhB,EAAtB2C,EAAa5jB,OAAY,KACnBO,EAAUnB,SAAS+D,cAAcygB,MAEnCrjB,EAAS,KACHsjB,EAAsBtjB,EAAQ4C,cAAc,uBAE9C0gB,IACAA,EAAoBhiB,MAAMmC,iBAAY6f,EAAoB5f,mBAC1D4f,EAAoBliB,UAAUC,IAAI,sBAKrCkiB,EAAiBzgB,OAEhB0gB,EADO1gB,EAAE2gB,cACWxgB,QAAQ,sBAE9BugB,EAAc,KACRE,EAAeF,EAAa5gB,cAAc,uBAE5C8gB,IACIA,EAAatiB,UAAUa,SAAS,YAChCyhB,EAAapiB,MAAMmC,OAAS,KAC5BigB,EAAatiB,UAAUQ,OAAO,aAE9B8hB,EAAapiB,MAAMmC,iBAAYigB,EAAahgB,mBAC5CggB,EAAatiB,UAAUC,IAAI,cAM3Cc,MAAM+f,KAAKkB,GAAellB,QAAQ,SAAA6E,GACVA,EAAKH,cAAc,YAC3BjE,iBAAiB,QAAQ4kB,KDwBrCI,GAEA/B,OAIJhkB,OAAO2kB,iBAAiB"}