1
0
mirror of https://github.com/searxng/searxng.git synced 2024-08-25 23:40:15 +02:00
searxng/searx/static/themes/simple/js/searxng.min.js.map
Alexandre Flament 1832ec742a [build] /static
2022-02-20 22:58:51 +01:00

1 line
95 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"file":"searxng.min.js","sources":["../src/js/main/00_toolkit.js","../src/js/main/infinite_scroll.js","../src/js/main/keyboard.js","../src/js/main/mapresult.js","../src/js/main/preferences.js","../src/js/main/results.js","../src/js/main/search.js","../../__common__/js/image_layout.js","../node_modules/autocomplete-js/dist/autocomplete.js"],"sourcesContent":["/**\n * @license\n * (C) Copyright Contributors to the SearXNG project.\n * (C) Copyright Contributors to the searx project (2014 - 2021).\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nwindow.searxng = (function (w, d) {\n\n 'use strict';\n\n // not invented here tookit with bugs fixed elsewhere\n // purposes : be just good enough and as small as possible\n\n // from https://plainjs.com/javascript/events/live-binding-event-handlers-14/\n if (w.Element) {\n (function (ElementPrototype) {\n ElementPrototype.matches = ElementPrototype.matches ||\n ElementPrototype.matchesSelector ||\n ElementPrototype.webkitMatchesSelector ||\n ElementPrototype.msMatchesSelector ||\n function (selector) {\n var node = this, nodes = (node.parentNode || node.document).querySelectorAll(selector), i = -1;\n while (nodes[++i] && nodes[i] != node);\n return !!nodes[i];\n };\n })(Element.prototype);\n }\n\n function callbackSafe (callback, el, e) {\n try {\n callback.call(el, e);\n } catch (exception) {\n console.log(exception);\n }\n }\n\n var searxng = window.searxng || {};\n\n searxng.on = function (obj, eventType, callback, useCapture) {\n useCapture = useCapture || false;\n if (typeof obj !== 'string') {\n // obj HTMLElement, HTMLDocument\n obj.addEventListener(eventType, callback, useCapture);\n } else {\n // obj is a selector\n d.addEventListener(eventType, function (e) {\n var el = e.target || e.srcElement, found = false;\n while (el && el.matches && el !== d && !(found = el.matches(obj))) el = el.parentElement;\n if (found) callbackSafe(callback, el, e);\n }, useCapture);\n }\n };\n\n searxng.ready = function (callback) {\n if (document.readyState != 'loading') {\n callback.call(w);\n } else {\n w.addEventListener('DOMContentLoaded', callback.bind(w));\n }\n };\n\n searxng.http = function (method, url, data = null) {\n return new Promise(function (resolve, reject) {\n try {\n var req = new XMLHttpRequest();\n req.open(method, url, true);\n req.timeout = 20000;\n\n // On load\n req.onload = function () {\n if (req.status == 200) {\n resolve(req.response, req.responseType);\n } else {\n reject(Error(req.statusText));\n }\n };\n\n // Handle network errors\n req.onerror = function () {\n reject(Error(\"Network Error\"));\n };\n\n req.onabort = function () {\n reject(Error(\"Transaction is aborted\"));\n };\n\n req.ontimeout = function () {\n reject(Error(\"Timeout\"));\n }\n\n // Make the request\n if (data) {\n req.send(data)\n } else {\n req.send();\n }\n } catch (ex) {\n reject(ex);\n }\n });\n };\n\n searxng.loadStyle = function (src) {\n var path = searxng.static_path + src,\n id = \"style_\" + src.replace('.', '_'),\n s = d.getElementById(id);\n if (s === null) {\n s = d.createElement('link');\n s.setAttribute('id', id);\n s.setAttribute('rel', 'stylesheet');\n s.setAttribute('type', 'text/css');\n s.setAttribute('href', path);\n d.body.appendChild(s);\n }\n };\n\n searxng.loadScript = function (src, callback) {\n var path = searxng.static_path + src,\n id = \"script_\" + src.replace('.', '_'),\n s = d.getElementById(id);\n if (s === null) {\n s = d.createElement('script');\n s.setAttribute('id', id);\n s.setAttribute('src', path);\n s.onload = callback;\n s.onerror = function () {\n s.setAttribute('error', '1');\n };\n d.body.appendChild(s);\n } else if (!s.hasAttribute('error')) {\n try {\n callback.apply(s, []);\n } catch (exception) {\n console.log(exception);\n }\n } else {\n console.log(\"callback not executed : script '\" + path + \"' not loaded.\");\n }\n };\n\n searxng.insertBefore = function (newNode, referenceNode) {\n referenceNode.parentNode.insertBefore(newNode, referenceNode);\n };\n\n searxng.insertAfter = function (newNode, referenceNode) {\n referenceNode.parentNode.insertAfter(newNode, referenceNode.nextSibling);\n };\n\n searxng.on('.close', 'click', function () {\n this.parentNode.classList.add('invisible');\n });\n\n function getEndpoint () {\n for (var className of d.getElementsByTagName('body')[0].classList.values()) {\n if (className.endsWith('_endpoint')) {\n return className.split('_')[0];\n }\n }\n return '';\n }\n\n searxng.endpoint = getEndpoint();\n\n return searxng;\n})(window, document);\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/* global searxng */\n\nsearxng.ready(function () {\n 'use strict';\n\n searxng.infinite_scroll_supported = (\n 'IntersectionObserver' in window &&\n 'IntersectionObserverEntry' in window &&\n 'intersectionRatio' in window.IntersectionObserverEntry.prototype);\n\n if (searxng.endpoint !== 'results') {\n return;\n }\n\n if (!searxng.infinite_scroll_supported) {\n console.log('IntersectionObserver not supported');\n return;\n }\n\n let d = document;\n var onlyImages = d.getElementById('results').classList.contains('only_template_images');\n\n function newLoadSpinner () {\n var loader = d.createElement('div');\n loader.classList.add('loader');\n return loader;\n }\n\n function replaceChildrenWith (element, children) {\n element.textContent = '';\n children.forEach(child => element.appendChild(child));\n }\n\n function loadNextPage (callback) {\n var form = d.querySelector('#pagination form.next_page');\n if (!form) {\n return\n }\n replaceChildrenWith(d.querySelector('#pagination'), [ newLoadSpinner() ]);\n var formData = new FormData(form);\n searxng.http('POST', d.querySelector('#search').getAttribute('action'), formData).then(\n function (response) {\n var nextPageDoc = new DOMParser().parseFromString(response, 'text/html');\n var articleList = nextPageDoc.querySelectorAll('#urls article');\n var paginationElement = nextPageDoc.querySelector('#pagination');\n d.querySelector('#pagination').remove();\n if (articleList.length > 0 && !onlyImages) {\n // do not add <hr> element when there are only images\n d.querySelector('#urls').appendChild(d.createElement('hr'));\n }\n articleList.forEach(articleElement => {\n d.querySelector('#urls').appendChild(articleElement);\n });\n if (paginationElement) {\n d.querySelector('#results').appendChild(paginationElement);\n callback();\n }\n }\n ).catch(\n function (err) {\n console.log(err);\n var e = d.createElement('div');\n e.textContent = searxng.translations.error_loading_next_page;\n e.classList.add('dialog-error');\n e.setAttribute('role', 'alert');\n replaceChildrenWith(d.querySelector('#pagination'), [ e ]);\n }\n )\n }\n\n if (searxng.infinite_scroll && searxng.infinite_scroll_supported) {\n const intersectionObserveOptions = {\n rootMargin: \"20rem\",\n };\n const observedSelector = 'article.result:last-child';\n const observer = new IntersectionObserver(entries => {\n const paginationEntry = entries[0];\n if (paginationEntry.isIntersecting) {\n observer.unobserve(paginationEntry.target);\n loadNextPage(() => observer.observe(d.querySelector(observedSelector), intersectionObserveOptions));\n }\n });\n observer.observe(d.querySelector(observedSelector), intersectionObserveOptions);\n }\n\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global searxng */\n\nsearxng.ready(function () {\n\n function isElementInDetail (el) {\n while (el !== undefined) {\n if (el.classList.contains('detail')) {\n return true;\n }\n if (el.classList.contains('result')) {\n // we found a result, no need to go to the root of the document:\n // el is not inside a <div class=\"detail\"> element\n return false;\n }\n el = el.parentNode;\n }\n return false;\n }\n\n function getResultElement (el) {\n while (el !== undefined) {\n if (el.classList.contains('result')) {\n return el;\n }\n el = el.parentNode;\n }\n return undefined;\n }\n\n function isImageResult (resultElement) {\n return resultElement && resultElement.classList.contains('result-images');\n }\n\n searxng.on('.result', 'click', function (e) {\n if (!isElementInDetail(e.target)) {\n highlightResult(this)(true);\n let resultElement = getResultElement(e.target);\n if (isImageResult(resultElement)) {\n e.preventDefault();\n searxng.selectImage(resultElement);\n }\n }\n });\n\n searxng.on('.result a', 'focus', function (e) {\n if (!isElementInDetail(e.target)) {\n let resultElement = getResultElement(e.target);\n if (resultElement && resultElement.getAttribute(\"data-vim-selected\") === null) {\n highlightResult(resultElement)(true);\n }\n if (isImageResult(resultElement)) {\n searxng.selectImage(resultElement);\n }\n }\n }, true);\n\n var vimKeys = {\n 27: {\n key: 'Escape',\n fun: removeFocus,\n des: 'remove focus from the focused input',\n cat: 'Control'\n },\n 73: {\n key: 'i',\n fun: searchInputFocus,\n des: 'focus on the search input',\n cat: 'Control'\n },\n 66: {\n key: 'b',\n fun: scrollPage(-window.innerHeight),\n des: 'scroll one page up',\n cat: 'Navigation'\n },\n 70: {\n key: 'f',\n fun: scrollPage(window.innerHeight),\n des: 'scroll one page down',\n cat: 'Navigation'\n },\n 85: {\n key: 'u',\n fun: scrollPage(-window.innerHeight / 2),\n des: 'scroll half a page up',\n cat: 'Navigation'\n },\n 68: {\n key: 'd',\n fun: scrollPage(window.innerHeight / 2),\n des: 'scroll half a page down',\n cat: 'Navigation'\n },\n 71: {\n key: 'g',\n fun: scrollPageTo(-document.body.scrollHeight, 'top'),\n des: 'scroll to the top of the page',\n cat: 'Navigation'\n },\n 86: {\n key: 'v',\n fun: scrollPageTo(document.body.scrollHeight, 'bottom'),\n des: 'scroll to the bottom of the page',\n cat: 'Navigation'\n },\n 75: {\n key: 'k',\n fun: highlightResult('up'),\n des: 'select previous search result',\n cat: 'Results'\n },\n 74: {\n key: 'j',\n fun: highlightResult('down'),\n des: 'select next search result',\n cat: 'Results'\n },\n 80: {\n key: 'p',\n fun: GoToPreviousPage(),\n des: 'go to previous page',\n cat: 'Results'\n },\n 78: {\n key: 'n',\n fun: GoToNextPage(),\n des: 'go to next page',\n cat: 'Results'\n },\n 79: {\n key: 'o',\n fun: openResult(false),\n des: 'open search result',\n cat: 'Results'\n },\n 84: {\n key: 't',\n fun: openResult(true),\n des: 'open the result in a new tab',\n cat: 'Results'\n },\n 82: {\n key: 'r',\n fun: reloadPage,\n des: 'reload page from the server',\n cat: 'Control'\n },\n 72: {\n key: 'h',\n fun: toggleHelp,\n des: 'toggle help window',\n cat: 'Other'\n }\n };\n\n if (searxng.hotkeys) {\n searxng.on(document, \"keydown\", function (e) {\n // check for modifiers so we don't break browser's hotkeys\n if (Object.prototype.hasOwnProperty.call(vimKeys, e.keyCode) && !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {\n var tagName = e.target.tagName.toLowerCase();\n if (e.keyCode === 27) {\n vimKeys[e.keyCode].fun(e);\n } else {\n if (e.target === document.body || tagName === 'a' || tagName === 'button') {\n e.preventDefault();\n vimKeys[e.keyCode].fun();\n }\n }\n }\n });\n }\n\n function highlightResult (which) {\n return function (noScroll) {\n var current = document.querySelector('.result[data-vim-selected]'),\n effectiveWhich = which;\n if (current === null) {\n // no selection : choose the first one\n current = document.querySelector('.result');\n if (current === null) {\n // no first one : there are no results\n return;\n }\n // replace up/down actions by selecting first one\n if (which === \"down\" || which === \"up\") {\n effectiveWhich = current;\n }\n }\n\n var next, results = document.querySelectorAll('.result');\n\n if (typeof effectiveWhich !== 'string') {\n next = effectiveWhich;\n } else {\n switch (effectiveWhich) {\n case 'visible':\n var top = document.documentElement.scrollTop || document.body.scrollTop;\n var bot = top + document.documentElement.clientHeight;\n\n for (var i = 0; i < results.length; i++) {\n next = results[i];\n var etop = next.offsetTop;\n var ebot = etop + next.clientHeight;\n\n if ((ebot <= bot) && (etop > top)) {\n break;\n }\n }\n break;\n case 'down':\n next = current.nextElementSibling;\n if (next === null) {\n next = results[0];\n }\n break;\n case 'up':\n next = current.previousElementSibling;\n if (next === null) {\n next = results[results.length - 1];\n }\n break;\n case 'bottom':\n next = results[results.length - 1];\n break;\n case 'top':\n /* falls through */\n default:\n next = results[0];\n }\n }\n\n if (next) {\n current.removeAttribute('data-vim-selected');\n next.setAttribute('data-vim-selected', 'true');\n var link = next.querySelector('h3 a') || next.querySelector('a');\n if (link !== null) {\n link.focus();\n }\n if (!noScroll) {\n scrollPageToSelected();\n }\n }\n };\n }\n\n function reloadPage () {\n document.location.reload(true);\n }\n\n function removeFocus (e) {\n const tagName = e.target.tagName.toLowerCase();\n if (document.activeElement && (tagName === 'input' || tagName === 'select' || tagName === 'textarea')) {\n document.activeElement.blur();\n } else {\n searxng.closeDetail();\n }\n }\n\n function pageButtonClick (css_selector) {\n return function () {\n var button = document.querySelector(css_selector);\n if (button) {\n button.click();\n }\n };\n }\n\n function GoToNextPage () {\n return pageButtonClick('nav#pagination .next_page button[type=\"submit\"]');\n }\n\n function GoToPreviousPage () {\n return pageButtonClick('nav#pagination .previous_page button[type=\"submit\"]');\n }\n\n function scrollPageToSelected () {\n var sel = document.querySelector('.result[data-vim-selected]');\n if (sel === null) {\n return;\n }\n var wtop = document.documentElement.scrollTop || document.body.scrollTop,\n wheight = document.documentElement.clientHeight,\n etop = sel.offsetTop,\n ebot = etop + sel.clientHeight,\n offset = 120;\n // first element ?\n if ((sel.previousElementSibling === null) && (ebot < wheight)) {\n // set to the top of page if the first element\n // is fully included in the viewport\n window.scroll(window.scrollX, 0);\n return;\n }\n if (wtop > (etop - offset)) {\n window.scroll(window.scrollX, etop - offset);\n } else {\n var wbot = wtop + wheight;\n if (wbot < (ebot + offset)) {\n window.scroll(window.scrollX, ebot - wheight + offset);\n }\n }\n }\n\n function scrollPage (amount) {\n return function () {\n window.scrollBy(0, amount);\n highlightResult('visible')();\n };\n }\n\n function scrollPageTo (position, nav) {\n return function () {\n window.scrollTo(0, position);\n highlightResult(nav)();\n };\n }\n\n function searchInputFocus () {\n window.scrollTo(0, 0);\n document.querySelector('#q').focus();\n }\n\n function openResult (newTab) {\n return function () {\n var link = document.querySelector('.result[data-vim-selected] h3 a');\n if (link === null) {\n link = document.querySelector('.result[data-vim-selected] > a');\n }\n if (link !== null) {\n var url = link.getAttribute('href');\n if (newTab) {\n window.open(url);\n } else {\n window.location.href = url;\n }\n }\n };\n }\n\n function initHelpContent (divElement) {\n var categories = {};\n\n for (var k in vimKeys) {\n var key = vimKeys[k];\n categories[key.cat] = categories[key.cat] || [];\n categories[key.cat].push(key);\n }\n\n var sorted = Object.keys(categories).sort(function (a, b) {\n return categories[b].length - categories[a].length;\n });\n\n if (sorted.length === 0) {\n return;\n }\n\n var html = '<a href=\"#\" class=\"close\" aria-label=\"close\" title=\"close\">×</a>';\n html += '<h3>How to navigate searx with Vim-like hotkeys</h3>';\n html += '<table>';\n\n for (var i = 0; i < sorted.length; i++) {\n var cat = categories[sorted[i]];\n\n var lastCategory = i === (sorted.length - 1);\n var first = i % 2 === 0;\n\n if (first) {\n html += '<tr>';\n }\n html += '<td>';\n\n html += '<h4>' + cat[0].cat + '</h4>';\n html += '<ul class=\"list-unstyled\">';\n\n for (var cj in cat) {\n html += '<li><kbd>' + cat[cj].key + '</kbd> ' + cat[cj].des + '</li>';\n }\n\n html += '</ul>';\n html += '</td>'; // col-sm-*\n\n if (!first || lastCategory) {\n html += '</tr>'; // row\n }\n }\n\n html += '</table>';\n\n divElement.innerHTML = html;\n }\n\n function toggleHelp () {\n var helpPanel = document.querySelector('#vim-hotkeys-help');\n if (helpPanel === undefined || helpPanel === null) {\n // first call\n helpPanel = document.createElement('div');\n helpPanel.id = 'vim-hotkeys-help';\n helpPanel.className = 'dialog-modal';\n initHelpContent(helpPanel);\n initHelpContent(helpPanel);\n initHelpContent(helpPanel);\n var body = document.getElementsByTagName('body')[0];\n body.appendChild(helpPanel);\n } else {\n // togggle hidden\n helpPanel.classList.toggle('invisible');\n return;\n }\n }\n\n searxng.scrollPageToSelected = scrollPageToSelected;\n searxng.selectNext = highlightResult('down');\n searxng.selectPrevious = highlightResult('up');\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global L */\n(function (w, d, searxng) {\n 'use strict';\n\n searxng.ready(function () {\n searxng.on('.searxng_init_map', 'click', function (event) {\n // no more request\n this.classList.remove(\"searxng_init_map\");\n\n //\n var leaflet_target = this.dataset.leafletTarget;\n var map_lon = parseFloat(this.dataset.mapLon);\n var map_lat = parseFloat(this.dataset.mapLat);\n var map_zoom = parseFloat(this.dataset.mapZoom);\n var map_boundingbox = JSON.parse(this.dataset.mapBoundingbox);\n var map_geojson = JSON.parse(this.dataset.mapGeojson);\n\n searxng.loadStyle('css/leaflet.css');\n searxng.loadScript('js/leaflet.js', function () {\n var map_bounds = null;\n if (map_boundingbox) {\n var southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);\n var northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);\n map_bounds = L.latLngBounds(southWest, northEast);\n }\n\n // init map\n var map = L.map(leaflet_target);\n // create the tile layer with correct attribution\n var osmMapnikUrl = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n var osmMapnikAttrib = 'Map data © <a href=\"https://openstreetmap.org\">OpenStreetMap</a> contributors';\n var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib});\n var osmWikimediaUrl = 'https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png';\n var osmWikimediaAttrib = 'Wikimedia maps | Maps data © <a href=\"https://openstreetmap.org\">OpenStreetMap contributors</a>';\n var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib});\n // init map view\n if (map_bounds) {\n // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021\n // Still useful ?\n setTimeout(function () {\n map.fitBounds(map_bounds, {\n maxZoom: 17\n });\n }, 0);\n } else if (map_lon && map_lat) {\n if (map_zoom) {\n map.setView(new L.latLng(map_lat, map_lon), map_zoom);\n } else {\n map.setView(new L.latLng(map_lat, map_lon), 8);\n }\n }\n\n map.addLayer(osmMapnik);\n\n var baseLayers = {\n \"OSM Mapnik\": osmMapnik,\n \"OSM Wikimedia\": osmWikimedia,\n };\n\n L.control.layers(baseLayers).addTo(map);\n\n if (map_geojson) {\n L.geoJson(map_geojson).addTo(map);\n } /* else if(map_bounds) {\n L.rectangle(map_bounds, {color: \"#ff7800\", weight: 3, fill:false}).addTo(map);\n } */\n });\n\n // this event occour only once per element\n event.preventDefault();\n });\n });\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d, searxng) {\n 'use strict';\n\n if (searxng.endpoint !== 'preferences') {\n return;\n }\n\n searxng.ready(function () {\n let engine_descriptions = null;\n function load_engine_descriptions () {\n if (engine_descriptions == null) {\n searxng.http(\"GET\", \"engine_descriptions.json\").then(function (content) {\n engine_descriptions = JSON.parse(content);\n for (const [engine_name, description] of Object.entries(engine_descriptions)) {\n let elements = d.querySelectorAll('[data-engine-name=\"' + engine_name + '\"] .engine-description');\n for (const element of elements) {\n let source = ' (<i>' + searxng.translations['Source'] + ':&nbsp;' + description[1] + '</i>)';\n element.innerHTML = description[0] + source;\n }\n }\n });\n }\n }\n\n for (const el of d.querySelectorAll('[data-engine-name]')) {\n searxng.on(el, 'mouseenter', load_engine_descriptions);\n }\n });\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d, searxng) {\n 'use strict';\n\n if (searxng.endpoint !== 'results') {\n return;\n }\n\n searxng.ready(function () {\n searxng.image_thumbnail_layout = new searxng.ImageLayout('#urls', '#urls .result-images', 'img.image_thumbnail', 14, 6, 200);\n searxng.image_thumbnail_layout.watch();\n\n d.querySelectorAll('#urls img.image').forEach(\n img =>\n img.addEventListener(\n 'error', () => {\n img.style.display = 'none';\n img.error = null;\n }\n ));\n\n searxng.on('.btn-collapse', 'click', function () {\n var btnLabelCollapsed = this.getAttribute('data-btn-text-collapsed');\n var btnLabelNotCollapsed = this.getAttribute('data-btn-text-not-collapsed');\n var target = this.getAttribute('data-target');\n var targetElement = d.querySelector(target);\n var html = this.innerHTML;\n if (this.classList.contains('collapsed')) {\n html = html.replace(btnLabelCollapsed, btnLabelNotCollapsed);\n } else {\n html = html.replace(btnLabelNotCollapsed, btnLabelCollapsed);\n }\n this.innerHTML = html;\n this.classList.toggle('collapsed');\n targetElement.classList.toggle('invisible');\n });\n\n searxng.on('.media-loader', 'click', function () {\n var target = this.getAttribute('data-target');\n var iframe_load = d.querySelector(target + ' > iframe');\n var srctest = iframe_load.getAttribute('src');\n if (srctest === null || srctest === undefined || srctest === false) {\n iframe_load.setAttribute('src', iframe_load.getAttribute('data-src'));\n }\n });\n\n searxng.selectImage = function (resultElement) {\n /* eslint no-unused-vars: 0 */\n if (resultElement) {\n // load full size image in background\n const imgElement = resultElement.querySelector('.result-images-source img');\n const thumbnailElement = resultElement.querySelector('.image_thumbnail');\n const detailElement = resultElement.querySelector('.detail');\n if (imgElement) {\n const imgSrc = imgElement.getAttribute('data-src');\n if (imgSrc) {\n const loader = d.createElement('div');\n const imgLoader = new Image();\n\n loader.classList.add('loader');\n detailElement.appendChild(loader);\n\n imgLoader.onload = e => {\n imgElement.src = imgSrc;\n loader.remove();\n };\n imgLoader.onerror = e => {\n loader.remove();\n };\n imgLoader.src = imgSrc;\n imgElement.src = thumbnailElement.src;\n imgElement.removeAttribute('data-src');\n }\n }\n }\n d.getElementById('results').classList.add('image-detail-open');\n searxng.image_thumbnail_layout.align();\n searxng.scrollPageToSelected();\n }\n\n searxng.closeDetail = function (e) {\n d.getElementById('results').classList.remove('image-detail-open');\n searxng.image_thumbnail_layout.align();\n searxng.scrollPageToSelected();\n }\n searxng.on('.result-detail-close', 'click', e => {\n e.preventDefault();\n searxng.closeDetail();\n });\n searxng.on('.result-detail-previous', 'click', e => searxng.selectPrevious(false));\n searxng.on('.result-detail-next', 'click', e => searxng.selectNext(false));\n\n w.addEventListener('scroll', function () {\n var e = d.getElementById('backToTop'),\n scrollTop = document.documentElement.scrollTop || document.body.scrollTop,\n results = d.getElementById('results');\n if (e !== null) {\n if (scrollTop >= 100) {\n results.classList.add('scrolling');\n } else {\n results.classList.remove('scrolling');\n }\n }\n }, true);\n\n });\n\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global AutoComplete */\n(function (w, d, searxng) {\n 'use strict';\n\n var firstFocus = true, qinput_id = \"q\", qinput;\n\n function placeCursorAtEnd (element) {\n if (element.setSelectionRange) {\n var len = element.value.length;\n element.setSelectionRange(len, len);\n }\n }\n\n function submitIfQuery () {\n if (qinput.value.length > 0) {\n var search = document.getElementById('search');\n setTimeout(search.submit.bind(search), 0);\n }\n }\n\n function createClearButton (qinput) {\n var cs = document.getElementById('clear_search');\n var updateClearButton = function () {\n if (qinput.value.length === 0) {\n cs.classList.add(\"empty\");\n } else {\n cs.classList.remove(\"empty\");\n }\n };\n\n // update status, event listener\n updateClearButton();\n cs.addEventListener('click', function () {\n qinput.value = '';\n qinput.focus();\n updateClearButton();\n });\n qinput.addEventListener('keyup', updateClearButton, false);\n }\n\n searxng.ready(function () {\n qinput = d.getElementById(qinput_id);\n\n function placeCursorAtEndOnce () {\n if (firstFocus) {\n placeCursorAtEnd(qinput);\n firstFocus = false;\n } else {\n // e.preventDefault();\n }\n }\n\n if (qinput !== null) {\n // clear button\n createClearButton(qinput);\n\n // autocompleter\n if (searxng.autocompleter) {\n searxng.autocomplete = AutoComplete.call(w, {\n Url: \"./autocompleter\",\n EmptyMessage: searxng.translations.no_item_found,\n HttpMethod: searxng.method,\n HttpHeaders: {\n \"Content-type\": \"application/x-www-form-urlencoded\",\n \"X-Requested-With\": \"XMLHttpRequest\"\n },\n MinChars: 4,\n Delay: 300,\n _Position: function () {\n this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n this.DOMResults.style.top = (this.Input.offsetTop + this.Input.offsetHeight) + \"px\";\n this.DOMResults.style.left = this.Input.offsetLeft + \"px\";\n this.DOMResults.style.width = this.Input.clientWidth + \"px\";\n },\n _Open: function () {\n var params = this;\n Array.prototype.forEach.call(this.DOMResults.getElementsByTagName(\"li\"), function (li) {\n if (li.getAttribute(\"class\") != \"locked\") {\n li.onmousedown = function () {\n params._Select(li);\n };\n }\n });\n },\n }, \"#\" + qinput_id);\n\n // hack, see : https://github.com/autocompletejs/autocomplete.js/issues/37\n w.addEventListener('resize', function () {\n var event = new CustomEvent(\"position\");\n qinput.dispatchEvent(event);\n });\n }\n\n qinput.addEventListener('focus', placeCursorAtEndOnce, false);\n qinput.focus();\n }\n\n // vanilla js version of search_on_category_select.js\n if (qinput !== null && d.querySelector('.help') != null && searxng.search_on_category_select) {\n d.querySelector('.help').className = 'invisible';\n\n searxng.on('#categories input', 'change', function () {\n var i, categories = d.querySelectorAll('#categories input[type=\"checkbox\"]');\n for (i = 0; i < categories.length; i++) {\n if (categories[i] !== this && categories[i].checked) {\n categories[i].click();\n }\n }\n if (! this.checked) {\n this.click();\n }\n submitIfQuery();\n return false;\n });\n\n searxng.on(d.getElementById('safesearch'), 'change', submitIfQuery);\n searxng.on(d.getElementById('time_range'), 'change', submitIfQuery);\n searxng.on(d.getElementById('language'), 'change', submitIfQuery);\n }\n\n });\n\n})(window, document, window.searxng);\n","/**\n*\n* Google Image Layout v0.0.1\n* Description, by Anh Trinh.\n* Heavily modified for searx\n* https://ptgamr.github.io/2014-09-12-google-image-layout/\n* https://ptgamr.github.io/google-image-layout/src/google-image-layout.js\n*\n* @license Free to use under the MIT License.\n*\n* @example <caption>Example usage of searxng.ImageLayout class.</caption>\n* searxng.image_thumbnail_layout = new searxng.ImageLayout(\n* '#urls', // container_selector\n* '#urls .result-images', // results_selector\n* 'img.image_thumbnail', // img_selector\n* 14, // verticalMargin\n* 6, // horizontalMargin\n* 200 // maxHeight\n* );\n* searxng.image_thumbnail_layout.watch();\n*/\n\n\n(function (w, d) {\n function ImageLayout (container_selector, results_selector, img_selector, verticalMargin, horizontalMargin, maxHeight) {\n this.container_selector = container_selector;\n this.results_selector = results_selector;\n this.img_selector = img_selector;\n this.verticalMargin = verticalMargin;\n this.horizontalMargin = horizontalMargin;\n this.maxHeight = maxHeight;\n this.trottleCallToAlign = null;\n this.alignAfterThrotteling = false;\n }\n\n /**\n * Get the height that make all images fit the container\n *\n * width = w1 + w2 + w3 + ... = r1*h + r2*h + r3*h + ...\n *\n * @param {[type]} images the images to be calculated\n * @param {[type]} width the container witdth\n * @param {[type]} margin the margin between each image\n *\n * @return {[type]} the height\n */\n ImageLayout.prototype._getHeigth = function (images, width) {\n var i, img;\n var r = 0;\n\n for (i = 0; i < images.length; i++) {\n img = images[i];\n if ((img.naturalWidth > 0) && (img.naturalHeight > 0)) {\n r += img.naturalWidth / img.naturalHeight;\n } else {\n // assume that not loaded images are square\n r += 1;\n }\n }\n\n return (width - images.length * this.verticalMargin) / r; // have to round down because Firefox will automatically roundup value with number of decimals > 3\n };\n\n ImageLayout.prototype._setSize = function (images, height) {\n var i, img, imgWidth;\n var imagesLength = images.length, resultNode;\n\n for (i = 0; i < imagesLength; i++) {\n img = images[i];\n if ((img.naturalWidth > 0) && (img.naturalHeight > 0)) {\n imgWidth = height * img.naturalWidth / img.naturalHeight;\n } else {\n // not loaded image : make it square as _getHeigth said it\n imgWidth = height;\n }\n img.setAttribute('width', Math.round(imgWidth));\n img.setAttribute('height', Math.round(height));\n img.style.marginLeft = Math.round(this.horizontalMargin) + 'px';\n img.style.marginTop = Math.round(this.horizontalMargin) + 'px';\n img.style.marginRight = Math.round(this.verticalMargin - 7) + 'px'; // -4 is the negative margin of the inline element\n img.style.marginBottom = Math.round(this.verticalMargin - 7) + 'px';\n resultNode = img.parentNode.parentNode;\n if (!resultNode.classList.contains('js')) {\n resultNode.classList.add('js');\n }\n }\n };\n\n ImageLayout.prototype._alignImgs = function (imgGroup) {\n var isSearching, slice, i, h;\n var containerElement = d.querySelector(this.container_selector);\n var containerCompStyles = window.getComputedStyle(containerElement);\n var containerPaddingLeft = parseInt(containerCompStyles.getPropertyValue('padding-left'), 10);\n var containerPaddingRight = parseInt(containerCompStyles.getPropertyValue('padding-right'), 10);\n var containerWidth = containerElement.clientWidth - containerPaddingLeft - containerPaddingRight;\n\n while (imgGroup.length > 0) {\n isSearching = true;\n for (i = 1; i <= imgGroup.length && isSearching; i++) {\n slice = imgGroup.slice(0, i);\n h = this._getHeigth(slice, containerWidth);\n if (h < this.maxHeight) {\n this._setSize(slice, h);\n // continue with the remaining images\n imgGroup = imgGroup.slice(i);\n isSearching = false;\n }\n }\n if (isSearching) {\n this._setSize(slice, Math.min(this.maxHeight, h));\n break;\n }\n }\n };\n\n ImageLayout.prototype.throttleAlign = function () {\n var obj = this;\n if (obj.trottleCallToAlign) {\n obj.alignAfterThrotteling = true;\n } else {\n obj.alignAfterThrotteling = false;\n obj.align();\n obj.trottleCallToAlign = setTimeout(function () {\n if (obj.alignAfterThrotteling) {\n obj.align();\n }\n obj.alignAfterThrotteling = false;\n obj.trottleCallToAlign = null;\n }, 20);\n }\n }\n\n ImageLayout.prototype.align = function () {\n var i;\n var results_selectorNode = d.querySelectorAll(this.results_selector);\n var results_length = results_selectorNode.length;\n var previous = null;\n var current = null;\n var imgGroup = [];\n\n for (i = 0; i < results_length; i++) {\n current = results_selectorNode[i];\n if (current.previousElementSibling !== previous && imgGroup.length > 0) {\n // the current image is not connected to previous one\n // so the current image is the start of a new group of images.\n // so call _alignImgs to align the current group\n this._alignImgs(imgGroup);\n // and start a new empty group of images\n imgGroup = [];\n }\n // add the current image to the group (only the img tag)\n imgGroup.push(current.querySelector(this.img_selector));\n // update the previous variable\n previous = current;\n }\n // align the remaining images\n if (imgGroup.length > 0) {\n this._alignImgs(imgGroup);\n }\n };\n\n ImageLayout.prototype._monitorImages = function () {\n var i, img;\n var objthrottleAlign = this.throttleAlign.bind(this);\n var results_nodes = d.querySelectorAll(this.results_selector);\n var results_length = results_nodes.length;\n\n function img_load_error (event) {\n // console.log(\"ERROR can't load: \" + event.originalTarget.src);\n event.originalTarget.src = w.searxng.static_path + w.searxng.theme.img_load_error;\n }\n\n for (i = 0; i < results_length; i++) {\n img = results_nodes[i].querySelector(this.img_selector);\n if (img !== null && img !== undefined && !img.classList.contains('aligned')) {\n img.addEventListener('load', objthrottleAlign);\n // https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror\n img.addEventListener('error', objthrottleAlign);\n img.addEventListener('timeout', objthrottleAlign);\n if (w.searxng.theme.img_load_error) {\n img.addEventListener('error', img_load_error, {once: true});\n }\n img.classList.add('aligned');\n }\n }\n }\n\n ImageLayout.prototype.watch = function () {\n var objthrottleAlign = this.throttleAlign.bind(this);\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/pageshow_event\n w.addEventListener('pageshow', objthrottleAlign);\n // https://developer.mozilla.org/en-US/docs/Web/API/FileReader/load_event\n w.addEventListener('load', objthrottleAlign);\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/resize_event\n w.addEventListener('resize', objthrottleAlign);\n\n this._monitorImages();\n\n var obj = this;\n\n let observer = new MutationObserver(entries => {\n let newElement = false;\n for (let i = 0; i < entries.length; i++) {\n if (entries[i].addedNodes.length > 0 && entries[i].addedNodes[0].classList.contains('result')) {\n newElement = true;\n break;\n }\n }\n if (newElement) {\n obj._monitorImages();\n }\n });\n observer.observe(d.querySelector(this.container_selector), {\n childList: true,\n subtree: true,\n attributes: false,\n characterData: false,\n })\n };\n\n w.searxng.ImageLayout = ImageLayout;\n\n}(window, document));\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.AutoComplete = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n/*\n * @license MIT\n *\n * Autocomplete.js v2.7.1\n * Developed by Baptiste Donaux\n * http://autocomplete-js.com\n *\n * (c) 2017, Baptiste Donaux\n */\n\"use strict\";\nvar ConditionOperator;\n(function (ConditionOperator) {\n ConditionOperator[ConditionOperator[\"AND\"] = 0] = \"AND\";\n ConditionOperator[ConditionOperator[\"OR\"] = 1] = \"OR\";\n})(ConditionOperator || (ConditionOperator = {}));\nvar EventType;\n(function (EventType) {\n EventType[EventType[\"KEYDOWN\"] = 0] = \"KEYDOWN\";\n EventType[EventType[\"KEYUP\"] = 1] = \"KEYUP\";\n})(EventType || (EventType = {}));\n/**\n * Core\n *\n * @class\n * @author Baptiste Donaux <baptiste.donaux@gmail.com> @baptistedonaux\n */\nvar AutoComplete = /** @class */ (function () {\n // Constructor\n function AutoComplete(params, selector) {\n if (params === void 0) { params = {}; }\n if (selector === void 0) { selector = \"[data-autocomplete]\"; }\n if (Array.isArray(selector)) {\n selector.forEach(function (s) {\n new AutoComplete(params, s);\n });\n }\n else if (typeof selector == \"string\") {\n var elements = document.querySelectorAll(selector);\n Array.prototype.forEach.call(elements, function (input) {\n new AutoComplete(params, input);\n });\n }\n else {\n var specificParams = AutoComplete.merge(AutoComplete.defaults, params, {\n DOMResults: document.createElement(\"div\")\n });\n AutoComplete.prototype.create(specificParams, selector);\n return specificParams;\n }\n }\n AutoComplete.prototype.create = function (params, element) {\n params.Input = element;\n if (params.Input.nodeName.match(/^INPUT$/i) && (params.Input.hasAttribute(\"type\") === false || params.Input.getAttribute(\"type\").match(/^TEXT|SEARCH$/i))) {\n params.Input.setAttribute(\"autocomplete\", \"off\");\n params._Position(params);\n params.Input.parentNode.appendChild(params.DOMResults);\n params.$Listeners = {\n blur: params._Blur.bind(params),\n destroy: AutoComplete.prototype.destroy.bind(null, params),\n focus: params._Focus.bind(params),\n keyup: AutoComplete.prototype.event.bind(null, params, EventType.KEYUP),\n keydown: AutoComplete.prototype.event.bind(null, params, EventType.KEYDOWN),\n position: params._Position.bind(params)\n };\n for (var event in params.$Listeners) {\n params.Input.addEventListener(event, params.$Listeners[event]);\n }\n }\n };\n AutoComplete.prototype.getEventsByType = function (params, type) {\n var mappings = {};\n for (var key in params.KeyboardMappings) {\n var event = EventType.KEYUP;\n if (params.KeyboardMappings[key].Event !== undefined) {\n event = params.KeyboardMappings[key].Event;\n }\n if (event == type) {\n mappings[key] = params.KeyboardMappings[key];\n }\n }\n return mappings;\n };\n AutoComplete.prototype.event = function (params, type, event) {\n var eventIdentifier = function (condition) {\n if ((match === true && mapping.Operator == ConditionOperator.AND) || (match === false && mapping.Operator == ConditionOperator.OR)) {\n condition = AutoComplete.merge({\n Not: false\n }, condition);\n if (condition.hasOwnProperty(\"Is\")) {\n if (condition.Is == event.keyCode) {\n match = !condition.Not;\n }\n else {\n match = condition.Not;\n }\n }\n else if (condition.hasOwnProperty(\"From\") && condition.hasOwnProperty(\"To\")) {\n if (event.keyCode >= condition.From && event.keyCode <= condition.To) {\n match = !condition.Not;\n }\n else {\n match = condition.Not;\n }\n }\n }\n };\n for (var name in AutoComplete.prototype.getEventsByType(params, type)) {\n var mapping = AutoComplete.merge({\n Operator: ConditionOperator.AND\n }, params.KeyboardMappings[name]), match = ConditionOperator.AND == mapping.Operator;\n mapping.Conditions.forEach(eventIdentifier);\n if (match === true) {\n mapping.Callback.call(params, event);\n }\n }\n };\n AutoComplete.prototype.makeRequest = function (params, callback, callbackErr) {\n var propertyHttpHeaders = Object.getOwnPropertyNames(params.HttpHeaders), request = new XMLHttpRequest(), method = params._HttpMethod(), url = params._Url(), queryParams = params._Pre(), queryParamsStringify = encodeURIComponent(params._QueryArg()) + \"=\" + encodeURIComponent(queryParams);\n if (method.match(/^GET$/i)) {\n if (url.indexOf(\"?\") !== -1) {\n url += \"&\" + queryParamsStringify;\n }\n else {\n url += \"?\" + queryParamsStringify;\n }\n }\n request.open(method, url, true);\n for (var i = propertyHttpHeaders.length - 1; i >= 0; i--) {\n request.setRequestHeader(propertyHttpHeaders[i], params.HttpHeaders[propertyHttpHeaders[i]]);\n }\n request.onreadystatechange = function () {\n if (request.readyState == 4 && request.status == 200) {\n params.$Cache[queryParams] = request.response;\n callback(request.response);\n }\n else if (request.status >= 400) {\n callbackErr();\n }\n };\n return request;\n };\n AutoComplete.prototype.ajax = function (params, request, timeout) {\n if (timeout === void 0) { timeout = true; }\n if (params.$AjaxTimer) {\n window.clearTimeout(params.$AjaxTimer);\n }\n if (timeout === true) {\n params.$AjaxTimer = window.setTimeout(AutoComplete.prototype.ajax.bind(null, params, request, false), params.Delay);\n }\n else {\n if (params.Request) {\n params.Request.abort();\n }\n params.Request = request;\n params.Request.send(params._QueryArg() + \"=\" + params._Pre());\n }\n };\n AutoComplete.prototype.cache = function (params, callback, callbackErr) {\n var response = params._Cache(params._Pre());\n if (response === undefined) {\n var request = AutoComplete.prototype.makeRequest(params, callback, callbackErr);\n AutoComplete.prototype.ajax(params, request);\n }\n else {\n callback(response);\n }\n };\n AutoComplete.prototype.destroy = function (params) {\n for (var event in params.$Listeners) {\n params.Input.removeEventListener(event, params.$Listeners[event]);\n }\n params.DOMResults.parentNode.removeChild(params.DOMResults);\n };\n AutoComplete.merge = function () {\n var merge = {}, tmp;\n for (var i = 0; i < arguments.length; i++) {\n for (tmp in arguments[i]) {\n merge[tmp] = arguments[i][tmp];\n }\n }\n return merge;\n };\n AutoComplete.defaults = {\n Delay: 150,\n EmptyMessage: \"No result here\",\n Highlight: {\n getRegex: function (value) {\n return new RegExp(value, \"ig\");\n },\n transform: function (value) {\n return \"<strong>\" + value + \"</strong>\";\n }\n },\n HttpHeaders: {\n \"Content-type\": \"application/x-www-form-urlencoded\"\n },\n Limit: 0,\n MinChars: 0,\n HttpMethod: \"GET\",\n QueryArg: \"q\",\n Url: null,\n KeyboardMappings: {\n \"Enter\": {\n Conditions: [{\n Is: 13,\n Not: false\n }],\n Callback: function (event) {\n if (this.DOMResults.getAttribute(\"class\").indexOf(\"open\") != -1) {\n var liActive = this.DOMResults.querySelector(\"li.active\");\n if (liActive !== null) {\n event.preventDefault();\n this._Select(liActive);\n this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n }\n }\n },\n Operator: ConditionOperator.AND,\n Event: EventType.KEYDOWN\n },\n \"KeyUpAndDown_down\": {\n Conditions: [{\n Is: 38,\n Not: false\n },\n {\n Is: 40,\n Not: false\n }],\n Callback: function (event) {\n event.preventDefault();\n },\n Operator: ConditionOperator.OR,\n Event: EventType.KEYDOWN\n },\n \"KeyUpAndDown_up\": {\n Conditions: [{\n Is: 38,\n Not: false\n },\n {\n Is: 40,\n Not: false\n }],\n Callback: function (event) {\n event.preventDefault();\n var first = this.DOMResults.querySelector(\"li:first-child:not(.locked)\"), last = this.DOMResults.querySelector(\"li:last-child:not(.locked)\"), active = this.DOMResults.querySelector(\"li.active\");\n if (active) {\n var currentIndex = Array.prototype.indexOf.call(active.parentNode.children, active), position = currentIndex + (event.keyCode - 39), lisCount = this.DOMResults.getElementsByTagName(\"li\").length;\n if (position < 0) {\n position = lisCount - 1;\n }\n else if (position >= lisCount) {\n position = 0;\n }\n active.classList.remove(\"active\");\n active.parentElement.children.item(position).classList.add(\"active\");\n }\n else if (last && event.keyCode == 38) {\n last.classList.add(\"active\");\n }\n else if (first) {\n first.classList.add(\"active\");\n }\n },\n Operator: ConditionOperator.OR,\n Event: EventType.KEYUP\n },\n \"AlphaNum\": {\n Conditions: [{\n Is: 13,\n Not: true\n }, {\n From: 35,\n To: 40,\n Not: true\n }],\n Callback: function () {\n var oldValue = this.Input.getAttribute(\"data-autocomplete-old-value\"), currentValue = this._Pre();\n if (currentValue !== \"\" && currentValue.length >= this._MinChars()) {\n if (!oldValue || currentValue != oldValue) {\n this.DOMResults.setAttribute(\"class\", \"autocomplete open\");\n }\n AutoComplete.prototype.cache(this, function (response) {\n this._Render(this._Post(response));\n this._Open();\n }.bind(this), this._Error);\n }\n else {\n this._Close();\n }\n },\n Operator: ConditionOperator.AND,\n Event: EventType.KEYUP\n }\n },\n DOMResults: null,\n Request: null,\n Input: null,\n /**\n * Return the message when no result returns\n */\n _EmptyMessage: function () {\n var emptyMessage = \"\";\n if (this.Input.hasAttribute(\"data-autocomplete-empty-message\")) {\n emptyMessage = this.Input.getAttribute(\"data-autocomplete-empty-message\");\n }\n else if (this.EmptyMessage !== false) {\n emptyMessage = this.EmptyMessage;\n }\n else {\n emptyMessage = \"\";\n }\n return emptyMessage;\n },\n /**\n * Returns the maximum number of results\n */\n _Limit: function () {\n var limit = this.Input.getAttribute(\"data-autocomplete-limit\");\n if (isNaN(limit) || limit === null) {\n return this.Limit;\n }\n return parseInt(limit, 10);\n },\n /**\n * Returns the minimum number of characters entered before firing ajax\n */\n _MinChars: function () {\n var minchars = this.Input.getAttribute(\"data-autocomplete-minchars\");\n if (isNaN(minchars) || minchars === null) {\n return this.MinChars;\n }\n return parseInt(minchars, 10);\n },\n /**\n * Apply transformation on labels response\n */\n _Highlight: function (label) {\n return label.replace(this.Highlight.getRegex(this._Pre()), this.Highlight.transform);\n },\n /**\n * Returns the HHTP method to use\n */\n _HttpMethod: function () {\n if (this.Input.hasAttribute(\"data-autocomplete-method\")) {\n return this.Input.getAttribute(\"data-autocomplete-method\");\n }\n return this.HttpMethod;\n },\n /**\n * Returns the query param to use\n */\n _QueryArg: function () {\n if (this.Input.hasAttribute(\"data-autocomplete-param-name\")) {\n return this.Input.getAttribute(\"data-autocomplete-param-name\");\n }\n return this.QueryArg;\n },\n /**\n * Returns the URL to use for AJAX request\n */\n _Url: function () {\n if (this.Input.hasAttribute(\"data-autocomplete\")) {\n return this.Input.getAttribute(\"data-autocomplete\");\n }\n return this.Url;\n },\n /**\n * Manage the close\n */\n _Blur: function (now) {\n if (now === void 0) { now = false; }\n if (now) {\n this._Close();\n }\n else {\n var params = this;\n setTimeout(function () {\n params._Blur(true);\n }, 150);\n }\n },\n /**\n * Manage the cache\n */\n _Cache: function (value) {\n return this.$Cache[value];\n },\n /**\n * Manage the open\n */\n _Focus: function () {\n var oldValue = this.Input.getAttribute(\"data-autocomplete-old-value\");\n if ((!oldValue || this.Input.value != oldValue) && this._MinChars() <= this.Input.value.length) {\n this.DOMResults.setAttribute(\"class\", \"autocomplete open\");\n }\n },\n /**\n * Bind all results item if one result is opened\n */\n _Open: function () {\n var params = this;\n Array.prototype.forEach.call(this.DOMResults.getElementsByTagName(\"li\"), function (li) {\n if (li.getAttribute(\"class\") != \"locked\") {\n li.onclick = function () {\n params._Select(li);\n };\n }\n });\n },\n _Close: function () {\n this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n },\n /**\n * Position the results HTML element\n */\n _Position: function () {\n this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n this.DOMResults.setAttribute(\"style\", \"top:\" + (this.Input.offsetTop + this.Input.offsetHeight) + \"px;left:\" + this.Input.offsetLeft + \"px;width:\" + this.Input.clientWidth + \"px;\");\n },\n /**\n * Execute the render of results DOM element\n */\n _Render: function (response) {\n var ul;\n if (typeof response == \"string\") {\n ul = this._RenderRaw(response);\n }\n else {\n ul = this._RenderResponseItems(response);\n }\n if (this.DOMResults.hasChildNodes()) {\n this.DOMResults.removeChild(this.DOMResults.childNodes[0]);\n }\n this.DOMResults.appendChild(ul);\n },\n /**\n * ResponseItems[] rendering\n */\n _RenderResponseItems: function (response) {\n var ul = document.createElement(\"ul\"), li = document.createElement(\"li\"), limit = this._Limit();\n // Order\n if (limit < 0) {\n response = response.reverse();\n }\n else if (limit === 0) {\n limit = response.length;\n }\n for (var item = 0; item < Math.min(Math.abs(limit), response.length); item++) {\n li.innerHTML = response[item].Label;\n li.setAttribute(\"data-autocomplete-value\", response[item].Value);\n ul.appendChild(li);\n li = document.createElement(\"li\");\n }\n return ul;\n },\n /**\n * string response rendering (RAW HTML)\n */\n _RenderRaw: function (response) {\n var ul = document.createElement(\"ul\"), li = document.createElement(\"li\");\n if (response.length > 0) {\n this.DOMResults.innerHTML = response;\n }\n else {\n var emptyMessage = this._EmptyMessage();\n if (emptyMessage !== \"\") {\n li.innerHTML = emptyMessage;\n li.setAttribute(\"class\", \"locked\");\n ul.appendChild(li);\n }\n }\n return ul;\n },\n /**\n * Deal with request response\n */\n _Post: function (response) {\n try {\n var returnResponse = [];\n //JSON return\n var json = JSON.parse(response);\n if (Object.keys(json).length === 0) {\n return \"\";\n }\n if (Array.isArray(json)) {\n for (var i = 0; i < Object.keys(json).length; i++) {\n returnResponse[returnResponse.length] = { \"Value\": json[i], \"Label\": this._Highlight(json[i]) };\n }\n }\n else {\n for (var value in json) {\n returnResponse.push({\n \"Value\": value,\n \"Label\": this._Highlight(json[value])\n });\n }\n }\n return returnResponse;\n }\n catch (event) {\n //HTML return\n return response;\n }\n },\n /**\n * Return the autocomplete value to send (before request)\n */\n _Pre: function () {\n return this.Input.value;\n },\n /**\n * Choice one result item\n */\n _Select: function (item) {\n if (item.hasAttribute(\"data-autocomplete-value\")) {\n this.Input.value = item.getAttribute(\"data-autocomplete-value\");\n }\n else {\n this.Input.value = item.innerHTML;\n }\n this.Input.setAttribute(\"data-autocomplete-old-value\", this.Input.value);\n },\n /**\n * Handle HTTP error on the request\n */\n _Error: function () {\n },\n $AjaxTimer: null,\n $Cache: {},\n $Listeners: {}\n };\n return AutoComplete;\n}());\nmodule.exports = AutoComplete;\n\n},{}]},{},[1])(1)\n});\n"],"names":["window","searxng","w","d","Element","ElementPrototype","matches","matchesSelector","webkitMatchesSelector","msMatchesSelector","selector","node","this","nodes","parentNode","document","querySelectorAll","i","prototype","callbackSafe","callback","el","e","call","exception","console","log","on","obj","eventType","useCapture","addEventListener","target","srcElement","found","parentElement","ready","readyState","bind","http","method","url","data","Promise","resolve","reject","req","XMLHttpRequest","open","timeout","onload","status","response","responseType","Error","statusText","onerror","onabort","ontimeout","send","ex","loadStyle","src","path","static_path","id","replace","s","getElementById","createElement","setAttribute","body","appendChild","loadScript","hasAttribute","apply","insertBefore","newNode","referenceNode","insertAfter","nextSibling","classList","add","getEndpoint","className","getElementsByTagName","values","endsWith","split","endpoint","infinite_scroll_supported","IntersectionObserverEntry","let","onlyImages","contains","newLoadSpinner","loader","replaceChildrenWith","element","children","textContent","forEach","child","loadNextPage","form","querySelector","formData","FormData","getAttribute","then","nextPageDoc","DOMParser","parseFromString","articleList","paginationElement","remove","length","articleElement","catch","err","translations","error_loading_next_page","infinite_scroll","intersectionObserveOptions","rootMargin","observedSelector","observer","IntersectionObserver","entries","paginationEntry","isIntersecting","unobserve","observe","isElementInDetail","undefined","getResultElement","isImageResult","resultElement","highlightResult","preventDefault","selectImage","vimKeys","27","key","fun","removeFocus","des","cat","73","searchInputFocus","66","scrollPage","innerHeight","70","85","68","71","scrollPageTo","scrollHeight","86","75","74","80","GoToPreviousPage","78","GoToNextPage","79","openResult","84","82","reloadPage","72","toggleHelp","hotkeys","Object","hasOwnProperty","keyCode","ctrlKey","altKey","shiftKey","metaKey","tagName","toLowerCase","which","noScroll","current","effectiveWhich","next","results","top","documentElement","scrollTop","bot","clientHeight","etop","offsetTop","ebot","nextElementSibling","previousElementSibling","removeAttribute","link","focus","scrollPageToSelected","location","reload","activeElement","blur","closeDetail","pageButtonClick","css_selector","button","click","sel","wtop","wheight","offset","scroll","scrollX","wbot","amount","scrollBy","position","nav","scrollTo","newTab","href","initHelpContent","divElement","categories","k","push","sorted","keys","sort","a","b","html","lastCategory","first","cj","innerHTML","helpPanel","toggle","selectNext","selectPrevious","event","leaflet_target","dataset","leafletTarget","map_lon","parseFloat","mapLon","map_lat","mapLat","map_zoom","mapZoom","map_boundingbox","JSON","parse","mapBoundingbox","map_geojson","mapGeojson","map_bounds","southWest","L","latLng","northEast","latLngBounds","map","osmMapnikUrl","osmMapnikAttrib","osmMapnik","TileLayer","minZoom","maxZoom","attribution","osmWikimediaUrl","osmWikimediaAttrib","osmWikimedia","setTimeout","fitBounds","setView","addLayer","baseLayers","OSM Mapnik","OSM Wikimedia","control","layers","addTo","geoJson","engine_descriptions","load_engine_descriptions","content","engine_name","description","elements","source","image_thumbnail_layout","ImageLayout","watch","img","style","display","error","btnLabelCollapsed","btnLabelNotCollapsed","targetElement","iframe_load","srctest","imgElement","thumbnailElement","detailElement","imgSrc","imgLoader","Image","align","firstFocus","qinput_id","qinput","placeCursorAtEnd","setSelectionRange","len","value","submitIfQuery","search","submit","createClearButton","cs","updateClearButton","placeCursorAtEndOnce","autocompleter","autocomplete","AutoComplete","Url","EmptyMessage","no_item_found","HttpMethod","HttpHeaders","Content-type","X-Requested-With","MinChars","Delay","_Position","DOMResults","Input","offsetHeight","left","offsetLeft","width","clientWidth","_Open","params","Array","li","onmousedown","_Select","CustomEvent","dispatchEvent","search_on_category_select","checked","container_selector","results_selector","img_selector","verticalMargin","horizontalMargin","maxHeight","trottleCallToAlign","alignAfterThrotteling","_getHeigth","images","r","naturalWidth","naturalHeight","_setSize","height","imgWidth","imagesLength","resultNode","Math","round","marginLeft","marginTop","marginRight","marginBottom","_alignImgs","imgGroup","isSearching","slice","h","containerElement","containerCompStyles","getComputedStyle","containerPaddingLeft","parseInt","getPropertyValue","containerPaddingRight","containerWidth","min","throttleAlign","results_selectorNode","results_length","previous","_monitorImages","objthrottleAlign","results_nodes","img_load_error","originalTarget","theme","once","MutationObserver","newElement","addedNodes","childList","subtree","attributes","characterData","f","exports","module","define","amd","g","global","self","n","t","o","c","require","u","code","p","1","ConditionOperator","EventType","isArray","input","specificParams","merge","defaults","create","nodeName","match","$Listeners","_Blur","destroy","_Focus","keyup","KEYUP","keydown","KEYDOWN","getEventsByType","type","mappings","KeyboardMappings","Event","eventIdentifier","condition","mapping","Operator","AND","OR","Not","Is","From","To","name","Conditions","Callback","makeRequest","callbackErr","propertyHttpHeaders","getOwnPropertyNames","request","_HttpMethod","_Url","queryParams","_Pre","queryParamsStringify","encodeURIComponent","_QueryArg","indexOf","setRequestHeader","onreadystatechange","$Cache","ajax","$AjaxTimer","clearTimeout","Request","abort","cache","_Cache","removeEventListener","removeChild","tmp","arguments","Highlight","getRegex","RegExp","transform","Limit","QueryArg","Enter","liActive","KeyUpAndDown_down","KeyUpAndDown_up","last","active","currentIndex","lisCount","item","AlphaNum","oldValue","currentValue","_MinChars","_Render","_Post","_Error","_Close","_EmptyMessage","emptyMessage","_Limit","limit","isNaN","minchars","_Highlight","label","now","onclick","ul","_RenderRaw","_RenderResponseItems","hasChildNodes","childNodes","reverse","abs","Label","Value","returnResponse","json"],"mappings":";;;;;GAMAA;OAAOC,QAAU,SAAWC,EAAGC,gBAQ7B,GAAID,EAAEE,QAAS,EACb,SAAWC,GACTA,EAAiBC,QAAUD,EAAiBC,SAC5CD,EAAiBE,iBACjBF,EAAiBG,uBACjBH,EAAiBI,mBACjB,SAAUC,GACR,IAAIC,EAAOC,KAAMC,GAASF,EAAKG,YAAcH,EAAKI,UAAUC,iBAAiBN,GAAWO,GAAK,EAC7F,MAAOJ,IAAQI,IAAMJ,EAAMI,IAAMN,GACjC,QAASE,EAAMI,KARnB,CAUGb,QAAQc,WAGb,SAASC,EAAcC,EAAUC,EAAIC,GACnC,IACEF,EAASG,KAAKF,EAAIC,GAClB,MAAOE,GACPC,QAAQC,IAAIF,IAIhB,IAAIvB,EAAUD,OAAOC,SAAW,GAEhCA,EAAQ0B,GAAK,SAAUC,EAAKC,EAAWT,EAAUU,GAC/CA,EAAaA,GAAc,MAC3B,UAAWF,IAAQ,SAAU,CAE3BA,EAAIG,iBAAiBF,EAAWT,EAAUU,OACrC,CAEL3B,EAAE4B,iBAAiBF,EAAW,SAAUP,GACtC,IAAID,EAAKC,EAAEU,QAAUV,EAAEW,WAAYC,EAAQ,MAC3C,MAAOb,GAAMA,EAAGf,SAAWe,IAAOlB,KAAO+B,EAAQb,EAAGf,QAAQsB,IAAOP,EAAKA,EAAGc,cAC3E,GAAID,EAAOf,EAAaC,EAAUC,EAAIC,IACrCQ,KAIP7B,EAAQmC,MAAQ,SAAUhB,GACxB,GAAIL,SAASsB,YAAc,UAAW,CACpCjB,EAASG,KAAKrB,OACT,CACLA,EAAE6B,iBAAiB,mBAAoBX,EAASkB,KAAKpC,MAIzDD,EAAQsC,KAAO,SAAUC,EAAQC,EAAKC,EAAO,MAC3C,OAAO,IAAIC,QAAQ,SAAUC,EAASC,GACpC,IACE,IAAIC,EAAM,IAAIC,eACdD,EAAIE,KAAKR,EAAQC,EAAK,MACtBK,EAAIG,QAAU,IAGdH,EAAII,OAAS,WACX,GAAIJ,EAAIK,QAAU,IAAK,CACrBP,EAAQE,EAAIM,SAAUN,EAAIO,kBACrB,CACLR,EAAOS,MAAMR,EAAIS,eAKrBT,EAAIU,QAAU,WACZX,EAAOS,MAAM,mBAGfR,EAAIW,QAAU,WACZZ,EAAOS,MAAM,4BAGfR,EAAIY,UAAY,WACdb,EAAOS,MAAM,aAIf,GAAIZ,EAAM,CACRI,EAAIa,KAAKjB,OACJ,CACLI,EAAIa,QAEN,MAAOC,GACPf,EAAOe,OAKb3D,EAAQ4D,UAAY,SAAUC,GAC5B,IAAIC,EAAO9D,EAAQ+D,YAAcF,EAC/BG,EAAK,SAAWH,EAAII,QAAQ,IAAK,KACjCC,EAAIhE,EAAEiE,eAAeH,GACvB,GAAIE,IAAM,KAAM,CACdA,EAAIhE,EAAEkE,cAAc,QACpBF,EAAEG,aAAa,KAAML,GACrBE,EAAEG,aAAa,MAAO,cACtBH,EAAEG,aAAa,OAAQ,YACvBH,EAAEG,aAAa,OAAQP,GACvB5D,EAAEoE,KAAKC,YAAYL,KAIvBlE,EAAQwE,WAAa,SAAUX,EAAK1C,GAClC,IAAI2C,EAAO9D,EAAQ+D,YAAcF,EAC/BG,EAAK,UAAYH,EAAII,QAAQ,IAAK,KAClCC,EAAIhE,EAAEiE,eAAeH,GACvB,GAAIE,IAAM,KAAM,CACdA,EAAIhE,EAAEkE,cAAc,UACpBF,EAAEG,aAAa,KAAML,GACrBE,EAAEG,aAAa,MAAOP,GACtBI,EAAEjB,OAAS9B,EACX+C,EAAEX,QAAU,WACVW,EAAEG,aAAa,QAAS,MAE1BnE,EAAEoE,KAAKC,YAAYL,QACd,IAAKA,EAAEO,aAAa,SAAU,CACnC,IACEtD,EAASuD,MAAMR,EAAG,IAClB,MAAO3C,GACPC,QAAQC,IAAIF,QAET,CACLC,QAAQC,IAAI,mCAAqCqC,EAAO,mBAI5D9D,EAAQ2E,aAAe,SAAUC,EAASC,GACxCA,EAAchE,WAAW8D,aAAaC,EAASC,IAGjD7E,EAAQ8E,YAAc,SAAUF,EAASC,GACvCA,EAAchE,WAAWiE,YAAYF,EAASC,EAAcE,cAG9D/E,EAAQ0B,GAAG,SAAU,QAAS,WAC5Bf,KAAKE,WAAWmE,UAAUC,IAAI,eAGhC,SAASC,IACP,IAAK,IAAIC,KAAajF,EAAEkF,qBAAqB,QAAQ,GAAGJ,UAAUK,SAAU,CAC1E,GAAIF,EAAUG,SAAS,aAAc,CACnC,OAAOH,EAAUI,MAAM,KAAK,IAGhC,MAAO,GAGTvF,EAAQwF,SAAWN,IAEnB,OAAOlF,EA7JQ,CA8JdD,OAAQe,UChKXd,QAAQmC,MAAM,wBAGZnC,QAAQyF,0BACN,yBAA0B1F,QAC1B,8BAA+BA,QAC/B,sBAAuBA,OAAO2F,0BAA0BzE,UAE1D,GAAIjB,QAAQwF,WAAa,UAAW,CAClC,OAGF,IAAKxF,QAAQyF,0BAA2B,CACtCjE,QAAQC,IAAI,sCACZ,OAGFkE,IAAIzF,EAAIY,SACR,IAAI8E,EAAa1F,EAAEiE,eAAe,WAAWa,UAAUa,SAAS,wBAEhE,SAASC,IACP,IAAIC,EAAS7F,EAAEkE,cAAc,OAC7B2B,EAAOf,UAAUC,IAAI,UACrB,OAAOc,EAGT,SAASC,EAAqBC,EAASC,GACrCD,EAAQE,YAAc,GACtBD,EAASE,QAAQC,GAASJ,EAAQ1B,YAAY8B,IAGhD,SAASC,EAAcnF,GACrB,IAAIoF,EAAOrG,EAAEsG,cAAc,8BAC3B,IAAKD,EAAM,CACT,OAEFP,EAAoB9F,EAAEsG,cAAc,eAAgB,CAAEV,MACtD,IAAIW,EAAW,IAAIC,SAASH,GAC5BvG,QAAQsC,KAAK,OAAQpC,EAAEsG,cAAc,WAAWG,aAAa,UAAWF,GAAUG,KAChF,SAAUzD,GACR,IAAI0D,GAAc,IAAIC,WAAYC,gBAAgB5D,EAAU,aAC5D,IAAI6D,EAAcH,EAAY9F,iBAAiB,iBAC/C,IAAIkG,EAAoBJ,EAAYL,cAAc,eAClDtG,EAAEsG,cAAc,eAAeU,SAC/B,GAAIF,EAAYG,OAAS,IAAMvB,EAAY,CAEzC1F,EAAEsG,cAAc,SAASjC,YAAYrE,EAAEkE,cAAc,OAEvD4C,EAAYZ,QAAQgB,IAClBlH,EAAEsG,cAAc,SAASjC,YAAY6C,KAEvC,GAAIH,EAAmB,CACrB/G,EAAEsG,cAAc,YAAYjC,YAAY0C,GACxC9F,OAGJkG,MACA,SAAUC,GACR9F,QAAQC,IAAI6F,GACZ,IAAIjG,EAAInB,EAAEkE,cAAc,OACxB/C,EAAE8E,YAAcnG,QAAQuH,aAAaC,wBACrCnG,EAAE2D,UAAUC,IAAI,gBAChB5D,EAAEgD,aAAa,OAAQ,SACvB2B,EAAoB9F,EAAEsG,cAAc,eAAgB,CAAEnF,MAK5D,GAAIrB,QAAQyH,iBAAmBzH,QAAQyF,0BAA2B,CAChE,MAAMiC,EAA6B,CACjCC,WAAY,SAEd,MAAMC,EAAmB,4BACzB,MAAMC,EAAW,IAAIC,qBAAqBC,IACxC,MAAMC,EAAkBD,EAAQ,GAChC,GAAIC,EAAgBC,eAAgB,CAClCJ,EAASK,UAAUF,EAAgBjG,QACnCuE,EAAa,IAAMuB,EAASM,QAAQjI,EAAEsG,cAAcoB,GAAmBF,OAG3EG,EAASM,QAAQjI,EAAEsG,cAAcoB,GAAmBF,MCjFxD1H,QAAQmC,MAAM,WAEZ,SAASiG,EAAmBhH,GAC1B,MAAOA,IAAOiH,UAAW,CACvB,GAAIjH,EAAG4D,UAAUa,SAAS,UAAW,CACnC,OAAO,KAET,GAAIzE,EAAG4D,UAAUa,SAAS,UAAW,CAGnC,OAAO,MAETzE,EAAKA,EAAGP,WAEV,OAAO,MAGT,SAASyH,EAAkBlH,GACzB,MAAOA,IAAOiH,UAAW,CACvB,GAAIjH,EAAG4D,UAAUa,SAAS,UAAW,CACnC,OAAOzE,EAETA,EAAKA,EAAGP,WAEV,OAAOwH,UAGT,SAASE,EAAeC,GACtB,OAAOA,GAAiBA,EAAcxD,UAAUa,SAAS,iBAG3D7F,QAAQ0B,GAAG,UAAW,QAAS,SAAUL,GACvC,IAAK+G,EAAkB/G,EAAEU,QAAS,CAChC0G,EAAgB9H,KAAhB8H,CAAsB,MACtB9C,IAAI6C,EAAgBF,EAAiBjH,EAAEU,QACvC,GAAIwG,EAAcC,GAAgB,CAChCnH,EAAEqH,iBACF1I,QAAQ2I,YAAYH,OAK1BxI,QAAQ0B,GAAG,YAAa,QAAS,SAAUL,GACzC,IAAK+G,EAAkB/G,EAAEU,QAAS,CAChC4D,IAAI6C,EAAgBF,EAAiBjH,EAAEU,QACvC,GAAIyG,GAAiBA,EAAc7B,aAAa,uBAAyB,KAAM,CAC7E8B,EAAgBD,EAAhBC,CAA+B,MAEjC,GAAIF,EAAcC,GAAgB,CAChCxI,QAAQ2I,YAAYH,MAGvB,MAEH,IAAII,EAAU,CACZC,GAAI,CACFC,IAAK,SACLC,IAAKC,EACLC,IAAK,sCACLC,IAAK,WAEPC,GAAI,CACFL,IAAK,IACLC,IAAKK,EACLH,IAAK,4BACLC,IAAK,WAEPG,GAAI,CACFP,IAAK,IACLC,IAAKO,GAAYvJ,OAAOwJ,aACxBN,IAAK,qBACLC,IAAK,cAEPM,GAAI,CACFV,IAAK,IACLC,IAAKO,EAAWvJ,OAAOwJ,aACvBN,IAAK,uBACLC,IAAK,cAEPO,GAAI,CACFX,IAAK,IACLC,IAAKO,GAAYvJ,OAAOwJ,YAAc,GACtCN,IAAK,wBACLC,IAAK,cAEPQ,GAAI,CACFZ,IAAK,IACLC,IAAKO,EAAWvJ,OAAOwJ,YAAc,GACrCN,IAAK,0BACLC,IAAK,cAEPS,GAAI,CACFb,IAAK,IACLC,IAAKa,GAAc9I,SAASwD,KAAKuF,aAAc,OAC/CZ,IAAK,gCACLC,IAAK,cAEPY,GAAI,CACFhB,IAAK,IACLC,IAAKa,EAAa9I,SAASwD,KAAKuF,aAAc,UAC9CZ,IAAK,mCACLC,IAAK,cAEPa,GAAI,CACFjB,IAAK,IACLC,IAAKN,EAAgB,MACrBQ,IAAK,gCACLC,IAAK,WAEPc,GAAI,CACFlB,IAAK,IACLC,IAAKN,EAAgB,QACrBQ,IAAK,4BACLC,IAAK,WAEPe,GAAI,CACFnB,IAAK,IACLC,IAAKmB,IACLjB,IAAK,sBACLC,IAAK,WAEPiB,GAAI,CACFrB,IAAK,IACLC,IAAKqB,IACLnB,IAAK,kBACLC,IAAK,WAEPmB,GAAI,CACFvB,IAAK,IACLC,IAAKuB,EAAW,OAChBrB,IAAK,qBACLC,IAAK,WAEPqB,GAAI,CACFzB,IAAK,IACLC,IAAKuB,EAAW,MAChBrB,IAAK,+BACLC,IAAK,WAEPsB,GAAI,CACF1B,IAAK,IACLC,IAAK0B,EACLxB,IAAK,8BACLC,IAAK,WAEPwB,GAAI,CACF5B,IAAK,IACLC,IAAK4B,EACL1B,IAAK,qBACLC,IAAK,UAIT,GAAIlJ,QAAQ4K,QAAS,CACnB5K,QAAQ0B,GAAGZ,SAAU,UAAW,SAAUO,GAExC,GAAIwJ,OAAO5J,UAAU6J,eAAexJ,KAAKsH,EAASvH,EAAE0J,WAAa1J,EAAE2J,UAAY3J,EAAE4J,SAAW5J,EAAE6J,WAAa7J,EAAE8J,QAAS,CACpH,IAAIC,EAAU/J,EAAEU,OAAOqJ,QAAQC,cAC/B,GAAIhK,EAAE0J,UAAY,GAAI,CACpBnC,EAAQvH,EAAE0J,SAAShC,IAAI1H,OAClB,CACL,GAAIA,EAAEU,SAAWjB,SAASwD,MAAQ8G,IAAY,KAAOA,IAAY,SAAU,CACzE/J,EAAEqH,iBACFE,EAAQvH,EAAE0J,SAAShC,WAO7B,SAASN,EAAiB6C,GACxB,OAAO,SAAUC,GACf,IAAIC,EAAU1K,SAAS0F,cAAc,8BACnCiF,EAAiBH,EACnB,GAAIE,IAAY,KAAM,CAEpBA,EAAU1K,SAAS0F,cAAc,WACjC,GAAIgF,IAAY,KAAM,CAEpB,OAGF,GAAIF,IAAU,QAAUA,IAAU,KAAM,CACtCG,EAAiBD,GAIrB,IAAIE,EAAMC,EAAU7K,SAASC,iBAAiB,WAE9C,UAAW0K,IAAmB,SAAU,CACtCC,EAAOD,MACF,CACL,OAAQA,GACR,IAAK,UACH,IAAIG,EAAM9K,SAAS+K,gBAAgBC,WAAahL,SAASwD,KAAKwH,UAC9D,IAAIC,EAAMH,EAAM9K,SAAS+K,gBAAgBG,aAEzC,IAAK,IAAIhL,EAAI,EAAGA,EAAI2K,EAAQxE,OAAQnG,IAAK,CACvC0K,EAAOC,EAAQ3K,GACf,IAAIiL,EAAOP,EAAKQ,UAChB,IAAIC,EAAOF,EAAOP,EAAKM,aAEvB,GAAKG,GAAQJ,GAASE,EAAOL,EAAM,CACjC,OAGJ,MACF,IAAK,OACHF,EAAOF,EAAQY,mBACf,GAAIV,IAAS,KAAM,CACjBA,EAAOC,EAAQ,GAEjB,MACF,IAAK,KACHD,EAAOF,EAAQa,uBACf,GAAIX,IAAS,KAAM,CACjBA,EAAOC,EAAQA,EAAQxE,OAAS,GAElC,MACF,IAAK,SACHuE,EAAOC,EAAQA,EAAQxE,OAAS,GAChC,MACF,IAAK,MAEL,QACEuE,EAAOC,EAAQ,IAInB,GAAID,EAAM,CACRF,EAAQc,gBAAgB,qBACxBZ,EAAKrH,aAAa,oBAAqB,QACvC,IAAIkI,EAAOb,EAAKlF,cAAc,SAAWkF,EAAKlF,cAAc,KAC5D,GAAI+F,IAAS,KAAM,CACjBA,EAAKC,QAEP,IAAKjB,EAAU,CACbkB,OAMR,SAAShC,IACP3J,SAAS4L,SAASC,OAAO,MAG3B,SAAS3D,EAAa3H,GACpB,MAAM+J,EAAU/J,EAAEU,OAAOqJ,QAAQC,cACjC,GAAIvK,SAAS8L,gBAAkBxB,IAAY,SAAWA,IAAY,UAAYA,IAAY,YAAa,CACrGtK,SAAS8L,cAAcC,WAClB,CACL7M,QAAQ8M,eAIZ,SAASC,EAAiBC,GACxB,OAAO,WACL,IAAIC,EAASnM,SAAS0F,cAAcwG,GACpC,GAAIC,EAAQ,CACVA,EAAOC,UAKb,SAAS9C,IACP,OAAO2C,EAAgB,mDAGzB,SAAS7C,IACP,OAAO6C,EAAgB,uDAGzB,SAASN,IACP,IAAIU,EAAMrM,SAAS0F,cAAc,8BACjC,GAAI2G,IAAQ,KAAM,CAChB,OAEF,IAAIC,EAAOtM,SAAS+K,gBAAgBC,WAAahL,SAASwD,KAAKwH,UAC7DuB,EAAUvM,SAAS+K,gBAAgBG,aACnCC,EAAOkB,EAAIjB,UACXC,EAAOF,EAAOkB,EAAInB,aAClBsB,EAAS,IAEX,GAAKH,EAAId,yBAA2B,MAAUF,EAAOkB,EAAU,CAG7DtN,OAAOwN,OAAOxN,OAAOyN,QAAS,GAC9B,OAEF,GAAIJ,EAAQnB,EAAOqB,EAAS,CAC1BvN,OAAOwN,OAAOxN,OAAOyN,QAASvB,EAAOqB,OAChC,CACL,IAAIG,EAAOL,EAAOC,EAClB,GAAII,EAAQtB,EAAOmB,EAAS,CAC1BvN,OAAOwN,OAAOxN,OAAOyN,QAASrB,EAAOkB,EAAUC,KAKrD,SAAShE,EAAYoE,GACnB,OAAO,WACL3N,OAAO4N,SAAS,EAAGD,GACnBjF,EAAgB,UAAhBA,IAIJ,SAASmB,EAAcgE,EAAUC,GAC/B,OAAO,WACL9N,OAAO+N,SAAS,EAAGF,GACnBnF,EAAgBoF,EAAhBpF,IAIJ,SAASW,IACPrJ,OAAO+N,SAAS,EAAG,GACnBhN,SAAS0F,cAAc,MAAMgG,QAG/B,SAASlC,EAAYyD,GACnB,OAAO,WACL,IAAIxB,EAAOzL,SAAS0F,cAAc,mCAClC,GAAI+F,IAAS,KAAM,CACjBA,EAAOzL,SAAS0F,cAAc,kCAEhC,GAAI+F,IAAS,KAAM,CACjB,IAAI/J,EAAM+J,EAAK5F,aAAa,QAC5B,GAAIoH,EAAQ,CACVhO,OAAOgD,KAAKP,OACP,CACLzC,OAAO2M,SAASsB,KAAOxL,KAM/B,SAASyL,EAAiBC,GACxB,IAAIC,EAAa,GAEjB,IAAK,IAAIC,KAAKxF,EAAS,CACrB,IAAIE,EAAMF,EAAQwF,GAClBD,EAAWrF,EAAII,KAAOiF,EAAWrF,EAAII,MAAQ,GAC7CiF,EAAWrF,EAAII,KAAKmF,KAAKvF,GAG3B,IAAIwF,EAASzD,OAAO0D,KAAKJ,GAAYK,KAAK,SAAUC,EAAGC,GACrD,OAAOP,EAAWO,GAAGvH,OAASgH,EAAWM,GAAGtH,SAG9C,GAAImH,EAAOnH,SAAW,EAAG,CACvB,OAGF,IAAIwH,EAAO,mEACXA,GAAQ,uDACRA,GAAQ,UAER,IAAK,IAAI3N,EAAI,EAAGA,EAAIsN,EAAOnH,OAAQnG,IAAK,CACtC,IAAIkI,EAAMiF,EAAWG,EAAOtN,IAE5B,IAAI4N,EAAe5N,IAAOsN,EAAOnH,OAAS,EAC1C,IAAI0H,EAAQ7N,EAAI,IAAM,EAEtB,GAAI6N,EAAO,CACTF,GAAQ,OAEVA,GAAQ,OAERA,GAAQ,OAASzF,EAAI,GAAGA,IAAM,QAC9ByF,GAAQ,6BAER,IAAK,IAAIG,KAAM5F,EAAK,CAClByF,GAAQ,YAAczF,EAAI4F,GAAIhG,IAAM,UAAYI,EAAI4F,GAAI7F,IAAM,QAGhE0F,GAAQ,QACRA,GAAQ,QAER,IAAKE,GAASD,EAAc,CAC1BD,GAAQ,SAIZA,GAAQ,WAERT,EAAWa,UAAYJ,EAGzB,SAAShE,IACP,IAAIqE,EAAYlO,SAAS0F,cAAc,qBACvC,GAAIwI,IAAc3G,WAAa2G,IAAc,KAAM,CAEjDA,EAAYlO,SAASsD,cAAc,OACnC4K,EAAUhL,GAAK,mBACfgL,EAAU7J,UAAY,eACtB8I,EAAgBe,GAChBf,EAAgBe,GAChBf,EAAgBe,GAChB,IAAI1K,EAAOxD,SAASsE,qBAAqB,QAAQ,GACjDd,EAAKC,YAAYyK,OACZ,CAELA,EAAUhK,UAAUiK,OAAO,aAC3B,QAIJjP,QAAQyM,qBAAuBA,EAC/BzM,QAAQkP,WAAazG,EAAgB,QACrCzI,QAAQmP,eAAiB1G,EAAgB,SC1Z3C,SAAWxI,EAAGC,EAAGF,gBAGfA,EAAQmC,MAAM,WACZnC,EAAQ0B,GAAG,oBAAqB,QAAS,SAAU0N,GAEjDzO,KAAKqE,UAAUkC,OAAO,oBAGtB,IAAImI,EAAiB1O,KAAK2O,QAAQC,cAClC,IAAIC,EAAUC,WAAW9O,KAAK2O,QAAQI,QACtC,IAAIC,EAAUF,WAAW9O,KAAK2O,QAAQM,QACtC,IAAIC,EAAWJ,WAAW9O,KAAK2O,QAAQQ,SACvC,IAAIC,EAAkBC,KAAKC,MAAMtP,KAAK2O,QAAQY,gBAC9C,IAAIC,EAAcH,KAAKC,MAAMtP,KAAK2O,QAAQc,YAE1CpQ,EAAQ4D,UAAU,mBAClB5D,EAAQwE,WAAW,gBAAiB,WAClC,IAAI6L,EAAa,KACjB,GAAIN,EAAiB,CACnB,IAAIO,EAAYC,EAAEC,OAAOT,EAAgB,GAAIA,EAAgB,IAC7D,IAAIU,EAAYF,EAAEC,OAAOT,EAAgB,GAAIA,EAAgB,IAC7DM,EAAaE,EAAEG,aAAaJ,EAAWG,GAIzC,IAAIE,EAAMJ,EAAEI,IAAItB,GAEhB,IAAIuB,EAAe,qDACnB,IAAIC,EAAkB,gFACtB,IAAIC,EAAY,IAAIP,EAAEQ,UAAUH,EAAc,CAACI,QAAS,EAAGC,QAAS,GAAIC,YAAaL,IACrF,IAAIM,EAAkB,sDACtB,IAAIC,EAAqB,kGACzB,IAAIC,EAAe,IAAId,EAAEQ,UAAUI,EAAiB,CAACH,QAAS,EAAGC,QAAS,GAAIC,YAAaE,IAE3F,GAAIf,EAAY,CAGdiB,WAAW,WACTX,EAAIY,UAAUlB,EAAY,CACxBY,QAAS,MAEV,QACE,GAAIzB,GAAWG,EAAS,CAC7B,GAAIE,EAAU,CACZc,EAAIa,QAAQ,IAAIjB,EAAEC,OAAOb,EAASH,GAAUK,OACvC,CACLc,EAAIa,QAAQ,IAAIjB,EAAEC,OAAOb,EAASH,GAAU,IAIhDmB,EAAIc,SAASX,GAEb,IAAIY,EAAa,CACfC,aAAcb,EACdc,gBAAiBP,GAGnBd,EAAEsB,QAAQC,OAAOJ,GAAYK,MAAMpB,GAEnC,GAAIR,EAAa,CACfI,EAAEyB,QAAQ7B,GAAa4B,MAAMpB,MAOjCvB,EAAM1G,sBApEZ,CAuEG3I,OAAQe,SAAUf,OAAOC,UCxE5B,SAAWC,EAAGC,EAAGF,gBAGf,GAAIA,EAAQwF,WAAa,cAAe,CACtC,OAGFxF,EAAQmC,MAAM,WACZwD,IAAIsM,EAAsB,KAC1B,SAASC,IACP,GAAID,GAAuB,KAAM,CAC/BjS,EAAQsC,KAAK,MAAO,4BAA4BsE,KAAK,SAAUuL,GAC7DF,EAAsBjC,KAAKC,MAAMkC,GACjC,IAAK,KAAM,CAACC,EAAaC,KAAgBxH,OAAO9C,QAAQkK,GAAsB,CAC5EtM,IAAI2M,EAAWpS,EAAEa,iBAAiB,sBAAwBqR,EAAc,0BACxE,IAAK,MAAMnM,KAAWqM,EAAU,CAC9B3M,IAAI4M,EAAS,QAAUvS,EAAQuH,aAAa,UAAY,UAAY8K,EAAY,GAAK,QACrFpM,EAAQ8I,UAAYsD,EAAY,GAAKE,OAO/C,IAAK,MAAMnR,KAAMlB,EAAEa,iBAAiB,sBAAuB,CACzDf,EAAQ0B,GAAGN,EAAI,aAAc8Q,OAzBnC,CA4BGnS,OAAQe,SAAUf,OAAOC,UC5B5B,SAAWC,EAAGC,EAAGF,gBAGf,GAAIA,EAAQwF,WAAa,UAAW,CAClC,OAGFxF,EAAQmC,MAAM,WACZnC,EAAQwS,uBAAyB,IAAIxS,EAAQyS,YAAY,QAAS,uBAAwB,sBAAuB,GAAI,EAAG,KACxHzS,EAAQwS,uBAAuBE,QAE/BxS,EAAEa,iBAAiB,mBAAmBqF,QACpCuM,GACEA,EAAI7Q,iBACF,QAAS,KACP6Q,EAAIC,MAAMC,QAAU,OACpBF,EAAIG,MAAQ,QAIpB9S,EAAQ0B,GAAG,gBAAiB,QAAS,WACnC,IAAIqR,EAAoBpS,KAAKgG,aAAa,2BAC1C,IAAIqM,EAAuBrS,KAAKgG,aAAa,+BAC7C,IAAI5E,EAASpB,KAAKgG,aAAa,eAC/B,IAAIsM,EAAgB/S,EAAEsG,cAAczE,GACpC,IAAI4M,EAAOhO,KAAKoO,UAChB,GAAIpO,KAAKqE,UAAUa,SAAS,aAAc,CACxC8I,EAAOA,EAAK1K,QAAQ8O,EAAmBC,OAClC,CACLrE,EAAOA,EAAK1K,QAAQ+O,EAAsBD,GAE5CpS,KAAKoO,UAAYJ,EACjBhO,KAAKqE,UAAUiK,OAAO,aACtBgE,EAAcjO,UAAUiK,OAAO,eAGjCjP,EAAQ0B,GAAG,gBAAiB,QAAS,WACnC,IAAIK,EAASpB,KAAKgG,aAAa,eAC/B,IAAIuM,EAAchT,EAAEsG,cAAczE,EAAS,aAC3C,IAAIoR,EAAUD,EAAYvM,aAAa,OACvC,GAAIwM,IAAY,MAAQA,IAAY9K,WAAa8K,IAAY,MAAO,CAClED,EAAY7O,aAAa,MAAO6O,EAAYvM,aAAa,gBAI7D3G,EAAQ2I,YAAc,SAAUH,GAE9B,GAAIA,EAAe,CAEjB,MAAM4K,EAAa5K,EAAchC,cAAc,6BAC/C,MAAM6M,EAAmB7K,EAAchC,cAAc,oBACrD,MAAM8M,EAAgB9K,EAAchC,cAAc,WAClD,GAAI4M,EAAY,CACd,MAAMG,EAASH,EAAWzM,aAAa,YACvC,GAAI4M,EAAQ,CACV,MAAMxN,EAAS7F,EAAEkE,cAAc,OAC/B,MAAMoP,EAAY,IAAIC,MAEtB1N,EAAOf,UAAUC,IAAI,UACrBqO,EAAc/O,YAAYwB,GAE1ByN,EAAUvQ,OAAS5B,IACjB+R,EAAWvP,IAAM0P,EACjBxN,EAAOmB,UAETsM,EAAUjQ,QAAUlC,IAClB0E,EAAOmB,UAETsM,EAAU3P,IAAM0P,EAChBH,EAAWvP,IAAMwP,EAAiBxP,IAClCuP,EAAW9G,gBAAgB,cAIjCpM,EAAEiE,eAAe,WAAWa,UAAUC,IAAI,qBAC1CjF,EAAQwS,uBAAuBkB,QAC/B1T,EAAQyM,wBAGVzM,EAAQ8M,YAAc,SAAUzL,GAC9BnB,EAAEiE,eAAe,WAAWa,UAAUkC,OAAO,qBAC7ClH,EAAQwS,uBAAuBkB,QAC/B1T,EAAQyM,wBAEVzM,EAAQ0B,GAAG,uBAAwB,QAASL,IAC1CA,EAAEqH,iBACF1I,EAAQ8M,gBAEV9M,EAAQ0B,GAAG,0BAA2B,QAASL,GAAKrB,EAAQmP,eAAe,QAC3EnP,EAAQ0B,GAAG,sBAAuB,QAASL,GAAKrB,EAAQkP,WAAW,QAEnEjP,EAAE6B,iBAAiB,SAAU,WAC3B,IAAIT,EAAInB,EAAEiE,eAAe,aACvB2H,EAAYhL,SAAS+K,gBAAgBC,WAAahL,SAASwD,KAAKwH,UAChEH,EAAUzL,EAAEiE,eAAe,WAC7B,GAAI9C,IAAM,KAAM,CACd,GAAIyK,GAAa,IAAK,CACpBH,EAAQ3G,UAAUC,IAAI,iBACjB,CACL0G,EAAQ3G,UAAUkC,OAAO,gBAG5B,SAtGP,CA0GGnH,OAAQe,SAAUf,OAAOC,UCzG5B,SAAWC,EAAGC,EAAGF,gBAGf,IAAI2T,EAAa,KAAMC,EAAY,IAAKC,EAExC,SAASC,EAAkB7N,GACzB,GAAIA,EAAQ8N,kBAAmB,CAC7B,IAAIC,EAAM/N,EAAQgO,MAAM9M,OACxBlB,EAAQ8N,kBAAkBC,EAAKA,IAInC,SAASE,IACP,GAAIL,EAAOI,MAAM9M,OAAU,EAAG,CAC5B,IAAIgN,EAASrT,SAASqD,eAAe,UACrCmN,WAAW6C,EAAOC,OAAO/R,KAAK8R,GAAS,IAI3C,SAASE,EAAmBR,GAC1B,IAAIS,EAAKxT,SAASqD,eAAe,gBACjC,IAAIoQ,EAAoB,WACtB,GAAIV,EAAOI,MAAM9M,SAAW,EAAG,CAC7BmN,EAAGtP,UAAUC,IAAI,aACZ,CACLqP,EAAGtP,UAAUkC,OAAO,WAKxBqN,IACAD,EAAGxS,iBAAiB,QAAS,WAC3B+R,EAAOI,MAAQ,GACfJ,EAAOrH,QACP+H,MAEFV,EAAO/R,iBAAiB,QAASyS,EAAmB,OAGtDvU,EAAQmC,MAAM,WACZ0R,EAAS3T,EAAEiE,eAAeyP,GAE1B,SAASY,IACP,GAAIb,EAAY,CACdG,EAAiBD,GACjBF,EAAa,UACR,GAKT,GAAIE,IAAW,KAAM,CAEnBQ,EAAkBR,GAGlB,GAAI7T,EAAQyU,cAAe,CACzBzU,EAAQ0U,aAAeC,aAAarT,KAAKrB,EAAG,CAC1C2U,IAAK,kBACLC,aAAc7U,EAAQuH,aAAauN,cACnCC,WAAY/U,EAAQuC,OACpByS,YAAa,CACXC,eAAgB,oCAChBC,mBAAoB,kBAEtBC,SAAU,EACVC,MAAO,IACPC,UAAW,WACT1U,KAAK2U,WAAWjR,aAAa,QAAS,gBACtC1D,KAAK2U,WAAW1C,MAAMhH,IAAOjL,KAAK4U,MAAMrJ,UAAYvL,KAAK4U,MAAMC,aAAgB,KAC/E7U,KAAK2U,WAAW1C,MAAM6C,KAAO9U,KAAK4U,MAAMG,WAAa,KACrD/U,KAAK2U,WAAW1C,MAAM+C,MAAQhV,KAAK4U,MAAMK,YAAc,MAEzDC,MAAO,WACL,IAAIC,EAASnV,KACboV,MAAM9U,UAAUmF,QAAQ9E,KAAKX,KAAK2U,WAAWlQ,qBAAqB,MAAO,SAAU4Q,GACjF,GAAIA,EAAGrP,aAAa,UAAY,SAAU,CACxCqP,EAAGC,YAAc,WACfH,EAAOI,QAAQF,SAKtB,IAAMpC,GAGT3T,EAAE6B,iBAAiB,SAAU,WAC3B,IAAIsN,EAAQ,IAAI+G,YAAY,YAC5BtC,EAAOuC,cAAchH,KAIzByE,EAAO/R,iBAAiB,QAAS0S,EAAsB,OACvDX,EAAOrH,QAIT,GAAIqH,IAAW,MAAQ3T,EAAEsG,cAAc,UAAY,MAAQxG,EAAQqW,0BAA2B,CAC5FnW,EAAEsG,cAAc,SAASrB,UAAY,YAErCnF,EAAQ0B,GAAG,oBAAqB,SAAU,WACxC,IAAIV,EAAGmN,EAAajO,EAAEa,iBAAiB,sCACvC,IAAKC,EAAI,EAAGA,EAAImN,EAAWhH,OAAQnG,IAAK,CACtC,GAAImN,EAAWnN,KAAOL,MAAQwN,EAAWnN,GAAGsV,QAAS,CACnDnI,EAAWnN,GAAGkM,SAGlB,IAAMvM,KAAK2V,QAAS,CAClB3V,KAAKuM,QAEPgH,IACA,OAAO,QAGTlU,EAAQ0B,GAAGxB,EAAEiE,eAAe,cAAe,SAAU+P,GACrDlU,EAAQ0B,GAAGxB,EAAEiE,eAAe,cAAe,SAAU+P,GACrDlU,EAAQ0B,GAAGxB,EAAEiE,eAAe,YAAa,SAAU+P,OApHzD,CAyHGnU,OAAQe,SAAUf,OAAOC;;;;;;;;;;;;;;;;;;;;;;CCpG3B,SAAUC,EAAGC,GACZ,SAASuS,EAAa8D,EAAoBC,EAAkBC,EAAcC,EAAgBC,EAAkBC,GAC1GjW,KAAK4V,mBAAqBA,EAC1B5V,KAAK6V,iBAAmBA,EACxB7V,KAAK8V,aAAeA,EACpB9V,KAAK+V,eAAiBA,EACtB/V,KAAKgW,iBAAmBA,EACxBhW,KAAKiW,UAAYA,EACjBjW,KAAKkW,mBAAqB,KAC1BlW,KAAKmW,sBAAwB,MAc/BrE,EAAYxR,UAAU8V,WAAa,SAAUC,EAAQrB,GACnD,IAAI3U,EAAG2R,EACP,IAAIsE,EAAI,EAER,IAAKjW,EAAI,EAAGA,EAAIgW,EAAO7P,OAAQnG,IAAK,CAClC2R,EAAMqE,EAAOhW,GACb,GAAK2R,EAAIuE,aAAe,GAAOvE,EAAIwE,cAAgB,EAAI,CACrDF,GAAKtE,EAAIuE,aAAevE,EAAIwE,kBACvB,CAELF,GAAK,GAIT,OAAQtB,EAAQqB,EAAO7P,OAASxG,KAAK+V,gBAAkBO,GAGzDxE,EAAYxR,UAAUmW,SAAW,SAAUJ,EAAQK,GACjD,IAAIrW,EAAG2R,EAAK2E,EACZ,IAAIC,EAAeP,EAAO7P,OAAQqQ,EAElC,IAAKxW,EAAI,EAAGA,EAAIuW,EAAcvW,IAAK,CACjC2R,EAAMqE,EAAOhW,GACb,GAAK2R,EAAIuE,aAAe,GAAOvE,EAAIwE,cAAgB,EAAI,CACrDG,EAAWD,EAAS1E,EAAIuE,aAAevE,EAAIwE,kBACtC,CAELG,EAAWD,EAEb1E,EAAItO,aAAa,QAASoT,KAAKC,MAAMJ,IACrC3E,EAAItO,aAAa,SAAUoT,KAAKC,MAAML,IACtC1E,EAAIC,MAAM+E,WAAaF,KAAKC,MAAM/W,KAAKgW,kBAAoB,KAC3DhE,EAAIC,MAAMgF,UAAYH,KAAKC,MAAM/W,KAAKgW,kBAAoB,KAC1DhE,EAAIC,MAAMiF,YAAcJ,KAAKC,MAAM/W,KAAK+V,eAAiB,GAAK,KAC9D/D,EAAIC,MAAMkF,aAAeL,KAAKC,MAAM/W,KAAK+V,eAAiB,GAAK,KAC/Dc,EAAa7E,EAAI9R,WAAWA,WAC5B,IAAK2W,EAAWxS,UAAUa,SAAS,MAAO,CACxC2R,EAAWxS,UAAUC,IAAI,SAK/BwN,EAAYxR,UAAU8W,WAAa,SAAUC,GAC3C,IAAIC,EAAaC,EAAOlX,EAAGmX,EAC3B,IAAIC,EAAmBlY,EAAEsG,cAAc7F,KAAK4V,oBAC5C,IAAI8B,EAAsBtY,OAAOuY,iBAAiBF,GAClD,IAAIG,EAAuBC,SAASH,EAAoBI,iBAAiB,gBAAiB,IAC1F,IAAIC,EAAwBF,SAASH,EAAoBI,iBAAiB,iBAAkB,IAC5F,IAAIE,EAAiBP,EAAiBxC,YAAc2C,EAAuBG,EAE3E,MAAOV,EAAS7Q,OAAS,EAAG,CAC1B8Q,EAAc,KACd,IAAKjX,EAAI,EAAGA,GAAKgX,EAAS7Q,QAAU8Q,EAAajX,IAAK,CACpDkX,EAAQF,EAASE,MAAM,EAAGlX,GAC1BmX,EAAIxX,KAAKoW,WAAWmB,EAAOS,GAC3B,GAAIR,EAAIxX,KAAKiW,UAAW,CACtBjW,KAAKyW,SAASc,EAAOC,GAErBH,EAAWA,EAASE,MAAMlX,GAC1BiX,EAAc,OAGlB,GAAIA,EAAa,CACftX,KAAKyW,SAASc,EAAOT,KAAKmB,IAAIjY,KAAKiW,UAAWuB,IAC9C,SAKN1F,EAAYxR,UAAU4X,cAAgB,WACpC,IAAIlX,EAAMhB,KACV,GAAIgB,EAAIkV,mBAAoB,CAC1BlV,EAAImV,sBAAwB,SACvB,CACLnV,EAAImV,sBAAwB,MAC5BnV,EAAI+R,QACJ/R,EAAIkV,mBAAqBvF,WAAW,WAClC,GAAI3P,EAAImV,sBAAuB,CAC7BnV,EAAI+R,QAEN/R,EAAImV,sBAAwB,MAC5BnV,EAAIkV,mBAAqB,MACxB,MAIPpE,EAAYxR,UAAUyS,MAAQ,WAC5B,IAAI1S,EACJ,IAAI8X,EAAuB5Y,EAAEa,iBAAiBJ,KAAK6V,kBACnD,IAAIuC,EAAiBD,EAAqB3R,OAC1C,IAAI6R,EAAW,KACf,IAAIxN,EAAU,KACd,IAAIwM,EAAW,GAEf,IAAKhX,EAAI,EAAGA,EAAI+X,EAAgB/X,IAAK,CACnCwK,EAAUsN,EAAqB9X,GAC/B,GAAIwK,EAAQa,yBAA2B2M,GAAYhB,EAAS7Q,OAAS,EAAG,CAItExG,KAAKoX,WAAWC,GAEhBA,EAAW,GAGbA,EAAS3J,KAAK7C,EAAQhF,cAAc7F,KAAK8V,eAEzCuC,EAAWxN,EAGb,GAAIwM,EAAS7Q,OAAS,EAAG,CACvBxG,KAAKoX,WAAWC,KAIpBvF,EAAYxR,UAAUgY,eAAiB,WACrC,IAAIjY,EAAG2R,EACP,IAAIuG,EAAmBvY,KAAKkY,cAAcxW,KAAK1B,MAC/C,IAAIwY,EAAgBjZ,EAAEa,iBAAiBJ,KAAK6V,kBAC5C,IAAIuC,EAAiBI,EAAchS,OAEnC,SAASiS,EAAgBhK,GAEvBA,EAAMiK,eAAexV,IAAM5D,EAAED,QAAQ+D,YAAc9D,EAAED,QAAQsZ,MAAMF,eAGrE,IAAKpY,EAAI,EAAGA,EAAI+X,EAAgB/X,IAAK,CACnC2R,EAAMwG,EAAcnY,GAAGwF,cAAc7F,KAAK8V,cAC1C,GAAI9D,IAAQ,MAAQA,IAAQtK,YAAcsK,EAAI3N,UAAUa,SAAS,WAAY,CAC3E8M,EAAI7Q,iBAAiB,OAAQoX,GAE7BvG,EAAI7Q,iBAAiB,QAASoX,GAC9BvG,EAAI7Q,iBAAiB,UAAWoX,GAChC,GAAIjZ,EAAED,QAAQsZ,MAAMF,eAAgB,CAClCzG,EAAI7Q,iBAAiB,QAASsX,EAAgB,CAACG,KAAM,OAEvD5G,EAAI3N,UAAUC,IAAI,cAKxBwN,EAAYxR,UAAUyR,MAAQ,WAC5B,IAAIwG,EAAmBvY,KAAKkY,cAAcxW,KAAK1B,MAG/CV,EAAE6B,iBAAiB,WAAYoX,GAE/BjZ,EAAE6B,iBAAiB,OAAQoX,GAE3BjZ,EAAE6B,iBAAiB,SAAUoX,GAE7BvY,KAAKsY,iBAEL,IAAItX,EAAMhB,KAEVgF,IAAIkC,EAAW,IAAI2R,iBAAiBzR,IAClCpC,IAAI8T,EAAa,MACjB,IAAK9T,IAAI3E,EAAI,EAAGA,EAAI+G,EAAQZ,OAAQnG,IAAK,CACvC,GAAI+G,EAAQ/G,GAAG0Y,WAAWvS,OAAS,GAAKY,EAAQ/G,GAAG0Y,WAAW,GAAG1U,UAAUa,SAAS,UAAW,CAC7F4T,EAAa,KACb,OAGJ,GAAIA,EAAY,CACd9X,EAAIsX,oBAGRpR,EAASM,QAAQjI,EAAEsG,cAAc7F,KAAK4V,oBAAqB,CACzDoD,UAAW,KACXC,QAAS,KACTC,WAAY,MACZC,cAAe,SAInB7Z,EAAED,QAAQyS,YAAcA,GAtM1B,CAwME1S,OAAQe,WC/NV,SAAUiZ,GAAG,UAAUC,UAAU,iBAAiBC,SAAS,YAAY,CAACA,OAAOD,QAAQD,SAAS,UAAUG,SAAS,YAAYA,OAAOC,IAAI,CAACD,OAAO,GAAGH,OAAO,CAAC,IAAIK,EAAE,UAAUra,SAAS,YAAY,CAACqa,EAAEra,YAAY,UAAUsa,SAAS,YAAY,CAACD,EAAEC,YAAY,UAAUC,OAAO,YAAY,CAACF,EAAEE,SAAS,CAACF,EAAEzZ,KAAKyZ,EAAEzF,aAAeoF,MAAjU,CAAwU,WAAW,IAAIG,EAAOD,EAAOD,EAAQ,OAAO,WAAY,SAAS/C,EAAE5V,EAAEkZ,EAAEC,GAAG,SAASC,EAAEzZ,EAAE+Y,GAAG,IAAIQ,EAAEvZ,GAAG,CAAC,IAAIK,EAAEL,GAAG,CAAC,IAAI0Z,EAAE,mBAAmBC,SAASA,QAAQ,IAAIZ,GAAGW,EAAE,OAAOA,EAAE1Z,GAAG,GAAG,GAAG4Z,EAAE,OAAOA,EAAE5Z,GAAG,GAAG,IAAIyN,EAAE,IAAIpL,MAAM,uBAAuBrC,EAAE,KAAK,MAAMyN,EAAEoM,KAAK,mBAAmBpM,EAAE,IAAIqM,EAAEP,EAAEvZ,GAAG,CAACgZ,QAAQ,IAAI3Y,EAAEL,GAAG,GAAGM,KAAKwZ,EAAEd,QAAQ,SAAS/C,GAAG,IAAIsD,EAAElZ,EAAEL,GAAG,GAAGiW,GAAG,OAAOwD,EAAEF,GAAGtD,IAAI6D,EAAEA,EAAEd,QAAQ/C,EAAE5V,EAAEkZ,EAAEC,GAAG,OAAOD,EAAEvZ,GAAGgZ,QAAQ,IAAI,IAAIY,EAAE,mBAAmBD,SAASA,QAAQ3Z,EAAE,EAAEA,EAAEwZ,EAAErT,OAAOnG,IAAIyZ,EAAED,EAAExZ,IAAI,OAAOyZ,EAAE,OAAOxD,EAAtc,EAAA,CAA4c,CAAC8D,EAAE,CAAC,SAASJ,EAAQV,EAAOD;;;;;;;;;;aAW51B,IAAIgB,GACJ,SAAWA,GACPA,EAAkBA,EAAkB,OAAS,GAAK,MAClDA,EAAkBA,EAAkB,MAAQ,GAAK,MAFrD,CAGGA,IAAsBA,EAAoB,KAC7C,IAAIC,GACJ,SAAWA,GACPA,EAAUA,EAAU,WAAa,GAAK,UACtCA,EAAUA,EAAU,SAAW,GAAK,SAFxC,CAGGA,IAAcA,EAAY,KAO7B,IAAItG,EAA8B,WAE9B,SAASA,EAAamB,EAAQrV,GAC1B,GAAIqV,SAAgB,EAAG,CAAEA,EAAS,GAClC,GAAIrV,SAAkB,EAAG,CAAEA,EAAW,sBACtC,GAAIsV,MAAMmF,QAAQza,GAAW,CACzBA,EAAS2F,QAAQ,SAAUlC,GACvB,IAAIyQ,EAAamB,EAAQ5R,UAG5B,UAAWzD,GAAY,SAAU,CAClC,IAAI6R,EAAWxR,SAASC,iBAAiBN,GACzCsV,MAAM9U,UAAUmF,QAAQ9E,KAAKgR,EAAU,SAAU6I,GAC7C,IAAIxG,EAAamB,EAAQqF,SAG5B,CACD,IAAIC,EAAiBzG,EAAa0G,MAAM1G,EAAa2G,SAAUxF,EAAQ,CACnER,WAAYxU,SAASsD,cAAc,SAEvCuQ,EAAa1T,UAAUsa,OAAOH,EAAgB3a,GAC9C,OAAO2a,GAGfzG,EAAa1T,UAAUsa,OAAS,SAAUzF,EAAQ7P,GAC9C6P,EAAOP,MAAQtP,EACf,GAAI6P,EAAOP,MAAMiG,SAASC,MAAM,cAAgB3F,EAAOP,MAAM9Q,aAAa,UAAY,OAASqR,EAAOP,MAAM5O,aAAa,QAAQ8U,MAAM,mBAAoB,CACvJ3F,EAAOP,MAAMlR,aAAa,eAAgB,OAC1CyR,EAAOT,UAAUS,GACjBA,EAAOP,MAAM1U,WAAW0D,YAAYuR,EAAOR,YAC3CQ,EAAO4F,WAAa,CAChB7O,KAAMiJ,EAAO6F,MAAMtZ,KAAKyT,GACxB8F,QAASjH,EAAa1T,UAAU2a,QAAQvZ,KAAK,KAAMyT,GACnDtJ,MAAOsJ,EAAO+F,OAAOxZ,KAAKyT,GAC1BgG,MAAOnH,EAAa1T,UAAUmO,MAAM/M,KAAK,KAAMyT,EAAQmF,EAAUc,OACjEC,QAASrH,EAAa1T,UAAUmO,MAAM/M,KAAK,KAAMyT,EAAQmF,EAAUgB,SACnErO,SAAUkI,EAAOT,UAAUhT,KAAKyT,IAEpC,IAAK,IAAI1G,KAAS0G,EAAO4F,WAAY,CACjC5F,EAAOP,MAAMzT,iBAAiBsN,EAAO0G,EAAO4F,WAAWtM,OAInEuF,EAAa1T,UAAUib,gBAAkB,SAAUpG,EAAQqG,GACvD,IAAIC,EAAW,GACf,IAAK,IAAItT,KAAOgN,EAAOuG,iBAAkB,CACrC,IAAIjN,EAAQ6L,EAAUc,MACtB,GAAIjG,EAAOuG,iBAAiBvT,GAAKwT,QAAUjU,UAAW,CAClD+G,EAAQ0G,EAAOuG,iBAAiBvT,GAAKwT,MAEzC,GAAIlN,GAAS+M,EAAM,CACfC,EAAStT,GAAOgN,EAAOuG,iBAAiBvT,IAGhD,OAAOsT,GAEXzH,EAAa1T,UAAUmO,MAAQ,SAAU0G,EAAQqG,EAAM/M,GACnD,IAAImN,EAAkB,SAAUC,GAC5B,GAAKf,IAAU,MAAQgB,EAAQC,UAAY1B,EAAkB2B,KAASlB,IAAU,OAASgB,EAAQC,UAAY1B,EAAkB4B,GAAK,CAChIJ,EAAY7H,EAAa0G,MAAM,CAC3BwB,IAAK,OACNL,GACH,GAAIA,EAAU1R,eAAe,MAAO,CAChC,GAAI0R,EAAUM,IAAM1N,EAAMrE,QAAS,CAC/B0Q,GAASe,EAAUK,QAElB,CACDpB,EAAQe,EAAUK,UAGrB,GAAIL,EAAU1R,eAAe,SAAW0R,EAAU1R,eAAe,MAAO,CACzE,GAAIsE,EAAMrE,SAAWyR,EAAUO,MAAQ3N,EAAMrE,SAAWyR,EAAUQ,GAAI,CAClEvB,GAASe,EAAUK,QAElB,CACDpB,EAAQe,EAAUK,QAKlC,IAAK,IAAII,KAAQtI,EAAa1T,UAAUib,gBAAgBpG,EAAQqG,GAAO,CACnE,IAAIM,EAAU9H,EAAa0G,MAAM,CAC7BqB,SAAU1B,EAAkB2B,KAC7B7G,EAAOuG,iBAAiBY,IAAQxB,EAAQT,EAAkB2B,KAAOF,EAAQC,SAC5ED,EAAQS,WAAW9W,QAAQmW,GAC3B,GAAId,IAAU,KAAM,CAChBgB,EAAQU,SAAS7b,KAAKwU,EAAQ1G,MAI1CuF,EAAa1T,UAAUmc,YAAc,SAAUtH,EAAQ3U,EAAUkc,GAC7D,IAAIC,EAAsBzS,OAAO0S,oBAAoBzH,EAAOd,aAAcwI,EAAU,IAAI1a,eAAkBP,EAASuT,EAAO2H,cAAejb,EAAMsT,EAAO4H,OAAQC,EAAc7H,EAAO8H,OAAQC,EAAuBC,mBAAmBhI,EAAOiI,aAAe,IAAMD,mBAAmBH,GACpR,GAAIpb,EAAOkZ,MAAM,UAAW,CACxB,GAAIjZ,EAAIwb,QAAQ,QAAU,EAAG,CACzBxb,GAAO,IAAMqb,MAEZ,CACDrb,GAAO,IAAMqb,GAGrBL,EAAQza,KAAKR,EAAQC,EAAK,MAC1B,IAAK,IAAIxB,EAAIsc,EAAoBnW,OAAS,EAAGnG,GAAK,EAAGA,IAAK,CACtDwc,EAAQS,iBAAiBX,EAAoBtc,GAAI8U,EAAOd,YAAYsI,EAAoBtc,KAE5Fwc,EAAQU,mBAAqB,WACzB,GAAIV,EAAQpb,YAAc,GAAKob,EAAQta,QAAU,IAAK,CAClD4S,EAAOqI,OAAOR,GAAeH,EAAQra,SACrChC,EAASqc,EAAQra,eAEhB,GAAIqa,EAAQta,QAAU,IAAK,CAC5Bma,MAGR,OAAOG,GAEX7I,EAAa1T,UAAUmd,KAAO,SAAUtI,EAAQ0H,EAASxa,GACrD,GAAIA,SAAiB,EAAG,CAAEA,EAAU,KACpC,GAAI8S,EAAOuI,WAAY,CACnBte,OAAOue,aAAaxI,EAAOuI,YAE/B,GAAIrb,IAAY,KAAM,CAClB8S,EAAOuI,WAAate,OAAOuR,WAAWqD,EAAa1T,UAAUmd,KAAK/b,KAAK,KAAMyT,EAAQ0H,EAAS,OAAQ1H,EAAOV,WAE5G,CACD,GAAIU,EAAOyI,QAAS,CAChBzI,EAAOyI,QAAQC,QAEnB1I,EAAOyI,QAAUf,EACjB1H,EAAOyI,QAAQ7a,KAAKoS,EAAOiI,YAAc,IAAMjI,EAAO8H,UAG9DjJ,EAAa1T,UAAUwd,MAAQ,SAAU3I,EAAQ3U,EAAUkc,GACvD,IAAIla,EAAW2S,EAAO4I,OAAO5I,EAAO8H,QACpC,GAAIza,IAAakF,UAAW,CACxB,IAAImV,EAAU7I,EAAa1T,UAAUmc,YAAYtH,EAAQ3U,EAAUkc,GACnE1I,EAAa1T,UAAUmd,KAAKtI,EAAQ0H,OAEnC,CACDrc,EAASgC,KAGjBwR,EAAa1T,UAAU2a,QAAU,SAAU9F,GACvC,IAAK,IAAI1G,KAAS0G,EAAO4F,WAAY,CACjC5F,EAAOP,MAAMoJ,oBAAoBvP,EAAO0G,EAAO4F,WAAWtM,IAE9D0G,EAAOR,WAAWzU,WAAW+d,YAAY9I,EAAOR,aAEpDX,EAAa0G,MAAQ,WACjB,IAAIA,EAAQ,GAAIwD,EAChB,IAAK,IAAI7d,EAAI,EAAGA,EAAI8d,UAAU3X,OAAQnG,IAAK,CACvC,IAAK6d,KAAOC,UAAU9d,GAAI,CACtBqa,EAAMwD,GAAOC,UAAU9d,GAAG6d,IAGlC,OAAOxD,GAEX1G,EAAa2G,SAAW,CACpBlG,MAAO,IACPP,aAAc,iBACdkK,UAAW,CACPC,SAAU,SAAU/K,GAChB,OAAO,IAAIgL,OAAOhL,EAAO,OAE7BiL,UAAW,SAAUjL,GACjB,MAAO,WAAaA,EAAQ,cAGpCe,YAAa,CACTC,eAAgB,qCAEpBkK,MAAO,EACPhK,SAAU,EACVJ,WAAY,MACZqK,SAAU,IACVxK,IAAK,KACLyH,iBAAkB,CACdgD,MAAS,CACLnC,WAAY,CAAC,CACLJ,GAAI,GACJD,IAAK,QAEbM,SAAU,SAAU/N,GAChB,GAAIzO,KAAK2U,WAAW3O,aAAa,SAASqX,QAAQ,UAAY,EAAG,CAC7D,IAAIsB,EAAW3e,KAAK2U,WAAW9O,cAAc,aAC7C,GAAI8Y,IAAa,KAAM,CACnBlQ,EAAM1G,iBACN/H,KAAKuV,QAAQoJ,GACb3e,KAAK2U,WAAWjR,aAAa,QAAS,mBAIlDqY,SAAU1B,EAAkB2B,IAC5BL,MAAOrB,EAAUgB,SAErBsD,kBAAqB,CACjBrC,WAAY,CAAC,CACLJ,GAAI,GACJD,IAAK,OAET,CACIC,GAAI,GACJD,IAAK,QAEbM,SAAU,SAAU/N,GAChBA,EAAM1G,kBAEVgU,SAAU1B,EAAkB4B,GAC5BN,MAAOrB,EAAUgB,SAErBuD,gBAAmB,CACftC,WAAY,CAAC,CACLJ,GAAI,GACJD,IAAK,OAET,CACIC,GAAI,GACJD,IAAK,QAEbM,SAAU,SAAU/N,GAChBA,EAAM1G,iBACN,IAAImG,EAAQlO,KAAK2U,WAAW9O,cAAc,+BAAgCiZ,EAAO9e,KAAK2U,WAAW9O,cAAc,8BAA+BkZ,EAAS/e,KAAK2U,WAAW9O,cAAc,aACrL,GAAIkZ,EAAQ,CACR,IAAIC,EAAe5J,MAAM9U,UAAU+c,QAAQ1c,KAAKoe,EAAO7e,WAAWqF,SAAUwZ,GAAS9R,EAAW+R,GAAgBvQ,EAAMrE,QAAU,IAAK6U,EAAWjf,KAAK2U,WAAWlQ,qBAAqB,MAAM+B,OAC3L,GAAIyG,EAAW,EAAG,CACdA,EAAWgS,EAAW,OAErB,GAAIhS,GAAYgS,EAAU,CAC3BhS,EAAW,EAEf8R,EAAO1a,UAAUkC,OAAO,UACxBwY,EAAOxd,cAAcgE,SAAS2Z,KAAKjS,GAAU5I,UAAUC,IAAI,eAE1D,GAAIwa,GAAQrQ,EAAMrE,SAAW,GAAI,CAClC0U,EAAKza,UAAUC,IAAI,eAElB,GAAI4J,EAAO,CACZA,EAAM7J,UAAUC,IAAI,YAG5ByX,SAAU1B,EAAkB4B,GAC5BN,MAAOrB,EAAUc,OAErB+D,SAAY,CACR5C,WAAY,CAAC,CACLJ,GAAI,GACJD,IAAK,MACN,CACCE,KAAM,GACNC,GAAI,GACJH,IAAK,OAEbM,SAAU,WACN,IAAI4C,EAAWpf,KAAK4U,MAAM5O,aAAa,+BAAgCqZ,EAAerf,KAAKid,OAC3F,GAAIoC,IAAiB,IAAMA,EAAa7Y,QAAUxG,KAAKsf,YAAa,CAChE,IAAKF,GAAYC,GAAgBD,EAAU,CACvCpf,KAAK2U,WAAWjR,aAAa,QAAS,qBAE1CsQ,EAAa1T,UAAUwd,MAAM9d,KAAM,SAAUwC,GACzCxC,KAAKuf,QAAQvf,KAAKwf,MAAMhd,IACxBxC,KAAKkV,SACPxT,KAAK1B,MAAOA,KAAKyf,YAElB,CACDzf,KAAK0f,WAGb3D,SAAU1B,EAAkB2B,IAC5BL,MAAOrB,EAAUc,QAGzBzG,WAAY,KACZiJ,QAAS,KACThJ,MAAO,KAIP+K,cAAe,WACX,IAAIC,EAAe,GACnB,GAAI5f,KAAK4U,MAAM9Q,aAAa,mCAAoC,CAC5D8b,EAAe5f,KAAK4U,MAAM5O,aAAa,wCAEtC,GAAIhG,KAAKkU,eAAiB,MAAO,CAClC0L,EAAe5f,KAAKkU,iBAEnB,CACD0L,EAAe,GAEnB,OAAOA,GAKXC,OAAQ,WACJ,IAAIC,EAAQ9f,KAAK4U,MAAM5O,aAAa,2BACpC,GAAI+Z,MAAMD,IAAUA,IAAU,KAAM,CAChC,OAAO9f,KAAKwe,MAEhB,OAAO3G,SAASiI,EAAO,KAK3BR,UAAW,WACP,IAAIU,EAAWhgB,KAAK4U,MAAM5O,aAAa,8BACvC,GAAI+Z,MAAMC,IAAaA,IAAa,KAAM,CACtC,OAAOhgB,KAAKwU,SAEhB,OAAOqD,SAASmI,EAAU,KAK9BC,WAAY,SAAUC,GAClB,OAAOA,EAAM5c,QAAQtD,KAAKoe,UAAUC,SAASre,KAAKid,QAASjd,KAAKoe,UAAUG,YAK9EzB,YAAa,WACT,GAAI9c,KAAK4U,MAAM9Q,aAAa,4BAA6B,CACrD,OAAO9D,KAAK4U,MAAM5O,aAAa,4BAEnC,OAAOhG,KAAKoU,YAKhBgJ,UAAW,WACP,GAAIpd,KAAK4U,MAAM9Q,aAAa,gCAAiC,CACzD,OAAO9D,KAAK4U,MAAM5O,aAAa,gCAEnC,OAAOhG,KAAKye,UAKhB1B,KAAM,WACF,GAAI/c,KAAK4U,MAAM9Q,aAAa,qBAAsB,CAC9C,OAAO9D,KAAK4U,MAAM5O,aAAa,qBAEnC,OAAOhG,KAAKiU,KAKhB+G,MAAO,SAAUmF,GACb,GAAIA,SAAa,EAAG,CAAEA,EAAM,MAC5B,GAAIA,EAAK,CACLngB,KAAK0f,aAEJ,CACD,IAAIvK,EAASnV,KACb2Q,WAAW,WACPwE,EAAO6F,MAAM,OACd,OAMX+C,OAAQ,SAAUzK,GACd,OAAOtT,KAAKwd,OAAOlK,IAKvB4H,OAAQ,WACJ,IAAIkE,EAAWpf,KAAK4U,MAAM5O,aAAa,+BACvC,KAAMoZ,GAAYpf,KAAK4U,MAAMtB,OAAS8L,IAAapf,KAAKsf,aAAetf,KAAK4U,MAAMtB,MAAM9M,OAAQ,CAC5FxG,KAAK2U,WAAWjR,aAAa,QAAS,uBAM9CwR,MAAO,WACH,IAAIC,EAASnV,KACboV,MAAM9U,UAAUmF,QAAQ9E,KAAKX,KAAK2U,WAAWlQ,qBAAqB,MAAO,SAAU4Q,GAC/E,GAAIA,EAAGrP,aAAa,UAAY,SAAU,CACtCqP,EAAG+K,QAAU,WACTjL,EAAOI,QAAQF,QAK/BqK,OAAQ,WACJ1f,KAAK2U,WAAWjR,aAAa,QAAS,iBAK1CgR,UAAW,WACP1U,KAAK2U,WAAWjR,aAAa,QAAS,gBACtC1D,KAAK2U,WAAWjR,aAAa,QAAS,QAAU1D,KAAK4U,MAAMrJ,UAAYvL,KAAK4U,MAAMC,cAAgB,WAAa7U,KAAK4U,MAAMG,WAAa,YAAc/U,KAAK4U,MAAMK,YAAc,QAKlLsK,QAAS,SAAU/c,GACf,IAAI6d,EACJ,UAAW7d,GAAY,SAAU,CAC7B6d,EAAKrgB,KAAKsgB,WAAW9d,OAEpB,CACD6d,EAAKrgB,KAAKugB,qBAAqB/d,GAEnC,GAAIxC,KAAK2U,WAAW6L,gBAAiB,CACjCxgB,KAAK2U,WAAWsJ,YAAYje,KAAK2U,WAAW8L,WAAW,IAE3DzgB,KAAK2U,WAAW/Q,YAAYyc,IAKhCE,qBAAsB,SAAU/d,GAC5B,IAAI6d,EAAKlgB,SAASsD,cAAc,MAAO4R,EAAKlV,SAASsD,cAAc,MAAOqc,EAAQ9f,KAAK6f,SAEvF,GAAIC,EAAQ,EAAG,CACXtd,EAAWA,EAASke,eAEnB,GAAIZ,IAAU,EAAG,CAClBA,EAAQtd,EAASgE,OAErB,IAAK,IAAI0Y,EAAO,EAAGA,EAAOpI,KAAKmB,IAAInB,KAAK6J,IAAIb,GAAQtd,EAASgE,QAAS0Y,IAAQ,CAC1E7J,EAAGjH,UAAY5L,EAAS0c,GAAM0B,MAC9BvL,EAAG3R,aAAa,0BAA2BlB,EAAS0c,GAAM2B,OAC1DR,EAAGzc,YAAYyR,GACfA,EAAKlV,SAASsD,cAAc,MAEhC,OAAO4c,GAKXC,WAAY,SAAU9d,GAClB,IAAI6d,EAAKlgB,SAASsD,cAAc,MAAO4R,EAAKlV,SAASsD,cAAc,MACnE,GAAIjB,EAASgE,OAAS,EAAG,CACrBxG,KAAK2U,WAAWvG,UAAY5L,MAE3B,CACD,IAAIod,EAAe5f,KAAK2f,gBACxB,GAAIC,IAAiB,GAAI,CACrBvK,EAAGjH,UAAYwR,EACfvK,EAAG3R,aAAa,QAAS,UACzB2c,EAAGzc,YAAYyR,IAGvB,OAAOgL,GAKXb,MAAO,SAAUhd,GACb,IACI,IAAIse,EAAiB,GAErB,IAAIC,EAAO1R,KAAKC,MAAM9M,GACtB,GAAI0H,OAAO0D,KAAKmT,GAAMva,SAAW,EAAG,CAChC,MAAO,GAEX,GAAI4O,MAAMmF,QAAQwG,GAAO,CACrB,IAAK,IAAI1gB,EAAI,EAAGA,EAAI6J,OAAO0D,KAAKmT,GAAMva,OAAQnG,IAAK,CAC/CygB,EAAeA,EAAeta,QAAU,CAAEqa,MAASE,EAAK1gB,GAAIugB,MAAS5gB,KAAKigB,WAAWc,EAAK1gB,UAG7F,CACD,IAAK,IAAIiT,KAASyN,EAAM,CACpBD,EAAepT,KAAK,CAChBmT,MAASvN,EACTsN,MAAS5gB,KAAKigB,WAAWc,EAAKzN,OAI1C,OAAOwN,EAEX,MAAOrS,GAEH,OAAOjM,IAMfya,KAAM,WACF,OAAOjd,KAAK4U,MAAMtB,OAKtBiC,QAAS,SAAU2J,GACf,GAAIA,EAAKpb,aAAa,2BAA4B,CAC9C9D,KAAK4U,MAAMtB,MAAQ4L,EAAKlZ,aAAa,+BAEpC,CACDhG,KAAK4U,MAAMtB,MAAQ4L,EAAK9Q,UAE5BpO,KAAK4U,MAAMlR,aAAa,8BAA+B1D,KAAK4U,MAAMtB,QAKtEmM,OAAQ,aAER/B,WAAY,KACZF,OAAQ,GACRzC,WAAY,IAEhB,OAAO/G,EA3fsB,GA6fjCsF,EAAOD,QAAUrF,GAEf,KAAK,GAAG,CAAC,GA1hByW,CA0hBrW"}