mirror of https://github.com/lissy93/dashy
1 line
821 KiB
Plaintext
1 line
821 KiB
Plaintext
{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/assets/interface-icons/user-logout.svg","webpack:///./src/components/Configuration/ConfigContainer.vue?3452","webpack:///./src/assets/interface-icons/config-delete-local.svg","webpack:///./src/components/InteractiveEditor/AddNewSectionLauncher.vue?b271","webpack:///./src/components/Configuration/AppVersion.vue?0a9c","webpack:///./src/assets/interface-icons/config-language.svg","webpack:///./src/assets/interface-icons/application-rebuild.svg","webpack:///./src/components/Settings/ItemSizeSelector.vue?b04a","webpack:///./src/components/InteractiveEditor/ExportConfigMenu.vue?85ce","webpack:///./src/assets/interface-icons/interactive-editor-app-config.svg","webpack:///./src/components/InteractiveEditor/EditModeSaveMenu.vue?e2ee","webpack:///./src/assets/interface-icons/open-iframe.svg","webpack:///./src/components/Workspace/SideBarItem.vue?1428","webpack:///./src/assets/interface-icons/interactive-editor-save-disk.svg","webpack:///./src/components/Configuration/ConfigContainer.vue?2c6c","webpack:///./src/views/Login.vue?d1de","webpack:///./src/assets/interface-icons/interactive-editor-cancel-changes.svg","webpack:///./src/components/Workspace/WebContent.vue?3653","webpack:///./src/assets/interface-icons/open-current-tab.svg","webpack:///./src/assets/interface-icons/open-new-tab.svg","webpack:///./src/assets/interface-icons/application-about.svg","webpack:///./src/components/PageStrcture/LoadingScreen.vue?b110","webpack:///./src/assets/interface-icons/application-minimal.svg","webpack:///./src/assets/interface-icons/config-editor.svg","webpack:///./src/components/InteractiveEditor/EditSection.vue?b89a","webpack:///./src/components/Settings/CustomThemeMaker.vue?0eb0","webpack:///./src/assets/interface-icons/application-change-view.svg","webpack:///./src/assets/interface-icons/config-backup.svg","webpack:///./src/assets/interface-icons/open-workspace.svg","webpack:///./src/assets/interface-icons/application-reload.svg","webpack:///./src/assets/interface-icons/config-color-palette.svg","webpack:///./src/components/LinkItems/StatusIndicator.vue?e73e","webpack:///./src/components/Settings/ThemeSelector.vue?d713","webpack:///./src/components/InteractiveEditor/EditItem.vue?d1f9","webpack:///./src/components/Settings/LayoutSelector.vue?cc28","webpack:///./src/assets/interface-icons/interactive-editor-export-changes.svg","webpack:///./src/components/Settings/SearchBar.vue?feff","webpack:///./src/components/Settings/LanguageSwitcher.vue?9734","webpack:///./src/components/LinkItems/ItemOpenMethodIcon.vue?0632","webpack:///./src/App.vue?dd7a","webpack:///./src/components/PageStrcture/Header.vue?be8d","webpack:///./src/components/PageStrcture/PageTitle.vue?b2e2","webpack:///./src/utils/StoreMutations.js","webpack:///src/components/PageStrcture/PageTitle.vue","webpack:///./src/components/PageStrcture/PageTitle.vue?3da7","webpack:///./src/components/PageStrcture/PageTitle.vue","webpack:///./src/components/PageStrcture/Nav.vue?545c","webpack:///src/components/PageStrcture/Nav.vue","webpack:///./src/components/PageStrcture/Nav.vue?e74f","webpack:///./src/components/PageStrcture/Nav.vue","webpack:///./src/utils/MiscHelpers.js","webpack:///src/components/PageStrcture/Header.vue","webpack:///./src/components/PageStrcture/Header.vue?2de8","webpack:///./src/components/PageStrcture/Header.vue","webpack:///./src/components/PageStrcture/Footer.vue?7317","webpack:///src/components/PageStrcture/Footer.vue","webpack:///./src/components/PageStrcture/Footer.vue?0e1c","webpack:///./src/components/PageStrcture/Footer.vue","webpack:///./src/components/InteractiveEditor/EditModeTopBanner.vue?7561","webpack:///./src/components/InteractiveEditor/EditModeTopBanner.vue","webpack:///./src/components/PageStrcture/LoadingScreen.vue?1630","webpack:///src/components/PageStrcture/LoadingScreen.vue","webpack:///./src/components/PageStrcture/LoadingScreen.vue?3cf6","webpack:///./src/components/PageStrcture/LoadingScreen.vue","webpack:///./src/utils/CoolConsole.js","webpack:///./src/utils/ErrorHandler.js","webpack:///src/App.vue","webpack:///./src/App.vue?f99d","webpack:///./src/App.vue","webpack:///./src/views/Home.vue?1d1d","webpack:///./src/components/Settings/SettingsContainer.vue?5ebc","webpack:///./src/components/Settings/SearchBar.vue?79d1","webpack:///./src/utils/ArrowKeyNavigation.js","webpack:///./src/utils/ConfigAccumalator.js","webpack:///./src/utils/Auth.js","webpack:///./src/utils/CheckSectionVisibility.js","webpack:///./src/utils/languages.js","webpack:///./src/utils/ConfigHelpers.js","webpack:///./src/utils/Search.js","webpack:///src/components/Settings/SearchBar.vue","webpack:///./src/components/Settings/SearchBar.vue?4b42","webpack:///./src/components/Settings/SearchBar.vue","webpack:///./src/components/Settings/ConfigLauncher.vue?bcd1","webpack:///./src/components/Configuration/ConfigContainer.vue?8bdc","webpack:///./src/components/Configuration/JsonEditor.vue?5a5a","webpack:///./src/components/FormElements/Button.vue?5a34","webpack:///src/components/FormElements/Button.vue","webpack:///./src/components/FormElements/Button.vue?804e","webpack:///./src/components/FormElements/Button.vue","webpack:///./src/components/FormElements/Radio.vue?00db","webpack:///src/components/FormElements/Radio.vue","webpack:///./src/components/FormElements/Radio.vue?6097","webpack:///./src/components/FormElements/Radio.vue","webpack:///src/components/Configuration/JsonEditor.vue","webpack:///./src/components/Configuration/JsonEditor.vue?f3e2","webpack:///./src/components/Configuration/JsonEditor.vue","webpack:///./src/components/Configuration/CustomCss.vue?e4a5","webpack:///./src/components/Settings/CustomThemeMaker.vue?2b1b","webpack:///src/components/Settings/CustomThemeMaker.vue","webpack:///./src/components/Settings/CustomThemeMaker.vue?6674","webpack:///./src/components/Settings/CustomThemeMaker.vue","webpack:///./src/components/Settings/ThemeSelector.vue?d390","webpack:///./src/utils/ThemeHelper.js","webpack:///src/components/Settings/ThemeSelector.vue","webpack:///./src/components/Settings/ThemeSelector.vue?84ba","webpack:///./src/components/Settings/ThemeSelector.vue","webpack:///src/components/Configuration/CustomCss.vue","webpack:///./src/components/Configuration/CustomCss.vue?4b5d","webpack:///./src/components/Configuration/CustomCss.vue","webpack:///./src/components/Configuration/CloudBackupRestore.vue?b97f","webpack:///./src/components/FormElements/Input.vue?2266","webpack:///src/components/FormElements/Input.vue","webpack:///./src/components/FormElements/Input.vue?2102","webpack:///./src/components/FormElements/Input.vue","webpack:///./src/utils/CloudBackup.js","webpack:///src/components/Configuration/CloudBackupRestore.vue","webpack:///./src/components/Configuration/CloudBackupRestore.vue?fc42","webpack:///./src/components/Configuration/CloudBackupRestore.vue","webpack:///./src/components/Configuration/RebuildApp.vue?f75a","webpack:///src/components/Configuration/RebuildApp.vue","webpack:///./src/components/Configuration/RebuildApp.vue?7d07","webpack:///./src/components/Configuration/RebuildApp.vue","webpack:///./src/components/Configuration/AppVersion.vue?04c8","webpack:///src/components/Configuration/AppVersion.vue","webpack:///./src/components/Configuration/AppVersion.vue?3f67","webpack:///./src/components/Configuration/AppVersion.vue","webpack:///src/components/Configuration/ConfigContainer.vue","webpack:///./src/components/Configuration/ConfigContainer.vue?a1c8","webpack:///./src/components/Configuration/ConfigContainer.vue","webpack:///./src/components/Settings/LanguageSwitcher.vue?d488","webpack:///src/components/Settings/LanguageSwitcher.vue","webpack:///./src/components/Settings/LanguageSwitcher.vue?6797","webpack:///./src/components/Settings/LanguageSwitcher.vue","webpack:///src/components/Settings/ConfigLauncher.vue","webpack:///./src/components/Settings/ConfigLauncher.vue?64bf","webpack:///./src/components/Settings/ConfigLauncher.vue","webpack:///./src/components/Settings/LayoutSelector.vue?53bf","webpack:///src/components/Settings/LayoutSelector.vue","webpack:///./src/components/Settings/LayoutSelector.vue?b5bf","webpack:///./src/components/Settings/LayoutSelector.vue","webpack:///./src/components/Settings/ItemSizeSelector.vue?4732","webpack:///src/components/Settings/ItemSizeSelector.vue","webpack:///./src/components/Settings/ItemSizeSelector.vue?b3f2","webpack:///./src/components/Settings/ItemSizeSelector.vue","webpack:///./src/components/Settings/AuthButtons.vue?deeb","webpack:///src/components/Settings/AuthButtons.vue","webpack:///./src/components/Settings/AuthButtons.vue?5ea4","webpack:///./src/components/Settings/AuthButtons.vue","webpack:///./src/components/Settings/KeyboardShortcutInfo.vue?84c8","webpack:///src/components/Settings/KeyboardShortcutInfo.vue","webpack:///./src/components/Settings/KeyboardShortcutInfo.vue?4c22","webpack:///./src/components/Settings/KeyboardShortcutInfo.vue","webpack:///./src/components/Configuration/AppInfoModal.vue?900b","webpack:///src/components/Configuration/AppInfoModal.vue","webpack:///./src/components/Configuration/AppInfoModal.vue?c1c1","webpack:///./src/components/Configuration/AppInfoModal.vue","webpack:///src/components/Settings/SettingsContainer.vue","webpack:///./src/components/Settings/SettingsContainer.vue?d1c9","webpack:///./src/components/Settings/SettingsContainer.vue","webpack:///./src/components/LinkItems/Section.vue?9079","webpack:///./src/components/LinkItems/Item.vue?c1b3","webpack:///./src/components/LinkItems/ItemIcon.vue?8410","webpack:///src/components/LinkItems/ItemIcon.vue","webpack:///./src/components/LinkItems/ItemIcon.vue?4095","webpack:///./src/components/LinkItems/ItemIcon.vue","webpack:///./src/components/LinkItems/ItemOpenMethodIcon.vue?0837","webpack:///src/components/LinkItems/ItemOpenMethodIcon.vue","webpack:///./src/components/LinkItems/ItemOpenMethodIcon.vue?5dc8","webpack:///./src/components/LinkItems/ItemOpenMethodIcon.vue","webpack:///./src/components/LinkItems/StatusIndicator.vue?37ad","webpack:///src/components/LinkItems/StatusIndicator.vue","webpack:///./src/components/LinkItems/StatusIndicator.vue?5395","webpack:///./src/components/LinkItems/StatusIndicator.vue","webpack:///./src/components/InteractiveEditor/EditItem.vue?036d","webpack:///./src/components/InteractiveEditor/SaveCancelButtons.vue?6706","webpack:///src/components/InteractiveEditor/SaveCancelButtons.vue","webpack:///./src/components/InteractiveEditor/SaveCancelButtons.vue?4928","webpack:///./src/components/InteractiveEditor/SaveCancelButtons.vue","webpack:///./src/components/FormElements/Select.vue?d011","webpack:///src/components/FormElements/Select.vue","webpack:///./src/components/FormElements/Select.vue?5eee","webpack:///./src/components/FormElements/Select.vue","webpack:///src/components/InteractiveEditor/EditItem.vue","webpack:///./src/components/InteractiveEditor/EditItem.vue?54ab","webpack:///./src/components/InteractiveEditor/EditItem.vue","webpack:///./src/components/InteractiveEditor/MoveItemTo.vue?14ae","webpack:///src/components/InteractiveEditor/MoveItemTo.vue","webpack:///./src/components/InteractiveEditor/MoveItemTo.vue?ce62","webpack:///./src/components/InteractiveEditor/MoveItemTo.vue","webpack:///./src/components/LinkItems/ItemContextMenu.vue?7a3e","webpack:///src/components/LinkItems/ItemContextMenu.vue","webpack:///./src/components/LinkItems/ItemContextMenu.vue?b9d2","webpack:///./src/components/LinkItems/ItemContextMenu.vue","webpack:///src/components/LinkItems/Item.vue","webpack:///./src/components/LinkItems/Item.vue?2ad0","webpack:///./src/components/LinkItems/Item.vue","webpack:///./src/components/LinkItems/Collapsable.vue?81c3","webpack:///src/components/LinkItems/Collapsable.vue","webpack:///./src/components/LinkItems/Collapsable.vue?31d4","webpack:///./src/components/LinkItems/Collapsable.vue","webpack:///./src/components/LinkItems/IframeModal.vue?331c","webpack:///src/components/LinkItems/IframeModal.vue","webpack:///./src/components/LinkItems/IframeModal.vue?cd01","webpack:///./src/components/LinkItems/IframeModal.vue","webpack:///./src/components/InteractiveEditor/EditSection.vue?6dfc","webpack:///src/components/InteractiveEditor/EditSection.vue","webpack:///./src/components/InteractiveEditor/EditSection.vue?7248","webpack:///./src/components/InteractiveEditor/EditSection.vue","webpack:///./src/components/LinkItems/SectionContextMenu.vue?3c3d","webpack:///src/components/LinkItems/SectionContextMenu.vue","webpack:///./src/components/LinkItems/SectionContextMenu.vue?fe43","webpack:///./src/components/LinkItems/SectionContextMenu.vue","webpack:///src/components/LinkItems/Section.vue","webpack:///./src/components/LinkItems/Section.vue?101a","webpack:///./src/components/LinkItems/Section.vue","webpack:///./src/components/InteractiveEditor/EditModeSaveMenu.vue?f133","webpack:///./src/components/InteractiveEditor/EditPageInfo.vue?fa99","webpack:///src/components/InteractiveEditor/EditPageInfo.vue","webpack:///./src/components/InteractiveEditor/EditPageInfo.vue?a59e","webpack:///./src/components/InteractiveEditor/EditPageInfo.vue","webpack:///./src/components/InteractiveEditor/EditAppConfig.vue?ea9d","webpack:///src/components/InteractiveEditor/EditAppConfig.vue","webpack:///./src/components/InteractiveEditor/EditAppConfig.vue?6b96","webpack:///./src/components/InteractiveEditor/EditAppConfig.vue","webpack:///src/components/InteractiveEditor/EditModeSaveMenu.vue","webpack:///./src/components/InteractiveEditor/EditModeSaveMenu.vue?c5f5","webpack:///./src/components/InteractiveEditor/EditModeSaveMenu.vue","webpack:///./src/components/InteractiveEditor/ExportConfigMenu.vue?8055","webpack:///src/components/InteractiveEditor/ExportConfigMenu.vue","webpack:///./src/components/InteractiveEditor/ExportConfigMenu.vue?a747","webpack:///./src/components/InteractiveEditor/ExportConfigMenu.vue","webpack:///./src/components/InteractiveEditor/AddNewSectionLauncher.vue?72a1","webpack:///src/components/InteractiveEditor/AddNewSectionLauncher.vue","webpack:///./src/components/InteractiveEditor/AddNewSectionLauncher.vue?6863","webpack:///./src/components/InteractiveEditor/AddNewSectionLauncher.vue","webpack:///src/views/Home.vue","webpack:///./src/views/Home.vue?588c","webpack:///./src/views/Home.vue","webpack:///./src/views/Login.vue?125c","webpack:///src/views/Login.vue","webpack:///./src/views/Login.vue?b90c","webpack:///./src/views/Login.vue","webpack:///./src/views/Workspace.vue?b9ac","webpack:///./src/components/Workspace/SideBar.vue?c306","webpack:///./src/components/Workspace/SideBarItem.vue?07a3","webpack:///src/components/Workspace/SideBarItem.vue","webpack:///./src/components/Workspace/SideBarItem.vue?7db1","webpack:///./src/components/Workspace/SideBarItem.vue","webpack:///./src/components/Workspace/SideBarSection.vue?c88b","webpack:///src/components/Workspace/SideBarSection.vue","webpack:///./src/components/Workspace/SideBarSection.vue?2afa","webpack:///./src/components/Workspace/SideBarSection.vue","webpack:///src/components/Workspace/SideBar.vue","webpack:///./src/components/Workspace/SideBar.vue?968e","webpack:///./src/components/Workspace/SideBar.vue","webpack:///./src/components/Workspace/WebContent.vue?7e00","webpack:///src/components/Workspace/WebContent.vue","webpack:///./src/components/Workspace/WebContent.vue?1b3c","webpack:///./src/components/Workspace/WebContent.vue","webpack:///./src/components/Workspace/MultiTaskingWebComtent.vue?e89e","webpack:///src/components/Workspace/MultiTaskingWebComtent.vue","webpack:///./src/components/Workspace/MultiTaskingWebComtent.vue?dc52","webpack:///./src/components/Workspace/MultiTaskingWebComtent.vue","webpack:///src/views/Workspace.vue","webpack:///./src/views/Workspace.vue?f4db","webpack:///./src/views/Workspace.vue","webpack:///./src/views/Minimal.vue?f117","webpack:///./src/components/MinimalView/MinimalSection.vue?080f","webpack:///src/components/MinimalView/MinimalSection.vue","webpack:///./src/components/MinimalView/MinimalSection.vue?fa57","webpack:///./src/components/MinimalView/MinimalSection.vue","webpack:///./src/components/MinimalView/MinimalHeading.vue?2260","webpack:///src/components/MinimalView/MinimalHeading.vue","webpack:///./src/components/MinimalView/MinimalHeading.vue?4e62","webpack:///./src/components/MinimalView/MinimalHeading.vue","webpack:///./src/components/MinimalView/MinimalSearch.vue?d024","webpack:///src/components/MinimalView/MinimalSearch.vue","webpack:///./src/components/MinimalView/MinimalSearch.vue?707f","webpack:///./src/components/MinimalView/MinimalSearch.vue","webpack:///src/views/Minimal.vue","webpack:///./src/views/Minimal.vue?4dec","webpack:///./src/views/Minimal.vue","webpack:///./src/router.js","webpack:///./src/store.js","webpack:///./src/utils/InitServiceWorker.js","webpack:///./src/utils/ClickOutside.js","webpack:///./src/utils/ErrorReporting.js","webpack:///./src/main.js","webpack:///./src/assets/interface-icons/config-open-settings.svg","webpack:///./src/assets/interface-icons/layout-horizontal.svg","webpack:///./src/components/InteractiveEditor/MoveItemTo.vue?a409","webpack:///./src/assets/interface-icons/interactive-editor-move-to.svg","webpack:///./src/assets/interface-icons/application-home.svg","webpack:///./src/assets/interface-icons/interactive-editor-copy-clipboard.svg","webpack:///./src/App.vue?946b","webpack:///./src/utils/defaults.js","webpack:///./src/assets/interface-icons/config-close.svg","webpack:///./src/assets/interface-icons/loader.svg","webpack:///./src/views/Minimal.vue?57d3","webpack:///./src/assets/interface-icons/cloud-backup-restore.svg","webpack:///./src/components/PageStrcture/PageTitle.vue?e490","webpack:///./src/components/MinimalView/MinimalSection.vue?76c5","webpack:///./src/assets/interface-icons/back-arrow.svg","webpack:///./src/components/FormElements/Button.vue?8869","webpack:///./src/components/Workspace/SideBarSection.vue?b5d5","webpack:///./src/assets/interface-icons/icon-size-medium.svg","webpack:///./src/components/LinkItems/SectionContextMenu.vue?7a2d","webpack:///./src/assets/interface-icons/interactive-editor-remove.svg","webpack:///./src/components/Settings/AuthButtons.vue?f323","webpack:///./src/assets/interface-icons/config-custom-css.svg","webpack:///./src/components/Workspace/MultiTaskingWebComtent.vue?b9aa","webpack:///./src/components/LinkItems/StatusIndicator.vue?3cfb","webpack:///./src/components/Configuration/JsonEditor.vue?3537","webpack:///./src/components/LinkItems/Item.vue?7ab8","webpack:///./src/components/MinimalView/MinimalHeading.vue?4a91","webpack:///./src/assets/interface-icons/open-top.svg","webpack:///./src/components/FormElements/Input.vue?43ad","webpack:///./src/components/LinkItems/ItemContextMenu.vue?bd7d","webpack:///./public/conf.yml","webpack:///./src/components/Configuration/AppInfoModal.vue?d472","webpack:///./src/assets/interface-icons/interactive-editor-page-info.svg","webpack:///./src/assets/interface-icons/config-cancel.svg","webpack:///./src/assets/interface-icons/save-config.svg","webpack:///./src/assets/interface-icons/icon-size-large.svg","webpack:///./src/components/Settings/KeyboardShortcutInfo.vue?4558","webpack:///./src/assets/interface-icons/broken-icon.svg","webpack:///./src/components/LinkItems/Section.vue?4723","webpack:///./src/components/Configuration/CustomCss.vue?1f3c","webpack:///./src/components/PageStrcture/Footer.vue?6cf7","webpack:///./src/components/PageStrcture/Nav.vue?f817","webpack:///./src/components/Settings/ConfigLauncher.vue?694b","webpack:///./src/components/FormElements/Select.vue?2ed1","webpack:///./src/components/InteractiveEditor/EditModeTopBanner.vue?a8b8","webpack:///./src/views/Workspace.vue?0b24","webpack:///./src/components/InteractiveEditor/SaveCancelButtons.vue?e9f4","webpack:///./src/assets/interface-icons/unknown-icon.svg","webpack:///./src/views/Minimal.vue?c486","webpack:///./src/components/LinkItems/Collapsable.vue?8d81","webpack:///./src/components/FormElements/Select.vue?47db","webpack:///./src/components/InteractiveEditor/EditAppConfig.vue?5308","webpack:///./src/assets/interface-icons/interactive-editor-edit-mode.svg","webpack:///./src/assets/interface-icons/interactive-editor-save-locally.svg","webpack:///./src/components/Workspace/SideBar.vue?5c7e","webpack:///./src/components/FormElements/Radio.vue?33ea","webpack:///./src/assets/interface-icons/layout-default.svg","webpack:///./src/assets/interface-icons/config-download-file.svg","webpack:///./src/components/InteractiveEditor/EditPageInfo.vue?fa8e","webpack:///./src/assets/interface-icons/icon-size-small.svg","webpack:///./src/views/Home.vue?9b46","webpack:///./src/components/LinkItems/ItemIcon.vue?e6ee","webpack:///./src/components/Configuration/AppInfoModal.vue?ad8e","webpack:///./src/assets/interface-icons/open-parent.svg","webpack:///./src/utils/EmojiUnicodeRegex.js","webpack:///./src/assets/interface-icons/burger-menu.svg","webpack:///./src/assets/interface-icons/interactive-editor-add.svg","webpack:///./src/assets/interface-icons/config-restore.svg","webpack:///./src/assets/interface-icons/config-edit-json.svg","webpack:///./src/utils/JsonToYaml.js","webpack:///./src/components/PageStrcture/Header.vue?4925","webpack:///./src/components/LinkItems/IframeModal.vue?11f4","webpack:///./src/components/Settings/SettingsContainer.vue?708e","webpack:///./src/components/Settings/LanguageSwitcher.vue?042c","webpack:///./src/components/Configuration/RebuildApp.vue?206b","webpack:///./src/components/LinkItems/Item.vue?1142","webpack:///./src/assets/interface-icons/layout-vertical.svg","webpack:///./src/components/Configuration/CloudBackupRestore.vue?9556"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","installedCssChunks","jsonpScriptSrc","p","exports","module","l","e","promises","cssChunks","Promise","resolve","reject","href","fullhref","existingLinkTags","document","getElementsByTagName","tag","dataHref","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","head","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","functional","_h","_vm","_c","_v","children","class","classNames","staticClass","style","staticStyle","attrs","rest","assign","concat","render","this","$createElement","_self","_e","isLoading","pageInfo","visibleComponents","footerText","staticRenderFns","title","description","logo","navLinks","isEditMode","_s","directives","rawName","tooltip","expression","on","$event","editTitle","KEY_NAMES","MUTATIONS","forEach","props","String","components","EditModeIcon","computed","$store","state","editMode","methods","$modal","show","commit","content","$t","component","navVisible","_l","link","index","path","isUrl","IconBurger","links","Array","isMobile","detectMobile","screenWidth","body","clientWidth","shouldBeVisible","routeName","hideFurnitureOn","includes","asciiHash","input","str","Math","random","toString","reducer","previousHash","char","charCodeAt","asciiSum","split","reduce","shortened","btoa","makeItemId","sectionStr","itemStr","charSum","map","a","x","y","itemTitleStr","replace","toLowerCase","applyItemId","inputSections","sections","sec","secIdx","items","item","itemIdx","id","PageTitle","Nav","$route","getters","pageTitle","navigation","text","visible","domProps","authorUrl","authorName","licenseUrl","license","showCopyright","date","repoUrl","_m","welcomeMsg","v","log","warningMsg","info","statusMsg","msg","statusErrorMsg","errorLog","makeTime","now","Date","pad","digit","padStart","getHours","getMinutes","getSeconds","appendToErrorLog","sessionStorage","getItem","sessionStorageKeys","ERROR_LOG","setItem","ErrorHandler","Sentry","InfoHandler","WarningInfoHandler","InfoKeys","AUTH","CLOUD_BACKUP","EDITOR","RAW_EDITOR","VISUAL","Header","Footer","LoadingScreen","EditModeTopBanner","config","appConfig","dispatch","usersCss","textContent","append","shouldShowSplash","availibleLocales","isLangSupported","languageList","userLang","usersBorwserLang1","navigator","language","usersBorwserLang2","usersSpairLangs","languages","$i18n","availableLocales","usersLang","localStorage","autoDetectLanguage","getLanguage","locale","loader","getElementById","display","applyLanguage","hideSplash","customCss","cleanedCss","injectCustomStyles","hideLoader","getBackgroundImage","ref","layout","itemSizeBound","getExternalCSSLinks","modalOpen","searching","updateModalVisibility","checkTheresData","singleSectionView","colCount","section","searchValue","filterTiles","icon","getDisplayData","finishedSearching","checkIfResults","userIsTypingSomething","settingsVisible","displayLayout","iconSize","userState","toggleSettingsVisibility","minimalSearch","preventDefault","searchSubmitted","arguments","composing","indexOf","_k","keyCode","clearFilterInput","searchPrefs","disableWebSearch","ArrowKeyNavigation","constructor","resetIndex","arrowNavigation","goToPrevious","goToNext","getSafeElementIndex","selectItemByIndex","focus","getElementsByClassName","numResults","getNumResults","startingIndex","isSameRow","indx","pos","offsetTop","checkPreviousIndex","currentIndex","yPos","position","isBelow","start","end","nextIndex","findPreviousRow","count","rowLen","findNextRow","adjustment","checkNextIndex","isAbove","ConfigAccumulator","conf","appConfigFile","usersAppConfig","defaultAppConfig","localStorageKeys","APP_CONFIG","JSON","parse","LAYOUT_ORIENTATION","defaultLayout","ICON_SIZE","defaultIconSize","auth","localPageInfo","PAGE_INFO","filePageInfo","defaultPageInfo","localSections","CONF_SECTIONS","json","getAppConfig","Accumulator","printWarning","isKeycloakEnabled","enableKeycloak","getKeycloakConfig","keycloak","serverUrl","realm","clientId","getUsers","isArray","users","generateUserToken","user","strAndUpper","toUpperCase","sha","sha256","hash","isLoggedIn","validTokens","userAuthenticated","cookie","cookieKey","trim","cookieValue","cookieKeys","AUTH_TOKEN","isAuthEnabled","isGuestAccessEnabled","enableGuestAccess","checkCredentials","username","pass","messages","response","correct","successMsg","incorrectPassword","missingPassword","missingUsername","incorrectUsername","login","expiry","setTime","getTime","toGMTString","userObject","USERNAME","logout","removeItem","getCurrentUser","foundUserObject","isLoggedInAsGuest","guestEnabled","notLoggedIn","isUserAdmin","currentUser","isAdmin","getUserState","notConfigured","loggedIn","guestAccess","userStateEnum","determineVisibility","visibilityList","cUsername","isFound","userInList","isSectionVisibleToUser","displayData","isGuest","checkVisiblity","hideFor","hideForUsers","checkHiddenability","showForUsers","checkIfHideForGuest","hideForGuest","hideForGuests","checkSectionVisibility","filter","currentSection","en","flag","de","nl","pl","fr","sl","es","it","zhCN","ar","hi","ja","pt","ru","nb","pirate","i18nMessages","lang","filterUserSections","componentVisibility","usersChoice","hideComponents","isThere","userValue","hideHeading","hideNav","searchBar","hideSearch","settings","hideSettings","footer","hideFooter","splashScreen","hideSplashScreen","getTheme","localTheme","THEME","appConfigTheme","theme","defaultTheme","getCustomColors","localColors","CUSTOM_COLORS","configColors","customColors","getCustomKeyShortcuts","results","itemsWithHotKeys","hotkey","url","flat","getUsersLanguage","langCode","LANGUAGE","defaultLanguage","langObj","find","targetValidator","acceptedTargets","ConfigSchema","properties","enum","isTargetValid","getDomainFromUrl","urlPattern","domainPattern","match","filterHelper","compareStr","searchStr","process","searchTiles","allTiles","searchTerm","tile","provider","tags","getSearchEngineFromBang","searchQuery","bangList","bangNames","keys","foundBang","bang","findUrlForSearchEngine","searchEngine","availableSearchEngines","test","stripBangs","q","Boolean","akn","webSearch","addEventListener","handleKeyPress","removeEventListener","currentElem","activeElement","notAlreadySearching","active","$refs","handleHotKey","$emit","blur","usersHotKeys","parseInt","open","method","openingMethod","searchBang","desiredSearchEngine","isCustomSearch","searchUrl","encodeURIComponent","launchWebSearch","showEditor","enterEditModeTooltip","startInteractiveEditor","openChangeViewMenu","modalNames","CONF_EDITOR","editorClosed","combineConfig","LANG_SWITCHER","openExportConfigModal","navigateToTab","openLanguageSwitchModal","backupId","openRebuildAppModal","resetLocalSettings","openAboutModal","options","model","callback","$$v","jsonData","saveOptions","initialSaveMode","allowWriteToDisk","saveMode","isValid","save","startPreview","errorMessages","saveSuccess","responseText","disallow","disabled","click","_t","Function","trigger","delay","label","radio","makeGroupName","_q","selectedRadio","updateValue","initialOption","VJsoneditor","Button","Radio","schema","modes","onValidationError","validationErrors","progress","allowConfigEdit","writeConfigToDisk","$toasted","saveConfigLocally","hide","yaml","baseUrl","endpoint","headers","success","carefullyClearLocalStorage","showToast","errors","currentTheme","showingAllVars","colorName","replaceAll","isColor","swatches","setVariable","$set","makeSwatchStyles","slot","isTextual","showFontVariables","findAllVariableNames","exportToClipboard","resetAndSave","themeToEdit","saveChanges","resetUnsavedColors","VSwatches","SaveIcon","CancelIcon","makeInitialData","cssVar","getComputedStyle","documentElement","getPropertyValue","variable","setProperty","priorSettings","variables","removeProperty","themeName","clipboardText","clipboard","writeText","variableArray","hasDash","addDash","removeDash","getCssVariableValue","currentVariables","fonts","fontVariables","availableVariables","from","styleSheets","colorHex","threeToSix","hex","hexToRgb","hexCode","startsWith","colorParts","exec","getLightness","contrastingColor","getForegroundColor","variableName","variableValue","nonColorVariables","varName","varValue","themeNames","themeChanged","selectedTheme","hidePallete","openThemeConfigurator","closeThemeConfigurator","GetTheme","ApplyCustomVariables","mainCssVars","vName","themeColors","customVar","ApplyLocalTheme","newTheme","htmlTag","hasAttribute","removeAttribute","LoadExternalTheme","preloadTheme","sheet","checkTheme","themes","selectTheme","add","CustomThemeMaker","IconPalette","watch","updateTheme","themeConfiguratorOpen","themeHelper","externalThemeNames","externalThemes","specialThemes","userThemes","cssThemes","availibleThemes","externalStyleSheet","externals","ext","Default","initialTheme","getInitialTheme","added","isThemeLocal","themeToCheck","localThemes","resetToDefault","ThemeSelector","css","saveToBrowser","injectToPage","showSuccessMsg","reloadPage","userStyles","localAppConfig","backupPassword","checkPass","restoreCode","restorePassword","restoreBackup","placeholder","Number","default","validator","ENDPOINT","backupEndpoint","encryptData","password","stringifiedData","stringify","encryptedData","aes","encrypt","decryptData","decrypt","Utf8","makeSubHash","backup","axios","post","userData","subHash","update","put","encodeGetParams","entries","kv","join","restore","params","errorMsg","decryptedData","Input","IconBackup","IconRestore","savedHash","makeUpdate","showErrorMsg","makeBackup","setBackupIdLocally","isUpdate","makeHash","modalName","startBuild","loading","allowRebuild","scopedSlots","_u","fn","proxy","output","refreshPage","RebuildIcon","ReloadIcon","LoadingAnimation","responseData","location","reload","isVersionValid","appVersion","finished","isUpToDate","veryOutOfDate","latestVersion","checksEnabled","checkVersion","packageUrl","version","checkIfUpToDate","currentVersion","difference","isNaN","jsonParser","JsonToYaml","JsonEditor","CustomCssEditor","CloudBackupRestore","RebuildApp","AppVersion","DownloadIcon","DeleteIcon","EditIcon","CloudIcon","CustomCssIcon","LanguageIcon","IconAbout","tabInxex","itemToSelect","tabView","navItems","activeTabItem","isTheUserSure","confirm","clear","navToTab","navigateConfToTab","isValidTabIndex","navigateToStartingTab","applyLanguageLocally","saveLanguage","SaveConfigIcon","savedLanguage","getIsoFromLangObj","newLang","friendlyName","selectedLanguage","i18nLocales","checkLocale","getLanguageFromIso","viewSwitcherOpen","ConfigContainer","LanguageSwitcher","IconSpanner","IconInteractiveEditor","IconViewMode","IconHome","IconWorkspaceView","IconMinimalView","updateDisplayLayout","IconDeafault","IconHorizontal","IconVertical","updateIconSize","IconSmall","IconMedium","IconLarge","makeText","userType","goToLogin","IconLogout","shouldHide","hideWelcomeHelper","timeDelay","keyPressEvent","shouldHideWelcomeMessage","$destroy","getErrorLog","SearchBar","ConfigLauncher","LayoutSelector","ItemSizeSelector","AuthButtons","KeyboardShortcutInfo","AppInfoModal","IconOpen","IconClose","getSettingsVisibility","something","groupId","collapsed","cols","rows","color","customStyles","openEditSection","openContextMenu","isGridLayout","itemSize","backgroundColor","statusCheckUrl","statusCheckHeaders","newItemSize","shouldEnableStatusCheck","statusCheck","getStatusCheckInterval","statusCheckAllowInsecure","triggerModal","closeEditSection","contextMenuOpen","contextPos","posX","posY","navigateToSection","removeSection","getTooltipOptions","makeClassList","getUnicodeOpeningIcon","hyperLinkHref","anchorTarget","itemOpened","button","accumulatedTarget","statusResponse","successStatus","openItemSettings","isAddNew","launchItem","openMoveItemMenu","openDeleteItem","parentSectionTitle","closeEditMenu","size","iconType","getEmoji","iconPath","getSimpleIcon","broken","imageNotFound","BrokenImage","determineImageType","getIconPath","pattern","RegExp","img","fileExtRegex","validImgExtensions","splitPath","emojiCode","emojiType","fromCodePoint","substr","fullUrl","specificApi","shouldUseDefaultFavicon","urlParts","host","getHostName","faviconApi","faviconIdentifier","getFavicon","isLocalIP","encodeURI","imageName","toLocaleLowerCase","imgType","makeClass","isSmall","isTransparent","transparent","NewTabOpenIcon","SameTabOpenIcon","IframeOpenIcon","WorkspaceOpenIcon","ParentOpenIcon","TopOpenIcon","UnknownIcon","statusText","otherStatusText","classes","statusSuccess","startTime","modalClosed","itemId","formData","row","boolRadioOptions","boolToStr","removeField","additionalFormData","appendNewField","saveItem","saveClick","cancelClick","selectedOption","isNew","Select","AddIcon","BinIcon","SaveCancelButtons","getItemFromState","makeInitialFormData","getItemById","getInputType","requiredFields","unneededFields","isPrimaryField","singleRow","makeRowData","bool","fieldId","elem","schemaItem","definedType","structured","newItem","formatBeforeSave","payload","strToTags","tagArr","strToBool","close","operationRadioOptions","operation","sectionList","selectedSection","appendToRadioOptions","appendTo","initialSection","sectionName","copyPayload","isMenuDisabled","launch","openSettings","openMoveMenu","MoveIcon","disableContextMenu","subtitle","enableStatusCheck","statusCheckInterval","Icon","ItemOpenMethodIcon","StatusIndicator","ContextMenu","MoveItemTo","EditItem","defaultOpeningMethod","nothing","noAnchorNeeded","getId","background","editMenuOpen","altKey","disableSmartSort","incrementMostUsedCount","incrementLastUsedCount","clientX","pageXOffset","clientY","pageYOffset","providerText","lb1","hotkeyText","tooltipText","editText","hideOnTargetClick","html","placement","encode","urlToCheck","enableInsecure","makeApiUrl","mostUsed","counter","lastUsed","closeContextMenu","parentSection","getParentSectionOfItem","checkWebsiteStatus","setInterval","rowColSpanClass","collapseClass","sanitizeCustomStyles","sectionKey","isExpanded","collapseChanged","editTooltip","openEditModal","uniqueKey","checkSpanNum","getCollapseState","span","classPrefix","maxSpan","numSpan","userCss","storageKey","initStorage","collapseStateObject","initialiseStorage","newState","collapseState","whatChanged","srcElement","checked","setCollapseState","customSchema","sectionData","saveSection","sectionIndex","FormSchema","sectionSchema","displayDataSchema","sortBy","getSectionByIndex","openSection","openEditSectionMenu","Collapsable","Item","IframeModal","EditSection","sortOrder","sortAlphabetically","reverse","sortByMostUsed","sortBLastUsed","sortRandomly","sectionLayout","styles","itemCountX","itemCountY","itemPreference","globalPreference","interval","sort","b","usageCount","gmu","glu","sectionIdentifier","confirmMsg","youSure","saveLocally","writeToDisk","openExportConfigMenu","openCloudBackupMenu","openRawConfigEditor","reset","openEditPageInfo","openEditAppConfig","saveToState","cancelEditing","processedFormData","removeUndefinedValues","rawAppConfig","raw","isEmpty","EditPageInfo","SaveLocallyIcon","SaveToDiskIcon","ExportIcon","AppConfigIcon","PageInfoIcon","EditAppConfig","CloudBackupIcon","EditRawIcon","yamlOptions","copyConfigToClipboard","downloadConfig","CopyConfigIcon","DownloadConfigIcon","filename","convertJsonToYaml","element","openAddNewSectionMenu","addNewSectionOpen","EditSectionMenu","SettingsContainer","EditModeSaveMenu","ExportConfigMenu","AddNewSection","Section","BackIcon","findSingleSection","filterComp","modalState","allSections","sectionTitle","sectionToReturn","prefix","isNeeded","checkIfIconLibraryNeeded","enableFontAwesome","checkIfFontAwesomeNeeded","fontAwesomeScript","faKey","fontAwesomeKey","checkIfMdiNeeded","mdiStylesheet","itemsFound","backgroundImg","initiateFontAwesome","initiateMaterialDesignIcons","layoutOrientation","existingUsername","stayLoggedIn","getOut","status","isUserAlreadyLoggedIn","isAuthenticationEnabled","dropDownMenu","submitLogin","guestLogin","time","goHome","isAllowed","setTheme","getInitialUrl","launchApp","isMultiTaskingEnabled","isOpen","itemClicked","SideBarItem","initUrl","fill","SideBarSection","val","ind","compare","findIndex","openDefaultSection","openApps","openExistingApp","appendNewApp","ComponentClass","instance","propsData","$mount","container","$el","frame","classList","remove","enableMultiTasking","SideBar","WebContent","MultiTaskingWebComtent","route","query","decodeURI","workspaceLandingUrl","this$1","setColumnCount","modalChanged","tabbedView","getSections","sectionSelected","selected","showAll","makeId","selectSection","startFiltering","MinimalSection","MinimalHeading","MinimalSearch","clearMinFilterInput","applyTheme","Vue","use","Router","ProgressBar","isAuthenticated","authEnabled","userLoggedIn","getConfig","getStartingView","startingView","getStartingComponent","usersPreference","Home","Minimal","Workspace","makeMetaTags","defaultTitle","metaTags","metaTagData","routingMode","router","routes","meta","routePaths","home","workspace","minimal","Login","beforeEnter","to","next","about","download","notFound","redirectedFrom","redirect","beforeEach","afterEach","nextTick","Vuex","INITIALIZE_CONFIG","SET_CONFIG","SET_MODAL_OPEN","SET_LANGUAGE","SET_ITEM_LAYOUT","SET_ITEM_SIZE","SET_THEME","SET_CUSTOM_COLORS","UPDATE_ITEM","SET_EDIT_MODE","SET_PAGE_INFO","SET_APP_CONFIG","SET_SECTIONS","UPDATE_SECTION","INSERT_SECTION","REMOVE_SECTION","COPY_ITEM","REMOVE_ITEM","INSERT_ITEM","UPDATE_CUSTOM_CSS","CONF_MENU_INDEX","Keys","store","Store","foundItem","itm","foundSection","mutations","newConfig","secIndex","itemIndex","newPageInfo","newAppConfig","newSections","newSection","targetSection","toSection","unshift","actions","deepCopy","setSwStatus","swStateToSet","initialSwState","ready","registered","cached","updateFound","updated","offline","devMode","disabledByUser","sessionData","SW_STATUS","currentSwState","newSwState","shouldEnableServiceWorker","enableServiceWorker","printSwStatus","swUrl","registerServiceWorker","register","updatefound","instances","onDocumentClick","el","contains","binding","dataset","outsideClickIndex","unbind","handler","ErrorReporting","enableErrorReporting","require","Integrations","dsn","sentryDsn","init","integrations","BrowserTracing","routingInstrumentation","vueRouterInstrumentation","tracesSampleRate","release","VueI18n","VTooltip","tooltipOptions","VModal","VTabs","TreeView","Toasted","toastedOptions","VSelect","directive","clickOutside","productionTip","i18n","fallbackLocale","serviceWorker","awesome","Dashy","mount","initOptions","onLoad","Keycloak","serviceEndpoints","statusPing","rebuild","builtInThemes","HIDE_WELCOME_BANNER","COLLAPSE_STATE","BACKUP_ID","BACKUP_HASH","HIDE_SETTINGS","MOST_USED","LAST_USED","REBUILD_APP","ABOUT_APP","EDIT_ITEM","EDIT_SECTION","EDIT_PAGE_INFO","EDIT_APP_CONFIG","EXPORT_CONFIG_MENU","MOVE_ITEM_TO","topLevelConfKeys","SECTIONS","splashScreenTime","duration","keepOnHover","className","iconPack","defaultTrigger","defaultHideOnTargetClick","autoHide","defaultHtml","defaultPlacement","defaultLoadingContent","defaultDelay","faviconApiEndpoints","mcapi","clearbit","faviconkit","google","allesedv","webmasterapi","iconCdns","fa","mdi","si","generative","localPath","faviconName","homeLabIcons","searchEngineUrls","duckduckgo","whoogle","qwant","startpage","ecosia","metager","swisscows","mojeek","peekier","wikipedia","stackoverflow","wolframalpha","reddit","youtube","github","bbc","defaultSearchEngine","defaultSearchOpeningMethod","searchBangs","pwa","manifestPath","themeColor","msTileColor","iconPaths","manifestCrossorigin","favicon64","favicon32","maskIcon","msTileImage","trimWhitespace","trimRight","throwError","indentLevel","handlers","null","number","boolean","string","array","typeOf","inArray","rootNode","k","function"],"mappings":"aACE,SAASA,EAAqBC,GAQ7B,IAPA,IAMIC,EAAUC,EANVC,EAAWH,EAAK,GAChBI,EAAcJ,EAAK,GACnBK,EAAiBL,EAAK,GAIHM,EAAI,EAAGC,EAAW,GACpCD,EAAIH,EAASK,OAAQF,IACzBJ,EAAUC,EAASG,GAChBG,OAAOC,UAAUC,eAAeC,KAAKC,EAAiBX,IAAYW,EAAgBX,IACpFK,EAASO,KAAKD,EAAgBX,GAAS,IAExCW,EAAgBX,GAAW,EAE5B,IAAID,KAAYG,EACZK,OAAOC,UAAUC,eAAeC,KAAKR,EAAaH,KACpDc,EAAQd,GAAYG,EAAYH,IAG/Be,GAAqBA,EAAoBhB,GAE5C,MAAMO,EAASC,OACdD,EAASU,OAATV,GAOD,OAHAW,EAAgBJ,KAAKK,MAAMD,EAAiBb,GAAkB,IAGvDe,IAER,SAASA,IAER,IADA,IAAIC,EACIf,EAAI,EAAGA,EAAIY,EAAgBV,OAAQF,IAAK,CAG/C,IAFA,IAAIgB,EAAiBJ,EAAgBZ,GACjCiB,GAAY,EACRC,EAAI,EAAGA,EAAIF,EAAed,OAAQgB,IAAK,CAC9C,IAAIC,EAAQH,EAAeE,GACG,IAA3BX,EAAgBY,KAAcF,GAAY,GAE3CA,IACFL,EAAgBQ,OAAOpB,IAAK,GAC5Be,EAASM,EAAoBA,EAAoBC,EAAIN,EAAe,KAItE,OAAOD,EAIR,IAAIQ,EAAmB,GAGnBC,EAAqB,CACxB,MAAS,GAMNjB,EAAkB,CACrB,MAAS,GAGNK,EAAkB,GAGtB,SAASa,EAAe7B,GACvB,OAAOyB,EAAoBK,EAAI,OAAS,GAAG9B,IAAUA,GAAW,IAAM,CAAC,iBAAiB,WAAW,iBAAiB,WAAW,iBAAiB,YAAYA,GAAW,MAIxK,SAASyB,EAAoB1B,GAG5B,GAAG4B,EAAiB5B,GACnB,OAAO4B,EAAiB5B,GAAUgC,QAGnC,IAAIC,EAASL,EAAiB5B,GAAY,CACzCK,EAAGL,EACHkC,GAAG,EACHF,QAAS,IAUV,OANAlB,EAAQd,GAAUW,KAAKsB,EAAOD,QAASC,EAAQA,EAAOD,QAASN,GAG/DO,EAAOC,GAAI,EAGJD,EAAOD,QAKfN,EAAoBS,EAAI,SAAuBlC,GAC9C,IAAImC,EAAW,GAIXC,EAAY,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,GACrER,EAAmB5B,GAAUmC,EAASvB,KAAKgB,EAAmB5B,IACzB,IAAhC4B,EAAmB5B,IAAkBoC,EAAUpC,IACtDmC,EAASvB,KAAKgB,EAAmB5B,GAAW,IAAIqC,SAAQ,SAASC,EAASC,GAIzE,IAHA,IAAIC,EAAO,QAAU,GAAGxC,IAAUA,GAAW,IAAM,CAAC,iBAAiB,WAAW,iBAAiB,WAAW,iBAAiB,YAAYA,GAAW,OAChJyC,EAAWhB,EAAoBK,EAAIU,EACnCE,EAAmBC,SAASC,qBAAqB,QAC7CxC,EAAI,EAAGA,EAAIsC,EAAiBpC,OAAQF,IAAK,CAChD,IAAIyC,EAAMH,EAAiBtC,GACvB0C,EAAWD,EAAIE,aAAa,cAAgBF,EAAIE,aAAa,QACjE,GAAe,eAAZF,EAAIG,MAAyBF,IAAaN,GAAQM,IAAaL,GAAW,OAAOH,IAErF,IAAIW,EAAoBN,SAASC,qBAAqB,SACtD,IAAQxC,EAAI,EAAGA,EAAI6C,EAAkB3C,OAAQF,IAAK,CAC7CyC,EAAMI,EAAkB7C,GACxB0C,EAAWD,EAAIE,aAAa,aAChC,GAAGD,IAAaN,GAAQM,IAAaL,EAAU,OAAOH,IAEvD,IAAIY,EAAUP,SAASQ,cAAc,QACrCD,EAAQF,IAAM,aACdE,EAAQE,KAAO,WACfF,EAAQG,OAASf,EACjBY,EAAQI,QAAU,SAASC,GAC1B,IAAIC,EAAUD,GAASA,EAAME,QAAUF,EAAME,OAAOC,KAAOjB,EACvDkB,EAAM,IAAIC,MAAM,qBAAuB5D,EAAU,cAAgBwD,EAAU,KAC/EG,EAAIE,KAAO,wBACXF,EAAIH,QAAUA,SACP5B,EAAmB5B,GAC1BkD,EAAQY,WAAWC,YAAYb,GAC/BX,EAAOoB,IAERT,EAAQV,KAAOC,EAEf,IAAIuB,EAAOrB,SAASC,qBAAqB,QAAQ,GACjDoB,EAAKC,YAAYf,MACfgB,MAAK,WACPtC,EAAmB5B,GAAW,MAMhC,IAAImE,EAAqBxD,EAAgBX,GACzC,GAA0B,IAAvBmE,EAGF,GAAGA,EACFhC,EAASvB,KAAKuD,EAAmB,QAC3B,CAEN,IAAIC,EAAU,IAAI/B,SAAQ,SAASC,EAASC,GAC3C4B,EAAqBxD,EAAgBX,GAAW,CAACsC,EAASC,MAE3DJ,EAASvB,KAAKuD,EAAmB,GAAKC,GAGtC,IACIC,EADAC,EAAS3B,SAASQ,cAAc,UAGpCmB,EAAOC,QAAU,QACjBD,EAAOE,QAAU,IACb/C,EAAoBgD,IACvBH,EAAOI,aAAa,QAASjD,EAAoBgD,IAElDH,EAAOZ,IAAM7B,EAAe7B,GAG5B,IAAI2E,EAAQ,IAAIf,MAChBS,EAAmB,SAAUd,GAE5Be,EAAOhB,QAAUgB,EAAOjB,OAAS,KACjCuB,aAAaJ,GACb,IAAIK,EAAQlE,EAAgBX,GAC5B,GAAa,IAAV6E,EAAa,CACf,GAAGA,EAAO,CACT,IAAIC,EAAYvB,IAAyB,SAAfA,EAAMH,KAAkB,UAAYG,EAAMH,MAChE2B,EAAUxB,GAASA,EAAME,QAAUF,EAAME,OAAOC,IACpDiB,EAAMK,QAAU,iBAAmBhF,EAAU,cAAgB8E,EAAY,KAAOC,EAAU,IAC1FJ,EAAMM,KAAO,iBACbN,EAAMvB,KAAO0B,EACbH,EAAMnB,QAAUuB,EAChBF,EAAM,GAAGF,GAEVhE,EAAgBX,QAAWkF,IAG7B,IAAIV,EAAUW,YAAW,WACxBd,EAAiB,CAAEjB,KAAM,UAAWK,OAAQa,MAC1C,MACHA,EAAOhB,QAAUgB,EAAOjB,OAASgB,EACjC1B,SAASqB,KAAKC,YAAYK,GAG5B,OAAOjC,QAAQ+C,IAAIjD,IAIpBV,EAAoB4D,EAAIxE,EAGxBY,EAAoB6D,EAAI3D,EAGxBF,EAAoB8D,EAAI,SAASxD,EAASkD,EAAMO,GAC3C/D,EAAoBgE,EAAE1D,EAASkD,IAClC1E,OAAOmF,eAAe3D,EAASkD,EAAM,CAAEU,YAAY,EAAMC,IAAKJ,KAKhE/D,EAAoBoE,EAAI,SAAS9D,GACX,qBAAX+D,QAA0BA,OAAOC,aAC1CxF,OAAOmF,eAAe3D,EAAS+D,OAAOC,YAAa,CAAEC,MAAO,WAE7DzF,OAAOmF,eAAe3D,EAAS,aAAc,CAAEiE,OAAO,KAQvDvE,EAAoBwE,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQvE,EAAoBuE,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,kBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAK7F,OAAO8F,OAAO,MAGvB,GAFA5E,EAAoBoE,EAAEO,GACtB7F,OAAOmF,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOvE,EAAoB8D,EAAEa,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIR3E,EAAoB+E,EAAI,SAASxE,GAChC,IAAIwD,EAASxD,GAAUA,EAAOmE,WAC7B,WAAwB,OAAOnE,EAAO,YACtC,WAA8B,OAAOA,GAEtC,OADAP,EAAoB8D,EAAEC,EAAQ,IAAKA,GAC5BA,GAIR/D,EAAoBgE,EAAI,SAASgB,EAAQC,GAAY,OAAOnG,OAAOC,UAAUC,eAAeC,KAAK+F,EAAQC,IAGzGjF,EAAoBK,EAAI,IAGxBL,EAAoBkF,GAAK,SAAShD,GAA2B,MAApBiD,QAAQjC,MAAMhB,GAAYA,GAEnE,IAAIkD,EAAaC,OAAO,gBAAkBA,OAAO,iBAAmB,GAChEC,EAAmBF,EAAWjG,KAAK2F,KAAKM,GAC5CA,EAAWjG,KAAOf,EAClBgH,EAAaA,EAAWG,QACxB,IAAI,IAAI5G,EAAI,EAAGA,EAAIyG,EAAWvG,OAAQF,IAAKP,EAAqBgH,EAAWzG,IAC3E,IAAIU,EAAsBiG,EAI1B/F,EAAgBJ,KAAK,CAAC,EAAE,kBAEjBM,K,8DCzQHc,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,yCAAyCC,EAAWC,GAC5DC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,eAAe,MAAQ,6BAA6B,QAAU,eAAgBF,MACtJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,gW,oCCvBzE,W,qBCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,sCAAsCC,EAAWC,GACzDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,YAAY,MAAQ,6BAA6B,QAAU,eAAgBF,MACnJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,me,oCCvBzE,W,6DCAA,W,qBCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,qCAAqCC,EAAWC,GACxDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,WAAW,MAAQ,6BAA6B,QAAU,eAAgBF,MAClJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,0/B,qBCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,mCAAmCC,EAAWC,GACtDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,SAAS,MAAQ,6BAA6B,QAAU,eAAgBF,MAChJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,kkB,oCCvBzE,W,u3hBCAA,W,8CCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,iCAAiCC,EAAWC,GACpDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,OAAO,MAAQ,6BAA6B,QAAU,eAAgBF,MAC9IC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,4mG,oCCvBzE,W,iECCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,kCAAkCC,EAAWC,GACrDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,QAAQ,MAAQ,6BAA6B,QAAU,eAAgBF,MAC/IC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,8P,wICvBzE,W,qBCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,iCAAiCC,EAAWC,GACpDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,OAAO,MAAQ,6BAA6B,QAAU,eAAgBF,MAC9IC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,0gB,oCCvBzE,W,oCCAA,W,mBCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,gCAAgCC,EAAWC,GACnDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,MAAM,MAAQ,6BAA6B,QAAU,eAAgBF,MAC7IC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,sV,oCCvBzE,W,mBCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,4CAA4CC,EAAWC,GAC/DC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,kBAAkB,MAAQ,6BAA6B,QAAU,eAAgBF,MACzJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,4K,qBCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,8CAA8CC,EAAWC,GACjEC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,oBAAoB,MAAQ,6BAA6B,QAAU,eAAgBF,MAC3JC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,iV,mBCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,gCAAgCC,EAAWC,GACnDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,OAAO,MAAQ,6BAA6B,QAAU,eAAgBF,MAC9IC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,uqB,smPCvBzE,W,4CCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,oCAAoCC,EAAWC,GACvDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,UAAU,MAAQ,6BAA6B,QAAU,eAAgBF,MACjJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,if,4CCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,mCAAmCC,EAAWC,GACtDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,SAAS,MAAQ,6BAA6B,QAAU,eAAgBF,MAChJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,id,oCCvBzE,W,oCCAA,W,qBCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,uCAAuCC,EAAWC,GAC1DC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,aAAa,MAAQ,6BAA6B,QAAU,eAAgBF,MACpJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,4rB,8CCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,mCAAmCC,EAAWC,GACtDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,SAAS,MAAQ,6BAA6B,QAAU,eAAgBF,MAChJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,0qB,8zLCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,sCAAsCC,EAAWC,GACzDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,YAAY,MAAQ,6BAA6B,QAAU,eAAgBF,MACnJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,uY,gGCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,iCAAiCC,EAAWC,GACpDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,OAAO,MAAQ,6BAA6B,QAAU,eAAgBF,MAC9IC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,imB,01OCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,oCAAoCC,EAAWC,GACvDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,UAAU,MAAQ,6BAA6B,QAAU,eAAgBF,MACjJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,+5B,4mNCvBzE,W,mmsDCAA,W,oCCAA,W,2DCAA,W,qBCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,0CAA0CC,EAAWC,GAC7DC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,gBAAgB,MAAQ,6BAA6B,QAAU,eAAgBF,MACvJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,4Y,oCCvBzE,W,kCCAA,W,oCCAA,W,wMCAII,EAAS,WAAa,IAAIb,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACQ,MAAM,CAAC,GAAK,UAAU,CAAET,EAAc,WAAEC,EAAG,qBAAqBD,EAAIiB,KAAMjB,EAAoB,iBAAEC,EAAG,gBAAgB,CAACQ,MAAM,CAAC,UAAYT,EAAIkB,aAAalB,EAAIiB,KAAKhB,EAAG,SAAS,CAACQ,MAAM,CAAC,SAAWT,EAAImB,YAAYlB,EAAG,eAAgBD,EAAIoB,kBAAwB,OAAEnB,EAAG,SAAS,CAACQ,MAAM,CAAC,KAAOT,EAAIqB,cAAcrB,EAAIiB,MAAM,IAC9ZK,EAAkB,GCDlB,EAAS,WAAa,IAAItB,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAQC,EAAoB,iBAAEC,EAAG,SAAS,CAAED,EAAgB,aAAEC,EAAG,YAAY,CAACQ,MAAM,CAAC,MAAQT,EAAImB,SAASI,MAAM,YAAcvB,EAAImB,SAASK,YAAY,KAAOxB,EAAImB,SAASM,QAAQzB,EAAIiB,KAAMjB,EAAc,WAAEC,EAAG,MAAM,CAACK,YAAY,MAAMG,MAAM,CAAC,MAAQT,EAAImB,SAASO,YAAY1B,EAAIiB,MAAM,GAAGjB,EAAIiB,MACvX,EAAkB,GCDlB,EAAS,WAAa,IAAIjB,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,cAAc,CAACK,YAAY,cAAcG,MAAM,CAAC,GAAK,IAAI,SAAWT,EAAI2B,aAAa,CAAE3B,EAAQ,KAAEC,EAAG,MAAM,CAACK,YAAY,YAAYG,MAAM,CAAC,IAAMT,EAAIyB,QAAQzB,EAAIiB,KAAKhB,EAAG,MAAM,CAACK,YAAY,QAAQ,CAACL,EAAG,KAAK,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIuB,UAAUtB,EAAG,OAAO,CAACK,YAAY,YAAY,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIwB,kBAAmBxB,EAAc,WAAEC,EAAG,eAAe,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,UAAWC,WAAW,cAAc1B,YAAY,YAAY2B,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAImC,gBAAgBnC,EAAIiB,MAAM,IAC7mB,EAAkB,G,qBCAtB,MAAMmB,EAAY,CAChB,oBACA,aACA,iBACA,eACA,gBACA,kBACA,gBACA,YACA,oBACA,cACA,gBACA,iBACA,eACA,iBACA,iBACA,iBACA,YACA,cACA,cACA,oBACA,mBAIIC,EAAY,GAClBD,EAAUE,QAASnD,IAAUkD,EAAUlD,GAAOA,IAC/BkD,Q,qBCRf,GACEvE,KAAM,YACNyE,MAAO,CACLhB,MAAOiB,OACPhB,YAAagB,OACbf,KAAMe,QAERC,WAAY,CACVC,aAAJ,KAEEC,SAAU,CACR,aACE,OAAO7B,KAAK8B,OAAOC,MAAMC,WAG7BC,QAAS,CAEP,YACEjC,KAAKkC,OAAOC,KAAK,EAAvB,8BACMnC,KAAK8B,OAAOM,OAAO,EAAzB,oBAGI,UACE,MAAMC,EAAUrC,KAAKsC,GAAG,8CACxB,MAAO,CAAb,8CC5CkW,I,wBCQ9VC,EAAY,eACd,EACA,EACA,GACA,EACA,KACA,WACA,MAIa,EAAAA,E,QCnBX,EAAS,WAAa,IAAIrD,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,aAAa,CAACL,EAAG,aAAa,CAACG,MAAO,WAAcJ,EAAIsD,WAAyB,GAAZ,WAAiBrB,GAAG,CAAC,MAAQ,SAASC,GAAQlC,EAAIsD,YAActD,EAAIsD,eAAgBtD,EAAc,WAAEC,EAAG,MAAM,CAACQ,MAAM,CAAC,GAAK,QAAQT,EAAIuD,GAAIvD,EAAS,OAAE,SAASwD,EAAKC,GAAO,OAAOxD,EAAG,cAAc,CAACd,IAAIsE,EAAMnD,YAAY,WAAWG,MAAM,CAAC,GAAK+C,EAAKE,KAAK,KAAOF,EAAKE,KAAK,OAAS1D,EAAI2D,MAAMH,EAAKE,MAAQ,SAAW,GAAG,IAAM,wBAAwB,CAAC1D,EAAIE,GAAGF,EAAI4B,GAAG4B,EAAKjC,aAAY,GAAGvB,EAAIiB,MAAM,IAC3jB,EAAkB,G,qBCsBtB,GACEnD,KAAM,MACN2E,WAAY,CACVmB,WAAJ,KAEErB,MAAO,CACLsB,MAAOC,OAETnL,KAAM,KAAM,CACV2K,YAAY,EACZS,UAAU,IAEZ,UACEjD,KAAKwC,YAAcxC,KAAKkD,eACxBlD,KAAKiD,SAAWjD,KAAKkD,gBAEvBjB,QAAS,CACP,eACE,MAAMkB,EAAczI,SAAS0I,KAAKC,YAClC,OAAOF,GAAeA,EAAc,KAEtCN,MAAO,GAAX,yDC5C4V,ICQxV,G,UAAY,eACd,EACA,EACA,GACA,EACA,KACA,WACA,OAIa,I,QChBR,MAAMS,EAAmBC,IAAeC,qBAAgBC,SAASF,GAG3DG,EAAaC,IACxB,MAAMC,EAAQD,GAA0B,IAAjBA,EAAMtL,OAA2CsL,EAA3BE,KAAKC,SAASC,WACrDC,EAAU,CAACC,EAAcC,KAAUD,GAAgB,GAAKC,EAAKC,WAAW,GACxEC,EAAWR,EAAIS,MAAM,IAAIC,OAAON,GAASD,WACzCQ,EAAYH,EAASrF,MAAM,EAAG,IAAMqF,EAASrF,MAAMqF,EAAS/L,OAAS,IAC3E,OAAOwG,OAAO2F,KAAKD,IAkBfE,EAAa,CAACC,EAAYC,EAAShC,KACvC,MAAMiC,EAAUF,EAAWL,MAAM,IAAIQ,IAAKC,GAAMA,EAAEX,WAAW,IAAIG,OAAO,CAACS,EAAGC,IAAMD,EAAIC,GAChFC,EAAeN,EAAQO,QAAQ,OAAQ,KAAKA,QAAQ,cAAe,IAAIC,cAC7E,MAAQ,GAAExC,KAASiC,KAAWK,KAInBG,EAAeC,IAC1B,MAAMC,EAAWD,GAAiB,GASlC,OARAC,EAAS9D,QAAQ,CAAC+D,EAAKC,KACjBD,EAAIE,OACNF,EAAIE,MAAMjE,QAAQ,CAACkE,EAAMC,KACvBL,EAASE,GAAQC,MAAME,GAASC,GAAKnB,EAAWc,EAAIvI,KAAM0I,EAAKjF,MAAOkF,OAKrEL,GC7BT,OACEtI,KAAM,SACN2E,WAAY,CACVkE,UAAJ,EACIC,IAAJ,GAEErE,MAAO,CACLpB,SAAU/H,QAEZuJ,SAAU,CACR,mBACE,OAAOyB,EAAgBtD,KAAK+F,OAAO/I,OAErC,oBACE,OAAOgD,KAAK8B,OAAOkE,QAAQ1F,mBAE7B,eACE,OAAON,KAAKM,kBAAkB2F,WAEhC,aACE,OAAOjG,KAAKM,kBAAkB4F,cCrC2T,ICQ3V,G,UAAY,eACd,EACA,EACA,GACA,EACA,KACA,WACA,OAIa,I,QCnBX,EAAS,WAAa,IAAIhH,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAQC,EAAIiH,MAAqB,KAAbjH,EAAIiH,MAAejH,EAAIkH,QAASjH,EAAG,SAAS,CAACkH,SAAS,CAAC,UAAYnH,EAAI4B,GAAG5B,EAAIiH,SAAUjH,EAAW,QAAEC,EAAG,SAAS,CAACD,EAAIE,GAAG,kBAAkBD,EAAG,IAAI,CAACQ,MAAM,CAAC,KAAOT,EAAIoH,YAAY,CAACpH,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIqH,eAAerH,EAAIE,GAAG,qBAAqBD,EAAG,IAAI,CAACQ,MAAM,CAAC,KAAOT,EAAIsH,aAAa,CAACtH,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIuH,YAAYvH,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIwH,cAAe,IAAK,IAAI,IAAIxH,EAAI4B,GAAG5B,EAAIyH,MAAM,cAAcxH,EAAG,IAAI,CAACQ,MAAM,CAAC,KAAOT,EAAI0H,UAAU,CAAC1H,EAAIE,GAAG,iBAAiBF,EAAIE,GAAG,QAAQF,EAAIiB,MAC/jB,EAAkB,GCetB,GACEnD,KAAM,SACNyE,MAAO,CACL0E,KAAMzE,OACN6E,WAAY,CAAhB,oCACID,UAAW,CAAf,+CACIG,QAAS,CAAb,2BACID,WAAY,CAAhB,4EACIG,KAAM,CAAV,iDACID,cAAe,CAAnB,yBACIE,QAAS,CAAb,yDAEE/E,SAAU,CACR,UACE,OAAOyB,EAAgBtD,KAAK+F,OAAO/I,SC9BsT,KCQ3V,I,UAAY,eACd,GACA,EACA,GACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIkC,EAAIc,KAASf,EAAGC,EAAIe,eAAsBf,EAAIgB,MAAMf,GAAO,OAAOD,EAAI2H,GAAG,IACnG,GAAkB,CAAC,WAAa,IAAI3H,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,wBAAwB,CAACL,EAAG,OAAO,CAACD,EAAIE,GAAG,2BCAvK/C,I,UAAS,IAMT,GAAY,eACdA,GACA,GACA,IACA,EACA,KACA,WACA,MAIa,M,QClBX,GAAS,WAAa,IAAI6C,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,aAAa,CAACQ,MAAM,CAAC,KAAO,eAAe,CAAET,EAAa,UAAEC,EAAG,MAAM,CAACG,MAAMJ,EAAI7B,EAAEsC,MAAM,CAAC,GAAK,WAAWwB,GAAG,CAAC,MAAQ,SAASC,GAAQlC,EAAI7B,EAAI,UAAU,CAAC8B,EAAG,KAAK,CAACD,EAAIE,GAAG,WAAWD,EAAG,MAAM,CAACK,YAAY,mBAAmB,CAACL,EAAG,IAAI,CAACD,EAAIE,GAAG,aAAaD,EAAG,OAAO,CAACK,YAAY,aAAa,CAACL,EAAG,OAAO,CAACK,YAAY,cAAcL,EAAG,OAAO,CAACK,YAAY,cAAcL,EAAG,OAAO,CAACK,YAAY,cAAcL,EAAG,OAAO,CAACK,YAAY,oBAAoBN,EAAIiB,QAC5hB,GAAkB,GCiBtB,IACEnD,KAAM,gBACNyE,MAAO,CACLrB,UAAW,CAAf,0BAEEvI,KAAM,KAAM,CACVwF,EAAG,MCxB+V,MCQlW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QChBR,MAAMyJ,GAAa,KACxB,MAAMC,EAAmC,SACzCpI,QAAQqI,IAAK,cAAaD,OAAQ,iOAIvBE,GAAclK,IACzB4B,QAAQuI,KACL,yBAAwBnK,gKACzB,8PACA,qDACA,wFAKSoK,GAAY,CAAC1G,EAAO2G,KAC/BzI,QAAQqI,IACL,KAAIvG,GAAS,SAAS2G,IACvB,iEACA,oBAKSC,GAAiB,CAAC5G,EAAO2G,EAAKE,KACzC3I,QAAQqI,IACL,KAAIvG,GAAS,SAAS2G,SAAWE,GAAY,KAC9C,iEACA,iBACA,sB,iBC5BJ,MAAMC,GAAW,KACf,MAAMC,EAAM,IAAIC,KACVC,EAAOC,GAAUjG,OAAOiG,GAAOC,SAAS,EAAG,KACjD,MAAQ,GAAEF,EAAIF,EAAIK,eAAeH,EAAIF,EAAIM,iBAAiBJ,EAAIF,EAAIO,iBAI9DC,GAAoBZ,IACxB,IAAIE,EAAWW,eAAeC,QAAQC,wBAAmBC,YAAc,GACvEd,GAAa,IAAGC,SAAeH,MAC/Ba,eAAeI,QAAQF,wBAAmBC,UAAWd,IASjDgB,GAAe,SAAiBlB,GACpCH,GAAWG,GACXY,GAAiBZ,GACjBmB,QAAuB,eAAcnB,IAI1BoB,GAAc,CAACpB,EAAK3G,KAC/B0G,GAAU1G,GAAS,OAAQ2G,IAIhBqB,GAAqB,CAACrB,EAAK3G,EAAOuG,KAC7CK,GAAe5G,GAAS,UAAW2G,EAAKJ,IAI7B0B,GAAW,CACtBC,KAAM,iBACNC,aAAc,yBACdC,OAAQ,qBACRC,WAAY,oBACZC,OAAQ,mBAGKT,UCxBf,IACEtL,KAAM,MACN2E,WAAY,CACVqH,OAAJ,EACIC,OAAJ,GACIC,cAAJ,GACIC,kBAAJ,IAEE,OACE,MAAO,CACL/I,WAAW,IAGfyB,SAAU,CAER,aACE,OAAO7B,KAAKK,UAAYL,KAAKK,SAASE,WAAaP,KAAKK,SAASE,WAAa,IAGhF,mBACE,OAAQP,KAAKM,mBAAqB,EAAxC,oCAEI,SACE,OAAON,KAAK8B,OAAOC,MAAMqH,QAE3B,YACE,OAAOpJ,KAAK8B,OAAOkE,QAAQqD,WAE7B,WACE,OAAOrJ,KAAK8B,OAAOkE,QAAQ3F,UAE7B,WACE,OAAOL,KAAK8B,OAAOkE,QAAQ3F,UAE7B,oBACE,OAAOL,KAAK8B,OAAOkE,QAAQ1F,mBAE7B,aACE,OAAON,KAAK8B,OAAOC,MAAMC,WAG7B,UACEhC,KAAK8B,OAAOwH,SAAS,EAAzB,oBAEErH,QAAS,CAEP,mBAAmBsH,GACjB,MAAM9J,EAAQ/E,SAASQ,cAAc,SACrCuE,EAAM+J,YAAcD,EACpB7O,SAASqB,KAAK0N,OAAOhK,IAGvB,aACMO,KAAK0J,iBACPxM,WAAW,KAAnB,gDAEQ8C,KAAKI,WAAY,GAKrB,mBAAmBuJ,GACjB,MAAMC,EAAkB,CAACC,EAAcC,IAAaD,EAC1D,qDAEYE,EAAoBlL,OAAOmL,UAAUC,UAAY,GACjDC,EAAoBH,EAAkB1F,MAAM,KAAK,GACjD8F,EAAkBtL,OAAOmL,UAAUI,UACzC,OAAOR,EAAgBD,EAAkBI,IAC/C,QACA,mBACA,eAII,cACE,MAAMJ,EAAmB3J,KAAKqK,MAAMC,iBAC9BC,EAAYC,aAAa,EAArC,uDACM,GAAID,EAAW,CACb,GAAIZ,EAAiBlG,SAAS8G,GAC5B,OAAOA,EAEP,GAAV,gCAGM,OAAOvK,KAAKyK,mBAAmBd,IAIjC,gBACE,MAAMM,EAAWjK,KAAK0K,cACtB1K,KAAK8B,OAAOM,OAAO,EAAzB,gBACMpC,KAAKqK,MAAMM,OAASV,EACpBvP,SAASC,qBAAqB,QAAQ,GAAG8B,aAAa,OAAQwN,IAEhE,aACE,MAAMW,EAASlQ,SAASmQ,eAAe,UACnCD,IAAQA,EAAOnL,MAAMqL,QAAU,UAIvC,UAGE,GAFA9K,KAAK+K,gBACL/K,KAAKgL,aACDhL,KAAKqJ,UAAU4B,UAAW,CAC5B,MAAMC,EAAalL,KAAKqJ,UAAU4B,UAAU/F,QAAQ,kBAAmB,IACvElF,KAAKmL,mBAAmBD,GACxBlL,KAAKoL,aAEPtE,OCtI0T,MCQ1T,I,UAAY,eACd,GACA/G,EACAS,GACA,EACA,KACA,KACA,OAIa,M,kCCnBX,GAAS,WAAa,IAAItB,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,OAAOC,MAAOP,EAAImM,sBAAuB,CAAClM,EAAG,oBAAoB,CAACmM,IAAI,aAAa9L,YAAY,iBAAiBG,MAAM,CAAC,cAAgBT,EAAIqM,OAAO,SAAWrM,EAAIsM,cAAc,eAAiBtM,EAAIuM,sBAAsB,UAAYvM,EAAIwM,WAAWvK,GAAG,CAAC,mBAAmBjC,EAAIyM,UAAU,0BAA0BzM,EAAI0M,yBAA0B1M,EAAqB,kBAAEC,EAAG,MAAM,CAACA,EAAG,cAAc,CAACK,YAAY,mBAAmBG,MAAM,CAAC,GAAK,UAAU,CAACR,EAAG,YAAYA,EAAG,OAAO,CAACD,EAAIE,GAAG,kBAAkB,IAAI,GAAGF,EAAIiB,KAAMjB,EAAI2M,gBAAgB3M,EAAIoG,UAAWnG,EAAG,MAAM,CAACG,MAAM,oCAC/oBJ,EAAIqM,OAD2oB,cAEjpBrM,EAAIsM,cAAgB,KAClCtM,EAAI2B,WAAa,aAAe,KAChC3B,EAAI4M,kBAAoB,uBAAyB,KACjD9L,KAAK+L,SAAY,aAAgB/L,KAAa,SAAI,IAAO,KAAK,CAACd,EAAIuD,GAAIvD,EAAiB,eAAE,SAAS8M,EAAQrJ,GAAO,OAAOxD,EAAG,UAAU,CAACd,IAAIsE,EAAMrD,MAAOJ,EAAI+M,aAA0E,IAA3D/M,EAAIgN,YAAYF,EAAQvG,MAAOvG,EAAI+M,aAAa5T,OAAgB,aAAe,GAAGsH,MAAM,CAAC,MAAQgD,EAAM,MAAQqJ,EAAQhP,KAAK,KAAOgP,EAAQG,WAAQlP,EAAU,YAAciC,EAAIkN,eAAeJ,GAAS,QAAW,WAAarJ,EAAO,MAAQzD,EAAIgN,YAAYF,EAAQvG,MAAOvG,EAAI+M,aAAa,WAAa/M,EAAI+M,YAAY,SAAW/M,EAAIsM,eAAerK,GAAG,CAAC,YAAc,SAASC,GAAQ,OAAOlC,EAAImN,qBAAqB,0BAA0BnN,EAAI0M,4BAA4B1M,EAAc,WAAEC,EAAG,iBAAiBD,EAAIiB,MAAM,GAAGjB,EAAIiB,KAAMjB,EAAIoN,iBAAkBnN,EAAG,MAAM,CAACK,YAAY,WAAW,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAI+M,YAAc/M,EAAIoD,GAAG,mBAAqBpD,EAAIoD,GAAG,iBAAiB,OAAOpD,EAAIiB,KAAMjB,EAAc,WAAEC,EAAG,oBAAoBD,EAAIiB,KAAKhB,EAAG,qBAAqB,IAC16B,GAAkB,GCNlB,GAAS,WAAa,IAAID,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,UAAU,CAAED,EAAiB,cAAEC,EAAG,YAAY,CAACmM,IAAI,YAAYnK,GAAG,CAAC,mBAAmBjC,EAAIqN,yBAAyBrN,EAAIiB,KAAKhB,EAAG,MAAM,CAACK,YAAY,iBAAiB,CAACL,EAAG,MAAM,CAACG,MAAO,sBAAyBJ,EAAIsN,gBAA2B,GAAT,SAAe,CAACrN,EAAG,iBAAiBA,EAAG,iBAAiB,CAACQ,MAAM,CAAC,cAAgBT,EAAIuN,iBAAiBtN,EAAG,mBAAmB,CAACQ,MAAM,CAAC,SAAWT,EAAIwN,YAAYvN,EAAG,kBAAoC,SAAjBD,EAAIyN,UAAsBxN,EAAG,cAAc,CAACQ,MAAM,CAAC,SAAWT,EAAIyN,aAAazN,EAAIiB,MAAM,GAAGhB,EAAG,MAAM,CAACG,MAAO,wBAA0BJ,EAAIsN,gBAAiB,WAAa,aAAc,CAACrN,EAAG,SAAS,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,OAASmB,EAAIsN,gBAAiB,OAAS,QAAU,iBAAmBtL,WAAW,wDAAwDvB,MAAM,CAAC,SAAW,MAAMwB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAI0N,8BAA8B,CAAE1N,EAAmB,gBAAEC,EAAG,aAAaA,EAAG,aAAa,OAAOA,EAAG,wBAAwBA,EAAG,iBAAiB,IAC9jC,GAAkB,GCDlB,GAAS,WAAa,IAAID,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,OAAO,CAACG,MAAMJ,EAAI2N,cAAgB,UAAY,SAAS1L,GAAG,CAAC,OAAS,SAASC,GAAgC,OAAxBA,EAAO0L,iBAAwB5N,EAAI6N,gBAAgB/T,MAAM,KAAMgU,cAAc,CAAC7N,EAAG,QAAQ,CAACQ,MAAM,CAAC,IAAM,iBAAiB,CAACT,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,2BAA2BnD,EAAG,MAAM,CAACK,YAAY,eAAe,CAACL,EAAG,QAAQ,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,QAAQgE,QAAQ,UAAUjD,MAAOmB,EAAS,MAAEgC,WAAW,UAAUoK,IAAI,SAAS3L,MAAM,CAAC,GAAK,eAAe,YAAcT,EAAIoD,GAAG,8BAA8B+D,SAAS,CAAC,MAASnH,EAAS,OAAGiC,GAAG,CAAC,MAAQ,CAAC,SAASC,GAAWA,EAAO5F,OAAOyR,YAAqB/N,EAAIyE,MAAMvC,EAAO5F,OAAOuC,QAAOmB,EAAIqN,uBAAuB,QAAU,SAASnL,GAAQ,OAAIA,EAAOjG,KAAK+R,QAAQ,QAAQhO,EAAIiO,GAAG/L,EAAOgM,QAAQ,MAAM,GAAGhM,EAAO/C,IAAI,CAAC,MAAM,WAAoB,KAAca,EAAImO,iBAAiBrU,MAAM,KAAMgU,gBAAkB9N,EAAIoO,YAAYC,kBAAqBrO,EAAIyE,MAAMtL,OAAS,EAAG8G,EAAG,IAAI,CAACK,YAAY,mBAAmB,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,+BAA+B,OAAOpD,EAAIiB,OAAQjB,EAAIyE,MAAMtL,OAAS,EAAG8G,EAAG,IAAI,CAACK,YAAY,eAAeG,MAAM,CAAC,MAAQT,EAAIoD,GAAG,gCAAgCnB,GAAG,CAAC,MAAQjC,EAAImO,mBAAmB,CAACnO,EAAIE,GAAG,OAAOF,EAAIiB,QAC9uC,GAAkB,GCIP,MAAMqN,GACnBC,YAAY9K,GACV3C,KAAK2C,MAAQA,EAGf+K,aACE1N,KAAK2C,MAAQ,EAKfgL,gBAAgBtP,QACKpB,IAAf+C,KAAK2C,MAAqB3C,KAAK2C,MAAQ,EAC1B,KAARtE,EACP2B,KAAK2C,OAAS,EACG,KAARtE,EACT2B,KAAK2C,MAAQ6K,GAAmBI,aAAa5N,KAAK2C,OACjC,KAARtE,EACT2B,KAAK2C,OAAS,EACG,KAARtE,IACT2B,KAAK2C,MAAQ6K,GAAmBK,SAAS7N,KAAK2C,QAGhD3C,KAAK2C,MAAQ6K,GAAmBM,oBAAoB9N,KAAK2C,OACzD6K,GAAmBO,kBAAkB/N,KAAK2C,OAAOqL,QAI/B,uBAClB,OAAOtT,SAASuT,uBAAuB,QAAQ5V,OAIvB,2BAACsK,GACzB,MAAMuL,EAAaV,GAAmBW,gBACtC,OAAIxL,EAAQ,EAAUuL,EAAa,EAC1BvL,GAASuL,EAAmB,EAC9BvL,EAIe,yBAACA,GACvB,OAAQA,GAAS,GAAKA,GAAS6K,GAAmBW,gBAC9CzT,SAASuT,uBAAuB,QAAQtL,GAAS,CAACjI,SAASuT,uBAAuB,SAIlE,uBAACG,GACrB,MAAMC,EAAY,CAACC,EAAMC,IAAQf,GAAmBO,kBAAkBO,GAAME,YAAcD,EACpFE,EAAqB,CAACC,EAAcC,IACpCD,GAAgBlB,GAAmBW,gBAAwBM,EAAmB,EAAGE,GAC5EN,EAAUK,EAAcC,GAAcF,EAAmBC,EAAe,EAAGC,GAC7ED,EAEHE,EAAWpB,GAAmBO,kBAAkBK,GAAeI,UACrE,OAAOC,EAAmBL,EAAeQ,GAIxB,oBAACR,GAClB,MAAMS,EAAU,CAACC,EAAOC,IAASvB,GAAmBO,kBAAkBe,GAAON,UACzEhB,GAAmBO,kBAAkBgB,GAAKP,UACxCQ,EAAYxB,GAAmByB,gBAAgBb,GAC/Cc,EAAQF,EAAYZ,EACpBe,EAASH,EAAYxB,GAAmB4B,YAAYhB,GAAiB,EACrEiB,EAAaR,EAAQT,EAAeY,GAAa,EAAIG,EAASD,EACpE,OAAOF,EAAYK,EAIH,mBAACjB,GACjB,MAAMC,EAAY,CAACC,EAAMC,IAAQf,GAAmBO,kBAAkBO,GAAME,YAAcD,EACpFe,EAAiB,CAACZ,EAAcC,IAChCD,GAAgBlB,GAAmBW,gBAAwBmB,EAAe,EAAGX,GACxEN,EAAUK,EAAcC,GAAcW,EAAeZ,EAAe,EAAGC,GACzED,EAEHE,EAAWpB,GAAmBO,kBAAkBK,GAAeI,UACrE,OAAOc,EAAelB,EAAeQ,GAIxB,gBAACR,GACd,MAAMmB,EAAU,CAACT,EAAOC,IAASvB,GAAmBO,kBAAkBe,GAAON,UACzEhB,GAAmBO,kBAAkBgB,GAAKP,UACxCQ,EAAYxB,GAAmB4B,YAAYhB,GAC3Cc,EAAQF,EAAYZ,EACpBe,EAASH,EAAYxB,GAAmByB,gBAAgBb,GAAiB,EACzEiB,EAAaE,EAAQnB,EAAeY,GAAa,EAAIG,EAASD,EACpE,OAAOF,EAAYK,G,4BC5ER,MAAMG,GACnB/B,cACEzN,KAAKyP,KAAOA,KAIdpG,YACE,IAAIqG,EAAgB,GAEhB1P,KAAKyP,OAAMC,EAAgB1P,KAAKyP,KAAKpG,WAAa,IAEtD,IAAIsG,EAAiBC,eAcrB,OAbIpF,aAAaqF,sBAAiBC,YAChCH,EAAiBI,KAAKC,MAAMxF,aAAaqF,sBAAiBC,aACjDJ,IAAkB,KAC3BC,EAAiBD,GAGnBC,EAAepE,OAASf,aAAaqF,sBAAiBI,qBACjDP,EAAcnE,QAAU2E,YAC7BP,EAAejD,SAAWlC,aAAaqF,sBAAiBM,YACnDT,EAAchD,UAAY0D,cAE3BV,EAAcW,OAAMV,EAAeU,KAAOX,EAAcW,MAErDV,EAITtP,WACE,IAAIiQ,EAAgB,GACpB,GAAI9F,aAAaqF,sBAAiBU,WAEhC,IAAMD,EAAgBP,KAAKC,MAAMxF,aAAaqF,sBAAiBU,YAC/D,MAAOtW,GAAKqO,GAAa,4CAE3B,MAAMkI,EAAexQ,KAAKyP,MAAOzP,KAAKyP,KAAKpP,UAAiB,GAC5D,MAAO,IAAKoQ,iBAAoBD,KAAiBF,GAInDhL,WACE,IAAIA,EAAW,GAEf,MAAMoL,EAAgBlG,aAAaqF,sBAAiBc,eACpD,GAAID,EACF,IACE,MAAME,EAAOb,KAAKC,MAAMU,GACpBE,EAAKvY,QAAU,IAAGiN,EAAWsL,GACjC,MAAO3W,GACPqO,GAAa,2CASjB,OALwB,IAApBhD,EAASjN,SACXiN,EAAWtF,KAAKyP,MAAOzP,KAAKyP,KAAKnK,UAAiB,IAGpDA,EAAWF,EAAYE,GAChBA,EAIT8D,SACE,MAAO,CACLC,UAAWrJ,KAAKqJ,YAChBhJ,SAAUL,KAAKK,WACfiF,SAAUtF,KAAKsF,a,4BC/ErB,MAAMuL,GAAe,KACnB,MAAMC,EAAc,IAAItB,GAClBpG,EAAS0H,EAAY1H,SAC3B,OAAOA,EAAOC,WAAa,IAQvB0H,GAAe,KACnBzI,GAAa,yEAIF0I,GAAoB,KAC/B,MAAM3H,EAAYwH,KAClB,OAAKxH,EAAUgH,MACRhH,EAAUgH,KAAKY,iBADM,GAKjBC,GAAoB,KAC/B,MAAM7H,EAAYwH,KAClB,IAAKG,KAAqB,OAAO,EACjC,MAAM,SAAEG,GAAa9H,EAAUgH,MACzB,UAAEe,EAAF,MAAaC,EAAb,SAAoBC,GAAaH,EACvC,OAAKC,GAAcC,GAAUC,EAItBH,GAHL7I,GAAa,mFACN,IAMLiJ,GAAW,KACf,MAAMlI,EAAYwH,KACZR,EAAOhH,EAAUgH,MAAQ,GAE/B,OAAIrN,MAAMwO,QAAQnB,IAChBU,KACO,IAGFV,EAAKoB,OAAS,IAQjBC,GAAqBC,IACzB,MAAMC,EAAejO,GAAUA,EAAMI,WAAW8N,cAC1CC,EAAMC,KAAOH,EAAYD,EAAKA,MAAQC,EAAYD,EAAKK,OAC7D,OAAOJ,EAAYE,IAQRG,GAAa,KACxB,MAAMR,EAAQF,KACRW,EAAcT,EAAM5M,IAAK8M,GAASD,GAAkBC,IAC1D,IAAIQ,GAAoB,EAYxB,OAXAzX,SAAS0X,OAAO/N,MAAM,KAAK7C,QAAS4Q,IAClC,GAAIA,GAAUA,EAAO/N,MAAM,KAAKhM,OAAS,EAAG,CAC1C,MAAMga,EAAYD,EAAO/N,MAAM,KAAK,GAAGiO,OACjCC,EAAcH,EAAO/N,MAAM,KAAK,GAAGiO,OACrCD,IAAcG,gBAAWC,YACvBP,EAAYzO,SAAS8O,KACvBJ,GAAoB,MAKrBA,GAIIO,GAAgB,KAC3B,MAAMjB,EAAQF,KACd,OAAQE,EAAMpZ,OAAS,GAIZsa,GAAuB,KAClC,MAAMtJ,EAAYwH,KAClB,OAAIxH,EAAUgH,MAAkC,kBAAnBhH,EAAUgH,MAC9BhH,EAAUgH,KAAKuC,oBAEjB,GAYIC,GAAmB,CAACC,EAAUC,EAAMtB,EAAOuB,KACtD,IAAIC,EAgBJ,OAfKH,EAEOC,EAGVtB,EAAMjQ,QAASmQ,IACTA,EAAKA,KAAKxM,gBAAkB2N,EAAS3N,gBAErC8N,EADEtB,EAAKK,KAAK7M,gBAAkB4M,KAAOgB,GAAMhP,WAAWoB,cAC3C,CAAE+N,SAAS,EAAM9L,IAAK4L,EAASG,YAE/B,CAAED,SAAS,EAAO9L,IAAK4L,EAASI,sBAPjDH,EAAW,CAAEC,SAAS,EAAO9L,IAAK4L,EAASK,iBAF3CJ,EAAW,CAAEC,SAAS,EAAO9L,IAAK4L,EAASM,iBActCL,GAAY,CAAEC,SAAS,EAAO9L,IAAK4L,EAASO,oBASxCC,GAAQ,CAACV,EAAUC,EAAMxW,KACpC,MAAMiL,EAAM,IAAIC,KACVgM,EAAS,IAAIhM,KAAKD,EAAIkM,QAAQlM,EAAImM,UAAYpX,IAAUqX,cACxDC,EAAa,CAAElC,KAAMmB,EAAUd,KAAMD,KAAOgB,GAAMhP,WAAWoB,eACnEzK,SAAS0X,OAAU,uBAAsBV,GAAkBmC,OACpDtX,EAAU,EAAK,WAAUkX,EAAW,IAC3CjJ,aAAanC,QAAQwH,sBAAiBiE,SAAUhB,IAMrCiB,GAAS,KACpBrZ,SAAS0X,OAAS,2BAClB5H,aAAawJ,WAAWnE,sBAAiBiE,WAQ9BG,GAAiB,KAC5B,IAAKhC,KAAc,OAAO,EAC1B,MAAMa,EAAWtI,aAAaqF,sBAAiBiE,UAC/C,IAAKhB,EAAU,OAAO,EACtB,IAAIoB,GAAkB,EAKtB,OAJA3C,KAAW/P,QAASmQ,IAEdA,EAAKA,OAASmB,IAAUoB,EAAkBvC,KAEzCuC,GAOIC,GAAoB,KAC/B,MAAMC,EAAezB,KACf0B,GAAepC,KACrB,OAAOmC,GAAgBC,GAYZC,GAAc,KACzB,MAAM7C,EAAQF,KACd,GAAqB,IAAjBE,EAAMpZ,OAAc,OAAO,EAC/B,IAAK4Z,KAAc,OAAO,EAC1B,MAAMsC,EAAc/J,aAAaqF,sBAAiBiE,UAClD,IAAIU,GAAU,EAMd,OALA/C,EAAMjQ,QAASmQ,IACTA,EAAKA,OAAS4C,GACE,UAAd5C,EAAKxW,OAAkBqZ,GAAU,KAGlCA,GAWIC,GAAe,KAC1B,MAAM,cAAEC,EAAF,SAAiBC,EAAjB,YAA2BC,GAAgBC,mBACjD,OAAKnC,KACDT,KAAqB0C,EACrBhC,KAA+BiC,EAC5BF,EAHsBA,GC7MzBI,GAAsB,CAACC,EAAgBC,KAC3C,IAAIC,GAAU,EAId,OAHAF,EAAevT,QAAS0T,IAClBA,EAAW/P,gBAAkB6P,IAAWC,GAAU,KAEjDA,GAIHE,GAAyB,CAACC,EAAab,EAAac,KAExD,MAAMC,EAAiB,KACrB,IAAKf,EAAa,OAAO,EACzB,MAAMgB,EAAUH,EAAYI,cAAgB,GACtCR,EAAYT,EAAY5C,KAAKxM,cACnC,OAAQ2P,GAAoBS,EAASP,IAGjCS,EAAqB,KACzB,IAAKlB,EAAa,OAAO,EACzB,MAAMS,EAAYT,EAAY5C,KAAKxM,cAC7BuQ,EAAeN,EAAYM,cAAgB,GACjD,OAAIA,EAAard,OAAS,GACnByc,GAAoBY,EAAcV,IAGrCW,EAAsB,KAC1B,MAAMC,EAAeR,EAAYS,cACjC,QAASD,GAAgBP,IAE3B,OAAOC,KAAoBG,KAAwBE,KAI/CG,GAA0BxQ,IAC9B,MAAMiP,EAAcN,KACdoB,EAAUlB,KAChB,OAAO7O,EAASyQ,OAAQC,IACtB,MAAMZ,EAAcY,EAAeZ,aAAe,GAClD,OAAOD,GAAuBC,EAAab,EAAac,MAI7CS,U,gNClCR,MAAM1L,GAAY,CACvB,CACEpN,KAAM,UACNpB,KAAM,KACN+O,OAAQsL,GACRC,KAAM,QAER,CACElZ,KAAM,UACNpB,KAAM,KACN+O,OAAQwL,GACRD,KAAM,QAER,CACElZ,KAAM,QACNpB,KAAM,KACN+O,OAAQyL,GACRF,KAAM,QAER,CACElZ,KAAM,SACNpB,KAAM,KACN+O,OAAQ0L,GACRH,KAAM,QAER,CACElZ,KAAM,WACNpB,KAAM,KACN+O,OAAQ2L,GACRJ,KAAM,QAER,CACElZ,KAAM,cACNpB,KAAM,KACN+O,OAAQ4L,GACRL,KAAM,QAER,CACElZ,KAAM,UACNpB,KAAM,KACN+O,OAAQ6L,GACRN,KAAM,QAER,CACElZ,KAAM,WACNpB,KAAM,KACN+O,OAAQ8L,GACRP,KAAM,QAER,CACElZ,KAAM,OACNpB,KAAM,KACN+O,OAAQ+L,GACRR,KAAM,QAER,CACElZ,KAAM,UACNpB,KAAM,KACN+O,OAAQgM,GACRT,KAAM,QAER,CACElZ,KAAM,OACNpB,KAAM,KACN+O,OAAQiM,GACRV,KAAM,QAER,CACElZ,KAAM,MACNpB,KAAM,KACN+O,OAAQkM,GACRX,KAAM,QAER,CACElZ,KAAM,YACNpB,KAAM,KACN+O,OAAQmM,GACRZ,KAAM,QAER,CACElZ,KAAM,UACNpB,KAAM,KACN+O,OAAQoM,GACRb,KAAM,QAER,CACElZ,KAAM,QACNpB,KAAM,KACN+O,OAAQqM,GACRd,KAAM,QAER,CACElZ,KAAM,SACNpB,KAAM,SACN+O,OAAQsM,GACRf,KAAM,UAgBJgB,GAAe,GACrB9M,GAAU5I,QAAS2V,IACjBD,GAAaC,EAAKvb,MAAQub,EAAKxM,SAE1B,MAAMqI,GAAWkE,G,iBCtHjB,MAAM9N,GAAS,MACpB,MAAM0H,EAAc,IAAItB,GACxB,MAAO,CACLnG,UAAWyH,EAAYzH,YACvBhJ,SAAUyQ,EAAYzQ,WACtBiF,SAAU8R,GAAmBtG,EAAYxL,cALvB,GAiBT+R,GAAuBhO,IAElC,MAAMiO,EAAcjO,EAAUkO,gBAAkB,GAE1CC,EAAWC,GAAmC,mBAAdA,EAEtC,MAAO,CACLxR,UAAWuR,EAAQF,EAAYI,cAC1BJ,EAAYI,YAAcpX,uBAAkB2F,UACjDC,WAAYsR,EAAQF,EAAYK,UAC3BL,EAAYK,QAAUrX,uBAAkB4F,WAC7C0R,UAAWJ,EAAQF,EAAYO,aAC1BP,EAAYO,WAAavX,uBAAkBsX,UAChDE,SAAUN,EAAQF,EAAYS,eACzBT,EAAYS,aAAezX,uBAAkBwX,SAClDE,OAAQR,EAAQF,EAAYW,aACvBX,EAAYW,WAAa3X,uBAAkB0X,OAChDE,aAAcV,EAAQF,EAAYa,mBAC7Bb,EAAYa,iBAAmB7X,uBAAkB4X,eAS7CE,GAAW,KACtB,MAAMC,EAAa7N,aAAaqF,sBAAiByI,OAC3CC,EAAiBnP,GAAOC,UAAUmP,MACxC,OAAOH,GAAcE,GAAkBE,YAO5BC,GAAkB,KAC7B,MAAMC,EAAc5I,KAAKC,MAAMxF,aAAaqF,sBAAiB+I,gBAAkB,MACzEC,EAAezP,GAAOC,UAAUyP,cAAgB,GACtD,OAAOxgB,OAAOuH,OAAOgZ,EAAcF,IAOxBI,GAAwB,KACnC,MAAMC,EAAU,GACV1T,EAAW8D,GAAO9D,UAAY,GAKpC,OAJAA,EAAS9D,QAASwK,IAChB,MAAMiN,EAAmBjN,EAAQvG,MAAMsQ,OAAOrQ,GAAQA,EAAKwT,QAC3DF,EAAQrgB,KAAKsgB,EAAiBpU,IAAIa,IAAQ,CAAGwT,OAAQxT,EAAKwT,OAAQC,IAAKzT,EAAKyT,UAEvEH,EAAQI,QAOJC,GAAmB,KAC9B,MAAMC,EAAW9O,aAAaqF,sBAAiB0J,WAC1CnQ,GAAOC,UAAUY,UACjBuP,cACCC,EAAUrP,GAAUsP,KAAKvC,GAAQA,EAAKvb,OAAS0d,GACrD,OAAOG,GASIE,GAAmBne,IAC9B,MAAMoe,EAAkBC,GAAaC,WAAWxU,SAASG,MACtDqU,WAAWrU,MAAMA,MAAMqU,WAAWte,OAAOue,KACtCC,GAAqD,IAArCJ,EAAgB1M,QAAQ1R,GAE9C,OADKwe,GAAe1R,GAAc,yBAAwB9M,GACnDwe,GCvGHC,GAAoBd,IACxB,IAAKA,EAAK,MAAO,GACjB,MAAMe,EAAa,0EACbC,EAAgBhB,EAAIiB,MAAMF,GAChC,OAAOC,EAAgBA,EAAc,GAAK,IAUtCE,GAAe,CAACC,EAAYC,KAChC,IAAKD,EAAY,OAAO,EACxB,MAAME,EAAW7W,GAAUA,GAASA,EAAMI,WAAWoB,cAAcD,QAAQ,YAAa,IACxF,OAAOsV,EAAQF,GAAY7W,SAAS+W,EAAQD,KAWjCE,GAAc,CAACC,EAAUC,IAC/BA,EACAD,EACEA,EAAS3E,OAAQ6E,IACtB,MAAM,MACJna,EADI,YACGC,EADH,SACgBma,EADhB,IAC0B1B,EAD1B,KAC+B2B,GACjCF,EACJ,OAAOP,GAAa5Z,EAAOka,IACtBN,GAAaQ,EAAUF,IACvBN,GAAa3Z,EAAaia,IAC1BN,GAAaS,EAAMH,IACnBN,GAAaJ,GAAiBd,GAAMwB,KATrB,GADED,EAebK,GAA0B,CAACC,EAAaC,KACnD,MAAMC,EAAY5iB,OAAO6iB,KAAKF,GACxBG,EAAYF,EAAUxB,KAAM2B,GAASL,EAAYvX,SAAS4X,IAChE,OAAOJ,EAASG,IAILE,GAAyB,CAACC,EAAcC,KAEnD,GAAKD,EAEL,MAAK,wBAAyBE,KAAKF,GAAsBA,EAErDC,EAAuBD,GAAsBC,EAAuBD,QAExEjT,GAAc,2CAA0CiT,MANnCjT,GAAa,+BAWvBoT,GAAa,CAACV,EAAaC,KACtC,MAAMC,EAAY5iB,OAAO6iB,KAAKF,GAAY,IAC1C,IAAIU,EAAIX,EAER,OADAE,EAAU1Z,QAAS6Z,IAAWM,EAAIA,EAAEzW,QAAQmW,EAAM,MAC3CM,EAAErJ,QC3CX,QACEtV,KAAM,aACNyE,MAAO,CACLoL,cAAe+O,SAEjB,OACE,MAAO,CACLjY,MAAO,GACPkY,IAAK,IAAIrO,GACTuL,sBAAN,KAGElX,SAAU,CACR,SACE,OAAQ7B,KAAK8B,OAAOC,MAAM2J,WAE5B,cACE,OAAO1L,KAAK8B,OAAOkE,QAAQ8V,WAAa,KAG5C,UACEjd,OAAOkd,iBAAiB,UAAW/b,KAAKgc,iBAE1C,gBACEnd,OAAOod,oBAAoB,UAAWjc,KAAKgc,iBAE7C/Z,QAAS,CAEP,eAAe3G,GACb,MAAM4gB,EAAcxhB,SAASyhB,cAAcvW,IACrC,IAAZ,eACYwW,EAAsC,iBAAhBF,EAEvBlc,KAAKqc,SACN,gBAAgBZ,KAAKpd,IAAQ+d,GAE3Bpc,KAAKsc,MAAMvG,QAAQ/V,KAAKsc,MAAMvG,OAAO/H,QACzChO,KAAKuM,yBACb,kBAEQvM,KAAKuc,aAAale,GAC1B,aAEQ2B,KAAK6b,IAAIlO,gBAAgBP,GACjC,QAEQpN,KAAKqN,qBAIT,wBACErN,KAAKwc,MAAM,mBAAoBxc,KAAK2D,QAGtC,mBACE3D,KAAK2D,MAAQ,GACb3D,KAAKuM,wBACL7R,SAASyhB,cAAcM,OACvBzc,KAAK6b,IAAInO,cAGX,aAAarP,GACX,MAAMqe,EAAe1c,KAAK+Y,wBAC1B2D,EAAalb,QAAQ,IACf0X,EAAOA,SAAWyD,SAASte,EAAK,KAC9B6a,EAAOC,KAAKta,OAAO+d,KAAK1D,EAAOC,IAAK,aAK9C,gBAAgBA,EAAK0D,GACnB,OAAQA,GACN,IAAK,SACHhe,OAAO+d,KAAKzD,EAAK,UACjB,MACF,IAAK,UACHta,OAAO+d,KAAKzD,EAAK,SACjB,MACF,IAAK,YACH,GAAV,uCACU,MACF,QACE,GAAV,8BACUta,OAAO+d,KAAKzD,EAAK,YAKvB,kBAEE,MAAM,YAAZ,QACM,IAAK7L,EAAYC,iBAAkB,CACjC,MAAM0N,EAAW,IAAK,EAA9B,qCACc6B,EAAgBxP,EAAYwP,eAAiB,EAA3D,8BACcC,EAAahC,GAAwB/a,KAAK2D,MAAOsX,GACjDM,EAAejO,EAAYiO,cAAgB,EAAzD,uBAEcyB,EAAsBD,GAAcxB,EACpC0B,EAAd,WAA+B,EAA/B,mCACQ,IAAIC,EAAYD,EACxB,qBACA,4BACYC,IACFA,GAAaC,mBAAmBzB,GAAW1b,KAAK2D,MAAOsX,IACvDjb,KAAKod,gBAAgBF,EAAWJ,GAChC9c,KAAKqN,wBC5ImV,MCQ9V,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAInO,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,gBAAgBgE,QAAQ,kBAAkBjD,MAAOmB,EAAqB,kBAAEgC,WAAW,sBAAsB1B,YAAY,kBAAkB,CAACL,EAAG,OAAO,CAACK,YAAY,gBAAgB,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,sCAAsCnD,EAAG,MAAM,CAACK,YAAY,kBAAkB,CAACL,EAAG,cAAc,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,qCAAsCpB,WAAW,oDAAoDvB,MAAM,CAAC,SAAW,MAAMwB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIme,iBAAiBle,EAAG,wBAAwB,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoe,sBAAuBpc,WAAW,kCAAkC5B,MAAMJ,EAAI2B,WAAa,WAAa,GAAGlB,MAAM,CAAC,SAAW,MAAMwB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIqe,6BAA6Bpe,EAAG,eAAe,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,2CAA4CpB,WAAW,0DAA0DvB,MAAM,CAAC,SAAW,MAAMwB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIse,0BAA0B,GAAGre,EAAG,QAAQ,CAACQ,MAAM,CAAC,KAAOT,EAAIue,WAAWC,YAAY,WAAY,EAAK,MAAQ,MAAM,OAAS,MAAM,QAAU,eAAevc,GAAG,CAAC,OAASjC,EAAIye,eAAe,CAACxe,EAAG,kBAAkB,CAACQ,MAAM,CAAC,OAAST,EAAI0e,oBAAoB,GAAGze,EAAG,QAAQ,CAACQ,MAAM,CAAC,KAAOT,EAAIue,WAAWI,cAAc,QAAU,cAAc,WAAY,EAAK,MAAQ,MAAM,OAAS,QAAQ,CAAC1e,EAAG,qBAAqB,GAAID,EAAoB,iBAAEC,EAAG,MAAM,CAACK,YAAY,iBAAiB,CAACL,EAAG,KAAK,CAACA,EAAG,KAAK,CAACA,EAAG,cAAc,CAACQ,MAAM,CAAC,GAAK,UAAU,CAACR,EAAG,YAAYA,EAAG,OAAO,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,gCAAgC,IAAI,GAAGnD,EAAG,KAAK,CAACA,EAAG,cAAc,CAACQ,MAAM,CAAC,GAAK,aAAa,CAACR,EAAG,mBAAmBA,EAAG,OAAO,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,gCAAgC,IAAI,GAAGnD,EAAG,KAAK,CAACA,EAAG,cAAc,CAACQ,MAAM,CAAC,GAAK,eAAe,CAACR,EAAG,qBAAqBA,EAAG,OAAO,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,kCAAkC,IAAI,OAAOpD,EAAIiB,MAAM,IACrnE,GAAkB,GCDlB,GAAS,WAAa,IAAIjB,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,OAAO,CAACmM,IAAI,UAAU3L,MAAM,CAAC,SAAU,EAAK,KAAO,aAAa,CAACR,EAAG,UAAU,CAACK,YAAY,WAAWG,MAAM,CAAC,KAAOT,EAAIoD,GAAG,qBAAqB,CAACnD,EAAG,MAAM,CAACK,YAAY,0BAA0B,CAACL,EAAG,MAAM,CAACK,YAAY,kBAAkB,CAACL,EAAG,KAAK,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,sBAAsBnD,EAAG,IAAI,CAACK,YAAY,oBAAoB2B,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAI4e,2BAA2B,CAAC3e,EAAG,SAAS,CAACK,YAAY,wBAAwB,CAACL,EAAG,eAAe,CAACK,YAAY,gBAAgBN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,kCAAkC,MAAM,KAAKnD,EAAG,SAAS,CAACK,YAAY,uBAAuB2B,GAAG,CAAC,MAAQ,WAAc,OAAOjC,EAAI6e,cAAc,MAAQ,CAAC5e,EAAG,WAAW,CAACK,YAAY,gBAAgBN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,8BAA8B,MAAM,GAAGnD,EAAG,SAAS,CAACK,YAAY,uBAAuB2B,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAI8e,6BAA6B,CAAC7e,EAAG,eAAe,CAACK,YAAY,gBAAgBN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,kCAAkC,MAAM,GAAGnD,EAAG,SAAS,CAACK,YAAY,uBAAuB2B,GAAG,CAAC,MAAQ,WAAc,OAAOjC,EAAI6e,cAAc,MAAQ,CAAC5e,EAAG,gBAAgB,CAACK,YAAY,gBAAgBN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,2BAA2B,MAAM,GAAGnD,EAAG,SAAS,CAACK,YAAY,uBAAuB2B,GAAG,CAAC,MAAQ,WAAc,OAAOjC,EAAI6e,cAAc,MAAQ,CAAC5e,EAAG,YAAY,CAACK,YAAY,gBAAgBN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAI+e,SAAW/e,EAAIoD,GAAG,iCAAmCpD,EAAIoD,GAAG,6BAA6B,MAAM,GAAGnD,EAAG,SAAS,CAACK,YAAY,uBAAuB2B,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIgf,yBAAyB,CAAC/e,EAAG,cAAc,CAACK,YAAY,gBAAgBN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,8BAA8B,MAAM,GAAGnD,EAAG,SAAS,CAACK,YAAY,uBAAuB2B,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIif,wBAAwB,CAAChf,EAAG,aAAa,CAACK,YAAY,gBAAgBN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,iCAAiC,MAAM,GAAGnD,EAAG,SAAS,CAACK,YAAY,uBAAuB2B,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIkf,oBAAoB,CAACjf,EAAG,YAAY,CAACK,YAAY,gBAAgBN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,2BAA2B,MAAM,GAAGnD,EAAG,IAAI,CAACK,YAAY,oBAAoBE,YAAY,CAAC,QAAU,SAAS,CAACR,EAAIE,GAAG,2FAA2FD,EAAG,IAAI,CAACK,YAAY,YAAY,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIwL,kBAAkBvL,EAAG,eAAe,GAAGA,EAAG,MAAM,CAACK,YAAY,eAAe,CAACL,EAAG,OAAO,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,8BAA8BnD,EAAG,eAAe,GAAGA,EAAG,UAAU,CAACQ,MAAM,CAAC,KAAOT,EAAIoD,GAAG,4BAA4B,CAACnD,EAAG,eAAe,GAAGA,EAAG,UAAU,CAACQ,MAAM,CAAC,KAAOT,EAAIoD,GAAG,sBAAsB,CAACnD,EAAG,uBAAuB,GAAGA,EAAG,UAAU,CAACQ,MAAM,CAAC,KAAOT,EAAIoD,GAAG,2BAA2B,CAACnD,EAAG,oBAAoB,IAAI,IACr1F,GAAkB,G,aCDlB,GAAS,WAAa,IAAID,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,qBAAqB,CAACL,EAAG,eAAe,CAACQ,MAAM,CAAC,QAAUT,EAAImf,SAASC,MAAM,CAACvgB,MAAOmB,EAAY,SAAEqf,SAAS,SAAUC,GAAMtf,EAAIuf,SAASD,GAAKtd,WAAW,cAAc/B,EAAG,QAAQ,CAACK,YAAY,eAAeG,MAAM,CAAC,MAAQT,EAAIoD,GAAG,qCAAqC,QAAUpD,EAAIwf,YAAY,cAAgBxf,EAAIyf,gBAAgB,UAAYzf,EAAI0f,kBAAkBN,MAAM,CAACvgB,MAAOmB,EAAY,SAAEqf,SAAS,SAAUC,GAAMtf,EAAI2f,SAASL,GAAKtd,WAAW,cAAc/B,EAAG,MAAM,CAACG,MAAO,kBAAqBJ,EAAI4f,QAAkB,GAAR,QAAc,CAAC3f,EAAG,SAAS,CAACQ,MAAM,CAAC,MAAQT,EAAI6f,OAAO,CAAC7f,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,8BAA8B,OAAOnD,EAAG,SAAS,CAACQ,MAAM,CAAC,MAAQT,EAAI8f,eAAe,CAAC9f,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,iCAAiC,QAAQ,GAAGnD,EAAG,IAAI,CAACK,YAAY,UAAU,CAACL,EAAG,KAAK,CAACD,EAAIuD,GAAIvD,EAAiB,eAAE,SAASxC,EAAMiG,GAAO,OAAOxD,EAAG,KAAK,CAACd,IAAIsE,EAAMrD,MAAO,QAAW5C,EAAU,MAAI,CAACwC,EAAIE,GAAG,IAAIF,EAAI4B,GAAGpE,EAAM0K,KAAK,UAAUlI,EAAI+f,cAAc5mB,OAAS,EAAG8G,EAAG,KAAK,CAACK,YAAY,cAAc,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,8BAA8B,OAAOpD,EAAIiB,MAAM,UAA0BlD,IAApBiC,EAAIggB,YAA2B/f,EAAG,IAAI,CAACG,MAAO,2BAA6BJ,EAAIggB,YAAc,UAAY,SAAU,CAAChgB,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIggB,YAAchgB,EAAIoD,GAAG,oCAAsCpD,EAAIoD,GAAG,kCAAkC,OAAOpD,EAAIiB,KAAOjB,EAAI0f,iBAA8H1f,EAAIiB,KAAhHhB,EAAG,IAAI,CAACK,YAAY,sBAAsB,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,iCAAiC,OAAgBnD,EAAG,IAAI,CAACK,YAAY,mBAAmB,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIigB,iBAAkBjgB,EAAe,YAAEC,EAAG,IAAI,CAACK,YAAY,mBAAmB,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,kCAAkC,IAAIpD,EAAI4B,GAAG5B,EAAIoD,GAAG,kCAAkC,OAAOpD,EAAIiB,KAAKhB,EAAG,IAAI,CAACK,YAAY,QAAQ,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,2BAA2B,IACh4D,GAAkB,G,6DCDlB,GAAS,WAAa,IAAIpD,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,SAAS,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAa,UAAEgC,WAAW,cAAc5B,MAAMJ,EAAIkgB,SAAW,aAAc,GAAGzf,MAAM,CAAC,KAAOT,EAAI/D,MAAQ,SAAS,SAAW+D,EAAImgB,SAAS,MAAQngB,EAAI+B,SAASE,GAAG,CAAC,MAAQ,SAASC,GAAQlC,EAAIogB,OAAQpgB,EAAIogB,WAA0C,CAACpgB,EAAIqgB,GAAG,WAAWrgB,EAAIqgB,GAAG,QAAQrgB,EAAIqgB,GAAG,SAAS,IACvc,GAAkB,GCgBtB,IACEviB,KAAM,SACNyE,MAAO,CACL0E,KAAMzE,OACN4d,MAAOE,SACPH,SAAUzD,QACVwD,SAAUxD,QACVzgB,KAAMuG,OACNT,QAASS,QAEXG,SAAU,CAER,YACE,MAAMQ,EAAUrC,KAAKiB,QACfwe,EAAU,cACVC,EAAQ,CAApB,mBACM,OAAO,EAAb,wCCjC+V,MCQ3V,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIxgB,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,mBAAmB,CAAEN,EAAS,MAAEC,EAAG,QAAQ,CAACK,YAAY,eAAe,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIygB,UAAUzgB,EAAIiB,KAAKhB,EAAG,MAAM,CAACK,YAAY,iBAAiBN,EAAIuD,GAAIvD,EAAW,SAAE,SAAS0gB,GAAO,OAAOzgB,EAAG,MAAM,CAACd,IAAIuhB,EAAM7hB,MAAMuB,MAAO,iBAAmBJ,EAAImgB,SAAW,gBAAkB,KAAM,CAAClgB,EAAG,QAAQ,CAACK,YAAY,eAAeG,MAAM,CAAC,IAAO,MAASigB,EAAW,QAAK,CAAC1gB,EAAIE,GAAGF,EAAI4B,GAAG8e,EAAMD,UAAUxgB,EAAG,QAAQ,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,QAAQgE,QAAQ,UAAUjD,MAAOmB,EAAiB,cAAEgC,WAAW,kBAAkB1B,YAAY,cAAcG,MAAM,CAAC,KAAO,QAAQ,GAAM,MAASigB,EAAW,MAAG,KAAO1gB,EAAI2gB,cAAc,SAAW3gB,EAAImgB,UAAYO,EAAMP,UAAUhZ,SAAS,CAAC,MAAQuZ,EAAM7hB,MAAM,QAAUmB,EAAI4gB,GAAG5gB,EAAI6gB,cAAcH,EAAM7hB,QAAQoD,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAI8gB,YAAY5e,EAAO5F,OAAOuC,QAAQ,OAAS,SAASqD,GAAQlC,EAAI6gB,cAAcH,EAAM7hB,eAAc,GAAImB,EAAe,YAAEC,EAAG,IAAI,CAACK,YAAY,qBAAqB,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIwB,gBAAgBxB,EAAIiB,QACzjC,GAAkB,GCsBtB,IACEnD,KAAM,QACN2E,WAAY,GACZF,MAAO,CACL4c,QAASrb,MACTid,cAAeve,OACfie,MAAOje,OACPhB,YAAagB,OACb2d,SAAUzD,SAEZ,OACE,MAAO,CACLmE,cAAe,KAGnB,UACM/f,KAAKigB,eACPjgB,KAAKggB,YAAYhgB,KAAKigB,gBAG1Bpe,SAAU,CACR,gBACE,OAAO7B,KAAK2f,MAAMxa,cAAcD,QAAQ,UAAW,MAGvDjD,QAAS,CACP,YAAYlE,GACViC,KAAKwc,MAAM,QAASze,GACpBiC,KAAK+f,cAAgBhiB,KCnDmU,MCQ1V,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QC6Cf,IACEf,KAAM,aACN2E,WAAY,CACVue,YAAJ,KACIC,OAAJ,GACIC,MAAJ,IAEE,OACE,MAAO,CACL3B,SAAU,GACVQ,cAAe,GACfJ,SAAU,GACVR,QAAS,CACPgC,OAAQ,GACRpiB,KAAM,OACNqiB,MAAO,CAAC,OAAQ,OAAQ,WACxBtjB,KAAM,SACNujB,kBAAmBvgB,KAAKwgB,kBAE1BrB,aAAc,GACdD,iBAAajiB,EACbwjB,SAAU,IAAI,GAApB,oCACM/B,YAAa,CACnB,CAAQ,MAAR,6CAAQ,MAAR,QACA,CAAQ,MAAR,8CAAQ,MAAR,YAIE7c,SAAU,CACR,SACE,OAAO7B,KAAK8B,OAAOC,MAAMqH,QAE3B,UACE,OAAOpJ,KAAKif,cAAc5mB,OAAS,GAErC,mBACE,MAAM,UAAZ,eACM,OAAqC,IAA9BgR,EAAUqX,iBAA6BpM,MAEhD,kBACE,OAAOtU,KAAK4e,iBAAmB,OAAS,UAG5C,UACE5e,KAAKye,SAAWze,KAAKoJ,OAChBpJ,KAAK4e,mBAAkB5e,KAAK6e,SAAW,UAE9C5c,QAAS,CAEP,OACwB,UAAlBjC,KAAK6e,UAAyB7e,KAAK4e,iBAE7C,uBACQ5e,KAAK2gB,oBAEL3gB,KAAK4gB,SAASze,KAAKnC,KAAKsC,GAAG,sCAJ3BtC,KAAK6gB,qBAQT,eACErY,GAAY,qCAAsCE,GAASI,YAC3D,MAAMjR,EAAOmI,KAAKye,SAClBze,KAAK8B,OAAOM,OAAO,EAAzB,4BACMpC,KAAK8B,OAAOM,OAAO,EAAzB,0BACMpC,KAAK8B,OAAOM,OAAO,EAAzB,yBACMpC,KAAK8B,OAAOM,OAAO,EAAzB,mBACMpC,KAAK8B,OAAOM,OAAO,EAAzB,kBACMpC,KAAKkC,OAAO4e,KAAK,EAAvB,4BAGI,oBAEE,MAAMC,EAAO,GAAnB,uBAEYC,EAAU,OAAtB,qGACYC,EAAW,GAAGD,IAAU,EAApC,2BACYE,EAAU,CAAtB,6BACY9d,EAAO,CAAnB,6BACY7H,EAAU,GAAtB,cAEMyE,KAAKygB,SAAS3R,QACdvT,EAAQU,KAAK,IACX+D,KAAKkf,YAAcjM,EAASpb,KAAKspB,UAAW,EAC5CnhB,KAAKmf,aAAelM,EAASpb,KAAKkF,QAC9BiD,KAAKkf,aACPlf,KAAKohB,6BACLphB,KAAKqhB,UAAUrhB,KAAKsC,GAAG,mCAAmC,IAE1DtC,KAAKqhB,UAAUrhB,KAAKsC,GAAG,wCAAwC,GAEjEkG,GAAY,8CAA+CE,GAASI,YACpE9I,KAAK8B,OAAOM,OAAO,EAA3B,0BACQpC,KAAKygB,SAAS1R,QAEtB,UACQ,KAAR,eACQ,KAAR,eACQ,KAAR,gBACQ,GAAR,6BACQ,KAAR,kBAII,oBACE,MAAMlX,EAAOmI,KAAKye,SACd5mB,EAAKyN,UACPkF,aAAanC,QAAQ,EAA7B,8DAEUxQ,EAAKwI,UACPmK,aAAanC,QAAQ,EAA7B,0DAEUxQ,EAAKwR,YACPxR,EAAKwR,UAAUgH,KAAOrQ,KAAKoJ,OAAOC,UAAUgH,MAAQ,GACpD7F,aAAanC,QAAQ,EAA7B,6DAEUxQ,EAAKwR,UAAUmP,OACjBhO,aAAanC,QAAQ,EAA7B,6CAEMG,GAAY,uDAAwDE,GAASI,YAC7E9I,KAAKqhB,UAAUrhB,KAAKsC,GAAG,oCAAoC,IAG7D,6BACEkI,aAAawJ,WAAW,EAA9B,+BACMxJ,aAAawJ,WAAW,EAA9B,gCACMxJ,aAAawJ,WAAW,EAA9B,oCAGI,iBAAiBsN,GACf,MAAMrC,EAAgB,GACtBqC,EAAO9f,QAAQ,IACb,OAAQ9E,EAAMvB,MACZ,IAAK,aACH8jB,EAActmB,KAAK,CACjBwC,KAAM,aACNiM,IAAQpH,KAAKsC,GAAG,wCAAX,KACnB,0CAEY,MACF,IAAK,QACH2c,EAActmB,KAAK,CACjBwC,KAAM,QACNiM,IAAK1K,EAAMK,UAEb,MACF,QACEkiB,EAActmB,KAAK,CACjBwC,KAAM,SACNiM,IAAKpH,KAAKsC,GAAG,sCAEf,SAGNtC,KAAKif,cAAgBA,GAGvB,UAAUliB,EAASokB,GACjBnhB,KAAK4gB,SAASze,KAAKpF,EAAS,CAAlC,8CC7NmW,MCQ/V,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,KACA,OAIa,M,QCnBX,GAAS,WAAa,IAAImC,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,oBAAoB,CAACL,EAAG,MAAM,CAACK,YAAY,6BAA6B,CAACL,EAAG,KAAK,CAACD,EAAIE,GAAG,gBAAgBD,EAAG,WAAW,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,QAAQgE,QAAQ,UAAUjD,MAAOmB,EAAa,UAAEgC,WAAW,cAAc1B,YAAY,aAAa6G,SAAS,CAAC,MAASnH,EAAa,WAAGiC,GAAG,CAAC,MAAQ,SAASC,GAAWA,EAAO5F,OAAOyR,YAAqB/N,EAAI+L,UAAU7J,EAAO5F,OAAOuC,WAAUmB,EAAIE,GAAG,KAAKD,EAAG,SAAS,CAACK,YAAY,cAAcG,MAAM,CAAC,MAAQT,EAAI6f,OAAO,CAAC7f,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,2BAA2BnD,EAAG,IAAI,CAACK,YAAY,cAAc,CAACL,EAAG,IAAI,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,0BAA0B,OAAOpD,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,uBAAuB,IAAIpD,EAAI4B,GAAG5B,EAAIoD,GAAG,uBAAuB,IAAIpD,EAAI4B,GAAG5B,EAAIoD,GAAG,uBAAuB,QAAQ,GAAGnD,EAAG,MAAM,CAACK,YAAY,oCAAoC,CAACL,EAAG,KAAK,CAACD,EAAIE,GAAG,gBAAgBD,EAAG,gBAAgB,CAACQ,MAAM,CAAC,aAAc,MAAS,GAAGR,EAAG,MAAM,CAACK,YAAY,iBAAiB,CAACL,EAAG,mBAAmB,CAACK,YAAY,eAAeG,MAAM,CAAC,YAAcT,EAAIqiB,iBAAiB,MAC1mC,GAAkB,GCDlB,GAAS,WAAa,IAAIriB,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACG,MAAO,+BAAiCJ,EAAIsiB,eAAiB,cAAgB,KAAM,CAACriB,EAAG,KAAK,CAACK,YAAY,sBAAsB,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,yBAAyBnD,EAAG,MAAM,CAACK,YAAY,uBAAuBN,EAAIuD,GAAInK,OAAO6iB,KAAKjc,EAAI4Z,eAAe,SAAS2I,GAAW,OAAOtiB,EAAG,MAAM,CAACd,IAAIojB,EAAUjiB,YAAY,aAAa,CAACL,EAAG,QAAQ,CAACK,YAAY,aAAaG,MAAM,CAAC,IAAO,eAAiB8hB,IAAa,CAACviB,EAAIE,GAAG,IAAIF,EAAI4B,GAAG2gB,EAAUC,WAAW,IAAK,MAAM,OAAQxiB,EAAIyiB,QAAQF,EAAWviB,EAAI4Z,aAAa2I,IAAatiB,EAAG,aAAa,CAACQ,MAAM,CAAC,gBAAgB,GAAG,sBAAsB,QAAQ,YAAY,OAAO,SAAWT,EAAI0iB,UAAUzgB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAI2iB,YAAYJ,EAAWviB,EAAI4Z,aAAa2I,MAAcnD,MAAM,CAACvgB,MAAOmB,EAAI4Z,aAAa2I,GAAYlD,SAAS,SAAUC,GAAMtf,EAAI4iB,KAAK5iB,EAAI4Z,aAAc2I,EAAWjD,IAAMtd,WAAW,4BAA4B,CAAC/B,EAAG,QAAQ,CAACK,YAAY,oCAAoCC,MAAOP,EAAI6iB,iBAAiBN,GAAY9hB,MAAM,CAAC,KAAO,UAAU,GAAM,eAAiB8hB,EAAW,SAAW,IAAIpb,SAAS,CAAC,MAAQnH,EAAI4Z,aAAa2I,IAAYO,KAAK,cAAc7iB,EAAG,QAAQ,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,QAAQgE,QAAQ,UAAUjD,MAAOmB,EAAI4Z,aAAa2I,GAAYvgB,WAAW,4BAA4B5B,MAAO,eAAiBJ,EAAI+iB,UAAUR,EAAWviB,EAAI4Z,aAAa2I,IAAc,aAAe,IAAK9hB,MAAM,CAAC,GAAM,eAAiB8hB,GAAYpb,SAAS,CAAC,MAASnH,EAAI4Z,aAAa2I,IAAatgB,GAAG,CAAC,MAAQ,CAAC,SAASC,GAAWA,EAAO5F,OAAOyR,WAAqB/N,EAAI4iB,KAAK5iB,EAAI4Z,aAAc2I,EAAWrgB,EAAO5F,OAAOuC,QAAQ,SAASqD,GAAQ,OAAOlC,EAAI2iB,YAAYJ,EAAWviB,EAAI4Z,aAAa2I,UAAkB,MAAK,GAAGtiB,EAAG,IAAI,CAACK,YAAY,oCAAoC2B,GAAG,CAAC,MAAQjC,EAAIgjB,oBAAoB,CAAChjB,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,oCAAoC,OAAOnD,EAAG,IAAI,CAACK,YAAY,oCAAoC2B,GAAG,CAAC,MAAQjC,EAAIijB,uBAAuB,CAACjjB,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,gCAAgC,OAAOnD,EAAG,IAAI,CAACK,YAAY,kBAAkB2B,GAAG,CAAC,MAAQjC,EAAIkjB,oBAAoB,CAACljB,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,8BAA8B,OAAOnD,EAAG,IAAI,CAACK,YAAY,kBAAkB2B,GAAG,CAAC,MAAQjC,EAAImjB,eAAe,CAACnjB,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,6BAA6B,KAAKpD,EAAI4B,GAAG5B,EAAIojB,aAAa,QAAQnjB,EAAG,MAAM,CAACK,YAAY,kBAAkB,CAACL,EAAG,SAAS,CAACQ,MAAM,CAAC,MAAQT,EAAIqjB,cAAc,CAACpjB,EAAG,YAAYD,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,4BAA4B,MAAM,GAAGnD,EAAG,SAAS,CAACQ,MAAM,CAAC,MAAQT,EAAIsjB,qBAAqB,CAACrjB,EAAG,cAAcD,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,8BAA8B,MAAM,IAAI,MACxoF,GAAkB,G,oFCoEtB,IACEtF,KAAM,aACN2E,WAAY,CACV8gB,UAAJ,KACItC,OAAJ,GACIuC,SAAJ,KACIC,WAAJ,MAEE,OACE,MAAO,CACL7J,aAAc9Y,KAAK4iB,gBAAgB,EAAzC,gBACMpB,gBAAgB,EAChBI,SAAN,gBAGEngB,MAAO,CACL6gB,YAAa5gB,QAEfO,QAAS,CAEP,oBAAoB4gB,GAClB,OAAOC,iBAAiBpoB,SAASqoB,iBAAiBC,iBAAiBH,GAAQvQ,QAAU,WAGvF,YAAY2Q,EAAUllB,GACpBrD,SAASqoB,gBAAgBtjB,MAAMyjB,YAAY,KAAKD,EAAYllB,IAG9D,cACE,MAAMolB,EAAgBpT,KAAKC,MAAMxF,aAAa,EAApD,0CACM2Y,EAAcnjB,KAAKsiB,aAAetiB,KAAK8Y,aACvCtO,aAAanC,QAAQ,EAA3B,qDACMrI,KAAK8B,OAAOM,OAAO,EAAzB,qBACMpC,KAAK4gB,SAASze,KAAKnC,KAAKsC,GAAG,0BAA2B,CAA5D,0BACMtC,KAAKwc,MAAM,2BAGb,qBACE,MAAM4G,EAAY9qB,OAAO6iB,KAAKnb,KAAK8Y,cACnCsK,EAAU5hB,QAAQ,IAChB9G,SAASqoB,gBAAgBtjB,MAAM4jB,eAAe,KAAKJ,KAErDjjB,KAAK8Y,aAAe9Y,KAAK4iB,gBAAgB,EAA/C,gBACM5iB,KAAKwc,MAAM,2BAGb,eACE,MAAM2G,EAAgBpT,KAAKC,MAAMxF,aAAa,EAApD,iDACa2Y,EAAcnjB,KAAKsiB,aAC1B9X,aAAanC,QAAQ,EAA3B,qDACMrI,KAAKwiB,qBACLxiB,KAAK4gB,SAASze,KAAKnC,KAAKsC,GAAG,0BAA2B,CAA5D,2BAGI,oBACE,MAAMghB,EAAYtjB,KAAKsiB,YAAYpd,QAAQ,MAAO7H,GAAKA,EAAEwU,eACzD,IAAI0R,EAAgB,wBAAwBD,MAC5ChrB,OAAO6iB,KAAKnb,KAAK8Y,cAActX,QAAQ,IACrC+hB,GAAiB,KAAzB,kCAEMvZ,UAAUwZ,UAAUC,UAAUF,GAC9BvjB,KAAK4gB,SAASze,KAAKnC,KAAKsC,GAAG,2BAA4B,CAA7D,YAGI,gBAAgBohB,GACd,MAAM7rB,EAAO,GACP8rB,EAAU,GAAtB,cACYC,EAAU,GAAtB,cACYC,EAAa,GAAzB,0BAIM,OAHAH,EAAcliB,QAAQ,IACpB3J,EAAKgsB,EAAWpC,IAAczhB,KAAK8jB,oBAAoBF,EAAQnC,MAE1D5pB,GAGT,oBACE,MAAMksB,EAAmB/jB,KAAK8Y,aACxBkL,EAAQ,CAAC,gBAAiB,YAAa,kBACvCC,EAAgBjkB,KAAK4iB,gBAAgBoB,GAC3ChkB,KAAK8Y,aAAe,IAAKiL,KAA/B,IAGI,uBACE,MAAMG,EAAqBlhB,MAAMmhB,KAAKzpB,SAAS0pB,aACrD,oEACA,OACA,WACA,KACA,8BACA,yDACA,8DACA,KAGA,IAEMpkB,KAAK8Y,aAAe9Y,KAAK4iB,gBAAgBsB,GACzClkB,KAAKwhB,gBAAiB,GAIxB,mBAAmB6C,GAEjB,MAAMC,EAAa,IACjB,IAAI3c,EAAQ4c,EAEZ,OADA5c,EAAQA,EAAMtD,MAAM,IAAIQ,IAAI,GAApC,wBACe8C,GAGH6c,EAAW,IACf,IAAIC,EAAUF,EAAIxlB,MAAM,EAAG,GACvBwlB,EAAIG,WAAW,MAAuB,IAAfH,EAAIlsB,SAAcosB,EAAUH,EAAWG,IAClE,MAAME,EAAa,4CAA4CC,KAAKH,GACpE,IAAKE,GAAcA,EAAWtsB,OAAS,EAAG,MAAO,QACjD,MAAM2X,EAAQ,GAAtB,kBACQ,OAAO2U,EAAa,CAA5B,4BAGYE,EAAe,IAA3B,6BACM,OAAKR,EAASK,WAAW,KAElBG,EAAaL,EAASH,EAAS/R,SAAW,IAAM,QAAU,QAF3B,SAKxC,iBAAiBmP,GACf,MAAMqD,EAAmB9kB,KAAK+kB,mBAAmB/kB,KAAK8Y,aAAa2I,IACnE,MAAO,cAAczhB,KAAK8Y,aAAa2I,YAC7C,6BAGI,QAAQuD,EAAcC,GAEpB,GAAI,WAAV,iBACM,MAAMC,EAAoB,CAC1B,kBAAN,iCACA,gEACA,4EACA,sFACA,4EACA,kDAGM,OAAIA,EAAkBzhB,SAAS,KAAKuhB,IAItC,UAAUG,EAASC,GACjB,OAAOD,EAAQT,WAAW,UAAY,GAA5C,eCxNyW,MCQrW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,KACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIxlB,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,gBAAgBgE,QAAQ,kBAAkBjD,MAAOmB,EAA0B,uBAAEgC,WAAW,2BAA2B1B,YAAY,0BAA0B,CAACL,EAAG,MAAM,CAACA,EAAG,OAAO,CAACK,YAAY,eAAe,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,4BAA4BnD,EAAG,WAAW,CAACK,YAAY,iBAAiBG,MAAM,CAAC,QAAUT,EAAImmB,WAAW,MAAQnmB,EAAI4C,OAAOkE,QAAQwS,MAAM,UAAY,GAAGrX,GAAG,CAAC,MAAQjC,EAAIomB,cAAchH,MAAM,CAACvgB,MAAOmB,EAAiB,cAAEqf,SAAS,SAAUC,GAAMtf,EAAIqmB,cAAc/G,GAAKtd,WAAW,oBAAoB,GAAKhC,EAAIsmB,YAA8NtmB,EAAIiB,KAArNhB,EAAG,cAAc,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAIoD,GAAG,qBAAsBpB,WAAW,4BAA4B1B,YAAY,eAAe2B,GAAG,CAAC,MAAQjC,EAAIumB,yBAAmCvmB,EAAyB,sBAAEC,EAAG,mBAAmB,CAACQ,MAAM,CAAC,YAAcT,EAAIqmB,eAAepkB,GAAG,CAAC,uBAAyB,SAASC,GAAQ,OAAOlC,EAAIwmB,6BAA6BxmB,EAAIiB,MAAM,IACziC,GAAkB,GCIf,MAAMwlB,GAAW,IAAMvN,KAGjBwN,GAAwBpN,IACnCqN,iBAAYrkB,QAASskB,IAAYprB,SAASqoB,gBAAgBtjB,MAAM4jB,eAAgB,KAAIyC,KACpF,MAAMC,EAAcrN,KAAkBF,GAClCuN,GACFztB,OAAO6iB,KAAK4K,GAAavkB,QAASwkB,IAChCtrB,SAASqoB,gBAAgBtjB,MAAMyjB,YAAa,KAAI8C,EAAaD,EAAYC,OAMlEC,GAAmBC,IAC9B,MAAMC,EAAUzrB,SAASC,qBAAqB,QAAQ,GAClDwrB,EAAQC,aAAa,eAAeD,EAAQE,gBAAgB,cAChEF,EAAQ1pB,aAAa,aAAcypB,IAOxBI,GAAoB,WAE/B,MAAMC,EAAgBhsB,IACpB,MAAMmI,EAAOhI,SAASQ,cAAc,QAIpC,OAHAwH,EAAK3H,IAAM,aACX2H,EAAKnI,KAAOA,EACZG,SAASqB,KAAKC,YAAY0G,GACnB,IAAItI,QAAQ,CAACC,EAASC,KAC3BoI,EAAKtH,OAASnB,IACZ,MAAM,MAAEusB,GAAUvsB,EAAEuB,OACpBgrB,EAAMnH,UAAW,EACjBhlB,EAAQmsB,IAEV9jB,EAAKrH,QAAUf,KAKbmsB,EAAa,CAACC,EAAQ1pB,OACpBA,GAAmB,WAATA,IAAsB0pB,EAAO1pB,MAC3CsL,GAAc,WAAUtL,GAAQ,sCACzB,GAML2pB,EAAc,CAACD,EAAQ1pB,KAC3B,GAAIypB,EAAWC,EAAQ1pB,GAAO,CAC5B,MAAMgB,EAAI0oB,EACVpuB,OAAO6iB,KAAKuL,GAAQllB,QAAQjD,IAAOP,EAAEO,GAAG8gB,SAAY9gB,IAAMvB,MAIxD0pB,EAAS,GAEf,MAAO,CACLE,IAAI5pB,EAAMzC,GAAQ,OAAOgsB,EAAahsB,GAAM0B,KAAKxC,IAAOitB,EAAO1pB,GAAQvD,KACvE,UAAUuD,GAAQ2pB,EAAYD,EAAQ1pB,IACtC,YAAc,OAAO1E,OAAO6iB,KAAKuL,GAAQhN,KAAKnb,IAAMmoB,EAAOnoB,GAAG8gB,a,4BC7BlE,IACEriB,KAAM,gBACNyE,MAAO,CACL+jB,YAAa5J,SAEfja,WAAY,CACVklB,iBAAJ,GACIC,YAAJ,MAEEC,MAAO,CAEL,eAAeb,GACblmB,KAAKulB,cAAgBW,EACrBlmB,KAAKgnB,YAAYd,KAGrB,OACE,MAAO,CACLX,cAAe,GACf0B,uBAAuB,EACvBC,YAAa,IAAIZ,GACjBL,gBAAN,GACML,qBAAN,KAGE/jB,SAAU,CAER,YACE,OAAO7B,KAAK8B,OAAOkE,QAAQqD,WAG7B,iBACE,OAAOrJ,KAAK8B,OAAOkE,QAAQwS,OAG7B6M,WAAY,WACV,MAAM8B,EAAqB7uB,OAAO6iB,KAAKnb,KAAKonB,gBACtCC,EAAgB,CAAC,UACvB,MAAO,IAAIF,KAAuB,EAAxC,uBAEI,kBACE,MAAMG,EAAatnB,KAAKqJ,UAAUke,WAAa,GAC/C,MAA0B,kBAAfD,EAAgC,CAACA,GACrCA,GAGT,iBACE,MAAME,EAAkB,GACxB,GAAIxnB,KAAKqJ,WACHrJ,KAAKqJ,UAAUoe,mBAAoB,CACrC,MAAMC,EAAY1nB,KAAKqJ,UAAUoe,mBAC7BzkB,MAAMwO,QAAQkW,GAChBA,EAAUlmB,QAAQ,CAACmmB,EAAKxvB,KACtBqvB,EAAgB,wBAAuBrvB,EAAI,IAAOwvB,IAGpDH,EAAgB,uBAAyBxnB,KAAKqJ,UAAUoe,mBAK9D,OADAD,EAAgBI,QAAU,IACnBJ,IAGX,UACE,MAAMK,EAAe7nB,KAAK8nB,kBAC1B9nB,KAAKulB,cAAgBsC,EAErB,MAAME,EAAQzvB,OAAO6iB,KAAKnb,KAAKonB,gBAAgBviB,IACnD,mDAGQ7E,KAAKgoB,aAAaH,GACpB7nB,KAAKgnB,YAAYa,GAEvB,eACMztB,QAAQ+C,IAAI4qB,GAAO9rB,KAAK,KACtB+D,KAAKgnB,YAAYa,MAIvB5lB,QAAS,CAIP,eACEjC,KAAK8B,OAAOM,OAAO,EAAzB,+BAGI,kBACE,MAAMiW,EAAa7N,aAAa,EAAtC,2BACM,OAAI6N,GAA6B,cAAfA,EAAmCA,EAC9CrY,KAAKqJ,UAAUmP,OAAS,EAArC,SAGI,aAAayP,GACX,MAAMC,EAAc,IAAI,EAA9B,yCACM,OAAOA,EAAYzkB,SAASwkB,IAG9B,wBACEjoB,KAAK8B,OAAOM,OAAO,EAAzB,mBACMpC,KAAKinB,uBAAwB,GAG/B,yBACMjnB,KAAKinB,wBACPjnB,KAAK8B,OAAOM,OAAO,EAA3B,mBACQpC,KAAKinB,uBAAwB,IAKjC,YAAYf,GACO,YAAbA,GACFlmB,KAAKmoB,iBACLnoB,KAAKknB,YAAY1O,MAAQ,WACjC,qBACQxY,KAAKimB,gBAAgBC,GAErBlmB,KAAKknB,YAAY1O,MAAQ0N,EAE3BlmB,KAAK4lB,qBAAqBM,GAC1B1b,aAAanC,QAAQ,EAA3B,8BAGI,iBACE3N,SAASC,qBAAqB,QAAQ,GAAG0rB,gBAAgB,iBCtKuS,MCQlW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,KACA,OAIa,M,QCaf,IACErpB,KAAM,cACN2E,WAAY,CACVwe,OAAJ,GACIiI,cAAJ,GACIvB,iBAAJ,IAEEhlB,SAAU,CACR,YACE,OAAO7B,KAAK8B,OAAOkE,QAAQqD,WAE7B,eACE,OAAOrJ,KAAKqJ,UAAUmP,OAAS,EAArC,WAGE,OACE,MAAO,CACLvN,UAAW,KAGf,UAEEjL,KAAKiL,UAAYjL,KAAKqJ,UAAU4B,WAAa,QAE/ChJ,QAAS,CAEP,OACE,MAAMomB,EAAMroB,KAAKiL,UAAU/F,QAAQ,kBAAmB,IACtDlF,KAAK8B,OAAOM,OAAO,EAAzB,qBACMpC,KAAKsoB,cAAcD,GACnBroB,KAAKuoB,aAAaF,GAClBroB,KAAKwoB,iBACO,KAARH,GAAYroB,KAAKyoB,cAGvB,aAAaC,GACX,MAAMxd,EAAawd,EAAWxjB,QAAQ,kBAAmB,IACnDzF,EAAQ/E,SAASQ,cAAc,SACrCuE,EAAM+J,YAAc0B,EACpBxQ,SAASqB,KAAK0N,OAAOhK,IAGvB,cAAc4oB,GACZ,MAAMM,EAAiB5Y,KAAKC,MAAMxF,aAAatC,QAAQ,EAA7D,uCACMygB,EAAe1d,UAAYod,EAC3B7d,aAAanC,QAAQ,EAA3B,mDAGI,aACEnL,WAAW,KAAjB,0BAGI,iBACE8C,KAAK4gB,SAASze,KAAK,iCCrFyU,MCQ9V,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,KACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIjD,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,gCAAgC,CAACL,EAAG,MAAM,CAACK,YAAY,iBAAiB,CAACL,EAAG,KAAK,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,wBAAwBnD,EAAG,IAAI,CAACK,YAAY,SAAS,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,wBAAwB,KAAKnD,EAAG,MAAMA,EAAG,MAAMD,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,wBAAwB,KAAKnD,EAAG,MAAMD,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,wBAAwB,KAAKnD,EAAG,IAAI,CAACQ,MAAM,CAAC,KAAO,wEAAwE,CAACT,EAAIE,GAAG,cAAcD,EAAG,MAAM,CAACK,YAAY,0BAA0B,EAAEN,EAAY,SAAEC,EAAG,KAAK,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,sCAAwGnD,EAAG,QAAQ,CAACQ,MAAM,CAAC,KAAO,kBAAkB,MAAQT,EAAI+e,SACxzB/e,EAAIoD,GAAG,oCAAsCpD,EAAIoD,GAAG,mCAAmC,OAAS,WAAW,KAAO,YAAYgc,MAAM,CAACvgB,MAAOmB,EAAkB,eAAEqf,SAAS,SAAUC,GAAMtf,EAAI0pB,eAAepK,GAAKtd,WAAW,oBAAoB/B,EAAG,SAAS,CAACQ,MAAM,CAAC,MAAQT,EAAI2pB,YAAY,CAAC3pB,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAI+e,SAAW/e,EAAIoD,GAAG,mCAAqCpD,EAAIoD,GAAG,mCAAmC,KAAKnD,EAAG,eAAe,GAAID,EAAY,SAAEC,EAAG,MAAM,CAACK,YAAY,gBAAgB,CAACL,EAAG,OAAO,CAACK,YAAY,mBAAmB,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,+BAA+B,QAAQnD,EAAG,MAAM,CAACK,YAAY,mBAAmB,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAI+e,aAAa9e,EAAG,OAAO,CAACK,YAAY,kBAAkB,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,mCAAmCpD,EAAIiB,MAAM,GAAGhB,EAAG,MAAM,CAACK,YAAY,2BAA2B,CAACL,EAAG,KAAK,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,gCAAgCnD,EAAG,QAAQ,CAACQ,MAAM,CAAC,KAAO,eAAe,MAAQT,EAAIoD,GAAG,gCAAgCgc,MAAM,CAACvgB,MAAOmB,EAAe,YAAEqf,SAAS,SAAUC,GAAMtf,EAAI4pB,YAAYtK,GAAKtd,WAAW,iBAAiB/B,EAAG,QAAQ,CAACQ,MAAM,CAAC,KAAO,mBAAmB,MAAQT,EAAIoD,GAAG,qCAAqC,KAAO,YAAYgc,MAAM,CAACvgB,MAAOmB,EAAmB,gBAAEqf,SAAS,SAAUC,GAAMtf,EAAI6pB,gBAAgBvK,GAAKtd,WAAW,qBAAqB/B,EAAG,SAAS,CAACQ,MAAM,CAAC,MAAQT,EAAI8pB,gBAAgB,CAAC9pB,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,8BAA8B,KAAKnD,EAAG,gBAAgB,IAAI,MACv6C,GAAkB,GCFlB,GAAS,WAAa,IAAID,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACG,MAAO,mBAAqBJ,EAAIqM,QAAS,CAAErM,EAAS,MAAEC,EAAG,QAAQ,CAACK,YAAY,cAAcG,MAAM,CAAC,IAAM,SAAS,CAACT,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIygB,OAAO,OAAOzgB,EAAIiB,KAAKhB,EAAG,QAAQ,CAACK,YAAY,cAAcG,MAAM,CAAC,KAAOT,EAAI/D,KAAK,KAAO+D,EAAIlC,KAAK,GAAKkC,EAAIlC,KAAK,YAAckC,EAAI+pB,aAAa5iB,SAAS,CAAC,MAAQnH,EAAInB,OAAOoD,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAI8gB,YAAY5e,EAAO5F,OAAOuC,WAAYmB,EAAe,YAAEC,EAAG,IAAI,CAACK,YAAY,qBAAqB,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIwB,aAAa,OAAOxB,EAAIiB,QACplB,GAAkB,GC4BtB,IACEnD,KAAM,QACNyE,MAAO,CACL1D,MAAO,CAAC2D,OAAQwnB,QAChBvJ,MAAOje,OACP1E,KAAM0E,OACNunB,YAAavnB,OACbhB,YAAagB,OACbvG,KAAM,CACJguB,QAAS,OACThuB,KAAMuG,QAER6J,OAAQ,CACN6d,UAAW,IAAjB,yCACMjuB,KAAMuG,OACNynB,QAAS,aAGblnB,QAAS,CACP,YAAYlE,GACViC,KAAKwc,MAAM,QAASze,MCjDoU,MCQ1V,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,wDCbf,MAAMsrB,GAAWC,oBAGXC,GAAc,CAAC1xB,EAAM2xB,KACzB,MAAMC,EAAkB1Z,KAAK2Z,UAAU7xB,GACjC8xB,EAAgBC,KAAIC,QAAQJ,EAAiBD,GACnD,OAAOG,EAAc5lB,YAIjB+lB,GAAc,CAACjyB,EAAM2xB,IAAaI,KAAIG,QAAQlyB,EAAM2xB,GAAUzlB,SAASimB,MAGvEC,GAAelX,GAAShB,KAAOgB,GAAMhP,WAAWhF,MAAM,EAAG,IAGlDmrB,GAAS,CAACryB,EAAM2xB,IAAaW,KAAMC,KAAKf,GAAU,CAC7DgB,SAAUd,GAAY1xB,EAAM2xB,GAC5Bc,QAASL,GAAYT,KAIVe,GAAS,CAAC1yB,EAAM2xB,EAAUvL,IAAakM,KAAMK,IAAInB,GAAU,CACtEpL,WACAoM,SAAUd,GAAY1xB,EAAM2xB,GAC5Bc,QAASL,GAAYT,KAGjBiB,GAAkB5wB,GAAKvB,OAAOoyB,QAAQ7wB,GAAGgL,IAAI8lB,GAAMA,EAAG9lB,IAAIsY,oBAAoByN,KAAK,MAAMA,KAAK,KAGvFC,GAAU,CAAC5M,EAAUuL,KAChC,MAAMsB,EAASL,GAAgB,CAAExM,WAAUqM,QAASL,GAAYT,KAC1DrQ,EAAO,GAAEkQ,OAAayB,IAC5B,OAAO,IAAI1wB,QAAQ,CAACC,EAASC,KAC3B6vB,KAAMxsB,IAAIwb,GAAKld,KAAMgX,IACnB,IAAKA,EAASpb,MAAQob,EAASpb,KAAKkzB,SAClCzwB,EAAO2Y,EAASpb,KAAKkzB,UAAY,aAC5B,CACL,MAAMC,EAAgBlB,GAAY7W,EAASpb,KAAKwyB,SAASA,SAAUb,GACnE,IAAMnvB,EAAQ0V,KAAKC,MAAMgb,IAAmB,MAAO/wB,GAAKK,EAAOL,U,oDC6BvE,IACE+C,KAAM,qBACN6E,SAAU,CACR,SACE,OAAO7B,KAAK8B,OAAOC,MAAMqH,SAG7B,OACE,MAAO,CACLwf,eAAgB,GAChBG,gBAAiB,GACjBD,YAAa,GACb7K,SAAUzT,aAAa,EAA7B,mCACMiW,SAAU,IAAI,GAApB,sCAGE9e,WAAY,CACVwe,OAAJ,GACI8K,MAAJ,GACIC,WAAJ,KACIC,YAAJ,MAEElpB,QAAS,CAEP,gBACEjC,KAAKygB,SAAS3R,QACd+b,GAAQ7qB,KAAK8oB,YAAa9oB,KAAK+oB,iBACrC,SACQ,KAAR,sCACQ,KAAR,iBACA,UACQ,KAAR,gBACQ,KAAR,kBAII,aACE/oB,KAAKygB,SAAS3R,QACdob,GAAOlqB,KAAKoJ,OAAQpJ,KAAK4oB,gBAC/B,SACA,0CAGU,KAAV,wCAFU,KAAV,uCAIQ,KAAR,iBACA,WACQ,KAAR,yDACQ,KAAR,kBAII,aACE5oB,KAAKygB,SAAS3R,QACdyb,GAAOvqB,KAAKoJ,OAAQpJ,KAAK4oB,eAAgB5oB,KAAKie,UACpD,SACA,0CAGU,KAAV,wCAFU,KAAV,uCAIQ,KAAR,iBACA,WACQ,KAAR,yDACQ,KAAR,kBAII,YACE,MAAMmN,EAAY5gB,aAAa,EAArC,yCACWxK,KAAK4oB,eAEhB,EAEA,uCACQ5oB,KAAKqrB,aAELrrB,KAAKsrB,aAAatrB,KAAKsC,GAAG,qCAJ1BtC,KAAKurB,aAFLvrB,KAAKsrB,aAAatrB,KAAKsC,GAAG,wCAU9B,kBAAkB8G,EAAQ6U,GAExBzT,aAAanC,QAAQ,EAA3B,8DACMmC,aAAanC,QAAQ,EAA3B,4DACMmC,aAAanC,QAAQ,EAA3B,0DACUe,EAAOC,UAAUmP,OACnBhO,aAAanC,QAAQ,EAA7B,6CAGMrI,KAAKwrB,mBAAmBvN,EAAUje,KAAK+oB,iBAEvC/oB,KAAK8B,OAAOM,OAAO,EAAzB,cAEMpC,KAAKwoB,eAAexoB,KAAKsC,GAAG,oCAG9B,oBAAoB2b,EAAUwN,GAAW,GACvCzrB,KAAKwrB,mBAAmBvN,EAAUje,KAAK4oB,gBACvC5oB,KAAKwoB,eACX,sEAEMxoB,KAAK4oB,eAAiB,IAGxB,aAAamC,GACXtiB,GAAmBsiB,EAAUriB,GAASE,cACtC5I,KAAK4gB,SAASze,KAAK4oB,EAAU,CAAnC,2BAGI,eAAe3jB,GACboB,GAAYpB,EAAKsB,GAASE,cAC1B5I,KAAK4gB,SAASze,KAAKiF,EAAK,CAA9B,6BAGI,SAAS2L,GACP,OAAO,KAAb,eAGI,mBAAmBkL,EAAUlL,GAC3B/S,KAAKie,SAAWA,EAChB,MAAMjM,EAAOhS,KAAK0rB,SAAS3Y,GAC3BvI,aAAanC,QAAQ,EAA3B,iCACMmC,aAAanC,QAAQ,EAA3B,sCCtM2W,MCQvW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAInJ,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,QAAQ,CAACQ,MAAM,CAAC,KAAOT,EAAIysB,UAAU,WAAY,EAAK,MAAQ,MAAM,OAAS,MAAM,QAAU,gBAAgB,CAACxsB,EAAG,MAAM,CAACK,YAAY,yBAAyB,CAACL,EAAG,KAAK,CAACK,YAAY,qBAAqB,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,yBAAyBnD,EAAG,IAAI,CAACD,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,gCAAgC,IAAIpD,EAAI4B,GAAG5B,EAAIoD,GAAG,iCAAiCnD,EAAG,MAAMD,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,gCAAgC,OAAOnD,EAAG,SAAS,CAACQ,MAAM,CAAC,MAAQT,EAAI0sB,WAAW,SAAW1sB,EAAI2sB,UAAY3sB,EAAI4sB,aAAa,UAAY5sB,EAAI4sB,cAAcC,YAAY7sB,EAAI8sB,GAAG,CAAC,CAAC3tB,IAAI,OAAO4tB,GAAG,WAAW,MAAO,CAAC/sB,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAI2sB,QAAU3sB,EAAIoD,GAAG,mCAAqCpD,EAAIoD,GAAG,+BAA+B,OAAO4pB,OAAM,GAAM,CAAC7tB,IAAI,OAAO4tB,GAAG,WAAW,MAAO,CAAC9sB,EAAG,iBAAiB+sB,OAAM,OAAYhtB,EAAI4sB,aAAgI5sB,EAAIiB,KAAtHhB,EAAG,MAAM,CAACA,EAAG,IAAI,CAACK,YAAY,wBAAwB,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,sCAAgDpD,EAAW,QAAEC,EAAG,MAAM,CAACK,YAAY,eAAe,CAACL,EAAG,mBAAmB,CAACK,YAAY,WAAWL,EAAG,IAAI,CAACK,YAAY,mBAAmB,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,oCAAoC,UAAU,GAAGpD,EAAIiB,UAAsBlD,IAAhBiC,EAAIiiB,QAAuBhiB,EAAG,MAAM,CAACK,YAAY,oBAAoB,CAAEN,EAAW,QAAEC,EAAG,IAAI,CAACK,YAAY,2BAA2B,CAACN,EAAIE,GAAG,MAAMF,EAAI4B,GAAG5B,EAAIoD,GAAG,4BAA4B,OAAOnD,EAAG,IAAI,CAACK,YAAY,2BAA2B,CAACN,EAAIE,GAAG,MAAMF,EAAI4B,GAAG5B,EAAIoD,GAAG,yBAAyB,OAAOnD,EAAG,MAAM,CAACK,YAAY,UAAU,CAACL,EAAG,OAAO,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIitB,QAAUjtB,EAAIxC,YAAYyC,EAAG,IAAI,CAACK,YAAY,mBAAmB,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAInC,YAAamC,EAAW,QAAEC,EAAG,IAAI,CAACK,YAAY,mBAAmB,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,4BAA4B,OAAOpD,EAAIiB,KAAMjB,EAAW,QAAEC,EAAG,SAAS,CAACQ,MAAM,CAAC,MAAQT,EAAIktB,aAAaL,YAAY7sB,EAAI8sB,GAAG,CAAC,CAAC3tB,IAAI,OAAO4tB,GAAG,WAAW,MAAO,CAAC/sB,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,iCAAiC4pB,OAAM,GAAM,CAAC7tB,IAAI,OAAO4tB,GAAG,WAAW,MAAO,CAAC9sB,EAAG,gBAAgB+sB,OAAM,IAAO,MAAK,EAAM,cAAchtB,EAAIiB,MAAM,GAAGjB,EAAIiB,MAAM,MAC7lE,GAAkB,G,wECsDtB,IACEnD,KAAM,aACN6E,SAAU,CACR,YACE,OAAO7B,KAAK8B,OAAOkE,QAAQqD,YAG/B1H,WAAY,CACVwe,OAAJ,GACIkM,YAAJ,KACIC,WAAJ,KACIC,iBAAJ,MAEE10B,KAAM,KAAM,CACV8zB,UAAW,EAAf,0BACIE,SAAS,EACT1K,aAASlkB,EACTP,MAAO,GACPyvB,OAAQ,GACRpvB,QAAS,GACT+uB,cAAc,EACdrL,SAAU,IAAI,GAAlB,sCAEExe,QAAS,CAEP,aACE,MAAM+e,EAAU,OAAtB,qGACYC,EAAW,GAAGD,IAAU,EAApC,8BACMhhB,KAAK6rB,SAAU,EACf7rB,KAAKygB,SAAS3R,QACd,GAAN,SACA,SACQ,KAAR,qBACQ,KAAR,iBAEA,UACQ,KAAR,UAAU,SAAV,EAAU,UACF,KAAR,kBAII,SAAS0d,GAEP,GADAxsB,KAAK6rB,SAAU,EACXW,EAAc,CAChB,MAAM,QACJrL,EADV,OACU,EADV,MACU,EADV,QACU,GACV,EACQnhB,KAAKmhB,QAAUA,EACfnhB,KAAKmsB,OAASA,EACdnsB,KAAKjD,QAAUA,EACfiD,KAAKtD,MAAQA,EAEfsD,KAAK4gB,SAASze,KACpB,aACA,6EACA,CAAQ,UAAR,6CAGI,cACEsqB,SAASC,WAGb,WACyC,IAAnC1sB,KAAKqJ,UAAUqX,kBACjB1gB,KAAK8rB,cAAe,KCvHyU,MCQ/V,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAI5sB,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAQC,EAAIytB,iBAAkBxtB,EAAG,MAAM,CAACK,YAAY,eAAe,CAACL,EAAG,IAAI,CAACD,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,6BAA6B,IAAIpD,EAAI4B,GAAG5B,EAAI0tB,YAAY,OAAQ1tB,EAAiB,cAAEC,EAAG,MAAM,CAAGD,EAAI2tB,SAAmH3tB,EAAIiB,KAA7GhB,EAAG,IAAI,CAACD,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIxC,MAAQ,8BAAgC,4BAA4B,OAAiBwC,EAAI2tB,UAAY3tB,EAAI4tB,WAAY3tB,EAAG,IAAI,CAACK,YAAY,cAAc,CAACN,EAAIE,GAAG,MAAMF,EAAI4B,GAAG5B,EAAIoD,GAAG,uBAAuB,OAAQpD,EAAI2tB,WAAa3tB,EAAI6tB,cAAe5tB,EAAG,IAAI,CAACK,YAAY,oBAAoB,CAACN,EAAIE,GAAG,MAAMF,EAAI4B,GAAG5B,EAAIoD,GAAG,wBAAwB,MAAMnD,EAAG,IAAI,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAI8tB,oBAAqB9tB,EAAI2tB,UAAY3tB,EAAI6tB,cAAe5tB,EAAG,IAAI,CAACK,YAAY,wBAAwB,CAACN,EAAIE,GAAG,MAAMF,EAAI4B,GAAG5B,EAAIoD,GAAG,wBAAwB,MAAMnD,EAAG,IAAI,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAI8tB,kBAAkB7tB,EAAG,OAAO,CAACK,YAAY,iBAAiB,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,mCAAmC,KAAKnD,EAAG,MAAMD,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,mCAAmC,IAAIpD,EAAI4B,GAAG5B,EAAI8tB,eAAe,SAAS9tB,EAAIiB,OAAOjB,EAAIiB,OAAOjB,EAAIiB,MACjnC,GAAkB,GCmCtB,IACEnD,KAAM,eACN6E,SAAU,CACR,YACE,OAAO7B,KAAK8B,OAAOkE,QAAQqD,YAG/B,OACE,MAAO,CACLujB,WAAY,QACZnM,SAAU,IAAI,GAApB,oCACMuM,cAAe,GACfC,eAAe,EACfH,YAAY,EACZC,eAAe,EACfF,UAAU,EACVnwB,OAAO,IAGX,WACOsD,KAAK4sB,YAAc,KAA5B,8CAEM5sB,KAAKitB,eAAgB,EAErBjtB,KAAKktB,gBAGTjrB,QAAS,CAEP,eACE,MAAMkrB,EAAa,sEACnBntB,KAAKygB,SAAS3R,QACd,GAAN,kBACYmE,GAAYA,EAASpb,MAAQob,EAASpb,KAAKu1B,UAC7CptB,KAAKgtB,cAAgB/Z,EAASpb,KAAKu1B,QACnCptB,KAAK8sB,WAAa9sB,KAAKqtB,gBAAgBrtB,KAAK4sB,WAAY5sB,KAAKgtB,eAC7DhtB,KAAK6sB,UAAW,EAChB7sB,KAAKygB,SAAS1R,SAExB,WACQ/O,KAAKtD,OAAQ,EACbsD,KAAKygB,SAAS1R,SAIlB,gBAAgBue,EAAgBN,GAC9B,MAAMhd,EAAQ,GAApB,kCACYud,EAAavd,EAAMgd,GAAiBhd,EAAMsd,GAEhD,OADIC,EAAa,IAAGvtB,KAAK+sB,eAAgB,GAClCQ,GAAc,GAGvB,iBACE,MAAMzO,GAAWoK,OAAOsE,MAAM7Q,SAAS3c,KAAK4sB,WAAWlL,WAAW,IAAK,IAAK,KAO5E,OANK5C,GACH,GAER,mHAGaA,KChGsV,MCQ/V,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,gLCmEf,IACE9hB,KAAM,kBACN,OACE,MAAO,CACLywB,WAAYC,GAAlB,KACMzP,SAAUzT,aAAa,EAA7B,mCACMoiB,WAAY,QACZI,cAAe,KAGnBvrB,MAAO,CACL2H,OAAQ9Q,QAEVuJ,SAAU,CACRyD,SAAU,WACR,OAAOtF,KAAKoJ,OAAO9D,UAErB,OACE,OAAOtF,KAAKytB,WAAWztB,KAAKoJ,UAGhCzH,WAAY,CACVgsB,WAAJ,GACIC,gBAAJ,GACIC,mBAAJ,GACIC,WAAJ,GACIC,WAAJ,GACIC,aAAJ,KACIC,WAAJ,KACIC,SAAJ,KACIC,UAAJ,KACIC,cAAJ,KACIC,aAAJ,KACIhC,YAAJ,KACIiC,UAAJ,MAEErsB,QAAS,CAEP,cAAcssB,GACZ,MAAMC,EAAexuB,KAAKsc,MAAMmS,QAAQC,SAASH,GACjDvuB,KAAKsc,MAAMmS,QAAQE,cAAcH,IAEnC,sBACExuB,KAAKkC,OAAOC,KAAK,EAAvB,4BAEI,iBACEnC,KAAKkC,OAAOC,KAAK,EAAvB,0BAEI,0BACEnC,KAAKkC,OAAOC,KAAK,EAAvB,8BAEI,wBACEnC,KAAKkC,OAAOC,KAAK,EAAvB,mCAGI,qBACE,MAAMiF,EAASpH,KAAKsC,GAAG,8BAAX,IAClB,uFACYssB,EAAgBC,QAAQznB,GAC1BwnB,IACFpkB,aAAaskB,QACb9uB,KAAK4gB,SAASze,KAAKnC,KAAKsC,GAAG,4BAC3BtC,KAAK8B,OAAOwH,SAAS,EAA7B,qBAGI,cACE,MAAM6N,EAAOkC,KACb,OAAOlC,EAAO,GAAGA,EAAKjB,QAAQiB,EAAKna,OAAS,IAG9C,wBACE,MAAM+xB,EAAW/uB,KAAK8B,OAAOC,MAAMitB,kBAC7BC,EAAkB,GAA9B,gCACUF,GAAYE,EAAgBF,IAAW/uB,KAAK+d,cAAcgR,GAC9D/uB,KAAK8B,OAAOM,OAAO,EAAzB,0BAGE,UACEpC,KAAKkvB,0BCpK+V,MCSpW,I,oBAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCpBX,GAAS,WAAa,IAAIhwB,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,qBAAqB,CAACL,EAAG,KAAK,CAACK,YAAY,SAAS,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,+BAA+BnD,EAAG,IAAI,CAACK,YAAY,SAAS,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,qCAAqC,OAAOnD,EAAG,WAAW,CAACK,YAAY,oBAAoBG,MAAM,CAAC,aAAc,EAAK,QAAUT,EAAI2K,aAAa,MAAQ,eAAe,MAAQ3K,EAAIiwB,wBAAwB7Q,MAAM,CAACvgB,MAAOmB,EAAY,SAAEqf,SAAS,SAAUC,GAAMtf,EAAI+K,SAASuU,GAAKtd,WAAW,cAAc/B,EAAG,SAAS,CAACK,YAAY,cAAcG,MAAM,CAAC,MAAQT,EAAIkwB,aAAa,UAAYlwB,EAAI+K,WAAW,CAAC/K,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,kCAAkC,KAAKnD,EAAG,mBAAmB,GAAID,EAAY,SAAEC,EAAG,IAAI,CAACK,YAAY,gBAAgB,CAACN,EAAIE,GAAG,OAAOF,EAAI4B,GAAG5B,EAAI+K,SAASiM,MAAM,IAAIhX,EAAI4B,GAAG5B,EAAI+K,SAASjN,MAAM,OAAOkC,EAAIiB,KAAMjB,EAAImL,MAAMC,iBAAiBjS,QAAU,EAAG8G,EAAG,IAAI,CAACK,YAAY,aAAa,CAACN,EAAIE,GAAG,4GAA4GF,EAAIiB,MAAM,IACvkC,GAAkB,GCiCtB,IACEnD,KAAM,mBACN2E,WAAY,CACVwe,OAAJ,GACIkP,eAAJ,MAEE,OACE,MAAO,CACLplB,SAAU,GACV0hB,UAAW,EAAjB,8BAGE,UAEE3rB,KAAKiK,SAAWjK,KAAKsvB,eAEvBztB,SAAU,CAER,YACE,OAAO7B,KAAK8B,OAAOkE,QAAQqD,WAG7BimB,cAAe,CACb,MACE,OAAOtvB,KAAKuvB,kBAAkBvvB,KAAK8B,OAAOkE,QAAQqD,UAAU8N,OAE9D,IAAIqY,GACFxvB,KAAK8B,OAAOM,OAAO,EAA3B,uBAIIyH,aAAc,IAAMO,GAAUvF,IAAI,IAChC,MAAM2qB,EAAUrY,EAEhB,OADAqY,EAAQC,aAAe,GAAGtY,EAAKjB,QAAQiB,EAAKna,OACrCwyB,KAGXvtB,QAAS,CAEP,YAAYytB,GACV,IAAKA,IAAqBA,EAAiB9zB,KAAM,OAAO,EACxD,MAAM+zB,EAAc3vB,KAAKqK,MAAMC,iBAC/B,OAAOqlB,EAAYlsB,SAASisB,EAAiB9zB,OAG/C,uBACMoE,KAAKiK,UAAYjK,KAAKiK,SAASrO,KACjCoE,KAAKqK,MAAMM,OAAS3K,KAAKiK,SAASrO,KAElC,GAAR,sEAII,eACE,MAAM8zB,EAAmB1vB,KAAKiK,SAC9B,GAAIjK,KAAK4vB,YAAYF,GAAmB,CACtCllB,aAAanC,QAAQ,EAA7B,qCACQrI,KAAKmvB,uBACLnvB,KAAKsvB,cAAgBI,EACrB,MAAMvc,EAAgBuc,EAAiBxZ,KAApB,IAC3B,wDACQlW,KAAK4gB,SAASze,KAAKgR,EAAY,CAAvC,4BACQnT,KAAKkC,OAAO4e,KAAK9gB,KAAK2rB,gBAEtB3rB,KAAK4gB,SAASze,KAAK,4BAA6B,CAAxD,0BACQ,GAAR,6BAII,kBAAkBsX,GAChB,MAAMoW,EAAqB,GAAjC,uBACM,OAAOA,EAAmBpW,MCzGyU,MCSrW,I,oBAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,gIC0Cf,IACEzc,KAAM,iBACN,OACE,MAAO,CACLygB,WAAN,gBACMqS,kBAAkB,IAGtBnuB,WAAY,CACVouB,gBAAJ,GACIC,iBAAJ,GACIC,YAAJ,KACIC,sBAAJ,IACIC,aAAJ,KACIC,SAAJ,KACIC,kBAAJ,KACIC,gBAAJ,MAEEzuB,SAAU,CACR,WACE,OAAO7B,KAAK8B,OAAOkE,QAAQV,UAE7B,YACE,OAAOtF,KAAK8B,OAAOkE,QAAQqD,WAE7B,WACE,OAAOrJ,KAAK8B,OAAOkE,QAAQ3F,UAE7B,aACE,OAAOL,KAAK8B,OAAOC,MAAMC,UAG3B,uBACE,OAAOhC,KAAKsC,GAClB,4CACA,iDAIEL,QAAS,CACPob,WAAY,WACVrd,KAAKkC,OAAOC,KAAK,EAAvB,2BACMnC,KAAK8B,OAAOM,OAAO,EAAzB,oBAEIub,aAAc,WACZ3d,KAAK8B,OAAOM,OAAO,EAAzB,oBAEI,gBACE,MAAMqN,EAAO,GAMb,OALAA,EAAK,EAAX,+CACMA,EAAK,EAAX,6CACMA,EAAK,EAAX,4CACMA,EAAK,EAAX,iFACA,0CACaA,GAET,QAAQpN,GACN,MAAO,CAAb,4CAEI,qBACErC,KAAK8vB,kBAAoB9vB,KAAK8vB,kBAEhC,oBACE9vB,KAAK8vB,kBAAmB,GAE1B,yBACO9vB,KAAKa,YACRb,KAAK8B,OAAOM,OAAO,EAA3B,qBCjIuW,MCQnW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIlD,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACA,EAAG,OAAO,CAACK,YAAY,iBAAiB,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,6BAA6BnD,EAAG,MAAM,CAACK,YAAY,mBAAmB,CAACL,EAAG,eAAe,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,yBAA0BpB,WAAW,wCAAwC5B,MAAO,gBAAwC,SAAtBJ,EAAIuN,cAA2B,WAAa,IAAK9M,MAAM,CAAC,SAAW,MAAMwB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIqxB,oBAAoB,YAAYpxB,EAAG,iBAAiB,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,+BAAgCpB,WAAW,8CAA8C5B,MAAO,gBAAwC,eAAtBJ,EAAIuN,cAAiC,WAAa,IAAK9M,MAAM,CAAC,SAAW,MAAMwB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIqxB,oBAAoB,kBAAkBpxB,EAAG,eAAe,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,6BAA8BpB,WAAW,4CAA4C5B,MAAO,gBAAwC,aAAtBJ,EAAIuN,cAA+B,WAAa,IAAK9M,MAAM,CAAC,SAAW,MAAMwB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIqxB,oBAAoB,iBAAiB,MAClxC,GAAkB,G,wEC+BtB,IACEvzB,KAAM,iBACNyE,MAAO,CACLgL,cAAe/K,QAEjBC,WAAY,CACV6uB,aAAJ,KACIC,eAAJ,KACIC,aAAJ,MAEEzuB,QAAS,CACP,oBAAoBsJ,GAClBvL,KAAK8B,OAAOM,OAAO,EAAzB,oBAEI,QAAQC,GACN,MAAO,CAAb,8CC/CuW,MCQnW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAInD,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACA,EAAG,OAAO,CAACK,YAAY,iBAAiB,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,gCAAgCnD,EAAG,MAAM,CAACK,YAAY,mBAAmB,CAACL,EAAG,YAAY,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,6BAA8BpB,WAAW,4CAA4C5B,MAAO,gBAAmC,UAAjBJ,EAAIwN,SAAuB,WAAa,IAAK/M,MAAM,CAAC,SAAW,MAAMwB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIyxB,eAAe,aAAaxxB,EAAG,aAAa,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,8BAA+BpB,WAAW,6CAA6C5B,MAAO,gBAAmC,WAAjBJ,EAAIwN,SAAwB,WAAa,IAAK/M,MAAM,CAAC,SAAW,MAAMwB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIyxB,eAAe,cAAcxxB,EAAG,YAAY,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,6BAA8BpB,WAAW,4CAA4C5B,MAAO,gBAAmC,UAAjBJ,EAAIwN,SAAuB,WAAa,IAAK/M,MAAM,CAAC,SAAW,MAAMwB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIyxB,eAAe,cAAc,MACvuC,GAAkB,G,wEC+BtB,IACE3zB,KAAM,mBACN,OACE,MAAO,CACL2G,MAAO,KAGXlC,MAAO,CACLiL,SAAUhL,QAEZC,WAAY,CACVivB,UAAJ,KACIC,WAAJ,KACIC,UAAJ,MAEE7uB,QAAS,CACP,eAAeyK,GACb1M,KAAK8B,OAAOM,OAAO,EAAzB,kBAEI,QAAQC,GACN,MAAO,CAAb,8CCpDyW,MCQrW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAInD,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACA,EAAG,OAAO,CAACK,YAAY,kBAAkB,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAI6xB,eAAe5xB,EAAG,MAAM,CAACK,YAAY,mBAAmB,CAAEN,EAAI8xB,UAAY9xB,EAAI2V,cAAcF,SAAUxV,EAAG,aAAa,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,8BAA+BpB,WAAW,6CAA6C1B,YAAY,cAAcG,MAAM,CAAC,SAAW,MAAMwB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAI6U,aAAa7U,EAAIiB,KAAMjB,EAAI8xB,UAAY9xB,EAAI2V,cAAcD,YAAazV,EAAG,aAAa,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,6BAA8BpB,WAAW,4CAA4C1B,YAAY,cAAcG,MAAM,CAAC,SAAW,MAAMwB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAI+xB,gBAAgB/xB,EAAIiB,MAAM,MAC93B,GAAkB,G,wBC4BtB,IACEnD,KAAM,cACN2E,WAAY,CACVuvB,WAAJ,MAEEzvB,MAAO,CACLuvB,SAAU9H,QAEZ,OACE,MAAO,CACLrU,cAAN,qBAGE5S,QAAS,CACP,SACE,KACAjC,KAAK4gB,SAASze,KAAKnC,KAAKsC,GAAG,yBAC3BpF,WAAW,KACT,GAAR,uBACA,MAEI,YACE,GAAN,uBAEI,QAAQmF,GACN,MAAO,CAAb,4CAEI,WACE,GAAIrC,KAAKgxB,WAAa,EAA5B,2BACQ,MAAMle,EAAWtI,aAAa,EAAtC,8BACQ,OAAOsI,EAAW9S,KAAKsC,GAAG,2BAA4B,CAA9D,gBAEM,OAAItC,KAAKgxB,WAAa,EAA5B,6BACehxB,KAAKsC,GAAG,4BAEV,MChEuV,MCQhW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIpD,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,aAAa,CAACQ,MAAM,CAAC,KAAO,eAAe,CAAGT,EAAIiyB,WAAykBjyB,EAAIiB,KAAjkBhB,EAAG,MAAM,CAACK,YAAY,cAAc,CAACL,EAAG,KAAK,CAACD,EAAIE,GAAG,wCAAwCD,EAAG,MAAM,CAACK,YAAY,QAAQG,MAAM,CAAC,MAAQ,sBAAsBwB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIkyB,uBAAuB,CAAClyB,EAAIE,GAAG,OAAOD,EAAG,IAAI,CAACQ,MAAM,CAAC,MAAQ,mFAAmF,CAACT,EAAIE,GAAG,gOAC7f,GAAkB,GCiBtB,IACEpC,KAAM,uBACN,OACE,MAAO,CACLm0B,YAAY,EACZE,UAAW,MAGfpvB,QAAS,CAKP,2BACE,QAASuI,aAAa,EAA5B,0CAMI,oBACExK,KAAKmxB,YAAa,EAClB3mB,aAAanC,QAAQ,EAA3B,4CACMxJ,OAAOod,oBAAoB,QAASjc,KAAKsxB,gBAG3C,cAAch2B,GACU,KAAlBA,EAAM8R,SAAgBpN,KAAKoxB,sBAQnC,UACE,MAAMD,EAAanxB,KAAKuxB,2BACnBJ,EAKHnxB,KAAKwxB,YAJL3yB,OAAO3B,WAAW,KAAxB,mCACM2B,OAAOkd,iBAAiB,QAAS/b,KAAKsxB,kBCzDiU,MCQzW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIpyB,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,QAAQ,CAACQ,MAAM,CAAC,KAAOT,EAAIysB,UAAU,WAAY,EAAK,MAAQ,MAAM,OAAS,MAAM,QAAU,gBAAgB,CAACxsB,EAAG,MAAM,CAACK,YAAY,eAAe,CAACL,EAAG,cAAc,CAACK,YAAY,QAAQG,MAAM,CAAC,GAAK,WAAW,CAACR,EAAG,KAAK,CAACD,EAAIE,GAAG,gBAAgBD,EAAG,KAAK,CAACD,EAAIE,GAAG,eAAgBF,EAAY,SAAEC,EAAG,MAAM,CAACK,YAAY,QAAQ,CAACL,EAAG,OAAO,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoI,eAAenI,EAAG,IAAI,CAACD,EAAIE,GAAG,kCAAkCD,EAAG,MAAMA,EAAG,KAAK,CAACD,EAAIE,GAAG,oBAAoBF,EAAIE,GAAG,oEAAoED,EAAG,IAAI,CAACQ,MAAM,CAAC,KAAO,iDAAiD,CAACT,EAAIE,GAAG,iBAAiBD,EAAG,KAAK,CAACD,EAAIE,GAAG,sBAAsBF,EAAIE,GAAG,uDAAuDD,EAAG,IAAI,CAACQ,MAAM,CAAC,KAAO,sEAAsE,CAACT,EAAIE,GAAG,kBAAkBF,EAAIE,GAAG,WAAWD,EAAG,KAAK,CAACD,EAAIE,GAAG,kBAAkBF,EAAIE,GAAG,kDAAkDD,EAAG,IAAI,CAACQ,MAAM,CAAC,KAAO,uDAAuD,CAACT,EAAIE,GAAG,oBAAoBF,EAAIE,GAAG,MAAMD,EAAG,KAAK,CAACD,EAAIE,GAAG,eAAeF,EAAIE,GAAG,aAAaD,EAAG,IAAI,CAACQ,MAAM,CAAC,KAAO,qCAAqC,CAACT,EAAIE,GAAG,8BAA8BD,EAAG,MAAMD,EAAIE,GAAG,oBAAoBD,EAAG,IAAI,CAACQ,MAAM,CAAC,KAAO,0BAA0B,CAACT,EAAIE,GAAG,mBAAmBD,EAAG,KAAK,CAACD,EAAIE,GAAG,aAAaF,EAAIE,GAAG,uCAAuCD,EAAG,IAAI,CAACQ,MAAM,CAAC,KAAO,4BAA4B,CAACT,EAAIE,GAAG,kBAAkBF,EAAIE,GAAG,YAAYD,EAAG,MAAMD,EAAIE,GAAG,sDAAsDD,EAAG,IAAI,CAACQ,MAAM,CAAC,KAAO,kEAAkE,CAACT,EAAIE,GAAG,WAAWF,EAAIE,GAAG,KAAKD,EAAG,MAAMD,EAAIE,GAAG,uDAAuDD,EAAG,IAAI,CAACQ,MAAM,CAAC,KAAO,iEAAiE,CAACT,EAAIE,GAAG,aAAaF,EAAIE,GAAG,MAAMD,EAAG,KAAK,CAACD,EAAIE,GAAG,aAAaD,EAAG,aAAa,CAACK,YAAY,iBAAiB,MACrgE,GAAkB,GCkCtB,IACExC,KAAM,eACN2E,WAAY,CACVosB,WAAJ,IAEE,OACE,MAAO,CACLpC,UAAW,EAAjB,wBACMiB,WAAY,QACZtlB,SAAUtH,KAAKyxB,gBAGnBxvB,QAAS,CACP,cACE,OAAOgG,eAAeC,QAAQ,EAApC,wCCjDqW,MCSjW,I,oBAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,wDCyBf,IACElL,KAAM,oBACNyE,MAAO,CACLgL,cAAe/K,OACfgL,SAAUhL,OACV0lB,eAAgB9uB,QAElBqJ,WAAY,CACV+vB,UAAJ,GACIC,eAAJ,GACIvJ,cAAJ,GACIwJ,eAAJ,GACIC,iBAAJ,GACIC,YAAJ,GACIC,qBAAJ,GACIC,aAAJ,GACIC,SAAJ,KACIC,UAAJ,MAEE,OACE,MAAO,CACL1lB,iBAAiB,IAGrB3K,SAAU,CACR,WACE,OAAO7B,KAAK8B,OAAOkE,QAAQV,UAE7B,YACE,OAAOtF,KAAK8B,OAAOkE,QAAQqD,WAE7B,WACE,OAAOrJ,KAAK8B,OAAOkE,QAAQ3F,UAU7B,YACE,OAAOoU,MAGT,oBACE,OAAOzU,KAAK8B,OAAOkE,QAAQ1F,mBAE7B,gBACE,OAAON,KAAK8B,OAAOkE,QAAQ1F,kBAAkBsX,YAGjD,UACE5X,KAAKwM,gBAAkBxM,KAAKmyB,yBAE9BlwB,QAAS,CACP,sBAAsBmwB,GACpBpyB,KAAKwc,MAAM,mBAAoB4V,IAEjC,mBACEpyB,KAAKsc,MAAMoV,UAAUrkB,oBAEvB,kBACE,OAAOrN,KAAKqJ,UAAUmP,OAAS,IAGjC,gBACE,MAAM8O,EAAatnB,KAAKqJ,UAAUke,WAAa,GAC/C,MAA0B,kBAAfD,EAAgC,CAACA,GACrCA,GAET,2BACEtnB,KAAKwM,iBAAmBxM,KAAKwM,gBAC7BhC,aAAanC,QAAQ,EAA3B,yDAEI,wBACE,MAAMlF,EAAczI,SAAS0I,KAAKC,YAClC,QAAIF,GAAeA,EAAc,MAC1B4M,KAAKC,MAAMxF,aAAa,EAArC,qCACA,6DC7H0W,MCQtW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAItL,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,cAAc,CAACQ,MAAM,CAAC,MAAQT,EAAIuB,MAAM,KAAOvB,EAAIiN,KAAK,UAAYjN,EAAImzB,QAAQ,UAAYnzB,EAAIkW,YAAYkd,UAAU,KAAOpzB,EAAIkW,YAAYmd,KAAK,KAAOrzB,EAAIkW,YAAYod,KAAK,MAAQtzB,EAAIkW,YAAYqd,MAAM,aAAevzB,EAAIkW,YAAYsd,cAAcvxB,GAAG,CAAC,gBAAkBjC,EAAIyzB,gBAAgB,gBAAkBzzB,EAAI0zB,kBAAkB,CAAI1zB,EAAIuG,SAASvG,EAAIuG,MAAMpN,OAAS,IAAO6G,EAAI2B,WAAkF1B,EAAG,MAAM,CAACG,MAAO,oBAAsBJ,EAAI2zB,aAAc,kBAAmB,IAAM,eAAiB3zB,EAAI4zB,SAAUrzB,MAAOP,EAAa,UAAES,MAAM,CAAC,GAAM,WAAaT,EAAImzB,UAAW,CAACnzB,EAAIuD,GAAIvD,EAAe,aAAE,SAASwG,GAAM,OAAOvG,EAAG,OAAO,CAACd,IAAIqH,EAAKE,GAAGjG,MAAM,CAAC,GAAK+F,EAAKE,GAAG,IAAMF,EAAKyT,IAAI,MAAQzT,EAAKjF,MAAM,YAAciF,EAAKhF,YAAY,KAAOgF,EAAKyG,KAAK,OAASzG,EAAKlK,OAAO,MAAQkK,EAAK+sB,MAAM,gBAAkB/sB,EAAKqtB,gBAAgB,eAAiBrtB,EAAKstB,eAAe,mBAAqBttB,EAAKutB,mBAAmB,SAAW/zB,EAAIg0B,YAAY,OAASxtB,EAAKwT,OAAO,SAAWxT,EAAKmV,SAAS,mBAAqB3b,EAAIuB,MAAM,kBAAoBvB,EAAIi0B,wBAAwBztB,EAAK0tB,aAAa,oBAAsBl0B,EAAIm0B,yBAAyB,yBAA2B3tB,EAAK4tB,yBAAyB,UAAW,GAAOnyB,GAAG,CAAC,YAAc,SAASC,GAAQ,OAAOlC,EAAIsd,MAAM,gBAAgB,aAAetd,EAAIq0B,mBAAmBr0B,EAAc,WAAEC,EAAG,OAAO,CAACd,IAAI,UAAUmB,YAAY,eAAeG,MAAM,CAAC,UAAW,EAAK,mBAAqBT,EAAIuB,MAAM,KAAO,oBAAoB,GAAK,UAAU,MAAQ,eAAe,YAAc,wBAAwB,SAAWvB,EAAIg0B,eAAeh0B,EAAIiB,KAAKhB,EAAG,MAAM,CAACmM,IAAI,oBAAoB,GAAhwCnM,EAAG,MAAM,CAACK,YAAY,YAAY,CAACN,EAAIE,GAAG,4BAAytCD,EAAG,cAAc,CAACmM,IAAK,eAAiBpM,EAAImzB,QAAS1yB,MAAM,CAAC,KAAQ,eAAiBT,EAAImzB,SAAUlxB,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOlC,EAAIsd,MAAM,mBAAoBtd,EAAgB,aAAEC,EAAG,cAAc,CAACQ,MAAM,CAAC,aAAeT,EAAIyD,MAAM,UAAW,GAAOxB,GAAG,CAAC,iBAAmBjC,EAAIs0B,oBAAoBt0B,EAAIiB,KAAKhB,EAAG,cAAc,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,gBAAgBgE,QAAQ,kBAAkBjD,MAAOmB,EAAoB,iBAAEgC,WAAW,qBAAqBvB,MAAM,CAAC,KAAOT,EAAIu0B,gBAAgB,KAAOv0B,EAAIw0B,WAAWC,KAAK,KAAOz0B,EAAIw0B,WAAWE,KAAK,GAAM,gBAAkB10B,EAAImzB,SAAUlxB,GAAG,CAAC,gBAAkBjC,EAAIyzB,gBAAgB,kBAAoBzzB,EAAI20B,kBAAkB,cAAgB30B,EAAI40B,kBAAkB,IAC/5E,GAAkB,GCDlB,GAAS,WAAa,IAAI50B,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACG,MAAO,0BAA4BJ,EAAI4zB,UAAW,CAAC3zB,EAAG,IAAI,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI60B,oBAAqB7yB,WAAW,wBAAwB5B,MAAO,QAAUJ,EAAI80B,cAAev0B,MAAQ,gBAAmBP,EAAI+0B,wBAA2B,KAAO/0B,EAAIwzB,aAAe/yB,MAAM,CAAC,KAAOT,EAAIg1B,cAAc,OAASh1B,EAAIi1B,aAAa,IAAM,sBAAsB,SAAW,IAAI,GAAM,QAAUj1B,EAAI0G,IAAKzE,GAAG,CAAC,MAAQjC,EAAIk1B,WAAW,QAAU,SAAShzB,GAAQ,OAAIA,EAAOjG,KAAK+R,QAAQ,QAAQhO,EAAIiO,GAAG/L,EAAOgM,QAAQ,QAAQ,GAAGhM,EAAO/C,IAAI,CAAC,QAAQ,gBAAkC,WAAY+C,GAA4B,IAAlBA,EAAOizB,OAAvC,KAA2En1B,EAAI0zB,gBAAgB55B,MAAM,KAAMgU,YAAY,YAAc,SAAS5L,GAAQA,EAAO0L,oBAAqB,CAAC3N,EAAG,MAAM,CAACG,MAAO,gBAAmBJ,EAAIiN,KAAwB,GAAlB,kBAAuBxM,MAAM,CAAC,GAAM,QAAUT,EAAI0G,KAAM,CAACzG,EAAG,OAAO,CAACK,YAAY,QAAQ,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIuB,UAAUtB,EAAG,IAAI,CAACK,YAAY,eAAe,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIwB,kBAAkBvB,EAAG,OAAO,CAACK,YAAY,SAASC,MAAOP,EAAgB,aAAES,MAAM,CAAC,KAAOT,EAAIiN,KAAK,IAAMjN,EAAIia,IAAI,KAAOja,EAAI4zB,SAAS,MAAQ5zB,EAAIuzB,SAAStzB,EAAG,qBAAqB,CAACK,YAAY,sBAAsBG,MAAM,CAAC,SAAWT,EAAIiN,MAAyB,UAAjBjN,EAAI4zB,SAAqB,cAAgB5zB,EAAIo1B,kBAAkB,SAAW,eAAe,OAASp1B,EAAIga,UAAWha,EAAqB,kBAAEC,EAAG,kBAAkB,CAACK,YAAY,mBAAmBG,MAAM,CAAC,cAAgBT,EAAIq1B,eAAiBr1B,EAAIq1B,eAAeC,mBAAgBv3B,EAAU,WAAaiC,EAAIq1B,eAAiBr1B,EAAIq1B,eAAex3B,aAAUE,KAAaiC,EAAIiB,KAAMjB,EAAc,WAAEC,EAAG,eAAe,CAACK,YAAY,iBAAiB2B,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIu1B,uBAAuBv1B,EAAIiB,MAAM,GAAGhB,EAAG,cAAc,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,gBAAgBgE,QAAQ,kBAAkBjD,MAAOmB,EAAoB,iBAAEgC,WAAW,qBAAqBvB,MAAM,CAAC,KAAOT,EAAIu0B,kBAAoBv0B,EAAIw1B,SAAS,KAAOx1B,EAAIw0B,WAAWC,KAAK,KAAOz0B,EAAIw0B,WAAWE,KAAK,GAAM,gBAAkB10B,EAAI0G,IAAKzE,GAAG,CAAC,WAAajC,EAAIy1B,WAAW,iBAAmBz1B,EAAIu1B,iBAAiB,iBAAmBv1B,EAAI01B,iBAAiB,eAAiB11B,EAAI21B,kBAAmB31B,EAAc,WAAEC,EAAG,aAAa,CAACQ,MAAM,CAAC,OAAST,EAAI0G,MAAM1G,EAAIiB,KAAMjB,EAAgB,aAAEC,EAAG,WAAW,CAACQ,MAAM,CAAC,OAAST,EAAI0G,GAAG,MAAQ1G,EAAIw1B,SAAS,mBAAqBx1B,EAAI41B,oBAAoB3zB,GAAG,CAAC,cAAgBjC,EAAI61B,iBAAiB71B,EAAIiB,MAAM,IACl8E,GAAkB,GCDlB,GAAS,WAAa,IAAIjB,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACG,MAAO,qBAAuBJ,EAAI81B,MAAO,CAAmB,iBAAjB91B,EAAI+1B,SAA6B91B,EAAG,IAAI,CAACG,MAAOJ,EAAIiN,KAAO,IAAMjN,EAAI81B,OAA0B,UAAjB91B,EAAI+1B,SAAsB91B,EAAG,IAAI,CAACG,MAAO,cAAgBJ,EAAI81B,MAAO,CAAC91B,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIg2B,SAASh2B,EAAIi2B,cAAgC,QAAjBj2B,EAAI+1B,SAAoB91B,EAAG,OAAO,CAACG,MAAO,OAASJ,EAAIiN,KAAO,IAAMjN,EAAI81B,OAA0B,OAAjB91B,EAAI+1B,SAAmB91B,EAAG,MAAM,CAACG,MAAO,gBAAkBJ,EAAI81B,KAAMr1B,MAAM,CAAC,KAAO,MAAM,QAAU,YAAY,MAAQ,+BAA+B,CAACR,EAAG,OAAO,CAACQ,MAAM,CAAC,EAAIT,EAAIk2B,cAAcl2B,EAAIiN,WAAYjN,EAAQ,KAAEC,EAAG,MAAM,CAACG,MAAO,aAAeJ,EAAI81B,KAAO,KAAO91B,EAAIm2B,OAAS,SAAW,IAAK11B,MAAM,CAAC,IAAMT,EAAIi2B,UAAUh0B,GAAG,CAAC,MAAQjC,EAAIo2B,iBAAiBp2B,EAAIiB,KAAMjB,EAAU,OAAEC,EAAG,cAAc,CAACK,YAAY,kBAAkBN,EAAIiB,MAAM,IACt1B,GAAkB,G,qFC6BtB,IACEnD,KAAM,OACNyE,MAAO,CACL0K,KAAMzK,OACNyX,IAAKzX,OACLszB,KAAMtzB,QAERC,WAAY,CACV4zB,YAAJ,MAEE1zB,SAAU,CAER,YACE,OAAO7B,KAAK8B,OAAOkE,QAAQqD,WAG7B4rB,SAAU,WACR,OAAOj1B,KAAKw1B,mBAAmBx1B,KAAKmM,OAGtCgpB,SAAU,WACR,OAAOn1B,KAAKy1B,YAAYz1B,KAAKmM,KAAMnM,KAAKmZ,OAG5C,OACE,MAAO,CACLkc,QAAQ,IAGZpzB,QAAS,CAEP,MAAM2B,GACJ,MAAM8xB,EAAU,IAAIC,OAAO,8EAC3B,OAAOD,EAAQja,KAAK7X,IAGtB,QAAQgyB,GACN,MAAMC,EAAe,kBACfC,EAAqB,CAAC,MAAO,MAAO,OACpCC,EAAYF,EAAajR,KAAKgR,GACpC,OAAIG,EAAU19B,QAAU,GAAUy9B,EAAmBryB,SAASsyB,EAAU,KAI1E,QAAQH,GACN,OAAI,GAAV,iCACe,CAAf,8BACA,6BACe,CAAf,kCACA,sCACe,CAAf,gCAEa,CAAb,0BAGI,SAASI,GACP,MAAM,UAAZ,mBACM,GAAkB,cAAdC,GACF,GAAI,GAAZ,qBACA,iBACQ,OAAOv0B,OAAOw0B,cAAcvZ,SAASqZ,EAAUG,OAAO,GAAI,KAE5D,OAAOH,GAGT,WAAWI,EAASC,GAClB,GAAIr2B,KAAKs2B,wBAAwBF,GAAU,CACzC,MAAMG,EAAWH,EAAQ/xB,MAAM,KAC/B,GAAIkyB,EAASl+B,QAAU,EAAG,MAAO,GAAGk+B,EAAS,MAAMA,EAAS,MAAMA,EAAS,MAAM,EAAzF,+BACA,uBACQ,MAAMC,EAAOx2B,KAAKy2B,YAAYL,GACxBM,EAAaL,GAAer2B,KAAKqJ,UAAUqtB,YAAc,EAAvE,cACczV,EAAW,EAAzB,0BACQ,OAAOA,EAAS/b,QAAQ,OAAQsxB,GAElC,MAAO,IAGT,iBAAiBJ,EAASO,GACxB,MAAMD,EAAaC,EAAkBtyB,MAAM,YAAY,GACvD,GAAKqyB,EAEX,sDAGQ,OAAO12B,KAAK42B,WAAWR,EAASM,GAFhC,GAAR,2DAFQ,GAAR,6BAOM12B,KAAKq1B,QAAS,GAKhB,wBAAwBe,GACtB,MAAMS,EAAY,8GAClB,OAAO,EAAb,8CAGI,kBAAkBjB,GAChB,MAAO,GAAG,EAAhB,8BAGI,kBAAkBzc,GAChB,MAAMqd,EAAOM,UAAU3d,IAAQtV,KAAKC,SAASC,WAC7C,OAAO,EAAb,+CAGI,cAAc6xB,GACZ,MAAMmB,EAAYnB,EAAI1wB,QAAQ,MAAO,IAC/BiH,EAAO,GAAnB,SACM,OAAOA,EAAKvJ,MAGd,eAAegzB,GACb,MAAMmB,EAAYnB,EAAI1wB,QAAQ,MAAO,IAAI8xB,oBACzC,OAAO,EAAb,8CAGI,YAAYpB,EAAKzc,GACf,OAAQnZ,KAAKw1B,mBAAmBI,IAC9B,IAAK,MAAb,SACQ,IAAK,MAAb,iCACQ,IAAK,UAAb,0BACQ,IAAK,iBAAb,kCACQ,IAAK,aAAb,iCACQ,IAAK,MAAb,SACQ,IAAK,eAAb,6BACQ,IAAK,iBAAb,8BACQ,IAAK,MAAb,SACQ,IAAK,QAAb,SACQ,QAAR,WAII,mBAAmBA,GACjB,IAAIqB,EAAU,GAad,OAXN,EADWrB,EACX,oBACA,sBACA,iCACA,yBACA,uBACA,mCACA,wCACA,wBACA,8BACA,gCACA,OAX0B,OAYbqB,GAGT,YAAY9d,GACV,IAAN,+CAGI,gBACEnZ,KAAKq1B,QAAS,EACd,GAAN,uDC3LiW,MCQ7V,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,KACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIn2B,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACA,EAAG,MAAM,CAACG,MAAMJ,EAAIg4B,UAAUh4B,EAAI0P,SAAU1P,EAAIi4B,QAASj4B,EAAIk4B,gBAAgB,CAAwB,WAAtBl4B,EAAI4d,cAA4B3d,EAAG,kBAAyC,YAAtBD,EAAI4d,cAA6B3d,EAAG,mBAA0C,UAAtBD,EAAI4d,cAA2B3d,EAAG,kBAAyC,cAAtBD,EAAI4d,cAA+B3d,EAAG,qBAA4C,WAAtBD,EAAI4d,cAA4B3d,EAAG,kBAAyC,QAAtBD,EAAI4d,cAAyB3d,EAAG,eAAeA,EAAG,gBAAgB,GAAID,EAAU,OAAEC,EAAG,MAAM,CAACG,MAAO,sBAAyBJ,EAAIg4B,UAAUh4B,EAAI0P,SAAU1P,EAAIi4B,QAASj4B,EAAIk4B,gBAAkB,CAACl4B,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIga,QAAQ,OAAOha,EAAIiB,QAC/qB,GAAkB,G,gJC4BtB,IACEnD,KAAM,qBACNyE,MAAO,CACLqb,cAAepb,OACfy1B,QAASvb,QACThN,SAAUlN,OACV01B,cAAexb,QACf1C,OAAQgQ,QAEVjnB,QAAS,CAEP,UAAU2M,EAAW,YAAauoB,GAAU,EAAOE,GAAc,GAC/D,MAAO,8BACLzoB,GAAY,sBACZuoB,EAAU,QAAU,aACpBE,EAAc,cAAgB,OAGpC11B,WAAY,CACV21B,eAAJ,KACIC,gBAAJ,KACIC,eAAJ,KACIC,kBAAJ,KACIC,eAAJ,KACIC,YAAJ,KACIC,YAAJ,OCtD2W,MCQvW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAI14B,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAM,CAC5JsE,QAASnD,EAAI24B,YAAc34B,EAAI44B,gBAC/BC,QAAS,CAAC,iBAAmB,OAAU74B,EAAIuzB,SAC3C/S,MAAO,CAAEvd,KAAM,EAAG2e,KAAM,MACvB5f,WAAW,+IAA+I1B,YAAY,aAAa,CAACL,EAAG,MAAM,CAACG,MAAO,WAAcJ,EAAIuzB,SAAW,CAACvzB,EAAI2H,GAAG,QAC3O,GAAkB,CAAC,WAAa,IAAI3H,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,OAAO,CAACA,EAAG,YCUxH,IACEnC,KAAM,kBACNyE,MAAO,CACLo2B,WAAYn2B,OACZs2B,cAAepc,SAEjB3Z,QAAS,CAEP,QACE,OAAQjC,KAAKg4B,eACX,UAAK/6B,EAAb,mDACQ,KAAK,EAAb,cACQ,QAAR,eAIE,OACE,MAAO,CACLg7B,UAAW,IAAIxwB,KACfqwB,gBAAiB,gBAGrB,UACE56B,WAAW,KACJ8C,KAAK63B,aAAY73B,KAAK83B,gBAAkB,sBACnD,OCxCwW,MCSpW,I,oBAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCpBX,GAAS,WAAa,IAAI54B,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,QAAQ,CAACQ,MAAM,CAAC,KAAOT,EAAIysB,UAAU,WAAY,EAAK,MAAQ,MAAM,OAAS,MAAM,QAAU,yBAAyBxqB,GAAG,CAAC,OAASjC,EAAIg5B,cAAc,CAAC/4B,EAAG,MAAM,CAACK,YAAY,mBAAmB,CAACL,EAAG,KAAK,CAACK,YAAY,SAAS,CAACN,EAAIE,GAAG,eAAeD,EAAG,IAAI,CAACK,YAAY,aAAa,CAACN,EAAIE,GAAG,WAAWF,EAAI4B,GAAG5B,EAAIwG,KAAKjF,OAAO,SAASvB,EAAI4B,GAAG5B,EAAIi5B,QAAQ,OAAgC,IAAxBj5B,EAAIk5B,SAAS//B,OAAc8G,EAAG,IAAI,CAACK,YAAY,gBAAgB,CAACN,EAAIE,GAAG,kGAAkGF,EAAIiB,KAAKjB,EAAIuD,GAAIvD,EAAY,UAAE,SAASm5B,EAAI11B,GAAO,OAAOxD,EAAG,MAAM,CAACd,IAAIg6B,EAAIr7B,KAAKwC,YAAY,OAAO,CAAe,SAAb64B,EAAIl9B,MAAgC,WAAbk9B,EAAIl9B,KAAmBgE,EAAG,QAAQ,CAACQ,MAAM,CAAC,YAAc04B,EAAI33B,YAAY,MAAQ23B,EAAI53B,OAAS43B,EAAIr7B,KAAK,KAAOq7B,EAAIl9B,KAAK,OAAS,cAAcmjB,MAAM,CAACvgB,MAAOmB,EAAIk5B,SAASz1B,GAAY,MAAE4b,SAAS,SAAUC,GAAMtf,EAAI4iB,KAAK5iB,EAAIk5B,SAASz1B,GAAQ,QAAS6b,IAAMtd,WAAW,2BAAyC,YAAbm3B,EAAIl9B,KAAoBgE,EAAG,QAAQ,CAACQ,MAAM,CAAC,YAAc04B,EAAI33B,YAAY,MAAQ23B,EAAI53B,OAAS43B,EAAIr7B,KAAK,QAAU,GAAG8C,OAAQZ,EAAIo5B,kBAAmB,cAAgBp5B,EAAIq5B,UAAUr5B,EAAIk5B,SAASz1B,GAAO5E,QAAQugB,MAAM,CAACvgB,MAAOmB,EAAIk5B,SAASz1B,GAAY,MAAE4b,SAAS,SAAUC,GAAMtf,EAAI4iB,KAAK5iB,EAAIk5B,SAASz1B,GAAQ,QAAS6b,IAAMtd,WAAW,2BAAyC,WAAbm3B,EAAIl9B,KAAmBgE,EAAG,SAAS,CAACK,YAAY,mBAAmBG,MAAM,CAAC,QAAUT,EAAIk5B,SAASz1B,GAAOoX,KAAK,YAAcse,EAAI33B,YAAY,cAAgBxB,EAAIk5B,SAASz1B,GAAO5E,MAAM,MAAQs6B,EAAI53B,OAAS43B,EAAIr7B,MAAMshB,MAAM,CAACvgB,MAAOmB,EAAIk5B,SAASz1B,GAAY,MAAE4b,SAAS,SAAUC,GAAMtf,EAAI4iB,KAAK5iB,EAAIk5B,SAASz1B,GAAQ,QAAS6b,IAAMtd,WAAW,2BAA2B/B,EAAG,MAAM,CAACD,EAAIE,GAAG,IAAIF,EAAI4B,GAAGu3B,EAAIr7B,MAAM,kDAAkDmC,EAAG,UAAU,CAACgC,GAAG,CAAC,MAAQ,WAAc,OAAOjC,EAAIs5B,YAAYH,EAAIr7B,WAAa,MAAMkC,EAAIu5B,mBAAmBpgC,OAAS,EAAG8G,EAAG,MAAM,CAACK,YAAY,mBAAmB,CAACL,EAAG,KAAK,CAACD,EAAIE,GAAG,iBAAiBD,EAAG,MAAM,CAACK,YAAY,eAAeN,EAAIuD,GAAIvD,EAAsB,oBAAE,SAASm5B,GAAK,OAAOl5B,EAAG,OAAO,CAACd,IAAIg6B,EAAIr7B,KAAKwC,YAAY,gBAAgB2B,GAAG,CAAC,MAAQ,WAAc,OAAOjC,EAAIw5B,eAAeL,EAAIr7B,SAAW,CAACmC,EAAG,WAAWD,EAAIE,GAAG,IAAIF,EAAI4B,GAAGu3B,EAAI53B,OAAS43B,EAAIr7B,MAAM,MAAM,MAAK,KAAKkC,EAAIiB,KAAKhB,EAAG,oBAAoB,CAACQ,MAAM,CAAC,UAAYT,EAAIy5B,SAAS,YAAcz5B,EAAIg5B,gBAAgB,MACh3E,GAAkB,G,gDCDlB,GAAS,WAAa,IAAIh5B,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,6BAA6B,CAACL,EAAG,SAAS,CAACK,YAAY,sBAAsBG,MAAM,CAAC,MAAQT,EAAI05B,YAAY,CAAC15B,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,2CAA2C,KAAKnD,EAAG,aAAa,GAAGA,EAAG,SAAS,CAACK,YAAY,sBAAsBG,MAAM,CAAC,MAAQT,EAAI25B,cAAc,CAAC35B,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,6CAA6C,KAAKnD,EAAG,eAAe,IAAI,IAC7e,GAAkB,GCkBtB,IACEnC,KAAM,mBACNyE,MAAO,CACLm3B,UAAWpZ,SACXqZ,YAAarZ,UAEf7d,WAAY,CACVwe,OAAJ,GACIuC,SAAJ,KACIC,WAAJ,OC5B0W,MCQtW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIzjB,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,oBAAoB,CAAEN,EAAS,MAAEC,EAAG,QAAQ,CAACK,YAAY,gBAAgB,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIygB,UAAUzgB,EAAIiB,KAAKhB,EAAG,WAAW,CAACK,YAAY,gBAAgBG,MAAM,CAAC,MAAQT,EAAI45B,eAAe,aAAc,EAAK,QAAU55B,EAAImf,SAASld,GAAG,CAAC,MAAQjC,EAAI8gB,eAAgB9gB,EAAe,YAAEC,EAAG,IAAI,CAACK,YAAY,sBAAsB,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIwB,gBAAgBxB,EAAIiB,MAAM,IAChe,GAAkB,GCetB,IACEnD,KAAM,SACN2E,WAAY,GACZF,MAAO,CACL4c,QAASrb,MACTid,cAAeve,OACfie,MAAOje,OACPhB,YAAagB,QAEf,OACE,MAAO,CACLo3B,eAAgB,KAGpB,UACM94B,KAAKigB,gBACPjgB,KAAK84B,eAAiB94B,KAAKigB,gBAG/Bhe,QAAS,CACP,YAAYlE,GACViC,KAAKwc,MAAM,QAASze,GACpBiC,KAAK84B,eAAiB/6B,KCtCmU,MCS3V,I,oBAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QC+Df,IACEf,KAAM,WACN,OACE,MAAO,CACL2uB,UAAW,EAAjB,wBACMtL,OAAQ,GAAd,4DACM+X,SAAU,GACVK,mBAAoB,GACpB/yB,KAAM,GACN4yB,iBAAkB,CACxB,CAAQ,MAAR,OAAQ,MAAR,QACA,CAAQ,MAAR,QAAQ,MAAR,YAIE72B,MAAO,CACL02B,OAAQz2B,OACRq3B,MAAOnd,QACPkZ,mBAAoBpzB,QAEtBG,SAAU,GACVF,WAAY,CACVspB,MAAJ,GACI7K,MAAJ,GACI4Y,OAAJ,GACIC,QAAJ,KACIC,QAAJ,KACIC,kBAAJ,IAEE,UACOn5B,KAAK+4B,QACR/4B,KAAK0F,KAAO1F,KAAKo5B,iBAAiBp5B,KAAKm4B,SAEzCn4B,KAAKo4B,SAAWp4B,KAAKq5B,sBACrBr5B,KAAKkC,OAAOC,KAAK,EAArB,0BAEEF,QAAS,CAEP,iBAAiB2D,GACf,OAAO5F,KAAK8B,OAAOkE,QAAQszB,YAAY1zB,IAGzC,YAAYnH,GACV,MAAO,CACLzB,KAAMyB,EACNiC,YAAaV,KAAKqgB,OAAO5hB,GAAUiC,YACnC3C,MAAOiC,KAAK0F,KAAKjH,GACjBtD,KAAM6E,KAAKu5B,aAAav5B,KAAKqgB,OAAO5hB,IACpCsb,KAAM/Z,KAAKqgB,OAAO5hB,GAAUsb,KAC5BtZ,MAAOT,KAAKqgB,OAAO5hB,GAAUgC,QAIjC,sBACE,MAAM23B,EAAW,GACXoB,EAAiB,CAAC,QAAS,cAAe,MAAO,OAAQ,UACzDC,EAAiB,CAAC,MAClBC,EAAiB,IAC7B,+BACA,cASM,OARAphC,OAAO6iB,KAAKnb,KAAKqgB,QAAQ7e,QAAQ,IAC/B,MAAMm4B,EAAY35B,KAAK45B,YAAYn7B,GAC/Bi7B,EAAej7B,GACjB25B,EAASz/B,KAAKghC,GAEd35B,KAAKy4B,mBAAmB9/B,KAAKghC,KAG1BvB,GAGT,UAAUyB,GACR,OAAIA,EAAa,QACJ,IAATA,EAAuB,aAA3B,GAIF,eAAeC,GACbxhC,OAAO6iB,KAAKnb,KAAKqgB,QAAQ7e,QAAQ,IAC3B/C,IAAaq7B,GACf95B,KAAKo4B,SAASz/B,KAAKqH,KAAK45B,YAAYn7B,MAGxCuB,KAAKy4B,mBAAmBj3B,QAAQ,CAACu4B,EAAMp3B,KACjCo3B,EAAK/8B,OAAS88B,GAChB95B,KAAKy4B,mBAAmBl/B,OAAOoJ,EAAO,MAK5C,YAAYm3B,GACV95B,KAAKo4B,SAAS52B,QAAQ,CAACu4B,EAAMp3B,KACvBo3B,EAAK/8B,OAAS88B,IAChB95B,KAAKo4B,SAAS7+B,OAAOoJ,EAAO,GAC5B3C,KAAKy4B,mBAAmB9/B,KAAKohC,OAKnC,aAAaC,GACX,MAAMC,EAAcD,EAAW7+B,KAC/B,MAAoB,SAAhB8+B,EACK,OACf,aACe,SACf,cACe,UACf,OACe,SAEF,QAGT,WAEE,MAAMC,EAAa,GACnBl6B,KAAKo4B,SAAS52B,QAAQ,IAA5B,oBAEM,MAAM24B,EAAUn6B,KAAKo6B,iBAAiBF,GACtC,GAAIl6B,KAAK+4B,MAAO,CACdoB,EAAQv0B,GAAK,QAAQu0B,EAAQ15B,MAC7B,MAAM45B,EAAU,CAAxB,iDACQr6B,KAAK8B,OAAOM,OAAO,EAA3B,oBAEQpC,KAAK8B,OAAOM,OAAO,EAA3B,4CAGMpC,KAAK8B,OAAOM,OAAO,EAAzB,kBAEMpC,KAAKwc,MAAM,kBAGb,iBAAiB9W,GACf,MAAMy0B,EAAUz0B,EAChBy0B,EAAQv0B,GAAK5F,KAAKm4B,OACdgC,EAAQjhB,SAAQihB,EAAQjhB,OAASyD,SAASwd,EAAQjhB,OAAQ,KAC9D,MAAMohB,EAAY,IAChB,MAAMC,EAAS32B,EAAIS,MAAM,KACzB,OAAOk2B,EAAO11B,IAAI,GAA1B,+CAEY21B,EAAY,IAChB,QAAYv9B,IAAR2G,EACJ,MAAe,SAARA,GAKT,OAHIu2B,EAAQrf,OAAMqf,EAAQrf,KAAOwf,EAAUH,EAAQrf,OAC/Cqf,EAAQ/G,cAAa+G,EAAQ/G,YAAcoH,EAAUL,EAAQ/G,cAE1D+G,GAGT,cACEn6B,KAAK8B,OAAOM,OAAO,EAAzB,mBACMpC,KAAKwc,MAAM,oBC3OgV,MCQ7V,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,KACA,OAIa,M,QCnBX,GAAS,WAAa,IAAItd,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,QAAQ,CAACQ,MAAM,CAAC,KAAOT,EAAIysB,UAAU,WAAY,EAAK,MAAQ,MAAM,OAAS,MAAM,QAAU,eAAexqB,GAAG,CAAC,OAASjC,EAAIu7B,QAAQ,CAACt7B,EAAG,MAAM,CAACK,YAAY,mBAAmB,CAACL,EAAG,KAAK,CAACK,YAAY,cAAc,CAACN,EAAIE,GAAG,uBAAuBD,EAAG,IAAI,CAACK,YAAY,WAAW,CAACN,EAAIE,GAAG,WAAWF,EAAI4B,GAAG5B,EAAIi5B,WAAWh5B,EAAG,QAAQ,CAACQ,MAAM,CAAC,QAAUT,EAAIw7B,sBAAsB,MAAQ,iBAAiB,cAAgBx7B,EAAIy7B,WAAWrc,MAAM,CAACvgB,MAAOmB,EAAa,UAAEqf,SAAS,SAAUC,GAAMtf,EAAIy7B,UAAUnc,GAAKtd,WAAW,eAAe/B,EAAG,SAAS,CAACQ,MAAM,CAAC,QAAUT,EAAI07B,YAAY,cAAgB17B,EAAI27B,gBAAgB,MAAQ,eAAevc,MAAM,CAACvgB,MAAOmB,EAAmB,gBAAEqf,SAAS,SAAUC,GAAMtf,EAAI27B,gBAAgBrc,GAAKtd,WAAW,qBAAqB/B,EAAG,QAAQ,CAACQ,MAAM,CAAC,QAAUT,EAAI47B,qBAAqB,MAAQ,YAAY,cAAgB57B,EAAI67B,UAAUzc,MAAM,CAACvgB,MAAOmB,EAAY,SAAEqf,SAAS,SAAUC,GAAMtf,EAAI67B,SAASvc,GAAKtd,WAAW,cAAc/B,EAAG,oBAAoB,CAACQ,MAAM,CAAC,UAAYT,EAAI6f,KAAK,YAAc7f,EAAIu7B,UAAU,MACjmC,GAAkB,GCyCtB,IACEz9B,KAAM,aACN2E,WAAY,CACVq3B,OAAJ,GACI5Y,MAAJ,GACI+Y,kBAAJ,IAEE13B,MAAO,CACL02B,OAAQz2B,OACRs5B,eAAgBt5B,QAElB,OACE,MAAO,CACLm5B,gBAAiB,GACjBF,UAAW,OACXI,SAAU,MACVpP,UAAW,GAAG,EAApB,4CACM+O,sBAAuB,CAC7B,CAAQ,MAAR,OAAQ,MAAR,QACA,CAAQ,MAAR,OAAQ,MAAR,SAEMI,qBAAsB,CAC5B,CAAQ,MAAR,YAAQ,MAAR,aACA,CAAQ,MAAR,MAAQ,MAAR,UAIEj5B,SAAU,CACR,WACE,OAAO7B,KAAK8B,OAAOkE,QAAQV,UAE7B,cACE,OAAOtF,KAAKsF,SAAST,IAAI,GAA/B,SAEI,iBACE,IAAIo2B,EAAc,GAMlB,OALAj7B,KAAKsF,SAAS9D,QAAQ,IACpBwK,EAAQvG,MAAMjE,QAAQ,IAChBkE,EAAKE,KAAO5F,KAAKm4B,SAAQ8C,EAAcjvB,EAAQhP,UAGhDi+B,IAGX,UACEj7B,KAAK66B,gBAAkB76B,KAAKgW,gBAE9B/T,QAAS,CACP,OACE,MAAMyD,EAAO1F,KAAK8B,OAAOkE,QAAQszB,YAAYt5B,KAAKm4B,QAE5C+C,EAAc,CAA1B,8DAGM,GAFAl7B,KAAK8B,OAAOM,OAAO,EAAzB,aAE6B,SAAnBpC,KAAK26B,UAAsB,CAC7B,MAAMN,EAAU,CAAxB,oDACQr6B,KAAK8B,OAAOM,OAAO,EAA3B,eAEMpC,KAAKy6B,SAEP,QACEz6B,KAAKkC,OAAO4e,KAAK9gB,KAAK2rB,WACtB3rB,KAAK8B,OAAOM,OAAO,EAAzB,sBCxGmW,MCQ/V,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIlD,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,aAAa,CAACQ,MAAM,CAAC,KAAO,UAAU,CAAET,EAAIiD,OAASjD,EAAIi8B,eAAgBh8B,EAAG,MAAM,CAACK,YAAY,eAAeC,MAAOP,EAAIy0B,MAAQz0B,EAAI00B,KAAQ,OAAS10B,EAAI00B,KAAO,WAAa10B,EAAIy0B,KAAO,MAAS,IAAK,CAACx0B,EAAG,KAAK,CAACK,YAAY,gBAAgB,CAACL,EAAG,KAAK,CAACK,YAAY,iBAAiB,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,0CAA0C,OAAOnD,EAAG,KAAK,CAACgC,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIk8B,OAAO,cAAc,CAACj8B,EAAG,mBAAmBA,EAAG,OAAO,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,mCAAmC,GAAGnD,EAAG,KAAK,CAACgC,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIk8B,OAAO,aAAa,CAACj8B,EAAG,kBAAkBA,EAAG,OAAO,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,kCAAkC,GAAGnD,EAAG,KAAK,CAACgC,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIk8B,OAAO,YAAY,CAACj8B,EAAG,kBAAkBA,EAAG,OAAO,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,iCAAiC,GAAGnD,EAAG,KAAK,CAACgC,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIk8B,OAAO,gBAAgB,CAACj8B,EAAG,qBAAqBA,EAAG,OAAO,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,qCAAqC,KAAKnD,EAAG,KAAK,CAACK,YAAY,gBAAgB,CAACL,EAAG,KAAK,CAACK,YAAY,iBAAiB,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,6CAA6C,OAAOnD,EAAG,KAAK,CAACgC,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIm8B,kBAAkB,CAACl8B,EAAG,YAAYA,EAAG,OAAO,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,qCAAqC,GAAIpD,EAAc,WAAEC,EAAG,KAAK,CAACgC,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIo8B,kBAAkB,CAACn8B,EAAG,YAAYA,EAAG,OAAO,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,qCAAqC,GAAGpD,EAAIiB,KAAMjB,EAAc,WAAEC,EAAG,KAAK,CAACgC,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAI21B,oBAAoB,CAAC11B,EAAG,WAAWA,EAAG,OAAO,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,uCAAuC,GAAGpD,EAAIiB,SAASjB,EAAIiB,QACpvD,GAAkB,G,wBCyDtB,IACEnD,KAAM,cACN2E,WAAY,CACVusB,SAAJ,KACIqN,SAAJ,KACIrC,QAAJ,KACI3B,gBAAJ,KACID,eAAJ,KACIE,eAAJ,KACIC,kBAAJ,MAEEh2B,MAAO,CACLkyB,KAAMzK,OACN0K,KAAM1K,OACN/mB,KAAMyZ,SAER/Z,SAAU,CACR,iBACE,QAAS7B,KAAK8B,OAAOkE,QAAQqD,UAAUmyB,oBAEzC,aACE,OAAOx7B,KAAK8B,OAAOC,MAAMC,WAG7BC,QAAS,CAGP,OAAOzG,GACLwE,KAAKwc,MAAM,aAAchhB,IAE3B,eACEwE,KAAKwc,MAAM,qBAEb,eACExc,KAAKwc,MAAM,qBAEb,iBACExc,KAAKwc,MAAM,qBC/FuV,MCQpW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,KACA,OAIa,M,QCuDf,IACExf,KAAM,OACNyE,MAAO,CACLmE,GAAIlE,OACJjB,MAAOiB,OACP+5B,SAAU/5B,OACVhB,YAAagB,OACbyK,KAAMzK,OACN+wB,MAAO/wB,OACPqxB,gBAAiBrxB,OACjByX,IAAKzX,OACLmZ,SAAUnZ,OACVwX,OAAQgQ,OACR1tB,OAAQ,CACNL,KAAMuG,OACN0nB,UAAWzP,IAEbmZ,SAAUpxB,OACVg6B,kBAAmB9f,QACnBqX,mBAAoB36B,OACpB06B,eAAgBtxB,OAChBi6B,oBAAqBzS,OACrBoK,yBAA0B1X,QAC1BkZ,mBAAoBpzB,OACpBgzB,SAAU9Y,SAEZja,WAAY,CACVi6B,KAAJ,GACIC,mBAAJ,GACIC,gBAAJ,GACIC,YAAJ,GACIC,WAAJ,GACIC,SAAJ,GACIr6B,aAAJ,KAEEC,SAAU,CACR,YACE,OAAO7B,KAAK8B,OAAOkE,QAAQqD,WAE7B,aACE,OAAOrJ,KAAK8B,OAAOC,MAAMC,UAE3B,oBACE,OAAOhC,KAAKxE,QAAUwE,KAAKqJ,UAAU6yB,sBAAwB,EAAnE,kBAGI,gBACE,MAAM,KACJ/vB,EADR,SACQ,EADR,SACQ,EADR,WACQ,GACR,KACM,MAAO,QAAQ2mB,KAAa3mB,EAAiB,GAAV,WACzC,yCAGI,eACE,GAAInM,KAAKa,WAAY,MAAO,QAC5B,MAAMrF,EAASwE,KAAKs0B,kBACpB,OAAQ94B,GACN,IAAK,UAAb,cACQ,IAAK,SAAb,eACQ,IAAK,SAAb,gBACQ,IAAK,MAAb,aACQ,QAAR,SAII,gBACE,MAAM2gC,EAAU,IAChB,GAAIn8B,KAAKa,WAAY,OAAOs7B,EAC5B,MAAMC,EAAiB,CAAC,QAAS,aACjC,OAAOA,EAAe34B,SAASzD,KAAKs0B,mBAAqB6H,EAAUn8B,KAAKmZ,MAG5E,OACE,MAAO,CACLsa,iBAAiB,EACjB4I,MAAOr8B,KAAK4F,GACZ8sB,aAAc,CACZD,MAAOzyB,KAAKyyB,MACZ6J,WAAYt8B,KAAK+yB,iBAEnBwB,oBAAgBt3B,EAChBy2B,WAAY,CACVC,UAAM12B,EACN22B,UAAM32B,GAERs/B,cAAc,IAGlBt6B,QAAS,CAEP,WAAWhI,GACL+F,KAAKa,WAEPb,KAAKy0B,oBAGHx6B,EAAEuiC,QAAqC,UAA3Bx8B,KAAKs0B,mBACnBr6B,EAAE6S,iBACF9M,KAAKwc,MAAM,eAAgBxc,KAAKmZ,MACxC,qCACQ,GAAR,8CAEQnZ,KAAKwc,MAAM,eAGRxc,KAAKqJ,UAAUozB,mBAClBz8B,KAAK08B,uBAAuB18B,KAAK4F,IACjC5F,KAAK28B,uBAAuB38B,KAAK4F,OAIrC,gBAAgB3L,GACd+F,KAAKyzB,iBAAmBzzB,KAAKyzB,gBACzBx5B,GAAK4E,SAEPmB,KAAK0zB,WAAa,CAChBC,KAAM15B,EAAE2iC,QAAU/9B,OAAOg+B,YACzBjJ,KAAM35B,EAAE6iC,QAAUj+B,OAAOk+B,eAK/B,mBACE/8B,KAAKyzB,iBAAkB,GAGzB,oBACE,IAAKzzB,KAAKU,cAAgBV,KAAK6a,SAAU,MAAO,GAChD,MAAMna,EAAcV,KAAKU,YAAcV,KAAKU,YAAc,GACpDs8B,EAAeh9B,KAAK6a,SAAW,oBAAoB7a,KAAK6a,SAAa,GACrEoiB,EAAMv8B,GAAes8B,EAAe,OAAS,GAC7CE,EAAal9B,KAAKkZ,OAAS,cAAclZ,KAAKkZ,oBAAsB,GACpEikB,EAAcH,EAAeC,EAAMv8B,EAAcw8B,EACjDE,EAAWp9B,KAAKsC,GAAG,gDACzB,MAAO,CACLD,QAAS,KAAjB,eACQod,QAAS,cACT4d,mBAAmB,EACnBC,MAAM,EACNC,UAAWv9B,KAAKu0B,eAAiB,OAAS,OAC1C7U,MAAO,CAAf,mBACQqY,QAAS,uCAAuC/3B,KAAK8yB,WAIzD,wBACE,OAAQ9yB,KAAKs0B,mBACX,IAAK,SAAb,iBACQ,IAAK,UAAb,iBACQ,IAAK,SAAb,iBACQ,IAAK,MAAb,iBACQ,IAAK,QAAb,iBACQ,IAAK,YAAb,iBACQ,QAAR,mBAII,aACE,MAAM,IACJnb,EADR,eACQ,EADR,mBACQ,EADR,yBACQ,GACR,KACYqkB,EAAS,GAArB,sBACMx9B,KAAKu0B,oBAAiBt3B,EAEtB,MAAM+jB,EAAU,OAAtB,qGAEYyc,EAAa,SAASD,EAAOxK,GAAkB7Z,GAE/C+H,EAAU+R,EACtB,oCAEYyK,EAAiBpK,EAA2B,uBAAyB,GAE3E,MAAO,GAAGtS,IAAU,EAA1B,gDAGI,qBACE,MAAMC,EAAWjhB,KAAK29B,aACtB,GAAN,SACA,SACA,uCAEA,WACQ,KAAR,gBACU,WAAV,yBACU,eAAV,MAKI,WAAW9gB,GACT,MAAM,IAAZ,QAEM,OADA7c,KAAKyzB,iBAAkB,EACf5W,GACN,IAAK,SACHhe,OAAO+d,KAAKzD,EAAK,UACjB,MACF,IAAK,UACHta,OAAO+d,KAAKzD,EAAK,SACjB,MACF,IAAK,QACHnZ,KAAKwc,MAAM,eAAgBrD,GAC3B,MACF,IAAK,YACH,GAAV,uCACU,MACF,QAAR,0BAII,mBACEnZ,KAAKu8B,cAAe,EACpBv8B,KAAKyzB,iBAAkB,EACvBzzB,KAAKkC,OAAOC,KAAK,EAAvB,yBACMnC,KAAK8B,OAAOM,OAAO,EAAzB,oBAGI,gBACEpC,KAAKu8B,cAAe,EACpBv8B,KAAKkC,OAAO4e,KAAK,EAAvB,yBACM9gB,KAAK8B,OAAOM,OAAO,EAAzB,oBAGI,uBAAuB+1B,GACrB,MAAMyF,EAAW7tB,KAAKC,MAAMxF,aAAatC,QAAQ,EAAvD,sCACM,IAAI21B,EAAUD,EAASzF,IAAW,EAClC0F,GAAW,EACXD,EAASzF,GAAU0F,EACnBrzB,aAAanC,QAAQ,EAA3B,kDAGI,uBAAuB8vB,GACrB,MAAM2F,EAAW/tB,KAAKC,MAAMxF,aAAatC,QAAQ,EAAvD,sCACM41B,EAAS3F,IAAU,IAAI1wB,MAAOkM,UAC9BnJ,aAAanC,QAAQ,EAA3B,kDAGI,mBACErI,KAAKkC,OAAOC,KAAK,GAAG,EAA1B,yCACMnC,KAAK8B,OAAOM,OAAO,EAAzB,mBACMpC,KAAK+9B,oBAGP,iBACE,MAAMC,EAAgBh+B,KAAK8B,OAAOkE,QAAQi4B,uBAAuBj+B,KAAK4F,IAChEy0B,EAAU,CAAtB,mCACMr6B,KAAK8B,OAAOM,OAAO,EAAzB,eACMpC,KAAK+9B,qBAGT,UAEM/9B,KAAK07B,mBAAmB17B,KAAKk+B,qBAE7Bl+B,KAAK27B,oBAAsB,GAC7BwC,YAAYn+B,KAAKk+B,mBAA+C,IAA3Bl+B,KAAK27B,uBC1U6S,MCSzV,I,oBAAY,eACd,GACA,GACA,IACA,EACA,KACA,KACA,OAIa,M,QCpBX,GAAS,WAAa,IAAIz8B,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACG,MAAO,eAAiBJ,EAAIk/B,gBAAkB,IAAMl/B,EAAIm/B,cAAe5+B,OAASP,EAAIuzB,MAAQ,eAAevzB,EAAIuzB,MAAQ,IAAM,KAAQvzB,EAAIo/B,qBAAqBp/B,EAAIwzB,cAAiB,KAAO,CAACvzB,EAAG,QAAQ,CAACK,YAAY,SAASG,MAAM,CAAC,GAAKT,EAAIq/B,WAAW,KAAO,WAAW,SAAW,MAAMl4B,SAAS,CAAC,QAAUnH,EAAIs/B,YAAYr9B,GAAG,CAAC,OAASjC,EAAIu/B,mBAAmBt/B,EAAG,QAAQ,CAACK,YAAY,aAAaG,MAAM,CAAC,IAAMT,EAAIq/B,WAAW,SAAW,MAAMp9B,GAAG,CAAC,QAAU,SAASC,GAAQ,OAAIA,EAAOjG,KAAK+R,QAAQ,QAAQhO,EAAIiO,GAAG/L,EAAOgM,QAAQ,QAAQ,GAAGhM,EAAO/C,IAAI,CAAC,QAAQ,gBAAkC,WAAY+C,GAA4B,IAAlBA,EAAOizB,OAAvC,KAA2En1B,EAAI0zB,gBAAgB55B,MAAM,KAAMgU,YAAY,YAAc,SAAS5L,GAAQA,EAAO0L,oBAAqB,CAAE5N,EAAQ,KAAEC,EAAG,OAAO,CAACK,YAAY,eAAeG,MAAM,CAAC,KAAOT,EAAIiN,KAAK,KAAO,QAAQ,IAAMjN,EAAIuB,SAASvB,EAAIiB,KAAKhB,EAAG,KAAK,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIuB,UAAWvB,EAAc,WAAEC,EAAG,eAAe,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAIw/B,cAAex9B,WAAW,kBAAkB1B,YAAY,iBAAiB2B,GAAG,CAAC,MAAQjC,EAAIy/B,iBAAiBz/B,EAAIiB,MAAM,GAAGhB,EAAG,MAAM,CAACK,YAAY,uBAAuB,CAACL,EAAG,MAAM,CAACK,YAAY,iBAAiB,CAACN,EAAIqgB,GAAG,YAAY,QAChzC,GAAkB,GCiCtB,IACEviB,KAAM,uBACNyE,MAAO,CACLm9B,UAAWl9B,OACXjB,MAAOiB,OACPyK,KAAMzK,OACN4wB,UAAW1W,QACX2W,KAAMrJ,OACNsJ,KAAMtJ,OACNuJ,MAAO/wB,OACPgxB,aAAchxB,QAEhBC,WAAY,CACVi6B,KAAJ,GACIh6B,aAAJ,KAEEC,SAAU,CACR,aACE,OAAO7B,KAAK8B,OAAOC,MAAMC,UAE3B,aACE,IAAIhC,KAAKa,WACT,MAAO,eAAeb,KAAK4+B,WAE7B,gBACE,OAAQ5+B,KAAKw+B,WAA+B,UAAlB,iBAE5B,kBACE,MAAM,KAAZ,8BACM,MAAO,GAAGK,EAAatM,EAAM,UAAUsM,EAAarM,EAAM,WAG9D36B,KAAM,KAAM,CACV2mC,YAAY,IAEd,UACEx+B,KAAKw+B,WAAax+B,KAAK8+B,oBAEzB78B,QAAS,CAEP,aAAa88B,EAAMC,GACjB,MAAMC,EAAU,EAChB,IAAIC,EAAU,QAAQzjB,KAAKsjB,GAAQpiB,SAASoiB,EAAM,IAAM,EAExD,OADAG,EAAU,EAAhB,MACa,GAAGF,KAAeE,KAG3B,qBAAqBC,GACnB,OAAOA,EAAUA,EAAQj6B,QAAQ,qBAAsB,IAAM,IAG/D,oBACE,MAAMk6B,EAAa,EAAzB,mCAEYC,EAAc,IAAM70B,aAAanC,QAAQ+2B,EAAYrvB,KAAK2Z,UAAU,KAE1E,OAAKlf,aAAa40B,GAKXrvB,KAAKC,MAAMxF,aAAa40B,KAJ7BC,IACO,KAMX,mBACE,QAAuBpiC,IAAnB+C,KAAKsyB,UAAyB,OAAQtyB,KAAKsyB,UAC/C,MAAMgN,EAAsBt/B,KAAKu/B,oBACjC,YAA4CtiC,IAAxCqiC,EAAoBt/B,KAAK4+B,YACpBU,EAAoBt/B,KAAK4+B,YAMpC,iBAAiBh5B,EAAI45B,GAEnB,MAAMC,EAAgB1vB,KAAKC,MAAMxF,aAAa,EAApD,qCAEMi1B,EAAc75B,GAAM45B,EAEpBh1B,aAAanC,QAAQ,EAA3B,uDAGI,gBAAgBq3B,GACd1/B,KAAKw+B,WAAakB,EAAYC,WAAWC,aACd3iC,IAAvB+C,KAAKy/B,gBACPz/B,KAAKu/B,oBACLv/B,KAAK6/B,iBAAiB7/B,KAAK4+B,UAAU76B,WAAY/D,KAAKw+B,cAG1D,gBACEx+B,KAAKwc,MAAM,oBAEb,gBAAgBviB,GACd+F,KAAKwc,MAAM,kBAAmBviB,IAEhC,cACE,MAAMoI,EAAUrC,KAAKsC,GAAG,gDACxB,MAAO,CAAb,4DCpIoW,MCQhW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIpD,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,QAAQ,CAACQ,MAAM,CAAC,KAAOT,EAAIlC,KAAK,WAAY,EAAK,MAAQ,MAAM,OAAS,MAAM,QAAU,eAAemE,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOlC,EAAIg5B,iBAAiB,CAAC/4B,EAAG,MAAM,CAACQ,MAAM,CAAC,KAAO,aAAawB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAI4hB,SAASkB,KAAK,aAAa,CAAC9iB,EAAIE,GAAG,WAAWD,EAAG,IAAI,CAACK,YAAY,eAAeG,MAAM,CAAC,MAAQ,SAASwB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAI4hB,UAAU,CAAC5hB,EAAIE,GAAG,OAAQF,EAAO,IAAEC,EAAG,SAAS,CAACK,YAAY,QAAQG,MAAM,CAAC,IAAMT,EAAIia,KAAKhY,GAAG,CAAC,QAAU,SAASC,GAAQ,OAAIA,EAAOjG,KAAK+R,QAAQ,QAAQhO,EAAIiO,GAAG/L,EAAOgM,QAAQ,MAAM,GAAGhM,EAAO/C,IAAI,CAAC,MAAM,WAAoB,KAAca,EAAIu7B,MAAMzhC,MAAM,KAAMgU,eAAe7N,EAAG,MAAM,CAACK,YAAY,UAAU,CAACN,EAAIE,GAAG,yBACxxB,GAAkB,GCYtB,IACEpC,KAAM,cACNyE,MAAO,CACLzE,KAAM0E,QAER7J,KAAM,KAAM,CACVshB,IAAK,MAEPlX,QAAS,CACP,KAAKkX,GACHnZ,KAAKmZ,IAAMA,EACXnZ,KAAKkC,OAAOC,KAAKnC,KAAKhD,MACtBgD,KAAK8B,OAAOM,OAAO,EAAzB,oBAEI,OACEpC,KAAKkC,OAAO4e,KAAK9gB,KAAKhD,OAExB,cACEgD,KAAK8B,OAAOM,OAAO,EAAzB,sBC/BoW,MCQhW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,KACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIlD,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,QAAQ,CAACQ,MAAM,CAAC,KAAOT,EAAIysB,UAAU,WAAY,EAAK,MAAQ,MAAM,OAAS,MAAM,QAAU,4BAA4BxqB,GAAG,CAAC,OAASjC,EAAIg5B,cAAc,CAAC/4B,EAAG,MAAM,CAACK,YAAY,sBAAsB,CAACL,EAAG,KAAK,CAACD,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAI,oCAAsCpD,EAAIw1B,SAAW,MAAQ,QAAU,mBAAoB,OAAOv1B,EAAG,aAAa,CAACK,YAAY,oBAAoBG,MAAM,CAAC,OAAST,EAAI4gC,aAAa,KAAO,mBAAmBxhB,MAAM,CAACvgB,MAAOmB,EAAe,YAAEqf,SAAS,SAAUC,GAAMtf,EAAI6gC,YAAYvhB,GAAKtd,WAAW,iBAAiB/B,EAAG,oBAAoB,CAACQ,MAAM,CAAC,UAAYT,EAAI8gC,YAAY,YAAc9gC,EAAIg5B,gBAAgB,MAC5tB,GAAkB,G,wBC8BtB,IACEl7B,KAAM,cACNyE,MAAO,CACLw+B,aAAc/W,OACdwL,SAAU9Y,SAEZja,WAAY,CACVw3B,kBAAJ,GACI+G,WAAJ,MAEE,OACE,MAAO,CACLvU,UAAW,EAAjB,2BACMtL,OAAQ,GAAd,qCACM0f,YAAa,KAGjBl+B,SAAU,CAER,eACE,MAAMs+B,EAAgBngC,KAAKqgB,OACrB+f,EAAoBpgC,KAAKqgB,OAAOjL,YAAY0E,WAClD,MAAO,CACL3e,KAAM,SACN2e,WAAY,CACV9c,KAAMmjC,EAAcnjC,KACpBmP,KAAMg0B,EAAch0B,KACpBiJ,YAAa,CACX3U,MAAO,GACPC,YAAa,GACbvF,KAAM,SACN2e,WAAY,CACVumB,OAAQD,EAAkBC,OAC1B7N,KAAM4N,EAAkB5N,KACxBD,KAAM6N,EAAkB7N,KACxBD,UAAW8N,EAAkB9N,UAC7Bzc,cAAeuqB,EAAkBvqB,oBAO7C,UACE7V,KAAK+/B,YAAc//B,KAAK8B,OAAOkE,QAAQs6B,kBAAkBtgC,KAAKigC,cAC9DjgC,KAAKkC,OAAOC,KAAK,EAArB,6BAEEF,QAAS,CAEP,oBAAoBU,GAClB,OAAI3C,KAAK00B,SAAiB,GACnB10B,KAAK8B,OAAOkE,QAAQs6B,kBAAkB39B,IAG/C,cACE3C,KAAK8B,OAAOM,OAAO,EAAzB,mBACMpC,KAAKwc,MAAM,qBAGb,cACE,MAAM,aAAZ,sBACUxc,KAAK00B,SACP10B,KAAK8B,OAAOM,OAAO,EAA3B,kBAEQpC,KAAK8B,OAAOM,OAAO,EAA3B,+CAEMpC,KAAK8B,OAAOM,OAAO,EAAzB,kBACMpC,KAAKwc,MAAM,uBClGmV,MCQhW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,KACA,OAIa,M,QCnBX,GAAS,WAAa,IAAItd,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,aAAa,CAACQ,MAAM,CAAC,KAAO,UAAU,CAAET,EAAIiD,OAASjD,EAAIi8B,eAAgBh8B,EAAG,MAAM,CAACK,YAAY,eAAeC,MAAOP,EAAIy0B,MAAQz0B,EAAI00B,KAAQ,OAAS10B,EAAI00B,KAAO,WAAa10B,EAAIy0B,KAAO,MAAS,IAAK,CAACx0B,EAAG,KAAK,CAACK,YAAY,gBAAgB,CAACL,EAAG,KAAK,CAACgC,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIqhC,iBAAiB,CAACphC,EAAG,mBAAmBA,EAAG,OAAO,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,2CAA2C,GAAGnD,EAAG,KAAK,CAACgC,GAAG,CAAC,MAAQjC,EAAIshC,sBAAsB,CAACrhC,EAAG,YAAYA,EAAG,OAAO,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,2CAA2C,GAAIpD,EAAc,WAAEC,EAAG,KAAK,CAACgC,GAAG,CAAC,MAAQjC,EAAI40B,gBAAgB,CAAC30B,EAAG,WAAWA,EAAG,OAAO,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,6CAA6C,GAAGpD,EAAIiB,SAASjB,EAAIiB,QAC3yB,GAAkB,GC4BtB,IACEnD,KAAM,cACN2E,WAAY,CACVusB,SAAJ,KACIgL,QAAJ,KACI3B,gBAAJ,MAEE91B,MAAO,CACLkyB,KAAMzK,OACN0K,KAAM1K,OACN/mB,KAAMyZ,SAER/Z,SAAU,CACR,iBACE,QAAS7B,KAAK8B,OAAOkE,QAAQqD,UAAUmyB,oBAEzC,aACE,OAAOx7B,KAAK8B,OAAOC,MAAMC,WAG7BC,QAAS,CAGP,cACEjC,KAAKwc,MAAM,sBAEb,sBACExc,KAAKwc,MAAM,oBAEb,gBACExc,KAAKwc,MAAM,oBC3D0V,MCQvW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCmFf,IACExf,KAAM,UACNyE,MAAO,CACL4wB,QAAS3wB,OACTjB,MAAOiB,OACPyK,KAAMzK,OACN0T,YAAa9c,OACbmN,MAAOzC,MACP8vB,SAAUpxB,OACViB,MAAOumB,QAETvnB,WAAY,CACV8+B,YAAJ,GACI1E,YAAJ,GACI2E,KAAJ,GACIC,YAAJ,GACIC,YAAJ,IAEE,OACE,MAAO,CACLrE,cAAc,EACd9I,iBAAiB,EACjBC,WAAY,CACVC,UAAM12B,EACN22B,UAAM32B,KAIZ4E,SAAU,CACR,YACE,OAAO7B,KAAK8B,OAAOkE,QAAQqD,WAE7B,YACE,OAAOrJ,KAAKoV,YAAYirB,QAAU,EAAxC,cAGI,cACE,IAAI,MAAV,QACM,OAAIrgC,KAAKqJ,UAAUozB,mBACI,iBAAnBz8B,KAAK6gC,UACP7gC,KAAK8gC,mBAAmBr7B,GAChC,wCACQzF,KAAK8gC,mBAAmBr7B,GAAOs7B,UACvC,6BACQt7B,EAAQzF,KAAKghC,eAAev7B,GACpC,6BACQA,EAAQzF,KAAKihC,cAAcx7B,GACnC,0BACQA,EAAQzF,KAAKkhC,aAAaz7B,GAClC,4CACQ,GAAR,iEAZkDA,GAgB9C,cACE,OAAOzF,KAAKoV,YAAY0d,UAAY9yB,KAAK8yB,UAE3C,eACE,MAA0C,SAAnC9yB,KAAKoV,YAAY+rB,kBAC9B,4DAEI,YACE,IAAIC,EAAS,GAOb,OANI1mC,SAAS0I,KAAKC,YAAc,MAC9B+9B,GAAUphC,KAAKoV,YAAYisB,WACnC,oFACQD,GAAUphC,KAAKoV,YAAYksB,WACnC,kFAEaF,GAET,aACE,OAAOphC,KAAK8B,OAAOC,MAAMC,WAG7BC,QAAS,CAEP,aAAakX,GACXnZ,KAAKsc,MAAM,eAAetc,KAAKqyB,SAAWlwB,KAAKgX,IAGjD,wBAAwBooB,GACtB,MAAMC,EAAmBxhC,KAAKqJ,UAAU+pB,cAAe,EACvD,YAA0Bn2B,IAAnBskC,EAA+BA,EAAiBC,GAGzD,yBACE,IAAIC,EAAWzhC,KAAKqJ,UAAUsyB,oBAC9B,OAAK8F,GACDA,EAAW,KAAIA,EAAW,IAC1BA,EAAW,IAAGA,EAAW,GACtBA,GAHe,GAMxB,mBAAmBh8B,GACjB,OAAOA,EAAMi8B,KAAK,CAAC58B,EAAG68B,IAAM,EAAlC,qBAGI,eAAel8B,GACb,MAAMm8B,EAAa7xB,KAAKC,MAAMxF,aAAatC,QAAQ,EAAzD,sCACY25B,EAAM,GAAlB,WAEM,OADAp8B,EAAMs7B,UAAUW,KAAK,CAAC58B,EAAG68B,IAAM,EAArC,cACal8B,GAGT,cAAcA,GACZ,MAAMm8B,EAAa7xB,KAAKC,MAAMxF,aAAatC,QAAQ,EAAzD,sCACY45B,EAAM,GAAlB,WAEM,OADAr8B,EAAMs7B,UAAUW,KAAK,CAAC58B,EAAG68B,IAAM,EAArC,cACal8B,GAGT,aAAaA,GACX,OAAOA,EACb,SAAQ,aAAR,iBACA,2BACA,MAAQ,WAAR,IAGI,oBACE,MAAMuK,EAAQ,GAApB,wCACY+xB,EAAoB/xB,EAAMhQ,KAAKS,OACrC,GAAN,wBACMT,KAAK+9B,oBAGP,kBACE/9B,KAAKu8B,cAAe,EACpBv8B,KAAKkC,OAAOC,KAAK,EAAvB,4BACMnC,KAAK8B,OAAOM,OAAO,EAAzB,mBACMpC,KAAK+9B,oBAGP,mBACE/9B,KAAKu8B,cAAe,EACpBv8B,KAAKkC,OAAO4e,KAAK,EAAvB,4BACM9gB,KAAK8B,OAAOM,OAAO,EAAzB,oBAGI,gBACE,MAAM4/B,EAAahiC,KAAKsC,GAAG,kDACrB2/B,EAAUpT,QAAQmT,GACxB,GAAIC,EAAS,CACX,MAAM5H,EAAU,CAAxB,gDACQr6B,KAAK8B,OAAOM,OAAO,EAA3B,kBAEMpC,KAAK+9B,oBAGP,gBAAgB9jC,GACd+F,KAAKyzB,iBAAkB,EACnBx5B,GAAK4E,SACPmB,KAAK0zB,WAAa,CAChBC,KAAM15B,EAAE2iC,QAAU/9B,OAAOg+B,YACzBjJ,KAAM35B,EAAE6iC,QAAUj+B,OAAOk+B,eAK/B,mBACE/8B,KAAKyzB,iBAAkB,KCtQmU,MCQ5V,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIv0B,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,2BAA2B,CAACL,EAAG,MAAM,CAACK,YAAY,uCAAuC,CAACL,EAAG,IAAI,CAACK,YAAY,yCAAyC,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,+CAA+C,OAAOnD,EAAG,IAAI,CAACK,YAAY,uBAAuB,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,kDAAkD,SAASnD,EAAG,MAAM,CAACK,YAAY,oCAAoCL,EAAG,MAAM,CAACK,YAAY,8CAA8C,CAACL,EAAG,IAAI,CAACK,YAAY,qBAAqB,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,2DAA2D,OAAOnD,EAAG,SAAS,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,iDAAkDpB,WAAW,gEAAgEvB,MAAM,CAAC,MAAQT,EAAIgjC,cAAc,CAAChjC,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,6CAA6C,KAAKnD,EAAG,oBAAoB,GAAGA,EAAG,SAAS,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,8CAA+CpB,WAAW,6DAA6DvB,MAAM,CAAC,MAAQT,EAAIijC,cAAc,CAACjjC,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,0CAA0C,KAAKnD,EAAG,mBAAmB,GAAGA,EAAG,SAAS,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,kDAAmDpB,WAAW,iEAAiEvB,MAAM,CAAC,MAAQT,EAAIkjC,uBAAuB,CAACljC,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,8CAA8C,KAAKnD,EAAG,eAAe,GAAGA,EAAG,SAAS,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,iDAAkDpB,WAAW,gEAAgEvB,MAAM,CAAC,MAAQT,EAAImjC,sBAAsB,CAACnjC,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,6CAA6C,KAAKnD,EAAG,oBAAoB,GAAGA,EAAG,SAAS,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,oDAAqDpB,WAAW,mEAAmEvB,MAAM,CAAC,MAAQT,EAAIojC,sBAAsB,CAACpjC,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,gDAAgD,KAAKnD,EAAG,gBAAgB,GAAGA,EAAG,SAAS,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,mDAAoDpB,WAAW,kEAAkEvB,MAAM,CAAC,MAAQT,EAAIqjC,QAAQ,CAACrjC,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,+CAA+C,KAAKnD,EAAG,eAAe,IAAI,GAAGA,EAAG,MAAM,CAACK,YAAY,gDAAgD,CAACL,EAAG,IAAI,CAACK,YAAY,qBAAqB,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,sDAAsD,OAAOnD,EAAG,SAAS,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,mDAAoDpB,WAAW,kEAAkEvB,MAAM,CAAC,MAAQT,EAAIsjC,mBAAmB,CAACtjC,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,+CAA+C,KAAKnD,EAAG,iBAAiB,GAAGA,EAAG,SAAS,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,oDAAqDpB,WAAW,mEAAmEvB,MAAM,CAAC,MAAQT,EAAIujC,oBAAoB,CAACvjC,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,gDAAgD,KAAKnD,EAAG,kBAAkB,IAAI,GAAGA,EAAG,gBAAgBA,EAAG,kBAAkB,IAC9sH,GAAkB,GCDlB,GAAS,WAAa,IAAID,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,QAAQ,CAACQ,MAAM,CAAC,KAAOT,EAAIysB,UAAU,WAAY,EAAK,MAAQ,MAAM,OAAS,MAAM,QAAU,8BAA8BxqB,GAAG,CAAC,OAASjC,EAAIg5B,cAAc,CAAC/4B,EAAG,MAAM,CAACK,YAAY,wBAAwB,CAACL,EAAG,KAAK,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,kDAAkDnD,EAAG,aAAa,CAACK,YAAY,iBAAiBG,MAAM,CAAC,OAAST,EAAImhB,OAAO,KAAO,gBAAgBlf,GAAG,CAAC,OAAS,SAASC,GAAgC,OAAxBA,EAAO0L,iBAAwB5N,EAAIwjC,YAAY1pC,MAAM,KAAMgU,aAAasR,MAAM,CAACvgB,MAAOmB,EAAY,SAAEqf,SAAS,SAAUC,GAAMtf,EAAIk5B,SAAS5Z,GAAKtd,WAAW,aAAa,CAAC/B,EAAG,SAAS,CAACQ,MAAM,CAAC,KAAO,WAAW,CAACT,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,2CAA2C,KAAKnD,EAAG,aAAa,IAAI,IAAI,MACvyB,GAAkB,GC+BtB,IACEnC,KAAM,eACN,OACE,MAAO,CACLo7B,SAAU,GACV/X,OAAQ,GAAd,oBACMsL,UAAW,EAAjB,+BAGEhqB,WAAY,CACVu+B,WAAJ,KACI/f,OAAJ,GACIuC,SAAJ,MAEE,UACE1iB,KAAKo4B,SAAWp4B,KAAKK,UAEvBwB,SAAU,CACR,WACE,OAAO7B,KAAK8B,OAAOkE,QAAQ3F,WAG/B4B,QAAS,CAEP,cACEjC,KAAK8B,OAAOM,OAAO,EAAzB,6BACMpC,KAAKkC,OAAO4e,KAAK9gB,KAAK2rB,WACtB3rB,KAAK8B,OAAOM,OAAO,EAAzB,mBACMpC,KAAK8B,OAAOM,OAAO,EAAzB,mBAGI,cACEpC,KAAK8B,OAAOM,OAAO,EAAzB,sBChEqW,MCQjW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,KACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIlD,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,QAAQ,CAACQ,MAAM,CAAC,KAAOT,EAAIysB,UAAU,WAAY,EAAK,MAAQ,MAAM,OAAS,MAAM,QAAU,+BAA+BxqB,GAAG,CAAC,OAASjC,EAAIg5B,cAAc,CAAC/4B,EAAG,MAAM,CAACK,YAAY,yBAAyB,CAACL,EAAG,KAAK,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,mDAAmDnD,EAAG,MAAM,CAACK,YAAY,oBAAoB,CAACL,EAAG,IAAI,CAACK,YAAY,eAAe,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,yDAAyD,OAAOpD,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,sDAAsD,IAAIpD,EAAI4B,GAAG5B,EAAIoD,GAAG,sDAAsD,KAAKnD,EAAG,IAAI,CAACQ,MAAM,CAAC,KAAO,yDAAyD,CAACT,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,wDAAwD,OAAOpD,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,sDAAsD,OAAOnD,EAAG,oBAAoB,CAACQ,MAAM,CAAC,UAAYT,EAAIwjC,YAAY,YAAcxjC,EAAIyjC,iBAAiBxjC,EAAG,aAAa,CAACK,YAAY,kBAAkBG,MAAM,CAAC,OAAST,EAAImhB,OAAO,QAAS,EAAK,KAAO,iBAAiBlf,GAAG,CAAC,OAAS,SAASC,GAAgC,OAAxBA,EAAO0L,iBAAwB5N,EAAIwjC,YAAY1pC,MAAM,KAAMgU,aAAasR,MAAM,CAACvgB,MAAOmB,EAAY,SAAEqf,SAAS,SAAUC,GAAMtf,EAAIk5B,SAAS5Z,GAAKtd,WAAW,cAAc/B,EAAG,oBAAoB,CAACQ,MAAM,CAAC,UAAYT,EAAIwjC,YAAY,YAAcxjC,EAAIyjC,kBAAkB,MACj7C,GAAkB,GC8CtB,IACE3lC,KAAM,gBACN,OACE,MAAO,CACLo7B,SAAU,GACV/X,OAAQ,GAAd,qBACMsL,UAAW,EAAjB,gCAGElqB,MAAO,GACPE,WAAY,CACVu+B,WAAJ,KACI/G,kBAAJ,IAEE,UACEn5B,KAAKo4B,SAAWp4B,KAAKqJ,WAEvBxH,SAAU,CACR,YACE,OAAO7B,KAAK8B,OAAOkE,QAAQqD,YAG/BpH,QAAS,CAEP,cACE,MAAM2gC,EAAoB5iC,KAAK6iC,sBAAsB7iC,KAAKo4B,UAC1Dp4B,KAAK8B,OAAOM,OAAO,EAAzB,kBACMpC,KAAKkC,OAAO4e,KAAK9gB,KAAK2rB,WACtB3rB,KAAK8B,OAAOM,OAAO,EAAzB,mBACMpC,KAAK8B,OAAOM,OAAO,EAAzB,mBAEI,gBACEpC,KAAKkC,OAAO4e,KAAK9gB,KAAK2rB,YAGxB,cACE3rB,KAAK8B,OAAOM,OAAO,EAAzB,oBAGI,sBAAsB0gC,GACpB,MAAMC,EAAMD,EACNE,EAAU,QAAtB,MAEM,OADA1qC,OAAO6iB,KAAK4nB,GAAKvhC,QAAQnD,GAAO2kC,EAAQD,EAAI1kC,YAAgB0kC,EAAI1kC,IACzD0kC,KC1FyV,MCQlW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,KACA,OAIa,M,wJCwFf,IACE/lC,KAAM,mBACN2E,WAAY,CACVwe,OAAJ,GACI8iB,aAAJ,GACIC,gBAAJ,KACIC,eAAJ,KACIC,WAAJ,KACIzgB,WAAJ,KACI0gB,cAAJ,KACIC,aAAJ,KACIC,cAAJ,GACIC,gBAAJ,KACIC,YAAJ,MAEE5hC,SAAU,CACR,SACE,OAAO7B,KAAK8B,OAAOC,MAAMqH,SAG7B,OACE,MAAO,CACL8V,iBAAajiB,EACbkiB,aAAc,GACdsB,SAAU,IAAI,GAApB,sCAGExe,QAAS,CACP,QACEjC,KAAK8B,OAAOwH,SAAS,EAA3B,mBACMtJ,KAAK8B,OAAOM,OAAO,EAAzB,mBAEI,uBACEpC,KAAKkC,OAAOC,KAAK,EAAvB,kCACMnC,KAAK8B,OAAOM,OAAO,EAAzB,oBAEI,mBACEpC,KAAKkC,OAAOC,KAAK,EAAvB,8BACMnC,KAAK8B,OAAOM,OAAO,EAAzB,oBAEI,oBACEpC,KAAKkC,OAAOC,KAAK,EAAvB,+BACMnC,KAAK8B,OAAOM,OAAO,EAAzB,oBAEI,sBACEpC,KAAK8B,OAAOM,OAAO,EAAzB,mBACMpC,KAAK8B,OAAOM,OAAO,EAAzB,mBACMpC,KAAKkC,OAAOC,KAAK,EAAvB,4BAEI,sBACEnC,KAAK8B,OAAOM,OAAO,EAAzB,mBACMpC,KAAK8B,OAAOM,OAAO,EAAzB,mBACMpC,KAAKkC,OAAOC,KAAK,EAAvB,4BAEI,QAAQE,GACN,MAAO,CAAb,4CAEI,UAAUtF,EAASokB,GACjBnhB,KAAK4gB,SAASze,KAAKpF,EAAS,CAAlC,4CAEI,6BACEyN,aAAawJ,WAAW,EAA9B,+BACMxJ,aAAawJ,WAAW,EAA9B,gCACMxJ,aAAawJ,WAAW,EAA9B,oCAEI,cACE,MAAMnc,EAAOmI,KAAKoJ,OAClBoB,aAAanC,QAAQ,EAA3B,8DACMmC,aAAanC,QAAQ,EAA3B,0DACMmC,aAAanC,QAAQ,EAA3B,4DACUxQ,EAAKwR,UAAUmP,OACjBhO,aAAanC,QAAQ,EAA7B,6CAEMG,GAAY,uDAAwD,iBACpExI,KAAKqhB,UAAUrhB,KAAKsC,GAAG,oCAAoC,GAC3DtC,KAAK8B,OAAOM,OAAO,EAAzB,mBAEI,cAEE,MAAMshC,EAAc,GACd3iB,EAAO,GAAnB,yBAEYC,EAAU,OAAtB,qGACYC,EAAW,GAAGD,IAAU,EAApC,2BACYE,EAAU,CAAtB,6BACY9d,EAAO,CAAnB,6BACY7H,EAAU,GAAtB,cAEMyE,KAAKygB,SAAS3R,QACdvT,EAAQU,KAAK,IACX+D,KAAKkf,YAAcjM,EAASpb,KAAKspB,UAAW,EAC5CnhB,KAAKmf,aAAelM,EAASpb,KAAKkF,QAC9BiD,KAAKkf,aACPlf,KAAKohB,6BACLphB,KAAKqhB,UAAUrhB,KAAKsC,GAAG,mCAAmC,IAE1DtC,KAAKqhB,UAAUrhB,KAAKsC,GAAG,wCAAwC,GAEjEkG,GAAY,8CAA+C,iBAC3DxI,KAAKygB,SAAS1R,MACd/O,KAAK8B,OAAOM,OAAO,EAA3B,oBAEA,UACQ,KAAR,eACQ,KAAR,eACQ,KAAR,gBACQ,GAAR,6BACQ,KAAR,oBCtNyW,MCQrW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIlD,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,QAAQ,CAACQ,MAAM,CAAC,KAAOT,EAAIysB,UAAU,WAAY,EAAK,MAAQ,MAAM,OAAS,MAAM,QAAU,yBAAyBxqB,GAAG,CAAC,OAASjC,EAAIg5B,cAAc,CAAC/4B,EAAG,MAAM,CAACK,YAAY,uBAAuB,CAACL,EAAG,KAAK,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,8CAA8CnD,EAAG,MAAM,CAACK,YAAY,6BAA6B,CAACL,EAAG,SAAS,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,qDAAsDpB,WAAW,oEAAoEvB,MAAM,CAAC,MAAQT,EAAIykC,wBAAwB,CAACzkC,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,iDAAiD,KAAKnD,EAAG,mBAAmB,GAAGA,EAAG,SAAS,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAI+B,QAAQ/B,EAAIoD,GAAG,oDAAqDpB,WAAW,mEAAmEvB,MAAM,CAAC,MAAQT,EAAI0kC,iBAAiB,CAAC1kC,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,gDAAgD,KAAKnD,EAAG,uBAAuB,IAAI,GAAGA,EAAG,KAAK,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,4CAA4CnD,EAAG,YAAY,CAACK,YAAY,mBAAmBG,MAAM,CAAC,KAAOT,EAAIkK,WAAW,MACvxC,GAAkB,G,wBCuCtB,IACEpM,KAAM,mBACN2E,WAAY,CACVwe,OAAJ,GACI0jB,eAAJ,KACIC,mBAAJ,MAEE,OACE,MAAO,CACLnY,UAAW,EAAjB,mCAGElqB,MAAO,GACPI,SAAU,CACR,SACE,OAAO7B,KAAK8B,OAAOC,MAAMqH,SAG7BnH,QAAS,CACP,oBACE,OAAO,GAAb,wBAEI,iBACE,MAAM8hC,EAAW,iBACX36B,EAASpJ,KAAKgkC,oBACdC,EAAUvpC,SAASQ,cAAc,KACvC+oC,EAAQxnC,aAAa,OAAQ,kCAAkC0gB,mBAAmB/T,IAClF66B,EAAQxnC,aAAa,WAAYsnC,GACjCE,EAAQxkC,MAAMqL,QAAU,OACxBpQ,SAAS0I,KAAKpH,YAAYioC,GAC1BA,EAAQ3kB,QACR5kB,SAAS0I,KAAKtH,YAAYmoC,GAC1Bz7B,GAAY,iCAAkCE,GAASG,SAEzD,wBACE,MAAMO,EAASpJ,KAAKgkC,oBACpBh6B,UAAUwZ,UAAUC,UAAUra,GAC9BpJ,KAAK4gB,SAASze,KAAKnC,KAAKsC,GAAG,2BAC3BkG,GAAY,6BAA8BE,GAASG,SAErD,cACE7I,KAAK8B,OAAOM,OAAO,EAAzB,oBAEI,QAAQC,GACN,MAAO,CACLA,UAAA,QAAR,cAAQ,MAAR,IAAQ,QAAR,kBCrFyW,MCQrW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,KACA,OAIa,M,QCnBX,GAAS,WAAa,IAAInD,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,eAAe,CAAEN,EAAc,WAAEC,EAAG,MAAM,CAACK,YAAY,kBAAkB2B,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIglC,2BAA2B,CAAC/kC,EAAG,IAAI,CAACD,EAAIE,GAAG,KAAKF,EAAI4B,GAAG5B,EAAIoD,GAAG,2DAA2DpD,EAAIiB,KAAMjB,EAAI2B,YAAc3B,EAAIilC,kBAAmBhlC,EAAG,kBAAkB,CAACQ,MAAM,CAAC,UAAW,GAAMwB,GAAG,CAAC,iBAAmBjC,EAAIs0B,oBAAoBt0B,EAAIiB,MAAM,IACtf,GAAkB,GCqBtB,IACEnD,KAAM,wBACN2E,WAAY,CACVyiC,gBAAJ,IAEEvsC,KAAM,KAAM,CACVssC,mBAAmB,IAErBtiC,SAAU,CACR,aACE,OAAO7B,KAAK8B,OAAOC,MAAMC,WAG7BC,QAAS,CACP,wBACEjC,KAAKmkC,mBAAoB,EACzBnkC,KAAKkC,OAAOC,KAAK,EAAvB,4BACMnC,KAAK8B,OAAOM,OAAO,EAAzB,oBAEI,mBACEpC,KAAKmkC,mBAAoB,EACzBnkC,KAAKkC,OAAO4e,KAAK,EAAvB,4BACM9gB,KAAK8B,OAAOM,OAAO,EAAzB,sBC5C8W,MCQ1W,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,gCCqDf,IACEpF,KAAM,OACN2E,WAAY,CACV0iC,kBAAJ,GACIC,iBAAJ,GACIC,iBAAJ,GACIC,cAAJ,GACIC,QAAJ,GACIC,SAAJ,MAEE7sC,KAAM,KAAM,CACVoU,YAAa,GACbV,OAAQ,GACRC,cAAe,GACf24B,mBAAmB,IAErBtiC,SAAU,CACR,WACE,OAAO7B,KAAK8B,OAAOkE,QAAQV,UAE7B,YACE,OAAOtF,KAAK8B,OAAOkE,QAAQqD,WAE7B,WACE,OAAOrJ,KAAK8B,OAAOkE,QAAQ3F,UAE7B,YACE,OAAOL,KAAK8B,OAAOC,MAAM2J,WAE3B,oBACE,OAAO1L,KAAK2kC,kBAAkB3kC,KAAK8B,OAAOkE,QAAQV,SAAUtF,KAAK+F,OAAO+kB,OAAO9e,UAEjF,aACE,OAAOhM,KAAK8B,OAAOC,MAAMC,UAG3B,WACE,IAAI,SAAV,kBACM,OAAK+J,GACDA,EAAW,IAAGA,EAAW,GACzBA,EAAW,IAAGA,EAAW,GACtBA,GAHe,MAMxB,gBACE,MAAMzG,EAAWtF,KAAK8L,mBAAqB9L,KAAKsF,SAChD,OAAOA,EAASyQ,OAAO,GAA7B,6CAGI,oBACE,OAAO/V,KAAK8B,OAAOkE,QAAQuF,QAG7B,WACE,OAAOvL,KAAK8B,OAAOkE,QAAQ0G,WAG/Bqa,MAAO,CACL,kBAAkBxb,GAChBf,aAAanC,QAAQ,EAA3B,0CACMrI,KAAKuL,OAASA,GAEhB,SAASypB,GACPxqB,aAAanC,QAAQ,EAA3B,iCACMrI,KAAKwL,cAAgBwpB,IAGzB/yB,QAAS,CAEP,gBAAgBqD,GACd,MAAMoL,EAAgBlG,aAAa,EAAzC,mCACM,OAAO,GAAb,6BAGI,UAAUyB,GACRjM,KAAKiM,YAAcA,GAAe,IAGpC,oBACEjM,KAAKsc,MAAMsoB,WAAWv3B,oBAGxB,YAAYqN,EAAUC,GACpB,OAAOF,GAAYC,EAAUC,IAG/B,eAAe3O,GACb,OAAQA,EAAQoJ,YAAmBpJ,EAAQoJ,YAAb,IAGhC,sBAAsByvB,GACpB7kC,KAAK8B,OAAOM,OAAO,iBAAkByiC,IAEvC,wBACE7kC,KAAKmkC,mBAAoB,EACzBnkC,KAAKkC,OAAOC,KAAK,EAAvB,4BACMnC,KAAK8B,OAAOM,OAAO,EAAzB,oBAEI,mBACEpC,KAAKmkC,mBAAoB,EACzBnkC,KAAKkC,OAAO4e,KAAK,EAAvB,4BACM9gB,KAAK8B,OAAOM,OAAO,EAAzB,oBAGIuiC,kBAAmB,CAACG,EAAaC,KAC/B,IAAKA,EAAc,OACnB,IAAIC,EACJ,MAAMh1B,EAAQ,GAApB,2CAOM,OANA80B,EAAYtjC,QAAQ,IACdwO,EAAM+0B,KAAkB/0B,EAAMhE,EAAQhP,QACxCgoC,EAAkB,CAACh5B,MAGlBg5B,GAAiB,GAA5B,qCACaA,GAGT,sBACE,MAAMxd,EAAkB,GACxB,GAAIxnB,KAAKqJ,WACHrJ,KAAKqJ,UAAUoe,mBAAoB,CACrC,MAAMC,EAAY1nB,KAAKqJ,UAAUoe,mBAC7BzkB,MAAMwO,QAAQkW,GAChBA,EAAUlmB,QAAQ,CAACmmB,EAAKxvB,KACtBqvB,EAAgB,wBAAuBrvB,EAAI,IAAOwvB,IAGpDH,EAAgB,uBAAyBxnB,KAAKqJ,UAAUoe,mBAK9D,OADAD,EAAgBI,QAAU,IACnBJ,GAGT,yBAAyByd,GACvB,IAAIC,GAAW,EACf,QAAKllC,KAAKsF,WACVtF,KAAKsF,SAAS9D,QAAQ,IAChBwK,EAAQG,MAAQH,EAAQG,KAAK1I,SAASwhC,KAASC,GAAW,GAC9Dl5B,EAAQvG,MAAMjE,QAAQ,IAChBkE,EAAKyG,MAAQzG,EAAKyG,KAAK1I,SAASwhC,KAASC,GAAW,OAGrDA,IAGT,2BACE,IAAIA,EAAWllC,KAAKmlC,yBAAyB,OAC7C,MAAM5jB,EAAe/W,aAAa,EAAxC,2BAEM,MADI,CAAC,WAAY,iBAAiB/G,SAAS8d,KAAe2jB,GAAW,GAC9DA,GAGT,sBACE,GAAIllC,KAAKqJ,UAAU+7B,mBAAqBplC,KAAKqlC,2BAA4B,CACvE,MAAMC,EAAoB5qC,SAASQ,cAAc,UAC3CqqC,EAAQvlC,KAAKqJ,UAAUm8B,gBAAkB,EAAvD,iBACQF,EAAkB7oC,aAAa,MAAO,GAAG,EAAjD,0BACQ/B,SAASqB,KAAKC,YAAYspC,KAI9B,mBACE,OAAOtlC,KAAKmlC,yBAAyB,SAGvC,8BACE,GAAInlC,KAAKylC,mBAAoB,CAC3B,MAAMC,EAAgBhrC,SAASQ,cAAc,QAC7CwqC,EAAcjpC,aAAa,MAAO,cAClCipC,EAAcjpC,aAAa,OAAQ,EAA3C,iBACQ/B,SAASqB,KAAKC,YAAY0pC,KAI9B,iBACE,GAAK1lC,KAAKsF,SAChB,CACQ,IAAIqgC,GAAa,EAIjB,OAHA3lC,KAAKsF,SAAS9D,QAAQ,IAChBxB,KAAKkM,YAAYF,EAAQvG,MAAOzF,KAAKiM,aAAa5T,OAAS,IAAGstC,GAAa,KAE1EA,EANW,OAAO,GAU7B,qBACE,OAAI3lC,KAAKqJ,WAAarJ,KAAKqJ,UAAUu8B,cAC5B,oBAAoB5lC,KAAKqJ,UAAUu8B,yCAErC,KAGX,UACE5lC,KAAK6lC,sBACL7lC,KAAK8lC,8BACL9lC,KAAKuL,OAASvL,KAAK+lC,kBACnB/lC,KAAKwL,cAAgBxL,KAAK0M,WC9QgT,MCQ1U,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIxN,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,cAAc,CAAEN,EAAyB,sBAAEC,EAAG,MAAM,CAACK,YAAY,qBAAqB,CAACL,EAAG,KAAK,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,qCAAqCnD,EAAG,IAAI,CAACK,YAAY,qBAAqB,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,iCAAiC,KAAKnD,EAAG,OAAO,CAACK,YAAY,YAAY,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAI8mC,uBAAuB7mC,EAAG,SAAS,CAACK,YAAY,eAAeG,MAAM,CAAC,MAAQT,EAAI+mC,eAAe,CAAC/mC,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,+BAA+B,OAAOnD,EAAG,SAAS,CAACK,YAAY,eAAeG,MAAM,CAAC,MAAQT,EAAIgnC,SAAS,CAAChnC,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,4BAA4BnD,EAAG,OAAO,CAACK,YAAY,0BAA0B,CAACN,EAAIE,GAAG,qEAAqED,EAAG,aAAa,CAACQ,MAAM,CAAC,KAAO,WAAW,CAACR,EAAG,IAAI,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,OAAOgE,QAAQ,SAASjD,MAAOmB,EAAW,QAAEgC,WAAW,YAAY5B,MAAO,uBAAyBJ,EAAIinC,QAAS,CAACjnC,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAInC,eAAe,GAAGmC,EAAIiB,MAAQjB,EAAIknC,uBAA0BlnC,EAAImnC,wBAAyBlnC,EAAG,OAAO,CAACK,YAAY,cAAc,CAACL,EAAG,KAAK,CAACK,YAAY,eAAe,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,mBAAmBnD,EAAG,QAAQ,CAACK,YAAY,uBAAuBG,MAAM,CAAC,KAAO,OAAO,MAAQT,EAAIoD,GAAG,yBAAyBgc,MAAM,CAACvgB,MAAOmB,EAAY,SAAEqf,SAAS,SAAUC,GAAMtf,EAAI4T,SAAS0L,GAAKtd,WAAW,cAAc/B,EAAG,QAAQ,CAACK,YAAY,uBAAuBG,MAAM,CAAC,KAAO,WAAW,MAAQT,EAAIoD,GAAG,yBAAyBgc,MAAM,CAACvgB,MAAOmB,EAAY,SAAEqf,SAAS,SAAUC,GAAMtf,EAAIsqB,SAAShL,GAAKtd,WAAW,cAAc/B,EAAG,QAAQ,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIoD,GAAG,+BAA+BnD,EAAG,WAAW,CAACK,YAAY,sBAAsBG,MAAM,CAAC,aAAc,EAAK,QAAUT,EAAIonC,cAAchoB,MAAM,CAACvgB,MAAOmB,EAAW,QAAEqf,SAAS,SAAUC,GAAMtf,EAAI3C,QAAQiiB,GAAKtd,WAAW,aAAa/B,EAAG,SAAS,CAACK,YAAY,eAAeG,MAAM,CAAC,MAAQT,EAAIqnC,cAAc,CAACrnC,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,uBAAuB,OAAOnD,EAAG,aAAa,CAACQ,MAAM,CAAC,KAAO,WAAW,CAACR,EAAG,IAAI,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,OAAOgE,QAAQ,SAASjD,MAAOmB,EAAW,QAAEgC,WAAW,YAAY5B,MAAO,uBAAyBJ,EAAIinC,QAAS,CAACjnC,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAInC,eAAe,GAAGmC,EAAIiB,KAAMjB,EAAIyT,uBAAyBzT,EAAIknC,uBAAyBlnC,EAAImnC,wBAAyBlnC,EAAG,OAAO,CAACK,YAAY,cAAc,CAACL,EAAG,KAAK,CAACK,YAAY,eAAe,CAACN,EAAIE,GAAG,kBAAkBD,EAAG,SAAS,CAACK,YAAY,eAAeG,MAAM,CAAC,MAAQT,EAAIsnC,aAAa,CAACtnC,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,+BAA+B,OAAOpD,EAAI2H,GAAG,IAAI,GAAG3H,EAAIiB,KAAOjB,EAAImnC,wBAAoRnnC,EAAIiB,KAA/PhB,EAAG,MAAM,CAACK,YAAY,kBAAkB,CAACL,EAAG,KAAK,CAACD,EAAIE,GAAG,WAAWD,EAAG,IAAI,CAACD,EAAIE,GAAG,qEAAqED,EAAG,SAAS,CAACK,YAAY,eAAeG,MAAM,CAAC,MAAQT,EAAIsnC,aAAa,CAACtnC,EAAIE,GAAG,gBAAgB,MAC10F,GAAkB,CAAC,WAAa,IAAIF,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,IAAI,CAACK,YAAY,eAAe,CAACN,EAAIE,GAAG,4CAA4CD,EAAG,MAAMD,EAAIE,GAAG,0FCsFjN,IACEpC,KAAM,QACN2E,WAAY,CACVwe,OAAJ,GACI8K,MAAJ,IAEE,OACE,MAAO,CACLnY,SAAU,GACV0W,SAAU,GACVzsB,QAAS,GACTopC,OAAQ,UACR5pC,aAASU,IAGb4E,SAAU,CACR,YACE,OAAO7B,KAAK8B,OAAOkE,QAAQqD,WAG7B,eACE,MAAO,CACb,CAAQ,MAAR,mCAAQ,KAAR,GACA,CAAQ,MAAR,kCAAQ,KAAR,OACA,CAAQ,MAAR,iCAAQ,KAAR,OACA,CAAQ,MAAR,kCAAQ,KAAR,UAII,mBACE,MAAO,CACLiK,gBAAiBtT,KAAKsC,GAAG,gCACzB+Q,gBAAiBrT,KAAKsC,GAAG,gCACzBiR,kBAAmBvT,KAAKsC,GAAG,kCAC3B8Q,kBAAmBpT,KAAKsC,GAAG,kCAC3B6Q,WAAYnT,KAAKsC,GAAG,2BAGxB,mBACE,OAAOkI,aAAa,EAA1B,+BAEI,QACE,MAAM6F,EAAOrQ,KAAKqJ,UAAUgH,MAAQ,GACpC,OAAOrN,MAAMwO,QAAQnB,GAAQA,EAAOA,EAAKoB,OAAS,IAEpD,wBACE,MAAMkD,GAAZ,wCACM,OAAO,GAAb,uBAEI,uBACE,OAAOhC,MAET,0BACE,OAAO,KAAb,sDAGE1Q,QAAS,CAEP,cAEE,MAAM1F,EAAUyD,KAAKzD,QAAUyD,KAAKzD,QAAQkqC,KAAO,EAE7CxzB,EAAWJ,GACvB,cACA,cACA,WACM,KAAN,kBAEM7S,KAAKjD,QAAUkW,EAAS7L,IACxBpH,KAAKmmC,OAASlzB,EAASC,QAAU,UAAY,QACzCD,EAASC,SACXM,GAAMxT,KAAK8S,SAAU9S,KAAKwpB,SAAUjtB,GACpCyD,KAAK0mC,SACLl+B,GAAY,4BAA4BxI,KAAK8S,SAAYpK,GAASC,OAElEF,GAAmB,oBAAqBC,GAASC,KAAM3I,KAAKjD,UAIhE,aACE,MAAM4pC,EAAY3mC,KAAK2S,qBACnBg0B,GACF3mC,KAAK4gB,SAASze,KAAK,qCAAsC,CAAjE,4BACQqG,GAAY,qBAAsBE,GAASC,MAC3C3I,KAAK0mC,WAEL1mC,KAAK4gB,SAASze,KAAK,2BAA4B,CAAvD,0BACQsG,GAAmB,2BAA4BC,GAASC,QAI5D,SACEoL,KACA/T,KAAKmmC,OAAS,UACdnmC,KAAKjD,QAAU,iBACfiD,KAAKosB,eAGP,eACEpsB,KAAKmmC,OAAS,UACdnmC,KAAKjD,QAAU,iBACfiD,KAAK0mC,UAGP,cACExpC,WAAW,KAAjB,yBAGI,SACEA,WAAW,KACT,GAAR,kBACA,MAGI,WACE,MAAMsb,EAAQhO,aAAa,EAAjC,sCACM9P,SAASC,qBAAqB,QAAQ,GAAG8B,aAAa,aAAc+b,KAGxE,UACExY,KAAK4mC,WACL1pC,WAAW,KAAf,wCChN+U,MCQ3U,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,KACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIgC,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,cAAc,CAACL,EAAG,UAAU,CAACQ,MAAM,CAAC,SAAWT,EAAIoG,SAAS,QAAUpG,EAAI2nC,iBAAiB1lC,GAAG,CAAC,aAAajC,EAAI4nC,aAAe5nC,EAAI6nC,sBAAgE5nC,EAAG,yBAAyB,CAACQ,MAAM,CAAC,IAAMT,EAAIia,OAAvFha,EAAG,aAAa,CAACQ,MAAM,CAAC,IAAMT,EAAIia,QAA6D,IAC3W,GAAkB,GCDlB,GAAS,WAAa,IAAIja,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,YAAY,CAACN,EAAIuD,GAAIvD,EAAY,UAAE,SAAS8M,EAAQrJ,GAAO,OAAOxD,EAAG,MAAM,CAACd,IAAIsE,EAAMnD,YAAY,oBAAoB,CAACL,EAAG,MAAM,CAACK,YAAY,0BAA0B2B,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIqhC,YAAY59B,MAAU,CAACxD,EAAG,cAAc,CAACK,YAAY,OAAOG,MAAM,CAAC,KAAOqM,EAAQG,KAAK,MAAQH,EAAQhP,SAAS,GAAGmC,EAAG,aAAa,CAACQ,MAAM,CAAC,KAAO,UAAU,CAAET,EAAI8nC,OAAOrkC,GAAQxD,EAAG,iBAAiB,CAACQ,MAAM,CAAC,MAAQqM,EAAQvG,OAAOtE,GAAG,CAAC,aAAajC,EAAI4nC,aAAa5nC,EAAIiB,MAAM,IAAI,MAAKhB,EAAG,MAAM,CAACK,YAAY,uBAAuB,CAACL,EAAG,cAAc,CAACQ,MAAM,CAAC,GAAK,UAAU,CAACR,EAAG,WAAW,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAIoD,GAAG,2BAA4BpB,WAAW,kCAAkC1B,YAAY,eAAe,GAAGL,EAAG,cAAc,CAACQ,MAAM,CAAC,GAAK,aAAa,CAACR,EAAG,kBAAkB,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAIoD,GAAG,2BAA4BpB,WAAW,kCAAkC1B,YAAY,eAAe,IAAI,IAAI,IACjlC,GAAkB,GCDlB,GAAS,WAAa,IAAIN,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAAC4B,WAAW,CAAC,CAAC/D,KAAK,UAAUgE,QAAQ,YAAYjD,MAAOmB,EAAW,QAAEgC,WAAW,YAAY5B,MAAO,kBAAoBJ,EAAIiN,KAAO,SAAW,aAAchL,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAI+nC,iBAAiB,CAAE/nC,EAAQ,KAAEC,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAOT,EAAIiN,KAAK,KAAO,QAAQ,IAAMjN,EAAIia,OAAOha,EAAG,IAAI,CAACK,YAAY,eAAe,CAACN,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIuB,WAAW,IACxc,GAAkB,GCWtB,IACEzD,KAAM,cACNyE,MAAO,CACL0K,KAAMzK,OACNjB,MAAOiB,OACPyX,IAAKzX,OACLlG,OAAQkG,OACR4d,MAAOE,UAET7d,WAAY,CACVi6B,KAAJ,IAEE35B,QAAS,CACP,cACMjC,KAAKmZ,KAAKnZ,KAAKwc,MAAM,aAAc,CAA7C,oCAGE,OACE,MAAO,CACLvb,QAAS,CACPoe,UAAWrf,KAAKS,MAChB4B,QAASrC,KAAKS,MACdgf,QAAS,cACT8d,UAAW,iBCnCiV,MCQhW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIr+B,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,gBAAgBN,EAAIuD,GAAIvD,EAAS,OAAE,SAASwG,EAAK/C,GAAO,OAAOxD,EAAG,MAAM,CAACd,IAAIsE,GAAO,CAACxD,EAAG,cAAc,CAACK,YAAY,OAAOG,MAAM,CAAC,KAAO+F,EAAKyG,KAAK,MAAQzG,EAAKjF,MAAM,IAAMiF,EAAKyT,IAAI,OAASzT,EAAKlK,QAAQ2F,GAAG,CAAC,aAAajC,EAAI4nC,cAAc,MAAK,IACpW,GAAkB,GCkBtB,IACE9pC,KAAM,iBACNyE,MAAO,CACLgE,MAAOzC,OAETrB,WAAY,CACVulC,YAAJ,IAEEjlC,QAAS,CACP,UAAUoc,GACRre,KAAKwc,MAAM,aAAc6B,MC7BwU,MCQnW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCiBf,IACErhB,KAAM,UACNyE,MAAO,CACL6D,SAAUtC,MACVmkC,QAASzlC,QAEX,OACE,MAAO,CACLslC,OAAQ,IAAIhkC,MAAMhD,KAAKsF,SAASjN,QAAQ+uC,MAAK,KAGjDzlC,WAAY,CACVulC,YAAJ,GACIG,eAAJ,GACI/W,gBAAJ,KACIF,SAAJ,MAEEnuB,QAAS,CAEP,YAAYU,GACV3C,KAAKgnC,OAAShnC,KAAKgnC,OAAOniC,IAAI,CAACyiC,EAAKC,IAAQ,IAAlD,QAGI,UAAUlpB,GACRre,KAAKwc,MAAM,aAAc6B,IAG3B,qBACE,IAAKre,KAAKmnC,QAAS,OACnB,MAAM3sB,EAAU,GAAtB,wCACYgtB,EAAU,GAAtB,2BACMxnC,KAAKsF,SAAS9D,QAAQ,CAACwK,EAASi0B,MACY,IAAtCj0B,EAAQvG,MAAMgiC,UAAUD,IAAiBxnC,KAAKugC,YAAYN,OAIpE,UAC+B,IAAzBjgC,KAAKsF,SAASjN,OAChB2H,KAAKugC,YAAY,GAEjBvgC,KAAK0nC,uBC5EqV,MCQ5V,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIxoC,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,cAAcG,MAAM,CAAC,GAAKT,EAAI0G,KAAK,CAACzG,EAAG,SAAS,CAACQ,MAAM,CAAC,IAAMT,EAAIia,UACpL,GAAkB,GCOtB,IACEnc,KAAM,aACNyE,MAAO,CACL0X,IAAKzX,OACLkE,GAAI,CACFzK,KAAMuG,OACNynB,QAAS,kBCdoV,MCQ/V,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIjqB,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACmM,IAAI,YAAY9L,YAAY,uBAClI,GAAkB,GCOtB,IACExC,KAAM,aACNyE,MAAO,CACL0X,IAAKzX,QAEP7J,KAAM,KAAM,CACV8vC,SAAU,KAEZ5gB,MAAO,CAEL,MAAJ,mBAEE9kB,QAAS,CAEP,YACMjC,KAAK2nC,SAASlkC,SAASzD,KAAKmZ,KAC9BnZ,KAAK4nC,mBAEL5nC,KAAK2nC,SAAShvC,KAAKqH,KAAKmZ,KACxBnZ,KAAK6nC,iBAIT,eACE,MAAMC,EAAiB,EAA7B,gBACYC,EAAW,IAAID,EAAe,CAClCE,UAAW,CAAnB,kCAEMD,EAASE,SACTjoC,KAAKsc,MAAM4rB,UAAUlsC,YAAY+rC,EAASI,MAG5C,kBACEnlC,MAAMmhB,KAAKzpB,SAASuT,uBAAuB,gBAAgBzM,QAAQ,IACjE4mC,EAAMC,UAAUzhB,IAAI,UAEtBlsB,SAASmQ,eAAerG,KAAKxE,KAAKmZ,MAAMkvB,UAAUC,OAAO,WC5CgT,MCQ3W,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCHf,IACEtrC,KAAM,YACNnF,KAAM,KAAM,CACVshB,IAAK,GACLwM,SAAJ,GACIM,gBAAJ,GACIL,qBAAJ,KAEE/jB,SAAU,CACR,WACE,OAAO7B,KAAK8B,OAAOkE,QAAQV,UAE7B,YACE,OAAOtF,KAAK8B,OAAOkE,QAAQqD,WAE7B,wBACE,OAAOrJ,KAAKqJ,UAAUk/B,qBAAsB,IAGhD5mC,WAAY,CACV6mC,QAAJ,GACIC,WAAJ,GACIC,uBAAJ,IAEEzmC,QAAS,CACP,UAAUoc,GACe,WAAnBA,EAAQ7iB,OACVqD,OAAO+d,KAAKyB,EAAQlF,IAAK,UAEzBnZ,KAAKmZ,IAAMkF,EAAQlF,KAGvB,WACE,MAAMX,EAAQxY,KAAK2lB,WACnB3lB,KAAKimB,gBAAgBzN,GACrBxY,KAAK4lB,qBAAqBpN,IAE5B,sBACE,MAAM8sB,EAAoB5qC,SAASQ,cAAc,UAC3CqqC,EAAQvlC,KAAKqJ,UAAUm8B,gBAAkB,EAArD,iBACMF,EAAkB7oC,aAAa,MAAO,+BAA+B8oC,QACrE7qC,SAASqB,KAAKC,YAAYspC,IAG5B,gBACE,MAAMqD,EAAQ3oC,KAAK+F,OACnB,OAAI4iC,EAAMC,OAASD,EAAMC,MAAMzvB,IACtB0vB,UAAUF,EAAMC,MAAMzvB,KACrC,mCACenZ,KAAKqJ,UAAUy/B,yBAD9B,IAME,UACE9oC,KAAK4mC,WACL5mC,KAAK6lC,sBACL7lC,KAAKmZ,IAAMnZ,KAAK6mC,kBCzE+T,MCQ/U,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WACb,IAAIkC,EAAS/oC,KACTd,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACK,YAAY,eAAeC,MAAOP,EAAImM,qBAAuBnM,EAAI8pC,kBAAmB,CAAC7pC,EAAG,MAAM,CAACK,YAAY,mBAAmB,CAACL,EAAG,iBAAiB,CAACK,YAAY,kBAAkB2B,GAAG,CAAC,aAAejC,EAAI+pC,iBAAiB,GAAG9pC,EAAG,MAAM,CAACK,YAAY,oBAAoB,CAACL,EAAG,cAAc,CAACQ,MAAM,CAAC,GAAK,MAAM,CAACR,EAAG,KAAK,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAImB,SAASI,YAAYtB,EAAG,gBAAgB,CAACmM,IAAI,aAAa3L,MAAM,CAAC,QAAUT,EAAIwM,WAAWvK,GAAG,CAAC,mBAAmB,SAAU1H,GAAKsvC,EAAO98B,YAAcxS,OAAS,GAAIyF,EAAI2M,gBAAgB3M,EAAIoG,UAAWnG,EAAG,MAAM,CAACG,MAAO,yBAA4BJ,EAAIgqC,WAA6B,GAAhB,gBAAsB,CAAChqC,EAAIuD,GAAIvD,EAAIiqC,YAAYjqC,EAAIoG,WAAW,SAAS0G,EAAQrJ,GAAO,OAAOxD,EAAG,iBAAiB,CAACd,IAAK,WAAasE,EAAOnD,YAAY,WAAWG,MAAM,CAAC,MAAQgD,EAAM,MAAQqJ,EAAQhP,KAAK,SAAWkC,EAAI27B,kBAAoBl4B,GAAOxB,GAAG,CAAC,gBAAkBjC,EAAIkqC,sBAAqBlqC,EAAIuD,GAAIvD,EAAIiqC,YAAYjqC,EAAIoG,WAAW,SAAS0G,EAAQrJ,GAAO,OAAOxD,EAAG,iBAAiB,CAACd,IAAK,QAAUsE,EAAOhD,MAAM,CAAC,MAAQgD,EAAM,MAAQqJ,EAAQhP,KAAK,KAAOgP,EAAQG,WAAQlP,EAAU,QAAW,WAAa0F,EAAO,MAAQzD,EAAIgN,YAAYF,EAAQvG,OAAO,SAAWvG,EAAI27B,kBAAoBl4B,EAAM,SAAWzD,EAAIgqC,WAAW,SAAW,SAAS/nC,GAAG,CAAC,gBAAkBjC,EAAIkqC,gBAAgB,YAAc,SAAShoC,GAAQ,OAAOlC,EAAImN,qBAAqB,0BAA0BnN,EAAI0M,4BAA4B1M,EAAIoN,iBAAkBnN,EAAG,MAAM,CAACK,YAAY,WAAW,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAI+M,YAAc/M,EAAIoD,GAAG,mBAAqBpD,EAAIoD,GAAG,iBAAiB,OAAOpD,EAAIiB,MAAM,GAAGhB,EAAG,MAAM,CAACK,YAAY,WAAW,CAACN,EAAIE,GAAG,IAAIF,EAAI4B,GAAG5B,EAAIoD,GAAG,iBAAiB,UACxqD,GAAkB,GCHlB,GAAS,WAAa,IAAIpD,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACG,MAAO,0BAA4BJ,EAAImqC,SAAW,WAAa,IAAM,KAAOnqC,EAAIoqC,QAAU,WAAY,KAAM,CAAEpqC,EAAImqC,UAAYnqC,EAAIoqC,QAASnqC,EAAG,MAAM,CAACK,YAAY,iBAAiBN,EAAIuD,GAAIvD,EAAS,OAAE,SAASwG,EAAK/C,GAAO,OAAOxD,EAAG,OAAO,CAACd,IAAKsE,EAAQ,IAAOzD,EAAIqqC,OAAO7jC,EAAKjF,OAASd,MAAM,CAAC,GAAMgD,EAAQ,IAAOzD,EAAIqqC,OAAO7jC,EAAKjF,OAAS,IAAMiF,EAAKyT,IAAI,MAAQzT,EAAKjF,MAAM,YAAciF,EAAKhF,YAAY,KAAOgF,EAAKyG,KAAK,OAASzG,EAAKlK,OAAO,MAAQkK,EAAK+sB,MAAM,gBAAkB/sB,EAAKqtB,gBAAgB,eAAiBrtB,EAAKstB,eAAe,mBAAqBttB,EAAKutB,mBAAmB,SAAW/zB,EAAI4zB,SAAS,OAASptB,EAAKwT,OAAO,kBAAoBha,EAAIi0B,wBAAwBztB,EAAK0tB,aAAa,oBAAsBl0B,EAAIm0B,0BAA0BlyB,GAAG,CAAC,YAAc,SAASC,GAAQ,OAAOlC,EAAIsd,MAAM,gBAAgB,aAAetd,EAAIq0B,mBAAkB,GAAGr0B,EAAIiB,KAAKhB,EAAG,cAAc,CAACmM,IAAK,eAAiBpM,EAAImzB,QAAS1yB,MAAM,CAAC,KAAQ,eAAiBT,EAAImzB,SAAUlxB,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOlC,EAAIsd,MAAM,oBAAoB,IACrmC,GAAkB,GCmCtB,IACExf,KAAM,YACNyE,MAAO,CACL4wB,QAAS3wB,OACTjB,MAAOiB,OACPyK,KAAMzK,OACN0T,YAAa9c,OACbmN,MAAOzC,MACP8vB,SAAUpxB,OACVgK,UAAWkQ,QACXjZ,MAAOumB,OACPmgB,SAAUztB,QACV0tB,QAAS1tB,SAEX/Z,SAAU,CACR,YACE,OAAO7B,KAAK8B,OAAOkE,QAAQqD,YAG/B1H,WAAY,CACV++B,KAAJ,GACIC,YAAJ,IAEE1+B,QAAS,CACP,cAAcU,GACZ3C,KAAKwc,MAAM,kBAAmB7Z,IAGhC,OAAOiB,GACL,OAAOA,EAAIsB,QAAQ,OAAQ,KAAKA,QAAQ,cAAe,IAAIC,eAG7D,aAAagU,GACXnZ,KAAKsc,MAAM,eAAetc,KAAKqyB,SAAWlwB,KAAKgX,IAEjD,wBAAwBooB,GACtB,MAAMC,EAAmBxhC,KAAKqJ,UAAU+pB,cAAe,EACvD,YAA0Bn2B,IAAnBskC,EAA+BA,EAAiBC,GAEzD,yBACE,IAAIC,EAAWzhC,KAAKqJ,UAAUsyB,oBAC9B,OAAK8F,GACDA,EAAW,KAAIA,EAAW,IAC1BA,EAAW,IAAGA,EAAW,GACtBA,GAHe,KC7E2U,MCQnW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIviC,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACG,MAAO,4BAA8BJ,EAAImqC,SAAW,WAAa,IAAKloC,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOlC,EAAIsqC,cAActqC,EAAIyD,UAAU,CAACxD,EAAG,KAAK,CAACD,EAAIE,GAAGF,EAAI4B,GAAG5B,EAAIuB,aAC5Q,GAAkB,GCStB,IACEzD,KAAM,kBACNyE,MAAO,CACLkB,MAAOumB,OACPzoB,MAAOiB,OACP2nC,SAAUztB,SAEZ3Z,QAAS,CACP,cAAcU,GACZ3C,KAAKwc,MAAM,kBAAmB7Z,MCnBmU,MCQnW,I,UAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCnBX,GAAS,WAAa,IAAIzD,EAAIc,KAASf,EAAGC,EAAIe,eAAmBd,EAAGD,EAAIgB,MAAMf,IAAIF,EAAG,OAAOE,EAAG,YAAY,CAACmM,IAAI,mBAAmB3L,MAAM,CAAC,QAAS,EAAK,eAAgB,GAAMwB,GAAG,CAAC,mBAAmBjC,EAAIqN,0BACzM,GAAkB,GCWtB,IACEvP,KAAM,gBACN2E,WAAY,CACV+vB,UAAJ,IAEEjwB,MAAO,CACL4a,OAAQT,SAEV,OACE,MAAO,CACLjY,MAAO,KAGX9B,SAAU,CACR,YACE,OAAO7B,KAAK8B,OAAOkE,QAAQqD,WAE7B,mBACE,OAAIrJ,KAAKqJ,YAAarJ,KAAKqJ,UAAUyS,YAC3B9b,KAAKqJ,UAAUyS,UAAUvO,mBAKvCtL,QAAS,CAEP,sBAAsBgK,GACpBjM,KAAK2D,MAAQsI,EACbjM,KAAKwc,MAAM,mBAAoBvQ,KAGnC,UACEpN,OAAOkd,iBAAiB,UAAW/b,KAAKypC,iBAE1C,gBACE5qC,OAAOod,oBAAoB,UAAWjc,KAAKypC,kBC/CuT,MCOlW,GAAY,eACd,GACA,GACA,IACA,EACA,KACA,KACA,MAIa,M,QC2Cf,IACEzsC,KAAM,OACN2E,WAAY,CACV+nC,eAAJ,GACIC,eAAJ,GACIC,cAAJ,GACIjY,eAAJ,IAEE95B,KAAM,KAAM,CACVoU,YAAa,GACbV,OAAQ,GACRG,WAAW,EACXmvB,gBAAiB,EACjBqO,YAAY,EACZ1wB,MAAOmN,OAET9jB,SAAU,CACR,WACE,OAAO7B,KAAK8B,OAAOkE,QAAQV,UAE7B,YACE,OAAOtF,KAAK8B,OAAOkE,QAAQqD,WAE7B,WACE,OAAOrJ,KAAK8B,OAAOkE,QAAQ3F,WAG/B0mB,MAAO,CAEL,cACE/mB,KAAKkpC,YAAclpC,KAAKiM,aAA2C,IAA5BjM,KAAKiM,YAAY5T,SAG5D4J,QAAS,CACP,gBAAgBU,GACd3C,KAAK66B,gBAAkBl4B,GAGzB,gBAAgB2C,GACd,MAAMoL,EAAgBlG,aAAa,EAAzC,mCACM,OAAO,GAAb,6BAGI,YAAYlF,GAEV,MAAMoL,EAAgBlG,aAAa,EAAzC,mCACM,GAAIkG,EAAe,CACjB,MAAME,EAAOb,KAAKC,MAAMU,GACxB,GAAIE,EAAKvY,QAAU,EAAG,OAAOuY,EAG/B,OAAOtL,GAGT,UAAU2G,GACRjM,KAAKiM,YAAcA,GAAe,IAGpC,oBACEjM,KAAKsc,MAAMsoB,WAAWiF,uBAGxB,iBAAiB1wB,GACf,IAAKA,EAAK,MAAO,GACjB,MAAMe,EAAa,0EACbC,EAAgBhB,EAAIiB,MAAMF,GAChC,OAAOC,EAAgBA,EAAc,GAAK,IAG5C,YAAYO,GACV,OAAKA,EACED,GAAYC,EAAU1a,KAAKiM,aADZ,IAIxB,sBAAsB44B,GACpB7kC,KAAK0L,UAAYm5B,GAGnB,2BACE,IAAIK,GAAW,EACf,QAAKllC,KAAKsF,WACVtF,KAAKsF,SAAS9D,QAAQ,IAChBwK,EAAQG,MAAQH,EAAQG,KAAK1I,SAAS,SAAQyhC,GAAW,GAC7Dl5B,EAAQvG,MAAMjE,QAAQ,IAChBkE,EAAKyG,MAAQzG,EAAKyG,KAAK1I,SAAS,SAAQyhC,GAAW,OAGpDA,IAGT,sBACE,GAAIllC,KAAKqJ,UAAU+7B,mBAAqBplC,KAAKqlC,2BAA4B,CACvE,MAAMC,EAAoB5qC,SAASQ,cAAc,UAC3CqqC,EAAQvlC,KAAKqJ,UAAUm8B,gBAAkB,EAAvD,iBACQF,EAAkB7oC,aAAa,MAAO,+BAA+B8oC,QACrE7qC,SAASqB,KAAKC,YAAYspC,KAI9B,iBACE,GAAKtlC,KAAKsF,SAChB,CACQ,IAAIqgC,GAAa,EAIjB,OAHA3lC,KAAKsF,SAAS9D,QAAQ,IAChBxB,KAAKkM,YAAYF,EAAQvG,OAAOpN,OAAS,IAAGstC,GAAa,KAExDA,EANW,OAAO,GAU7B,iBACE,MAAO,gBAAgB3lC,KAAKsF,SAASjN,WAGvC,qBACE,OAAI2H,KAAKqJ,WAAarJ,KAAKqJ,UAAUu8B,cAC5B,oBAAoB5lC,KAAKqJ,UAAUu8B,yCAErC,IAGT,aACM5lC,KAAKwY,QACPyN,GAAgBjmB,KAAKwY,OACrBoN,GAAqB5lB,KAAKwY,SAG9B,aAAaqsB,GACX7kC,KAAK0L,UAAYm5B,IAGrB,UACE7kC,KAAK6lC,sBACL7lC,KAAK8pC,eClMwU,MCS7U,I,oBAAY,eACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCGfC,OAAIC,IAAIC,SACR,MAAMxpB,GAAW,IAAIypB,QAAY,CAAEzX,MAAO,wBAGpC0X,GAAkB,KACtB,MAAMC,EAAc13B,KACd23B,EAAep4B,KACfmC,EAAezB,KACrB,OAASy3B,GAAeC,GAAgBj2B,GAGpCk2B,GAAY,KAChB,MAAMx5B,EAAc,IAAItB,GACxB,MAAO,CACLnG,UAAWyH,EAAYzH,YACvBhJ,SAAUyQ,EAAYzQ,cAIlBgJ,UAAF,YAAahJ,IAAaiqC,KAG1BC,GAAkB,IAAMlhC,GAAUmhC,cAAgBA,kBAMlDC,GAAuB,KAC3B,MAAMC,EAAkBH,KACxB,OAAQG,GACN,IAAK,UAAW,OAAOC,GACvB,IAAK,UAAW,OAAOC,GACvB,IAAK,YAAa,OAAOC,GACzB,QAAS,OAAOF,KAKdG,GAAgBC,IAAD,CACnBtqC,MAAOJ,GAASI,OAASsqC,EACzBC,SAAUC,mBAINhtC,GAAOoL,GAAU6hC,aAAe,UAGhCC,GAAS,IAAIlB,QAAO,CACxBhsC,QACAmtC,OAAQ,CACN,CACExoC,KAAM,IACN5F,KAAO,gBAAeutC,KACtBhoC,UAAWkoC,KACXY,KAAMP,GAAa,cAErB,CACEloC,KAAM0oC,gBAAWC,KACjBvuC,KAAM,OACNuF,UAAWooC,GACXU,KAAMP,GAAa,cAErB,CACEloC,KAAS0oC,gBAAWC,KAAb,YACPvuC,KAAM,eACNuF,UAAWooC,GACXU,KAAMP,GAAa,cAErB,CACEloC,KAAM0oC,gBAAWE,UACjBxuC,KAAM,YACNuF,UAAWsoC,GACXQ,KAAMP,GAAa,cAErB,CACEloC,KAAM0oC,gBAAWG,QACjBzuC,KAAM,UACNuF,UAAWqoC,GACXS,KAAMP,GAAa,eAErB,CACEloC,KAAM0oC,gBAAW93B,MACjBxW,KAAM,QACNuF,UAAWmpC,GACXC,YAAa,CAACC,EAAIznB,EAAM0nB,KAElB1B,OAAsBx3B,MAAwBw4B,GAAOxyC,KAAK,CAAEiK,KAAM,MACtEipC,MAGJ,CACEjpC,KAAM0oC,gBAAWQ,MACjB9uC,KAAM,QACNuF,UAAW,IAAM,gDACjB8oC,KAAMP,GAAa,gBAErB,CACEloC,KAAM0oC,gBAAWS,SACjB/uC,KAAM,WACNuF,UAAW,IAAM,gDACjB8oC,KAAMP,GAAa,oBAErB,CACEloC,KAAM0oC,gBAAWU,SACjBhvC,KAAM,MACNuF,UAAW,IAAM,gDACjB8oC,KAAMP,GAAa,iBACnBa,YAAa,CAACC,EAAIznB,EAAM0nB,KAClBD,EAAGK,gBACL3jC,GAAc,qBAAoBsjC,EAAGK,mBAEvCJ,MAGJ,CACEjpC,KAAM,IACNspC,SAAU,WAUhBf,GAAOgB,WAAW,CAACP,EAAIznB,EAAM0nB,KAC3BprB,GAAS3R,QACO,UAAZ88B,EAAG5uC,MAAqBmtC,KACvB0B,IAD0CA,EAAK,CAAE7uC,KAAM,YAK9DmuC,GAAOiB,UAAWR,IAChBnrB,GAAS1R,MACTg7B,OAAIsC,SAAS,KACX3xC,SAAS+F,MAAQmrC,EAAGP,KAAK5qC,OAAS,YAKvB0qC,U,aC3JfpB,OAAIC,IAAIsC,SAER,MAAM,kBACJC,GADI,WAEJC,GAFI,eAGJC,GAHI,aAIJC,GAJI,gBAKJC,GALI,cAMJC,GANI,UAOJC,GAPI,kBAQJC,GARI,YASJC,GATI,cAUJC,GAVI,cAWJC,GAXI,eAYJC,GAZI,aAaJC,GAbI,eAcJC,GAdI,eAeJC,GAfI,eAgBJC,GAhBI,UAiBJC,GAjBI,YAkBJC,GAlBI,YAmBJC,GAnBI,kBAoBJC,GApBI,gBAqBJC,IACEC,EAEEC,GAAQ,IAAIvB,QAAKwB,MAAM,CAC3B/rC,MAAO,CACLqH,OAAQ,GACRpH,UAAU,EACV0J,WAAW,EACXsjB,uBAAmB/xB,GAErB+I,QAAS,CACPoD,OAAOrH,GACL,OAAOA,EAAMqH,QAEf/I,SAAS0B,GACP,OAAOA,EAAMqH,OAAO/I,UAAY,IAElCgJ,UAAUtH,GACR,OAAOA,EAAMqH,OAAOC,WAAa,IAEnCmP,MAAMzW,GACJ,OAAOA,EAAMqH,OAAOC,UAAUmP,OAEhClT,SAASvD,GACP,OAAOqV,GAAmBrV,EAAMqH,OAAO9D,UAAY,KAErDwW,UAAU/Z,EAAOiE,GACf,OAAOA,EAAQqD,UAAUyS,WAAa,IAExCxb,kBAAkByB,EAAOiE,GACvB,OAAOqR,GAAoBrR,EAAQqD,YAGrCi3B,kBAAmB,CAACv+B,EAAOiE,IAAarD,GAC/BqD,EAAQV,SAAS3C,GAE1B22B,YAAa,CAACv3B,EAAOiE,IAAaJ,IAChC,IAAIF,EAKJ,OAJAM,EAAQV,SAAS9D,QAAQ+D,IACvB,MAAMwoC,EAAYxoC,EAAIE,MAAMiU,KAAMs0B,GAAQA,EAAIpoC,KAAOA,GACjDmoC,IAAWroC,EAAOqoC,KAEjBroC,GAETu4B,uBAAwB,CAACl8B,EAAOiE,IAAamyB,IAC3C,IAAI8V,EAMJ,OALAjoC,EAAQV,SAAS9D,QAASwK,IACxBA,EAAQvG,MAAMjE,QAASkE,IACjBA,EAAKE,KAAOuyB,IAAQ8V,EAAejiC,OAGpCiiC,GAET1iC,OAAOxJ,GACL,OAAOA,EAAMqH,OAAOC,UAAUkC,QAAU,QAE1CmB,SAAS3K,GACP,OAAOA,EAAMqH,OAAOC,UAAUqD,UAAY,WAG9CwhC,UAAW,CACT,CAAC1B,IAAYzqC,EAAOqH,GAClBrH,EAAMqH,OAASA,GAEjB,CAACsjC,IAAc3qC,EAAOoV,GACpB,MAAMg3B,EAAYpsC,EAAMqH,OACxB+kC,EAAU9kC,UAAUY,SAAWkN,EAC/BpV,EAAMqH,OAAS+kC,GAEjB,CAAC1B,IAAgB1qC,EAAO2J,GACtB3J,EAAM2J,UAAYA,GAEpB,CAACshC,IAAejrC,EAAOC,GACjBA,IAAaD,EAAMC,WACrBwG,GAAYxG,EAAW,uBAAyB,qBAAsB0G,GAASG,QAC/E9G,EAAMC,SAAWA,IAGrB,CAAC+qC,IAAahrC,EAAOs4B,GACnB,MAAM,OAAElC,EAAF,QAAUgC,GAAYE,EACtB8T,EAAY,IAAKpsC,EAAMqH,QAC7B+kC,EAAU7oC,SAAS9D,QAAQ,CAACwK,EAASoiC,KACnCpiC,EAAQvG,MAAMjE,QAAQ,CAACkE,EAAM2oC,KACvB3oC,EAAKE,KAAOuyB,IACdgW,EAAU7oC,SAAS8oC,GAAU3oC,MAAM4oC,GAAalU,EAChD3xB,GAAY,eAAgBE,GAASG,aAI3C9G,EAAMqH,OAAS+kC,GAEjB,CAAClB,IAAelrC,EAAOusC,GACrB,MAAMH,EAAYpsC,EAAMqH,OACxB+kC,EAAU9tC,SAAWiuC,EACrBvsC,EAAMqH,OAAS+kC,EACf3lC,GAAY,oBAAqBE,GAASG,SAE5C,CAACqkC,IAAgBnrC,EAAOwsC,GACtB,MAAMJ,EAAYpsC,EAAMqH,OACxB+kC,EAAU9kC,UAAYklC,EACtBxsC,EAAMqH,OAAS+kC,EACf3lC,GAAY,qBAAsBE,GAASG,SAE7C,CAACskC,IAAcprC,EAAOysC,GACpB,MAAML,EAAYpsC,EAAMqH,OACxB+kC,EAAU7oC,SAAWkpC,EACrBzsC,EAAMqH,OAAS+kC,EACf3lC,GAAY,mBAAoBE,GAASG,SAE3C,CAACukC,IAAgBrrC,EAAOs4B,GACtB,MAAM,aAAE4F,EAAF,YAAgBF,GAAgB1F,EAChC8T,EAAY,IAAKpsC,EAAMqH,QAC7B+kC,EAAU7oC,SAAS26B,GAAgBF,EACnCh+B,EAAMqH,OAAS+kC,EACf3lC,GAAY,kBAAmBE,GAASG,SAE1C,CAACwkC,IAAgBtrC,EAAO0sC,GACtB,MAAMN,EAAY,IAAKpsC,EAAMqH,QAC7BqlC,EAAWhpC,MAAQ,GACnB0oC,EAAU7oC,SAAS3M,KAAK81C,GACxB1sC,EAAMqH,OAAS+kC,EACf3lC,GAAY,oBAAqBE,GAASG,SAE5C,CAACykC,IAAgBvrC,EAAOs4B,GACtB,MAAM,aAAE4F,EAAF,YAAgBhF,GAAgBZ,EAChC8T,EAAY,IAAKpsC,EAAMqH,QACzB+kC,EAAU7oC,SAAS26B,GAAcjjC,OAASi+B,IAC5CkT,EAAU7oC,SAAS/L,OAAO0mC,EAAc,GACxCz3B,GAAY,kBAAmBE,GAASG,SAE1C9G,EAAMqH,OAAS+kC,GAEjB,CAACV,IAAa1rC,EAAOs4B,GACnB,MAAM,QAAEF,EAAF,cAAWuU,GAAkBrU,EAC7BjxB,EAAS,IAAKrH,EAAMqH,QAC1BA,EAAO9D,SAAS9D,QAASwK,IACnBA,EAAQhP,OAAS0xC,IACnB1iC,EAAQvG,MAAM9M,KAAKwhC,GACnB3xB,GAAY,iBAAkBE,GAASG,WAG3CO,EAAO9D,SAAWF,EAAYgE,EAAO9D,UACrCvD,EAAMqH,OAASA,GAEjB,CAACmkC,IAAWxrC,EAAOs4B,GACjB,MAAM,KAAE30B,EAAF,UAAQipC,EAAR,SAAmB5T,GAAaV,EAChCjxB,EAAS,IAAKrH,EAAMqH,QACpB+wB,EAAU,IAAKz0B,GACrB0D,EAAO9D,SAAS9D,QAASwK,IACnBA,EAAQhP,OAAS2xC,IACF,cAAb5T,EACF/uB,EAAQvG,MAAMmpC,QAAQzU,GAEtBnuB,EAAQvG,MAAM9M,KAAKwhC,GAErB3xB,GAAY,cAAeE,GAASG,WAGxCO,EAAO9D,SAAWF,EAAYgE,EAAO9D,UACrCvD,EAAMqH,OAASA,GAEjB,CAACokC,IAAazrC,EAAOs4B,GACnB,MAAM,OAAElC,EAAF,YAAU8C,GAAgBZ,EAC1BjxB,EAAS,IAAKrH,EAAMqH,QAC1BA,EAAO9D,SAAS9D,QAASwK,IACnBA,EAAQhP,OAASi+B,GACnBjvB,EAAQvG,MAAMjE,QAAQ,CAACkE,EAAM/C,KACvB+C,EAAKE,KAAOuyB,IACdnsB,EAAQvG,MAAMlM,OAAOoJ,EAAO,GAC5B6F,GAAY,eAAgBE,GAASG,aAK7C9G,EAAMqH,OAASA,GAEjB,CAACyjC,IAAW9qC,EAAOyW,GACjB,MAAM21B,EAAY,IAAKpsC,EAAMqH,QAC7B+kC,EAAU9kC,UAAUmP,MAAQA,EAC5BzW,EAAMqH,OAAS+kC,EACf3lC,GAAY,gBAAiBE,GAASK,SAExC,CAAC+jC,IAAmB/qC,EAAO+W,GACzB,MAAMq1B,EAAY,IAAKpsC,EAAMqH,QAC7B+kC,EAAU9kC,UAAUyP,aAAeA,EACnC/W,EAAMqH,OAAS+kC,EACf3lC,GAAY,wBAAyBE,GAASK,SAEhD,CAAC4jC,IAAiB5qC,EAAOwJ,GACvBxJ,EAAMqH,OAAOC,UAAUkC,OAASA,EAChC/C,GAAY,iBAAkBE,GAASK,SAEzC,CAAC6jC,IAAe7qC,EAAO2K,GACrB3K,EAAMqH,OAAOC,UAAUqD,SAAWA,EAClClE,GAAY,oBAAqBE,GAASK,SAE5C,CAAC2kC,IAAmB3rC,EAAOkJ,GACzBlJ,EAAMqH,OAAOC,UAAU4B,UAAYA,EACnCzC,GAAY,wBAAyBE,GAASK,SAEhD,CAAC4kC,IAAiB5rC,EAAOY,GACvBZ,EAAMitB,kBAAoBrsB,IAG9BksC,QAAS,CAEP,CAACtC,KAAmB,OAAEnqC,IACpB,MAAM0sC,EAAYl+B,GAASb,KAAKC,MAAMD,KAAK2Z,UAAU9Y,IAC/CxH,EAAS0lC,GAAS,IAAIt/B,IAAoBpG,UAChDhH,EAAOoqC,GAAYpjC,KAGvBxQ,QAAS,KAGIi1C,U,aClPf,MAAMkB,GAAeC,IACnB,MAAMC,EAAiB,CACrBC,OAAO,EACPC,YAAY,EACZC,QAAQ,EACRC,aAAa,EACbC,SAAS,EACTC,SAAS,EACT7yC,OAAO,EACP8yC,SAAS,EACTC,gBAAgB,GAEZC,EAAcznC,eAAeE,wBAAmBwnC,WAChDC,EAAiBF,EAAc3/B,KAAKC,MAAM0/B,GAAeT,EAC/D,IACE,MAAMY,EAAa,IAAKD,KAAmBZ,GAC3C/mC,eAAeI,QAAQF,wBAAmBwnC,UAAW5/B,KAAK2Z,UAAUmmB,IACpE,MAAO51C,GACPoN,GAAe,wBAAyB,2BAA4BpN,KASlE61C,GAA4B,IAC5BrgC,MAAQA,KAAKpG,WAAaoG,KAAKpG,UAAU0mC,qBAC3ChB,GAAY,CAAEU,gBAAgB,KACvB,IAKTV,GAAY,CAAEU,gBAAgB,KACvB,GAIHO,GAAiB5oC,IACrBD,GAAU,wBAAyBC,IAG/B6oC,GAAS,qBAGTC,GAAwB,KACxBJ,MACFK,gBAASF,GAAO,CACdf,QACEH,GAAY,CAAEG,OAAO,IACrBc,GACE,yGAIJb,aACEJ,GAAY,CAAEI,YAAY,IAC1Ba,GAAc,wCAEhBZ,SACEL,GAAY,CAAEK,QAAQ,IACtBY,GAAc,yCAEhBI,cACErB,GAAY,CAAEM,aAAa,IAC3BW,GAAc,kCAEhBV,UACEP,GAAY,CAAEO,SAAS,IACvBU,GAAc,uDAEhBT,UACER,GAAY,CAAEQ,SAAS,IACvBS,GAAc,oEAEhBtzC,MAAMA,GACJqyC,GAAY,CAAEryC,OAAO,IACrB2K,GAAe,wBAAyB,+BAAgC3K,OAMjEwzC,UCrFf,MAAMG,GAAY,GAElB,SAASC,GAAgBr2C,EAAGs2C,EAAItkB,GAC9B,MAAM,OAAEzwB,GAAWvB,EACfs2C,IAAO/0C,GAAW+0C,EAAGC,SAASh1C,IAChCywB,EAAGhyB,GAIQ,QACbqE,KAAK2lC,EAASwM,GACZ,MAAMF,EAAKtM,EACXsM,EAAGG,QAAQC,kBAAoBN,GAAUh4C,OAEzC,MAAM4zB,EAAKwkB,EAAQ1yC,MACbuhB,EAASrlB,IACbq2C,GAAgBr2C,EAAGs2C,EAAItkB,IAGzBvxB,SAASqhB,iBAAiB,QAASuD,GACnC5kB,SAASqhB,iBAAiB,aAAcuD,GACxC+wB,GAAU13C,KAAK2mB,IAEjBsxB,OAAOL,GACL,IAAKA,EAAGG,QAAS,OACjB,MAAM/tC,EAAQ4tC,EAAGG,QAAQC,kBACnBE,EAAUR,GAAU1tC,GAC1BjI,SAASuhB,oBAAoB,QAAS40B,GACtCR,GAAU92C,OAAOoJ,EAAO,KCpB5B,MAAMmuC,GAAiB,CAAC/G,EAAKoB,KAE3B,MAAM9hC,GAAY,IAAImG,IAAoBnG,aAAe,GAEzD,GAAIA,EAAU0nC,qBAAsB,CAElC,MAAMnkB,EAA4C,cAE5CrkB,EAASyoC,EAAQ,SACjB,aAAEC,GAAiBD,EAAQ,QAE3BE,EAAM7nC,EAAU8nC,WAAaA,eAEnC5oC,EAAO6oC,KAAK,CACVrH,MACAmH,MACAG,aAAc,CACZ,IAAIJ,EAAaK,eAAe,CAC9BC,uBAAwBhpC,EAAOipC,yBAAyBrG,MAG5DsG,iBAAkB,EAClBC,QAAS9kB,MAOAkkB,UCjBf/G,OAAIC,IAAI2H,QACR5H,OAAIC,IAAI4H,OAAUC,qBAClB9H,OAAIC,IAAI8H,KACR/H,OAAIC,IAAI+H,QACRhI,OAAIC,IAAIgI,KACRjI,OAAIC,IAAIiI,IAASC,qBACjBnI,OAAIxnC,UAAU,WAAY4vC,KAC1BpI,OAAIqI,UAAU,eAAgBC,IAE9BtI,OAAI3gC,OAAOkpC,eAAgB,EAG3B,MAAMC,GAAO,IAAIZ,OAAQ,CACvBhnC,OAAQ6O,cACRg5B,eAAgBh5B,cAChBxG,cAIFy/B,KAGA3B,GAAe/G,OAAKoB,IAGpB,MAAMprC,GAAU2yC,GAAYA,EAAQC,IAG9BC,GAAQ,IAAM,IAAI7I,OAAI,CAC1B8D,SAAO1C,UAAQprC,OADW,GACHwyC,UACtBtK,OAAO,QAGV,GAAKj3B,KAEE,CACL,MAAM,UAAEI,EAAF,MAAaC,EAAb,SAAoBC,GAAaJ,KACjC2hC,EAAc,CAClB15B,IAAQ/H,EAAF,QAAoBC,QAAOC,WAAUwhC,OAAQ,kBAE/C3hC,EAAW4hC,IAASF,GAC1B1hC,EAASigC,KAAK,CAAE0B,OAAQD,EAAYC,SAAU72C,KAAMoU,IAC7CA,EAKHuiC,KAHA/zC,OAAO4tB,SAASC,gBAVpBkmB,M,mBC3DI74C,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,sCAAsCC,EAAWC,GACzDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,YAAY,MAAQ,6BAA6B,QAAU,eAAgBF,MACnJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,6mB,qBCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,oCAAoCC,EAAWC,GACvDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,UAAU,MAAQ,6BAA6B,QAAU,eAAgBF,MACjJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,8wB,oCCvBzE,W,mBCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,qCAAqCC,EAAWC,GACxDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,WAAW,MAAQ,6BAA6B,QAAU,eAAgBF,MAClJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,qqB,8CCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,iCAAiCC,EAAWC,GACpDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,OAAO,MAAQ,6BAA6B,QAAU,eAAgBF,MAC9IC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,8d,qBCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,iCAAiCC,EAAWC,GACpDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,OAAO,MAAQ,6BAA6B,QAAU,eAAgBF,MAC9IC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,2f,oCCvBzE,W,8CCAA5F,EAAOD,QAAU,CAEfuG,SAAU,CACRI,MAAO,QACPC,YAAa,GACbE,SAAU,CACR,CAAEH,MAAO,OAAQmC,KAAM,KACvB,CAAEnC,MAAO,SAAUmC,KAAM,qCAE3BrC,WAAY,IAGd8I,UAAW,GAEXY,SAAU,KAEVugC,aAAc,UAEd99B,SAAU,SAEVnB,OAAQ,OAERiN,MAAO,UAEPgtB,eAAgB,aAEhB9O,WAAY,aAEZmK,UAAW,UAEXyK,WAAY,CACVC,KAAM,QACNE,QAAS,WACTD,UAAW,aACXM,MAAO,SACPt4B,MAAO,SACPu4B,SAAU,YACVC,SAAU,QAGZgH,iBAAkB,CAChBC,WAAY,eACZ7f,YAAa,gBACbrU,KAAM,uBACNm0B,QAAS,2BAGXC,cAAe,CACb,WACA,WACA,WACA,gBACA,aACA,WACA,WACA,UACA,YACA,aACA,OACA,eACA,gBACA,QACA,YACA,SACA,aACA,cACA,OACA,gBACA,MACA,QACA,YACA,oBACA,yBACA,qBACA,uBAGF7yC,kBAAmB,CACjB4X,cAAc,EACdhS,YAAY,EACZD,WAAW,EACX2R,WAAW,EACXE,UAAU,EACVE,QAAQ,GAGVxU,gBAAiB,CACf,UACA,QACA,WACA,wBAIFqM,iBAAkB,CAChB0J,SAAU,WACV65B,oBAAqB,qBACrBnjC,mBAAoB,oBACpBojC,eAAgB,gBAChBljC,UAAW,WACXmI,MAAO,QACPM,cAAe,eACfjI,cAAe,eACfJ,UAAW,WACXT,WAAY,YACZwjC,UAAW,WACXC,YAAa,aACbC,cAAe,eACf1/B,SAAU,WACV2/B,UAAW,WACXC,UAAW,YAGblhC,WAAY,CACVC,WAAY,uBAGdtK,mBAAoB,CAClBwnC,UAAW,sBACXvnC,UAAW,YAGbqV,WAAY,CACVC,YAAa,cACbi2B,YAAa,cACbC,UAAW,YACX/1B,cAAe,gBACfg2B,UAAW,YACXC,aAAc,eACdC,eAAgB,iBAChBC,gBAAiB,kBACjBC,mBAAoB,qBACpBC,aAAc,gBAGhBC,iBAAkB,CAChB5jC,UAAW,WACXT,WAAY,YACZskC,SAAU,YAGZvuB,YAAa,CAAC,UAAW,aAAc,qBAEvCwuB,iBAAkB,KAElBpJ,YAAa,CACX,CAAEjuC,KAAM,cAAeqF,QAAS,+CAGlCya,cAAe,SAEfo1B,eAAgB,CACdtjC,SAAU,gBACV0lC,SAAU,KACVC,aAAa,EACbC,UAAW,gBACXC,SAAU,eAGZ5C,eAAgB,CACd6C,eAAgB,cAChBC,0BAA0B,EAC1BC,UAAU,EACVC,aAAa,EACbC,iBAAkB,OAClBC,sBAAuB,aACvBC,aAAc,CAAE7yC,KAAM,IAAK2e,KAAM,IAInCwI,eAAgB,sCAEhB2rB,oBAAqB,CACnBC,MAAO,+CACPC,SAAU,iCACVC,WAAY,qCACZC,OAAQ,4DACRC,SAAU,mCACVC,aAAc,iEAGhBC,SAAU,CACRC,GAAI,8BACJC,IAAK,gFACLC,GAAI,0CACJC,WAAY,wDACZC,UAAW,eACXC,YAAa,cACbC,aAAc,qFAGhBC,iBAAkB,CAEhBC,WAAY,6BACZZ,OAAQ,+BACRa,QAAS,oCACTC,MAAO,4BACPC,UAAW,6CAEX,YAAa,8BACb,aAAc,+BACd,mBAAoB,yCACpB,kBAAmB,wCACnBC,OAAQ,mCACRC,QAAS,8CACTC,UAAW,mCACXC,OAAQ,mCACRC,QAAS,yBAETC,UAAW,sCACXC,cAAe,sCACfC,aAAc,yCACdC,OAAQ,oCACRC,QAAS,iCACTC,OAAQ,+BACRC,IAAK,mCAEPC,oBAAqB,aACrBC,2BAA4B,SAC5BC,YAAa,CACX,KAAM,MACN,KAAM,aACN,KAAM,SACN,KAAM,SACN,KAAM,YACN,KAAM,UACN,MAAO,SACP,MAAO,gBACP,MAAO,gBAGTv1B,SAAU,CACR,CAAC,UAAW,UAAW,UAAW,WAClC,CAAC,UAAW,UAAW,UAAW,WAClC,CAAC,UAAW,UAAW,UAAW,WAClC,CAAC,UAAW,UAAW,UAAW,WAClC,CAAC,UAAW,UAAW,UAAW,WAClC,CAAC,UAAW,UAAW,UAAW,WAClC,CAAC,UAAW,UAAW,UAAW,YAGpCuvB,UAAW,4EAEXt8B,cAAe,CACbH,cAAe,EACfC,SAAU,EACVC,YAAa,EACbP,YAAa,GAGf+iC,IAAK,CACHp6C,KAAM,QACNq6C,aAAc,kBACdC,WAAY,UACZC,YAAa,UACbt5C,KAAM,aACNu5C,UAAW,CACTC,oBAAqB,kBACrBC,UAAW,gCACXC,UAAW,gCACXC,SAAU,6BACVC,YAAa,iC,8CCpQb99C,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,yCAAyCC,EAAWC,GAC5DC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,eAAe,MAAQ,6BAA6B,QAAU,eAAgBF,MACtJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,ge,mBCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAACC,EAAWC,GACnBC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,MAAQ,6BAA6B,MAAQ,MAAM,OAAS,MAAM,oBAAsB,YAAaF,MACxHC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACA,EAAG,WAAW,CAACQ,MAAM,CAAC,GAAK,MAAM,CAACR,EAAG,OAAO,CAACQ,MAAM,CAAC,EAAI,0BAA0BR,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,OAAO,OAAS,0BAA0B,eAAe,IAAI,iBAAiB,QAAQ,kBAAkB,QAAQ,oBAAoB,KAAK,YAAY,UAAU,EAAI,gRAAgR,CAACR,EAAG,mBAAmB,CAACQ,MAAM,CAAC,cAAgB,YAAY,KAAO,YAAY,YAAc,aAAa,IAAM,sBAAsB,OAAS,YAAY,SAAW,SAASR,EAAG,UAAU,CAACQ,MAAM,CAAC,cAAgB,mBAAmB,YAAc,aAAa,IAAM,sBAAsB,OAAS,6BAA6B,SAAW,iB,yDCvBp5B,W,0CCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,6CAA6CC,EAAWC,GAChEC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,mBAAmB,MAAQ,6BAA6B,QAAU,eAAgBF,MAC1JC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,moB,kCCvBzE,W,oCCAA,W,uECCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,2CAA2CC,EAAWC,GAC9DC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,iBAAiB,MAAQ,6BAA6B,QAAU,eAAgBF,MACxJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,wK,+8NCvBzE,W,oCCAA,W,mBCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,mCAAmCC,EAAWC,GACtDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,SAAS,MAAQ,6BAA6B,QAAU,eAAgBF,MAChJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,wgB,2GCvBzE,W,giOCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,sCAAsCC,EAAWC,GACzDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,YAAY,MAAQ,6BAA6B,QAAU,eAAgBF,MACnJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,me,6DCvBzE,W,qBCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,qCAAqCC,EAAWC,GACxDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,WAAW,MAAQ,6BAA6B,QAAU,eAAgBF,MAClJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,yP,oCCvBzE,W,6DCAA,W,6DCAA,W,oCCAA,W,oCCAA,W,qsfCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,qCAAqCC,EAAWC,GACxDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,WAAW,MAAQ,6BAA6B,QAAU,eAAgBF,MAClJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,+gB,oCCvBzE,W,sFCAA,W,qBCAA5F,EAAOD,QAAU,CAAC,SAAW,CAAC,MAAQ,QAAQ,YAAc,iCAAiC,SAAW,CAAC,CAAC,MAAQ,SAAS,KAAO,oCAAoC,CAAC,MAAQ,gBAAgB,KAAO,2BAA2B,UAAY,CAAC,MAAQ,YAAY,SAAW,CAAC,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,MAAQ,CAAC,CAAC,MAAQ,aAAa,YAAc,mDAAmD,KAAO,6CAA6C,IAAM,yBAAyB,OAAS,UAAU,CAAC,MAAQ,SAAS,YAAc,wCAAwC,IAAM,mCAAmC,KAAO,WAAW,CAAC,MAAQ,OAAO,YAAc,oCAAoC,SAAW,WAAW,KAAO,cAAc,IAAM,yBAAyB,CAAC,MAAQ,WAAW,YAAc,iCAAiC,IAAM,gEAAgE,KAAO,sBAAsB,CAAC,MAAQ,eAAe,YAAc,yCAAyC,IAAM,mEAAmE,KAAO,iBAAiB,CAAC,MAAQ,UAAU,YAAc,sDAAsD,IAAM,kEAAkE,KAAO,6B,oCCAhxC,W,mBCCMC,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,wCAAwCC,EAAWC,GAC3DC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,cAAc,MAAQ,6BAA6B,QAAU,eAAgBF,MACrJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,ypB,g/MCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,yCAAyCC,EAAWC,GAC5DC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,eAAe,MAAQ,6BAA6B,QAAU,eAAgBF,MACtJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,uhB,qBCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,iCAAiCC,EAAWC,GACpDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,OAAO,MAAQ,6BAA6B,QAAU,eAAgBF,MAC9IC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,0gB,0kPCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,8CAA8CC,EAAWC,GACjEC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,oBAAoB,MAAQ,6BAA6B,QAAU,eAAgBF,MAC3JC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,6f,oFCvBzE,W,mBCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAACC,EAAWC,GACnBC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,MAAQ,6BAA6B,QAAU,eAAgBF,MAClFC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,EAAI,iEAAiER,EAAG,OAAO,CAACQ,MAAM,CAAC,EAAI,gMAAgMR,EAAG,OAAO,CAACQ,MAAM,CAAC,EAAI,iMAAiMR,EAAG,OAAO,CAACQ,MAAM,CAAC,EAAI,oE,6DCvBvjB,W,6DCAA,W,6DCAA,W,2DCAA,W,yDCAA,W,kCCAA,W,yDCAA,W,yDCAA,W,qoKCAA,W,mBCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,qCAAqCC,EAAWC,GACxDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,WAAW,MAAQ,6BAA6B,QAAU,eAAgBF,MAClJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,glB,kCCvBzE,W,kCCAA,W,kCCAA,W,qhJCAA,W,0CCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,uCAAuCC,EAAWC,GAC1DC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,aAAa,MAAQ,6BAA6B,QAAU,eAAgBF,MACpJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,uoB,mBCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,mCAAmCC,EAAWC,GACtDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,SAAS,MAAQ,6BAA6B,QAAU,eAAgBF,MAChJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,skB,kCCvBzE,W,kCCAA,W,mBCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,kCAAkCC,EAAWC,GACrDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,QAAQ,MAAQ,6BAA6B,QAAU,eAAgBF,MAC/IC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,uN,qxMCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,0CAA0CC,EAAWC,GAC7DC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,gBAAgB,MAAQ,6BAA6B,QAAU,eAAgBF,MACvJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,mgB,gFCvBzE,W,wFCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,gDAAgDC,EAAWC,GACnEC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,sBAAsB,MAAQ,6BAA6B,QAAU,eAAgBF,MAC7JC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,8tB,kCCvBzE,W,kCCAA,W,kCCAA,W,mBCCM5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,qCAAqCC,EAAWC,GACxDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,WAAW,MAAQ,6BAA6B,QAAU,eAAgBF,MAClJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,kZ,mBCvBzE5F,EAAOD,QAAU,omB,mBCCXC,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,iCAAiCC,EAAWC,GACpDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,OAAO,MAAQ,6BAA6B,QAAU,eAAgBF,MAC9IC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,iW,giWCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,iCAAiCC,EAAWC,GACpDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,OAAO,MAAQ,6BAA6B,QAAU,eAAgBF,MAC9IC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,2P,mBCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,qCAAqCC,EAAWC,GACxDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,WAAW,MAAQ,6BAA6B,QAAU,eAAgBF,MAClJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,wrB,mBCtBnE5F,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,iCAAiCC,EAAWC,GACpDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,OAAO,MAAQ,6BAA6B,QAAU,eAAgBF,MAC9IC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,khB,kCCvBzE,gBAEA,MAAMm4C,EAAkBn0C,GAAUA,EAAMU,MAAM,MAAMQ,IAAIE,GAAKA,EAAEgzC,aAAantB,KAAK,MAE3EotB,EAAc5wC,IAClB,MAAM,IAAIzL,MAAO,qCAAoCyL,IAIjDsiB,EAAa7xB,IACjB,IAAIogD,EAAc,GAClB,MAAMC,EAAW,CACfj7C,YACE,MAAO,QAETk7C,OACE,MAAO,QAETC,OAAOrzC,GACL,OAAOA,GAETszC,QAAQtzC,GACN,OAAOA,EAAI,OAAS,SAEtBuzC,OAAOvzC,GACL,OAAOgL,KAAK2Z,UAAU3kB,IAExBwzC,MAAMxzC,GACJ,IAAIonB,EAAS,GACb,OAAiB,IAAbpnB,EAAE1M,QACJ8zB,GAAU,KACHA,IAGT8rB,EAAcA,EAAY/yC,QAAQ,IAAK,MACvCH,EAAEvD,QAASwD,IACT,MAAM6rC,EAAUqH,EAASM,oBAAOxzC,IAE3B6rC,GAASmH,EAAWQ,oBAAOxzC,IAEhCmnB,GAAW,KAAI8rB,MAAgBpH,EAAQ7rC,GAAG,OAE5CizC,EAAcA,EAAY/yC,QAAQ,OAAQ,IAEnCinB,IAET3tB,OAAOuG,EAAG0zC,EAASC,GACjB,IAAIvsB,EAAS,GAEb,OAA8B,IAA1B7zB,OAAO6iB,KAAKpW,GAAG1M,QACjB8zB,GAAU,KACHA,IAGJusB,IACHT,EAAcA,EAAY/yC,QAAQ,IAAK,OAGzC5M,OAAO6iB,KAAKpW,GAAGvD,QAAQ,CAACm3C,EAAGxgD,KACzB,MAAMmvC,EAAMviC,EAAE4zC,GACR9H,EAAUqH,EAASM,oBAAOlR,IAEb,qBAARA,IAINuJ,GAASmH,EAAWQ,oBAAOlR,IAE1BmR,GAAiB,IAANtgD,IACfg0B,GAAW,KAAI8rB,GAGjB9rB,GAAW,GAAEwsB,MAAM9H,EAAQvJ,QAE7B2Q,EAAcA,EAAY/yC,QAAQ,OAAQ,IAEnCinB,IAETysB,WACE,MAAO,sBAIX,OAAOd,EAAkBI,EAASM,oBAAO3gD,IAAOA,GAAM,GAAM,GAArC,OAGV6xB,U,kCCtFf,W,6tICAA,W,kCCAA,W,gFCAA,W,kCCAA,W,kCCAA,W,0CCCM3vB,EAAOD,QAAU,CACfkF,YAAY,EACZ,OAAOC,EAAIC,GACT,MAAM,GAAEC,EAAE,GAAEC,EAAE,KAAEvH,EAAI,SAAEwH,EAAW,IAAOH,GAGtCI,MAAOC,EAAU,YACjBC,EAAW,MACXC,EAAK,YACLC,EAAW,MACXC,EAAQ,MACLC,GACD/H,EAEJ,OAAOsH,EACL,MACA,CACEG,MAAO,CAAC,oCAAoCC,EAAWC,GACvDC,MAAO,CAACA,EAAMC,GACdC,MAAOrH,OAAOuH,OAAO,CAAC,cAAc,OAAO,cAAc,MAAM,YAAY,UAAU,MAAQ,6BAA6B,QAAU,eAAgBF,MACjJC,GAELP,EAASS,OAAO,CAACX,EAAG,OAAO,CAACQ,MAAM,CAAC,KAAO,eAAe,EAAI,4K,kCCvBzE,W","file":"js/dashy.94aab285.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t\"dashy\": 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"dashy\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-051d7c14\":\"30c3b7cc\",\"chunk-36fb5c32\":\"6f3940cb\",\"chunk-724820ea\":\"b6da96e1\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"chunk-051d7c14\":1,\"chunk-36fb5c32\":1,\"chunk-724820ea\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"css/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-051d7c14\":\"6fea770a\",\"chunk-36fb5c32\":\"a64c098d\",\"chunk-724820ea\":\"8e5b7c8e\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-sign-out-alt fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"sign-out-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M497 273L329 441c-15 15-41 4.5-41-17v-96H152c-13.3 0-24-10.7-24-24v-96c0-13.3 10.7-24 24-24h136V88c0-21.4 25.9-32 41-17l168 168c9.3 9.4 9.3 24.6 0 34zM192 436v-40c0-6.6-5.4-12-12-12H96c-17.7 0-32-14.3-32-32V160c0-17.7 14.3-32 32-32h84c6.6 0 12-5.4 12-12V76c0-6.6-5.4-12-12-12H96c-53 0-96 43-96 96v192c0 53 43 96 96 96h84c6.6 0 12-5.4 12-12z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigContainer.vue?vue&type=style&index=0&id=7b4f1c0a&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-trash-alt fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"trash-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M268 416h24a12 12 0 0012-12V188a12 12 0 00-12-12h-24a12 12 0 00-12 12v216a12 12 0 0012 12zM432 80h-82.41l-34-56.7A48 48 0 00274.41 0H173.59a48 48 0 00-41.16 23.3L98.41 80H16A16 16 0 000 96v16a16 16 0 0016 16h16v336a48 48 0 0048 48h288a48 48 0 0048-48V128h16a16 16 0 0016-16V96a16 16 0 00-16-16zM171.84 50.91A6 6 0 01177 48h94a6 6 0 015.15 2.91L293.61 80H154.39zM368 464H80V128h288zm-212-48h24a12 12 0 0012-12V188a12 12 0 00-12-12h-24a12 12 0 00-12 12v216a12 12 0 0012 12z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddNewSectionLauncher.vue?vue&type=style&index=0&id=53ced373&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppVersion.vue?vue&type=style&index=0&id=2f975a24&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-language fa-w-20\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"language\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 640 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M160.3 203.8h-.5s-4.3 20.9-7.8 33l-11 37.3h37.9l-10.7-37.3c-3.6-12.1-7.9-33-7.9-33zM616 96H24c-13.3 0-24 10.7-24 24v272c0 13.3 10.7 24 24 24h592c13.3 0 24-10.7 24-24V120c0-13.3-10.7-24-24-24zM233.2 352h-22.6a12 12 0 01-11.5-8.6l-9.3-31.7h-59.9l-9.1 31.6c-1.5 5.1-6.2 8.7-11.5 8.7H86.8c-8.2 0-14-8.1-11.4-15.9l57.1-168c1.7-4.9 6.2-8.1 11.4-8.1h32.2c5.1 0 9.7 3.3 11.4 8.1l57.1 168c2.6 7.8-3.2 15.9-11.4 15.9zM600 376H320V136h280zM372 228h110.8c-6.3 12.8-15.1 25.9-25.9 38.5-6.6-7.8-12.8-15.8-18.3-24-3.5-5.3-10.6-6.9-16.1-3.6l-13.7 8.2c-5.9 3.5-7.6 11.3-3.8 17 6.5 9.7 14.4 20.1 23.5 30.6-9 7.7-18.6 14.8-28.7 21.2-5.4 3.4-7.1 10.5-3.9 16l7.9 13.9c3.4 5.9 11 7.9 16.8 4.2 12.5-7.9 24.6-17 36-26.8 10.7 9.6 22.3 18.6 34.6 26.6 5.8 3.7 13.6 1.9 17-4.1l8-13.9c3.1-5.5 1.5-12.5-3.8-16-9.2-6-18.4-13.1-27.2-20.9 1.5-1.7 2.9-3.3 4.3-5 17.1-20.6 29.6-41.7 36.8-62H540c6.6 0 12-5.4 12-12v-16c0-6.6-5.4-12-12-12h-64v-16c0-6.6-5.4-12-12-12h-16c-6.6 0-12 5.4-12 12v16h-64c-6.6 0-12 5.4-12 12v16c0 6.7 5.4 12.1 12 12.1z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-hammer fa-w-18\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"hammer\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 576 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M571.31 193.94l-22.63-22.63c-6.25-6.25-16.38-6.25-22.63 0l-11.31 11.31-28.9-28.9c5.63-21.31.36-44.9-16.35-61.61l-45.25-45.25c-62.48-62.48-163.79-62.48-226.28 0l90.51 45.25v18.75c0 16.97 6.74 33.25 18.75 45.25l49.14 49.14c16.71 16.71 40.3 21.98 61.61 16.35l28.9 28.9-11.31 11.31c-6.25 6.25-6.25 16.38 0 22.63l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0l90.51-90.51c6.23-6.24 6.23-16.37-.02-22.62zm-286.72-15.2c-3.7-3.7-6.84-7.79-9.85-11.95L19.64 404.96c-25.57 23.88-26.26 64.19-1.53 88.93s65.05 24.05 88.93-1.53l238.13-255.07c-3.96-2.91-7.9-5.87-11.44-9.41l-49.14-49.14z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemSizeSelector.vue?vue&type=style&index=0&id=499e085c&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ExportConfigMenu.vue?vue&type=style&index=0&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-cogs fa-w-20\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"cogs\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 640 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M217.1 478.1c-23.8 0-41.6-3.5-57.5-7.5-10.6-2.7-18.1-12.3-18.1-23.3v-31.7c-9.4-4.4-18.4-9.6-26.9-15.6l-26.7 15.4c-9.6 5.6-21.9 3.8-29.5-4.3-35.4-37.6-44.2-58.6-57.2-98.5-3.6-10.9 1.1-22.7 11-28.4l26.8-15c-.9-10.3-.9-20.7 0-31.1L12.2 223c-10-5.6-14.6-17.5-11-28.4 13.1-40 21.9-60.9 57.2-98.5 7.6-8.1 19.8-9.9 29.5-4.3l26.7 15.4c8.5-6 17.5-11.2 26.9-15.6V61.4c0-11.1 7.6-20.8 18.4-23.3 44.2-10.5 70-10.5 114.3 0 10.8 2.6 18.4 12.2 18.4 23.3v30.4c9.4 4.4 18.4 9.6 26.9 15.6L346.2 92c9.7-5.6 21.9-3.7 29.6 4.4 26.1 27.9 48.4 58.5 56.8 100.3 2 9.8-2.4 19.8-10.9 25.1l-26.6 16.5c.9 10.3.9 20.7 0 31.1l26.6 16.5c8.4 5.2 12.9 15.2 10.9 24.9-8.1 40.5-29.6 71.3-56.9 100.6-7.6 8.1-19.8 9.9-29.5 4.3l-26.7-15.4c-8.5 6-17.5 11.2-26.9 15.6v31.7c0 11-7.4 20.6-18.1 23.3-15.8 3.8-33.6 7.2-57.4 7.2zm-27.6-50.7c18.3 2.9 36.9 2.9 55.1 0v-44.8l16-5.7c15.2-5.4 29.1-13.4 41.3-23.9l12.9-11 38.8 22.4c11.7-14.4 21-30.5 27.6-47.7l-38.8-22.4 3.1-16.7c2.9-15.9 2.9-32 0-47.9l-3.1-16.7 38.8-22.4c-6.6-17.2-15.9-33.3-27.6-47.7l-38.8 22.4-12.9-11c-12.3-10.5-26.2-18.6-41.3-23.9l-16-5.7V80c-18.3-2.9-36.9-2.9-55.1 0v44.8l-16 5.7c-15.2 5.4-29.1 13.4-41.3 23.9l-12.9 11L80.5 143c-11.7 14.4-21 30.5-27.6 47.7l38.8 22.4-3.1 16.7c-2.9 15.9-2.9 32 0 47.9l3.1 16.7-38.8 22.4c6.6 17.2 15.9 33.4 27.6 47.7l38.8-22.4 12.9 11c12.3 10.5 26.2 18.6 41.3 23.9l16 5.7v44.7zm27.1-85.1c-22.6 0-45.2-8.6-62.4-25.8-34.4-34.4-34.4-90.4 0-124.8 34.4-34.4 90.4-34.4 124.8 0 34.4 34.4 34.4 90.4 0 124.8-17.3 17.2-39.9 25.8-62.4 25.8zm0-128.4c-10.3 0-20.6 3.9-28.5 11.8-15.7 15.7-15.7 41.2 0 56.9 15.7 15.7 41.2 15.7 56.9 0 15.7-15.7 15.7-41.2 0-56.9-7.8-7.9-18.1-11.8-28.4-11.8zM638.5 85c-1-5.8-6-10-11.9-10h-16.1c-3.5-9.9-8.8-19-15.5-26.8l8-13.9c2.9-5.1 1.8-11.6-2.7-15.3C591 11.3 580.5 5.1 569 .8c-5.5-2.1-11.8.1-14.7 5.3l-8 13.9c-10.2-1.9-20.7-1.9-30.9 0l-8-13.9c-3-5.1-9.2-7.3-14.7-5.3-11.5 4.3-22.1 10.5-31.4 18.2-4.5 3.7-5.7 10.2-2.7 15.3l8 13.9c-6.7 7.8-12 16.9-15.5 26.8H435c-5.9 0-11 4.3-11.9 10.2-2 12.2-1.9 24.5 0 36.2 1 5.8 6 10 11.9 10h16.1c3.5 9.9 8.8 19 15.5 26.8l-8 13.9c-2.9 5.1-1.8 11.6 2.7 15.3 9.3 7.7 19.9 13.9 31.4 18.2 5.5 2.1 11.8-.1 14.7-5.3l8-13.9c10.2 1.9 20.7 1.9 30.9 0l8 13.9c3 5.1 9.2 7.3 14.7 5.3 11.5-4.3 22.1-10.5 31.4-18.2 4.5-3.7 5.7-10.2 2.7-15.3l-8-13.9c6.7-7.8 12-16.9 15.5-26.8h16.1c5.9 0 11-4.3 11.9-10.2 1.9-12.2 1.9-24.4-.1-36.2zm-107.8 50.2c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm107.8 255.4c-1-5.8-6-10-11.9-10h-16.1c-3.5-9.9-8.8-19-15.5-26.8l8-13.9c2.9-5.1 1.8-11.6-2.7-15.3-9.3-7.7-19.9-13.9-31.4-18.2-5.5-2.1-11.8.1-14.7 5.3l-8 13.9c-10.2-1.9-20.7-1.9-30.9 0l-8-13.9c-3-5.1-9.2-7.3-14.7-5.3-11.5 4.3-22.1 10.5-31.4 18.2-4.5 3.7-5.7 10.2-2.7 15.3l8 13.9c-6.7 7.8-12 16.9-15.5 26.8h-16.1c-5.9 0-11 4.3-11.9 10.2-2 12.2-1.9 24.5 0 36.2 1 5.8 6 10 11.9 10H451c3.5 9.9 8.8 19 15.5 26.8l-8 13.9c-2.9 5.1-1.8 11.6 2.7 15.3 9.3 7.7 19.9 13.9 31.4 18.2 5.5 2.1 11.8-.1 14.7-5.3l8-13.9c10.2 1.9 20.7 1.9 30.9 0l8 13.9c3 5.1 9.2 7.3 14.7 5.3 11.5-4.3 22.1-10.5 31.4-18.2 4.5-3.7 5.7-10.2 2.7-15.3l-8-13.9c6.7-7.8 12-16.9 15.5-26.8h16.1c5.9 0 11-4.3 11.9-10.2 2-12.1 2-24.4 0-36.2zm-107.8 50.2c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditModeSaveMenu.vue?vue&type=style&index=0&id=1893de4e&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-clone fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"clone\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M464 0c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48H176c-26.51 0-48-21.49-48-48V48c0-26.51 21.49-48 48-48h288M176 416c-44.112 0-80-35.888-80-80V128H48c-26.51 0-48 21.49-48 48v288c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48v-48H176z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBarItem.vue?vue&type=style&index=0&id=df79d1ee&lang=scss&scoped=true&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-save fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"save\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M433.941 129.941l-83.882-83.882A48 48 0 00316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 00-14.059-33.941zM272 80v80H144V80h128zm122 352H54a6 6 0 01-6-6V86a6 6 0 016-6h42v104c0 13.255 10.745 24 24 24h176c13.255 0 24-10.745 24-24V83.882l78.243 78.243a6 6 0 011.757 4.243V426a6 6 0 01-6 6zM224 232c-48.523 0-88 39.477-88 88s39.477 88 88 88 88-39.477 88-88-39.477-88-88-88zm0 128c-22.056 0-40-17.944-40-40s17.944-40 40-40 40 17.944 40 40-17.944 40-40 40z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigContainer.vue?vue&type=style&index=1&lang=scss&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Login.vue?vue&type=style&index=0&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-ban fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"ban\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm141.421 106.579c73.176 73.175 77.05 187.301 15.964 264.865L132.556 98.615c77.588-61.105 191.709-57.193 264.865 15.964zM114.579 397.421c-73.176-73.175-77.05-187.301-15.964-264.865l280.829 280.829c-77.588 61.105-191.709 57.193-264.865-15.964z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebContent.vue?vue&type=style&index=0&id=f1f96a0a&lang=scss&scoped=true&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-window-maximize fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"window-maximize\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V192h416v234z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-external-link-alt fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"external-link-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M432 320h-32a16 16 0 00-16 16v112H64V128h144a16 16 0 0016-16V80a16 16 0 00-16-16H48a48 48 0 00-48 48v352a48 48 0 0048 48h352a48 48 0 0048-48V336a16 16 0 00-16-16zM488 0H360c-21.37 0-32.05 25.91-17 41l35.73 35.73L135 320.37a24 24 0 000 34L157.67 377a24 24 0 0034 0l243.61-243.68L471 169c15 15 41 4.5 41-17V24a24 24 0 00-24-24z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-info fa-w-8\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"info\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 256 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M224 352.589V224c0-16.475-6.258-31.517-16.521-42.872C225.905 161.14 236 135.346 236 108 236 48.313 187.697 0 128 0 68.313 0 20 48.303 20 108c0 20.882 5.886 40.859 16.874 58.037C15.107 176.264 0 198.401 0 224v39.314c0 23.641 12.884 44.329 32 55.411v33.864C12.884 363.671 0 384.359 0 408v40c0 35.29 28.71 64 64 64h128c35.29 0 64-28.71 64-64v-40c0-23.641-12.884-44.329-32-55.411zM128 48c33.137 0 60 26.863 60 60s-26.863 60-60 60-60-26.863-60-60 26.863-60 60-60zm80 400c0 8.836-7.164 16-16 16H64c-8.836 0-16-7.164-16-16v-40c0-8.836 7.164-16 16-16h16V279.314H64c-8.836 0-16-7.164-16-16V224c0-8.836 7.164-16 16-16h96c8.836 0 16 7.164 16 16v168h16c8.836 0 16 7.164 16 16v40z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LoadingScreen.vue?vue&type=style&index=0&id=a7bc1de6&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-splotch fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"splotch\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M472.29 195.89l-67.06-22.95c-19.28-6.6-33.54-20.92-38.14-38.3L351.1 74.19c-11.58-43.77-76.57-57.13-109.98-22.62l-46.14 47.67c-13.26 13.71-33.54 20.93-54.2 19.31l-71.88-5.62c-52.05-4.07-86.93 44.88-59.03 82.83l38.54 52.42c11.08 15.07 12.82 33.86 4.64 50.24L24.62 355.4c-20.59 41.25 22.84 84.87 73.49 73.81l69.96-15.28c20.11-4.39 41.45 0 57.07 11.73l54.32 40.83c39.32 29.56 101.04 7.57 104.45-37.22l4.7-61.86c1.35-17.79 12.8-33.86 30.63-42.99l62-31.74c44.88-22.96 39.59-80.17-8.95-96.79z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-wrench fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"wrench\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M507.73 109.1c-2.24-9.03-13.54-12.09-20.12-5.51l-74.36 74.36-67.88-11.31-11.31-67.88 74.36-74.36c6.62-6.62 3.43-17.9-5.66-20.16-47.38-11.74-99.55.91-136.58 37.93-39.64 39.64-50.55 97.1-34.05 147.2L18.74 402.76c-24.99 24.99-24.99 65.51 0 90.5 24.99 24.99 65.51 24.99 90.5 0l213.21-213.21c50.12 16.71 107.47 5.68 147.37-34.22 37.07-37.07 49.7-89.32 37.91-136.73zM64 472c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditSection.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomThemeMaker.vue?vue&type=style&index=0&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-swatchbook fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"swatchbook\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M112 424c13.25 0 24-10.75 24-24 0-13.26-10.75-24-24-24s-24 10.74-24 24c0 13.25 10.75 24 24 24zm368-136h-97.61l69.02-69.02c12.5-12.5 12.5-32.76 0-45.25L338.27 60.59c-6.25-6.25-14.44-9.37-22.63-9.37s-16.38 3.12-22.63 9.37L224 129.61V32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v368c0 61.86 50.14 112 112 112h368c17.67 0 32-14.33 32-32V320c0-17.67-14.33-32-32-32zM176 400c0 17.88-7.41 34.03-19.27 45.65-3.65 3.57-7.7 6.53-11.99 9.05-.86.51-1.76.96-2.64 1.43-4.47 2.34-9.12 4.31-14.02 5.57-5.16 1.35-10.48 2.29-16.06 2.29H112c-35.29 0-64-28.71-64-64v-96h128V400zm0-144H48v-80h128v80zm0-128H48V48h128v80zm48 69.49l91.65-91.65 90.51 90.51L224 378.51V197.49zM464 464H206.39l128-128H464v128z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-upload fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fal\",\"data-icon\":\"upload\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M452 432c0 11-9 20-20 20s-20-9-20-20 9-20 20-20 20 9 20 20zm-84-20c-11 0-20 9-20 20s9 20 20 20 20-9 20-20-9-20-20-20zm144-48v104c0 24.3-19.7 44-44 44H44c-24.3 0-44-19.7-44-44V364c0-24.3 19.7-44 44-44h124v-99.3h-52.7c-35.6 0-53.4-43.1-28.3-68.3L227.7 11.7c15.6-15.6 40.9-15.6 56.6 0L425 152.4c25.2 25.2 7.3 68.3-28.3 68.3H344V320h124c24.3 0 44 19.7 44 44zM200 188.7V376c0 4.4 3.6 8 8 8h96c4.4 0 8-3.6 8-8V188.7h84.7c7.1 0 10.7-8.6 5.7-13.7L261.7 34.3c-3.1-3.1-8.2-3.1-11.3 0L109.7 175c-5 5-1.5 13.7 5.7 13.7H200zM480 364c0-6.6-5.4-12-12-12H344v24c0 22.1-17.9 40-40 40h-96c-22.1 0-40-17.9-40-40v-24H44c-6.6 0-12 5.4-12 12v104c0 6.6 5.4 12 12 12h424c6.6 0 12-5.4 12-12V364z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-briefcase fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"briefcase\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M464 128h-80V80c0-26.51-21.49-48-48-48H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v256c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48zM176 80h160v48H176V80zM54 176h404c3.31 0 6 2.69 6 6v74H48v-74c0-3.31 2.69-6 6-6zm404 256H54c-3.31 0-6-2.69-6-6V304h144v24c0 13.25 10.75 24 24 24h80c13.25 0 24-10.75 24-24v-24h144v122c0 3.31-2.69 6-6 6z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-sync fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"sync\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M440.65 12.57l4 82.77A247.16 247.16 0 00255.83 8C134.73 8 33.91 94.92 12.29 209.82A12 12 0 0024.09 224h49.05a12 12 0 0011.67-9.26 175.91 175.91 0 01317-56.94l-101.46-4.86a12 12 0 00-12.57 12v47.41a12 12 0 0012 12H500a12 12 0 0012-12V12a12 12 0 00-12-12h-47.37a12 12 0 00-11.98 12.57zM255.83 432a175.61 175.61 0 01-146-77.8l101.8 4.87a12 12 0 0012.57-12v-47.4a12 12 0 00-12-12H12a12 12 0 00-12 12V500a12 12 0 0012 12h47.35a12 12 0 0012-12.6l-4.15-82.57A247.17 247.17 0 00255.83 504c121.11 0 221.93-86.92 243.55-201.82a12 12 0 00-11.8-14.18h-49.05a12 12 0 00-11.67 9.26A175.86 175.86 0 01255.83 432z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-palette fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"palette\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M128 224c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.4-32-32-32zM418.6 58.1C359.2 9.3 281.3-10 204.6 5 104.9 24.4 24.7 104.2 5.1 203.7c-16.7 84.2 8.1 168.3 67.8 230.6 47.3 49.4 109.7 77.8 167.9 77.8 8.8 0 17.5-.6 26.1-2 24.2-3.7 44.6-18.7 56.1-41.1 12.3-24 12.3-52.7.2-76.6-6.1-12-5.5-26.2 1.8-38 7-11.8 18.7-18.4 32-18.4h72.2c46.4 0 82.8-35.7 82.8-81.3-.2-76.4-34.3-148.1-93.4-196.6zM429.2 288H357c-29.9 0-57.2 15.4-73 41.3-16 26.1-17.3 57.8-3.6 84.9 5.1 10.1 5.1 22.7-.2 32.9-2.6 5-8.7 13.7-20.6 15.6-49.3 7.7-108.9-16.6-152-61.6-48.8-50.9-69-119.4-55.4-188 15.9-80.6 80.8-145.3 161.6-161 62.6-12.3 126.1 3.5 174.3 43.1 48.1 39.5 75.7 97.6 75.9 159.6 0 18.6-15.3 33.2-34.8 33.2zM160 128c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.4-32-32-32zm96-32.1c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32c0-17.6-14.3-32-32-32zm96 32.1c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./StatusIndicator.vue?vue&type=style&index=1&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThemeSelector.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditItem.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LayoutSelector.vue?vue&type=style&index=0&id=748b80da&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-file-download fa-w-12\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"file-download\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 384 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm76.45 211.36l-96.42 95.7c-6.65 6.61-17.39 6.61-24.04 0l-96.42-95.7C73.42 337.29 80.54 320 94.82 320H160v-80c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v80h65.18c14.28 0 21.4 17.29 11.27 27.36zM377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchBar.vue?vue&type=style&index=0&id=3e12dc6e&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LanguageSwitcher.vue?vue&type=style&index=0&id=35dfeeb8&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemOpenMethodIcon.vue?vue&type=style&index=0&id=3bd0e154&scoped=true&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"dashy\"}},[(_vm.isEditMode)?_c('EditModeTopBanner'):_vm._e(),(_vm.shouldShowSplash)?_c('LoadingScreen',{attrs:{\"isLoading\":_vm.isLoading}}):_vm._e(),_c('Header',{attrs:{\"pageInfo\":_vm.pageInfo}}),_c('router-view'),(_vm.visibleComponents.footer)?_c('Footer',{attrs:{\"text\":_vm.footerText}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.componentVisible)?_c('header',[(_vm.titleVisible)?_c('PageTitle',{attrs:{\"title\":_vm.pageInfo.title,\"description\":_vm.pageInfo.description,\"logo\":_vm.pageInfo.logo}}):_vm._e(),(_vm.navVisible)?_c('Nav',{staticClass:\"nav\",attrs:{\"links\":_vm.pageInfo.navLinks}}):_vm._e()],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('router-link',{staticClass:\"page-titles\",attrs:{\"to\":\"/\",\"disabled\":_vm.isEditMode}},[(_vm.logo)?_c('img',{staticClass:\"site-logo\",attrs:{\"src\":_vm.logo}}):_vm._e(),_c('div',{staticClass:\"text\"},[_c('h1',[_vm._v(_vm._s(_vm.title))]),_c('span',{staticClass:\"subtitle\"},[_vm._v(_vm._s(_vm.description))])]),(_vm.isEditMode)?_c('EditModeIcon',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip()),expression:\"tooltip()\"}],staticClass:\"edit-icon\",on:{\"click\":function($event){return _vm.editTitle()}}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","// A list of mutation names\nconst KEY_NAMES = [\n 'INITIALIZE_CONFIG',\n 'SET_CONFIG',\n 'SET_MODAL_OPEN',\n 'SET_LANGUAGE',\n 'SET_EDIT_MODE',\n 'SET_ITEM_LAYOUT',\n 'SET_ITEM_SIZE',\n 'SET_THEME',\n 'SET_CUSTOM_COLORS',\n 'UPDATE_ITEM',\n 'SET_PAGE_INFO',\n 'SET_APP_CONFIG',\n 'SET_SECTIONS',\n 'UPDATE_SECTION',\n 'INSERT_SECTION',\n 'REMOVE_SECTION',\n 'COPY_ITEM',\n 'REMOVE_ITEM',\n 'INSERT_ITEM',\n 'UPDATE_CUSTOM_CSS',\n 'CONF_MENU_INDEX',\n];\n\n// Convert array of key names into an object, and export\nconst MUTATIONS = {};\nKEY_NAMES.forEach((key) => { MUTATIONS[key] = key; });\nexport default MUTATIONS;\n","<template>\n <router-link to=\"/\" class=\"page-titles\" :disabled=\"isEditMode\">\n <!-- Optional page logo image -->\n <img v-if=\"logo\" :src=\"logo\" class=\"site-logo\" />\n <!-- Page heading and sub-heading -->\n <div class=\"text\">\n <h1>{{ title }}</h1>\n <span class=\"subtitle\">{{ description }}</span>\n </div>\n <!-- When in edit mode, show Edit Title button -->\n <EditModeIcon v-if=\"isEditMode\" @click=\"editTitle()\"\n class=\"edit-icon\" v-tooltip=\"tooltip()\" />\n </router-link>\n</template>\n\n<script>\nimport EditModeIcon from '@/assets/interface-icons/interactive-editor-edit-mode.svg';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { modalNames } from '@/utils/defaults';\n\nexport default {\n name: 'PageTitle',\n props: {\n title: String,\n description: String,\n logo: String,\n },\n components: {\n EditModeIcon,\n },\n computed: {\n isEditMode() {\n return this.$store.state.editMode;\n },\n },\n methods: {\n /* On edit button click, open the edit pageInfo modal */\n editTitle() {\n this.$modal.show(modalNames.EDIT_PAGE_INFO);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n },\n /* Edit button tooltip */\n tooltip() {\n const content = this.$t('interactive-editor.menu.edit-page-info-btn');\n return { content, trigger: 'hover focus', delay: 250 };\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/media-queries.scss';\n\n.page-titles {\n display: flex;\n flex-wrap: wrap;\n flex-direction: row;\n align-items: center;\n text-decoration: none;\n position: relative;\n h1 {\n color: var(--heading-text-color);\n font-size: 2.5rem;\n margin: 0;\n }\n span.subtitle {\n color: var(--heading-text-color);\n font-style: italic;\n text-shadow: 1px 1px 2px #130f23;\n opacity: var(--dimming-factor);\n }\n img.site-logo {\n margin: 0.2rem 0.5rem 0.2rem 0;\n max-width: 3.5rem;\n height: fit-content;\n }\n @include phone {\n flex-direction: column;\n text-align: center;\n padding: 0.25rem 0;\n }\n &[disabled] {\n cursor: default;\n }\n svg.edit-icon {\n width: 1rem;\n height: 1rem;\n right: 1rem;\n top: 0.5rem;\n padding: 0.25rem;\n margin: 0.25rem;\n cursor: pointer;\n border: 1px solid var(--background-darker);\n border-radius: var(--curve-factor);\n path { fill: var(--primary); }\n &:hover { border: 1px solid var(--primary); }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PageTitle.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PageTitle.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PageTitle.vue?vue&type=template&id=3b5dde54&scoped=true&\"\nimport script from \"./PageTitle.vue?vue&type=script&lang=js&\"\nexport * from \"./PageTitle.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PageTitle.vue?vue&type=style&index=0&id=3b5dde54&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3b5dde54\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"nav-outer\"},[_c('IconBurger',{class:(\"burger \" + (!_vm.navVisible ? 'visible' : '')),on:{\"click\":function($event){_vm.navVisible = !_vm.navVisible}}}),(_vm.navVisible)?_c('nav',{attrs:{\"id\":\"nav\"}},_vm._l((_vm.links),function(link,index){return _c('router-link',{key:index,staticClass:\"nav-item\",attrs:{\"to\":link.path,\"href\":link.path,\"target\":_vm.isUrl(link.path) ? '_blank' : '',\"rel\":\"noopener noreferrer\"}},[_vm._v(_vm._s(link.title))])}),1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"nav-outer\">\n <IconBurger\n :class=\"`burger ${!navVisible ? 'visible' : ''}`\"\n @click=\"navVisible = !navVisible\"\n />\n <nav id=\"nav\" v-if=\"navVisible\">\n <router-link\n v-for=\"(link, index) in links\"\n :key=\"index\"\n :to=\"link.path\"\n :href=\"link.path\"\n :target=\"isUrl(link.path) ? '_blank' : ''\"\n rel=\"noopener noreferrer\"\n class=\"nav-item\"\n >{{link.title}}</router-link>\n </nav>\n </div>\n</template>\n\n<script>\nimport IconBurger from '@/assets/interface-icons/burger-menu.svg';\n\nexport default {\n name: 'Nav',\n components: {\n IconBurger,\n },\n props: {\n links: Array,\n },\n data: () => ({\n navVisible: true,\n isMobile: false,\n }),\n created() {\n this.navVisible = !this.detectMobile();\n this.isMobile = this.detectMobile();\n },\n methods: {\n detectMobile() {\n const screenWidth = document.body.clientWidth;\n return screenWidth && screenWidth < 600;\n },\n isUrl: (str) => new RegExp(/(http|https):\\/\\/(\\S+)(:[0-9]+)?/).test(str),\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n@import '@/styles/media-queries.scss';\n\n.nav-outer {\n nav {\n display: flex;\n align-items: center;\n .nav-item {\n display: inline-block;\n padding: 0.75rem 0.5rem;\n margin: 0.5rem;\n min-width: 5rem;\n text-align: center;\n outline: none;\n border: none;\n border-radius: var(--curve-factor);\n box-shadow: var(--nav-link-shadow);\n color: var(--nav-link-text-color);\n background: var(--nav-link-background-color);\n border: 1px solid var(--nav-link-border-color);\n text-decoration: none;\n &.router-link-active, &:hover {\n color: var(--nav-link-text-color-hover);\n background: var(--nav-link-background-color-hover);\n border: 1px solid var(--nav-link-border-color-hover);\n box-shadow: var(--nav-link-shadow-hover);\n }\n }\n }\n /* Mobile and Burger-Menu Styles */\n @extend .svg-button;\n @include phone {\n width: 100%;\n nav { flex-wrap: wrap; }\n }\n .burger {\n display: none;\n &.visible { display: block; }\n @include phone { display: block; }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Nav.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Nav.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Nav.vue?vue&type=template&id=0cb96044&scoped=true&\"\nimport script from \"./Nav.vue?vue&type=script&lang=js&\"\nexport * from \"./Nav.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Nav.vue?vue&type=style&index=0&id=0cb96044&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0cb96044\",\n null\n \n)\n\nexport default component.exports","import { hideFurnitureOn } from '@/utils/defaults';\n\n/* Returns false if page furniture should be hidden on said route */\nexport const shouldBeVisible = (routeName) => !hideFurnitureOn.includes(routeName);\n\n/* Very rudimentary hash function for generative icons */\nexport const asciiHash = (input) => {\n const str = (!input || input.length === 0) ? Math.random().toString() : input;\n const reducer = (previousHash, char) => (previousHash || 0) + char.charCodeAt(0);\n const asciiSum = str.split('').reduce(reducer).toString();\n const shortened = asciiSum.slice(0, 30) + asciiSum.slice(asciiSum.length - 30);\n return window.btoa(shortened);\n};\n\n/* Encode potentially malicious characters from string */\nexport const sanitize = (string) => {\n const map = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/',\n };\n const reg = /[&<>\"'/]/ig;\n return string.replace(reg, (match) => (map[match]));\n};\n\n/* Based on section title, item name and index, return a string value for ID */\nconst makeItemId = (sectionStr, itemStr, index) => {\n const charSum = sectionStr.split('').map((a) => a.charCodeAt(0)).reduce((x, y) => x + y);\n const itemTitleStr = itemStr.replace(/\\s+/g, '-').replace(/[^a-zA-Z ]/g, '').toLowerCase();\n return `${index}_${charSum}_${itemTitleStr}`;\n};\n\n/* Given an array of sections, apply a unique ID to each item, and return modified array */\nexport const applyItemId = (inputSections) => {\n const sections = inputSections || [];\n sections.forEach((sec, secIdx) => {\n if (sec.items) {\n sec.items.forEach((item, itemIdx) => {\n sections[secIdx].items[itemIdx].id = makeItemId(sec.name, item.title, itemIdx);\n // TODO: Check if ID already exists, and if so, modify it\n });\n }\n });\n return sections;\n};\n","<template>\n <header v-if=\"componentVisible\">\n <PageTitle\n v-if=\"titleVisible\"\n :title=\"pageInfo.title\"\n :description=\"pageInfo.description\"\n :logo=\"pageInfo.logo\"\n />\n <Nav v-if=\"navVisible\" :links=\"pageInfo.navLinks\" class=\"nav\" />\n </header>\n</template>\n\n<script>\nimport PageTitle from '@/components/PageStrcture/PageTitle.vue';\nimport Nav from '@/components/PageStrcture/Nav.vue';\nimport { shouldBeVisible } from '@/utils/MiscHelpers';\n\nexport default {\n name: 'Header',\n components: {\n PageTitle,\n Nav,\n },\n props: {\n pageInfo: Object,\n },\n computed: {\n componentVisible() {\n return shouldBeVisible(this.$route.name);\n },\n visibleComponents() {\n return this.$store.getters.visibleComponents;\n },\n titleVisible() {\n return this.visibleComponents.pageTitle;\n },\n navVisible() {\n return this.visibleComponents.navigation;\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\n@import '@/styles/media-queries.scss';\n\n header {\n margin: 0;\n padding: 0.5rem;\n display: flex;\n justify-content: space-between;\n background: var(--background-darker);\n align-items: center;\n align-content: flex-start;\n @include phone {\n flex-direction: column-reverse;\n }\n }\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Header.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Header.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Header.vue?vue&type=template&id=68e7510c&scoped=true&\"\nimport script from \"./Header.vue?vue&type=script&lang=js&\"\nexport * from \"./Header.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Header.vue?vue&type=style&index=0&id=68e7510c&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"68e7510c\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.text && _vm.text !== '' && _vm.visible)?_c('footer',{domProps:{\"innerHTML\":_vm._s(_vm.text)}}):(_vm.visible)?_c('footer',[_vm._v(\" Developed by \"),_c('a',{attrs:{\"href\":_vm.authorUrl}},[_vm._v(_vm._s(_vm.authorName))]),_vm._v(\". Licensed under \"),_c('a',{attrs:{\"href\":_vm.licenseUrl}},[_vm._v(_vm._s(_vm.license))]),_vm._v(\" \"+_vm._s(_vm.showCopyright? '©': '')+\" \"+_vm._s(_vm.date)+\". Get the \"),_c('a',{attrs:{\"href\":_vm.repoUrl}},[_vm._v(\"Source Code\")]),_vm._v(\". \")]):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <!-- User Footer -->\n <footer v-if=\"text && text !== '' && visible\" v-html=\"text\"></footer>\n <!-- Default Footer -->\n <footer v-else-if=\"visible\">\n Developed by <a :href=\"authorUrl\">{{authorName}}</a>.\n Licensed under <a :href=\"licenseUrl\">{{license}}</a>\n {{ showCopyright? '©': '' }} {{date}}.\n Get the <a :href=\"repoUrl\">Source Code</a>.\n </footer>\n</template>\n\n<script>\n\nimport { shouldBeVisible } from '@/utils/MiscHelpers';\n\nexport default {\n name: 'Footer',\n props: {\n text: String,\n authorName: { type: String, default: 'Alicia Sykes' },\n authorUrl: { type: String, default: 'https://aliciasykes.com' },\n license: { type: String, default: 'MIT' },\n licenseUrl: { type: String, default: 'https://gist.github.com/Lissy93/143d2ee01ccc5c052a17' },\n date: { type: String, default: `${new Date().getFullYear()}` },\n showCopyright: { type: Boolean, default: true },\n repoUrl: { type: String, default: 'https://github.com/lissy93/dashy' },\n },\n computed: {\n visible() {\n return shouldBeVisible(this.$route.name);\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/media-queries.scss';\n\nfooter {\n width: calc(100% - 0.5rem);\n bottom: 0;\n padding: 0.25rem;\n text-align: center;\n color: var(--medium-grey);\n opacity: var(--dimming-factor);\n background: var(--footer-background);\n margin-top: 1.5rem;\n border-top: 1px solid var(--outline-color);\n @include tablet-down {\n display: none;\n }\n}\n\nfooter a{\n color: var(--footer-text-color);\n &:hover {\n color: var(--footer-text-color-link);\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Footer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Footer.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Footer.vue?vue&type=template&id=d162889c&scoped=true&\"\nimport script from \"./Footer.vue?vue&type=script&lang=js&\"\nexport * from \"./Footer.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Footer.vue?vue&type=style&index=0&id=d162889c&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"d162889c\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _vm._m(0)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"edit-mode-top-banner\"},[_c('span',[_vm._v(\"Edit Mode Enabled\")])])}]\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./EditModeTopBanner.vue?vue&type=template&id=3cb5bf99&scoped=true&\"\nvar script = {}\nimport style0 from \"./EditModeTopBanner.vue?vue&type=style&index=0&id=3cb5bf99&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3cb5bf99\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('transition',{attrs:{\"name\":\"slide-fade\"}},[(_vm.isLoading)?_c('div',{class:_vm.c,attrs:{\"id\":\"loading\"},on:{\"click\":function($event){_vm.c = 'hide'}}},[_c('h2',[_vm._v(\"Dashy\")]),_c('div',{staticClass:\"inner-container\"},[_c('p',[_vm._v(\"Loading\")]),_c('span',{staticClass:\"dots-cont\"},[_c('span',{staticClass:\"dot dot-1\"}),_c('span',{staticClass:\"dot dot-2\"}),_c('span',{staticClass:\"dot dot-3\"}),_c('span',{staticClass:\"dot dot-4\"})])])]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <transition name=\"slide-fade\">\n <div id=\"loading\" v-if=\"isLoading\" :class=\"c\" @click=\"c = 'hide'\">\n <h2>Dashy</h2>\n <div class=\"inner-container\">\n <p>Loading</p>\n <span class=\"dots-cont\">\n <span class=\"dot dot-1\"></span>\n <span class=\"dot dot-2\"></span>\n <span class=\"dot dot-3\"></span>\n <span class=\"dot dot-4\"></span>\n </span>\n </div>\n </div>\n </transition>\n</template>\n\n<script>\nexport default {\n name: 'LoadingScreen',\n props: {\n isLoading: { type: Boolean, default: false },\n },\n data: () => ({\n c: '',\n }),\n};\n</script>\n\n<style scoped lang=\"scss\">\ndiv#loading {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n position: absolute;\n height: 100%;\n width: 100%;\n z-index: 7;\n background: var(--loading-screen-background);\n color: var(--loading-screen-color);\n\n &.hide { display: none; }\n\n .inner-container {\n text-align: center;\n }\n\n p {\n font-size: 6vw;\n display: inline;\n margin: 0 auto;\n }\n h2 {\n opacity: 0.35;\n font-size: 16vw;\n margin: 0;\n }\n\n .dots-cont {\n display: inline;\n .dot {\n width: 4px;\n height: 4px;\n background: var(--loading-screen-color);\n display: inline-block;\n border-radius: 35%;\n right: 0px;\n bottom: 0px;\n margin: 0px 2.5px;\n position: relative;\n animation: jump 1s infinite;\n &.dot-1 {\n -webkit-animation-delay: 100ms;\n animation-delay: 100ms;\n }\n &.dot-2 {\n -webkit-animation-delay: 200ms;\n animation-delay: 200ms;\n }\n &.dot-3 {\n -webkit-animation-delay: 300ms;\n animation-delay: 300ms;\n }\n &.dot-4 {\n -webkit-animation-delay: 400ms;\n animation-delay: 400ms;\n }\n }\n }\n\n @keyframes jump {\n 0% {\n bottom: 0px;\n }\n\n 20% {\n bottom: 5px;\n }\n\n 40% {\n bottom: 0px;\n }\n }\n}\n\n.slide-fade-leave-active {\n transition: all .2s cubic-bezier(1, 0.9, 0.7, 0.4);\n}\n.slide-fade-enter, .slide-fade-leave-to {\n transform: translateY(-200px);\n opacity: 0;\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LoadingScreen.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LoadingScreen.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./LoadingScreen.vue?vue&type=template&id=a7bc1de6&scoped=true&\"\nimport script from \"./LoadingScreen.vue?vue&type=script&lang=js&\"\nexport * from \"./LoadingScreen.vue?vue&type=script&lang=js&\"\nimport style0 from \"./LoadingScreen.vue?vue&type=style&index=0&id=a7bc1de6&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"a7bc1de6\",\n null\n \n)\n\nexport default component.exports","/* eslint no-console: [\"error\", { allow: [\"log\", \"info\"] }] */\n\n/* Prints the app name and version, helpful for debugging */\nexport const welcomeMsg = () => {\n const v = process.env.VUE_APP_VERSION ? `V${process.env.VUE_APP_VERSION}` : '';\n console.log(`\\n%cDashy ${v} 🚀`, 'color:#0dd8d8; background:#0b1021; font-size:1.5rem; padding:0.15rem 0.25rem; margin: 1rem auto; font-family: Rockwell; border: 2px solid #0dd8d8; border-radius: 4px;font-weight: bold; text-shadow: 1px 1px 1px #00af87bf;');\n};\n\n/* Prints warning message, usually when there is a configuration error */\nexport const warningMsg = (message) => {\n console.info(\n `\\n%c⚠️ Warning ⚠️%c \\n${message} \\n\\n%cThis is likely not an issue with Dashy, but rather your configuration. If you think it is a bug, please open a ticket on GitHub: https://git.io/JukXk`,\n \"color:#ceb73f; background: #ceb73f33; font-size:1.5rem; padding:0.15rem; margin: 1rem auto; font-family: Rockwell, Tahoma, 'Trebuchet MS', Helvetica; border: 2px solid #ceb73f; border-radius: 4px; font-weight: bold; text-shadow: 1px 1px 1px #000000bf;\",\n 'font-weight: bold; font-size: 1rem;color: #ceb73f;',\n \"color: #ceb73f; font-size: 0.75rem; font-family: Tahoma, 'Trebuchet MS', Helvetica;\",\n );\n};\n\n/* Prints status message */\nexport const statusMsg = (title, msg) => {\n console.log(\n `%c${title || ''}\\n%c${msg}`,\n 'font-weight: bold; color: #0dd8d8; text-decoration: underline;',\n 'color: #ceb73f;',\n );\n};\n\n/* Prints status message, with a stack trace */\nexport const statusErrorMsg = (title, msg, errorLog) => {\n console.log(\n `%c${title || ''}\\n%c${msg} \\n%c${errorLog || ''}`,\n 'font-weight: bold; color: #0dd8d8; text-decoration: underline;',\n 'color: #ff025a',\n 'color: #ff025a80;',\n );\n};\n","import * as Sentry from '@sentry/vue';\nimport { warningMsg, statusMsg, statusErrorMsg } from '@/utils/CoolConsole';\nimport { sessionStorageKeys } from '@/utils/defaults';\n\n/* Makes the current time, like hh:mm:ss */\nconst makeTime = () => {\n const now = new Date();\n const pad = (digit) => String(digit).padStart(2, '0');\n return `${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`;\n};\n\n/* Appends recent errors to local storage, for viewing in the UI */\nconst appendToErrorLog = (msg) => {\n let errorLog = sessionStorage.getItem(sessionStorageKeys.ERROR_LOG) || '';\n errorLog += `[${makeTime()}] ${msg}\\n`;\n sessionStorage.setItem(sessionStorageKeys.ERROR_LOG, errorLog);\n};\n\n/**\n * Function called when an error happens\n * Will call to function which prints helpful message to console\n * If error reporting is enabled, will also log the message to Sentry\n * If you wish to use your own error logging service, put code for it here\n */\nconst ErrorHandler = function handler(msg) {\n warningMsg(msg); // Print to console\n appendToErrorLog(msg); // Save to local storage\n Sentry.captureMessage(`[USER-WARN] ${msg}`); // Report to bug tracker (if enabled)\n};\n\n/* Similar to error handler, but for recording general info */\nexport const InfoHandler = (msg, title) => {\n statusMsg(title || 'Info', msg);\n};\n\n/* Outputs warnings caused by the user, such as missing field */\nexport const WarningInfoHandler = (msg, title, log) => {\n statusErrorMsg(title || 'Warning', msg, log);\n};\n\n/* Titles for info logging */\nexport const InfoKeys = {\n AUTH: 'Authentication',\n CLOUD_BACKUP: 'Cloud Backup & Restore',\n EDITOR: 'Interactive Editor',\n RAW_EDITOR: 'Raw Config Editor',\n VISUAL: 'Layout & Styles',\n};\n\nexport default ErrorHandler;\n","<template>\n <div id=\"dashy\">\n <EditModeTopBanner v-if=\"isEditMode\" />\n <LoadingScreen :isLoading=\"isLoading\" v-if=\"shouldShowSplash\" />\n <Header :pageInfo=\"pageInfo\" />\n <router-view />\n <Footer :text=\"footerText\" v-if=\"visibleComponents.footer\" />\n </div>\n</template>\n<script>\n\nimport Header from '@/components/PageStrcture/Header.vue';\nimport Footer from '@/components/PageStrcture/Footer.vue';\nimport EditModeTopBanner from '@/components/InteractiveEditor/EditModeTopBanner.vue';\nimport LoadingScreen from '@/components/PageStrcture/LoadingScreen.vue';\nimport { welcomeMsg } from '@/utils/CoolConsole';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport Keys from '@/utils/StoreMutations';\nimport {\n localStorageKeys,\n splashScreenTime,\n visibleComponents as defaultVisibleComponents,\n language as defaultLanguage,\n} from '@/utils/defaults';\n\nexport default {\n name: 'app',\n components: {\n Header,\n Footer,\n LoadingScreen,\n EditModeTopBanner,\n },\n data() {\n return {\n isLoading: true, // Set to false after mount complete\n };\n },\n computed: {\n /* If the user has specified custom text for footer - get it */\n footerText() {\n return this.pageInfo && this.pageInfo.footerText ? this.pageInfo.footerText : '';\n },\n /* Determine if splash screen should be shown */\n shouldShowSplash() {\n return (this.visibleComponents || defaultVisibleComponents).splashScreen;\n },\n config() {\n return this.$store.state.config;\n },\n appConfig() {\n return this.$store.getters.appConfig;\n },\n pageInfo() {\n return this.$store.getters.pageInfo;\n },\n sections() {\n return this.$store.getters.pageInfo;\n },\n visibleComponents() {\n return this.$store.getters.visibleComponents;\n },\n isEditMode() {\n return this.$store.state.editMode;\n },\n },\n created() {\n this.$store.dispatch(Keys.INITIALIZE_CONFIG);\n },\n methods: {\n /* Injects the users custom CSS as a style tag */\n injectCustomStyles(usersCss) {\n const style = document.createElement('style');\n style.textContent = usersCss;\n document.head.append(style);\n },\n /* Hide splash screen, either after 2 seconds, or immediately based on user preference */\n hideSplash() {\n if (this.shouldShowSplash) {\n setTimeout(() => { this.isLoading = false; }, splashScreenTime || 1500);\n } else {\n this.isLoading = false;\n }\n },\n\n /* Auto-detects users language from browser/ os, when not specified */\n autoDetectLanguage(availibleLocales) {\n const isLangSupported = (languageList, userLang) => languageList\n .map(lang => lang.toLowerCase()).find((lang) => lang === userLang.toLowerCase());\n\n const usersBorwserLang1 = window.navigator.language || ''; // e.g. en-GB or or ''\n const usersBorwserLang2 = usersBorwserLang1.split('-')[0]; // e.g. en or undefined\n const usersSpairLangs = window.navigator.languages; // e.g [en, en-GB, en-US]\n return isLangSupported(availibleLocales, usersBorwserLang1)\n || isLangSupported(availibleLocales, usersBorwserLang2)\n || usersSpairLangs.find((spair) => isLangSupported(availibleLocales, spair))\n || defaultLanguage;\n },\n\n /* Get users language, if not available then call auto-detect */\n getLanguage() {\n const availibleLocales = this.$i18n.availableLocales; // All available locales\n const usersLang = localStorage[localStorageKeys.LANGUAGE] || this.appConfig.language;\n if (usersLang) {\n if (availibleLocales.includes(usersLang)) {\n return usersLang;\n } else {\n ErrorHandler(`Unsupported Language: '${usersLang}'`);\n }\n }\n return this.autoDetectLanguage(availibleLocales);\n },\n\n /* Fetch or detect users language, then apply it */\n applyLanguage() {\n const language = this.getLanguage();\n this.$store.commit(Keys.SET_LANGUAGE, language);\n this.$i18n.locale = language;\n document.getElementsByTagName('html')[0].setAttribute('lang', language);\n },\n hideLoader() {\n const loader = document.getElementById('loader');\n if (loader) loader.style.display = 'none';\n },\n },\n /* When component mounted, hide splash and initiate the injection of custom styles */\n mounted() {\n this.applyLanguage();\n this.hideSplash();\n if (this.appConfig.customCss) {\n const cleanedCss = this.appConfig.customCss.replace(/<\\/?[^>]+(>|$)/g, '');\n this.injectCustomStyles(cleanedCss);\n this.hideLoader();\n }\n welcomeMsg();\n },\n};\n</script>\n\n<style lang=\"scss\">\n/* Import styles used globally throughout the app */\n@import '@/styles/global-styles.scss';\n@import '@/styles/color-palette.scss';\n@import '@/styles/dimensions.scss';\n@import '@/styles/color-themes.scss';\n@import '@/styles/typography.scss';\n@import '@/styles/user-defined-themes.scss';\n\n</style>\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=9f8f59ca&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"home\",style:(_vm.getBackgroundImage())},[_c('SettingsContainer',{ref:\"filterComp\",staticClass:\"settings-outer\",attrs:{\"displayLayout\":_vm.layout,\"iconSize\":_vm.itemSizeBound,\"externalThemes\":_vm.getExternalCSSLinks(),\"modalOpen\":_vm.modalOpen},on:{\"user-is-searchin\":_vm.searching,\"change-modal-visibility\":_vm.updateModalVisibility}}),(_vm.singleSectionView)?_c('div',[_c('router-link',{staticClass:\"back-to-all-link\",attrs:{\"to\":\"/home\"}},[_c('BackIcon'),_c('span',[_vm._v(\"Back to All\")])],1)],1):_vm._e(),(_vm.checkTheresData(_vm.sections))?_c('div',{class:\"item-group-container \"\n + \"orientation-\" + _vm.layout + \" \"\n + \"item-size-\" + _vm.itemSizeBound + \" \"\n + (_vm.isEditMode ? 'edit-mode ' : '')\n + (_vm.singleSectionView ? 'single-section-view ' : '')\n + (this.colCount ? (\"col-count-\" + (this.colCount) + \" \") : '')},[_vm._l((_vm.filteredTiles),function(section,index){return _c('Section',{key:index,class:(_vm.searchValue && _vm.filterTiles(section.items, _vm.searchValue).length === 0) ? 'no-results' : '',attrs:{\"index\":index,\"title\":section.name,\"icon\":section.icon || undefined,\"displayData\":_vm.getDisplayData(section),\"groupId\":(\"section-\" + index),\"items\":_vm.filterTiles(section.items, _vm.searchValue),\"searchTerm\":_vm.searchValue,\"itemSize\":_vm.itemSizeBound},on:{\"itemClicked\":function($event){return _vm.finishedSearching()},\"change-modal-visibility\":_vm.updateModalVisibility}})}),(_vm.isEditMode)?_c('AddNewSection'):_vm._e()],2):_vm._e(),(_vm.checkIfResults())?_c('div',{staticClass:\"no-data\"},[_vm._v(\" \"+_vm._s(_vm.searchValue ? _vm.$t('home.no-results') : _vm.$t('home.no-data'))+\" \")]):_vm._e(),(_vm.isEditMode)?_c('EditModeSaveMenu'):_vm._e(),_c('ExportConfigMenu')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',[(_vm.searchVisible)?_c('SearchBar',{ref:\"SearchBar\",on:{\"user-is-searchin\":_vm.userIsTypingSomething}}):_vm._e(),_c('div',{staticClass:\"options-outer\"},[_c('div',{class:(\"options-container \" + (!_vm.settingsVisible ? 'hide' : ''))},[_c('ThemeSelector'),_c('LayoutSelector',{attrs:{\"displayLayout\":_vm.displayLayout}}),_c('ItemSizeSelector',{attrs:{\"iconSize\":_vm.iconSize}}),_c('ConfigLauncher'),(_vm.userState != 'noone')?_c('AuthButtons',{attrs:{\"userType\":_vm.userState}}):_vm._e()],1),_c('div',{class:(\"show-hide-container \" + (_vm.settingsVisible? 'hide-btn' : 'show-btn'))},[_c('button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(((_vm.settingsVisible? 'Hide' : 'Open') + \" Settings Menu\")),expression:\"`${settingsVisible? 'Hide' : 'Open'} Settings Menu`\"}],attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.toggleSettingsVisibility()}}},[(_vm.settingsVisible)?_c('IconClose'):_c('IconOpen')],1)])]),_c('KeyboardShortcutInfo'),_c('AppInfoModal')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('form',{class:_vm.minimalSearch ? 'minimal' : 'normal',on:{\"submit\":function($event){$event.preventDefault();return _vm.searchSubmitted.apply(null, arguments)}}},[_c('label',{attrs:{\"for\":\"filter-tiles\"}},[_vm._v(_vm._s(_vm.$t('search.search-label')))]),_c('div',{staticClass:\"search-wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.input),expression:\"input\"}],ref:\"filter\",attrs:{\"id\":\"filter-tiles\",\"placeholder\":_vm.$t('search.search-placeholder')},domProps:{\"value\":(_vm.input)},on:{\"input\":[function($event){if($event.target.composing){ return; }_vm.input=$event.target.value},_vm.userIsTypingSomething],\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }return _vm.clearFilterInput.apply(null, arguments)}}}),((!_vm.searchPrefs.disableWebSearch) && _vm.input.length > 0)?_c('p',{staticClass:\"web-search-note\"},[_vm._v(\" \"+_vm._s(_vm.$t('search.enter-to-search-web'))+\" \")]):_vm._e()]),(_vm.input.length > 0)?_c('i',{staticClass:\"clear-search\",attrs:{\"title\":_vm.$t('search.clear-search-tooltip')},on:{\"click\":_vm.clearFilterInput}},[_vm._v(\"x\")]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * Class encapsulating the functionality that enables the user to\n * navigate through tiles/ search result grid using the arrow keys\n * This code is very hacky, it's best not to look at it for too long\n */\nexport default class ArrowKeyNavigation {\n constructor(index) {\n this.index = index;\n }\n\n resetIndex() {\n this.index = 0;\n }\n\n /* Figures out which element is next, based on the key pressed *\n * current index and total number of items. Then calls focus function */\n arrowNavigation(key) {\n if (this.index === undefined) this.index = 0; // Start at beginning\n else if (key === 37) { // Left --> Previous\n this.index -= 1;\n } else if (key === 38) { // Up --> Previous\n this.index = ArrowKeyNavigation.goToPrevious(this.index);\n } else if (key === 39) { // Right --> Next\n this.index += 1;\n } else if (key === 40) { // Down --> Next\n this.index = ArrowKeyNavigation.goToNext(this.index);\n }\n /* Ensure the index is within bounds, then focus element */\n this.index = ArrowKeyNavigation.getSafeElementIndex(this.index);\n ArrowKeyNavigation.selectItemByIndex(this.index).focus();\n }\n\n /* Returns the number of visible items / results */\n static getNumResults() {\n return document.getElementsByClassName('item').length;\n }\n\n /* Returns the index for an element, ensuring that it's within bounds */\n static getSafeElementIndex(index) {\n const numResults = ArrowKeyNavigation.getNumResults();\n if (index < 0) return numResults - 1;\n else if (index >= numResults) return 0;\n return index;\n }\n\n /* Selects a given element, by it's ID. If out of bounds, returns element 0 */\n static selectItemByIndex(index) {\n return (index >= 0 && index <= ArrowKeyNavigation.getNumResults())\n ? document.getElementsByClassName('item')[index] : [document.getElementsByClassName('item')];\n }\n\n /* Returns the index of the first cell in the previous/ above row */\n static findPreviousRow(startingIndex) {\n const isSameRow = (indx, pos) => ArrowKeyNavigation.selectItemByIndex(indx).offsetTop === pos;\n const checkPreviousIndex = (currentIndex, yPos) => {\n if (currentIndex >= ArrowKeyNavigation.getNumResults()) return checkPreviousIndex(0, yPos);\n else if (isSameRow(currentIndex, yPos)) return checkPreviousIndex(currentIndex - 1, yPos);\n return currentIndex;\n };\n const position = ArrowKeyNavigation.selectItemByIndex(startingIndex).offsetTop;\n return checkPreviousIndex(startingIndex, position);\n }\n\n /* Moves to the cell directly above the current */\n static goToPrevious(startingIndex) {\n const isBelow = (start, end) => (ArrowKeyNavigation.selectItemByIndex(start).offsetTop\n < ArrowKeyNavigation.selectItemByIndex(end).offsetTop);\n const nextIndex = ArrowKeyNavigation.findPreviousRow(startingIndex);\n const count = nextIndex - startingIndex;\n const rowLen = nextIndex - ArrowKeyNavigation.findNextRow(startingIndex) + 1;\n const adjustment = isBelow(startingIndex, nextIndex) ? 0 : rowLen - count;\n return nextIndex + adjustment;\n }\n\n /* Returns the index of the first cell in the next/ below row */\n static findNextRow(startingIndex) {\n const isSameRow = (indx, pos) => ArrowKeyNavigation.selectItemByIndex(indx).offsetTop === pos;\n const checkNextIndex = (currentIndex, yPos) => {\n if (currentIndex >= ArrowKeyNavigation.getNumResults()) return checkNextIndex(0, yPos);\n else if (isSameRow(currentIndex, yPos)) return checkNextIndex(currentIndex + 1, yPos);\n return currentIndex;\n };\n const position = ArrowKeyNavigation.selectItemByIndex(startingIndex).offsetTop;\n return checkNextIndex(startingIndex, position);\n }\n\n /* Moves to the cell directly below the current */\n static goToNext(startingIndex) {\n const isAbove = (start, end) => (ArrowKeyNavigation.selectItemByIndex(start).offsetTop\n > ArrowKeyNavigation.selectItemByIndex(end).offsetTop);\n const nextIndex = ArrowKeyNavigation.findNextRow(startingIndex);\n const count = nextIndex - startingIndex;\n const rowLen = nextIndex - ArrowKeyNavigation.findPreviousRow(startingIndex) - 1;\n const adjustment = isAbove(startingIndex, nextIndex) ? 0 : rowLen - count;\n return nextIndex + adjustment;\n }\n}\n","/**\n * Reads the users config from `conf.yml`, and combines it with any local preferences\n * Also ensures that any missing attributes are populated with defaults, and the\n * object is structurally sound, to avoid any error if the user is missing something\n * The main config object is made up of three parts: appConfig, pageInfo and sections\n * For anything other than these three sections, please see @utils/ConfigHelpers.js\n */\nimport {\n localStorageKeys,\n appConfig as defaultAppConfig,\n pageInfo as defaultPageInfo,\n iconSize as defaultIconSize,\n layout as defaultLayout,\n} from '@/utils/defaults';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport { applyItemId } from '@/utils/MiscHelpers';\nimport conf from '../../public/conf.yml';\n\nexport default class ConfigAccumulator {\n constructor() {\n this.conf = conf;\n }\n\n /* App Config */\n appConfig() {\n let appConfigFile = {};\n // Set app config from file\n if (this.conf) appConfigFile = this.conf.appConfig || {};\n // Fill in defaults if anything missing\n let usersAppConfig = defaultAppConfig;\n if (localStorage[localStorageKeys.APP_CONFIG]) {\n usersAppConfig = JSON.parse(localStorage[localStorageKeys.APP_CONFIG]);\n } else if (appConfigFile !== {}) {\n usersAppConfig = appConfigFile;\n }\n // Some settings have their own local storage keys, apply them here\n usersAppConfig.layout = localStorage[localStorageKeys.LAYOUT_ORIENTATION]\n || appConfigFile.layout || defaultLayout;\n usersAppConfig.iconSize = localStorage[localStorageKeys.ICON_SIZE]\n || appConfigFile.iconSize || defaultIconSize;\n // Don't let users modify users locally\n if (appConfigFile.auth) usersAppConfig.auth = appConfigFile.auth;\n // All done, return final appConfig object\n return usersAppConfig;\n }\n\n /* Page Info */\n pageInfo() {\n let localPageInfo = {};\n if (localStorage[localStorageKeys.PAGE_INFO]) {\n // eslint-disable-next-line brace-style\n try { localPageInfo = JSON.parse(localStorage[localStorageKeys.PAGE_INFO]); }\n catch (e) { ErrorHandler('Malformed pageInfo data in local storage'); }\n }\n const filePageInfo = this.conf ? this.conf.pageInfo || {} : {};\n return { ...defaultPageInfo, ...filePageInfo, ...localPageInfo };\n }\n\n /* Sections */\n sections() {\n let sections = [];\n // If the user has stored sections in local storage, return those\n const localSections = localStorage[localStorageKeys.CONF_SECTIONS];\n if (localSections) {\n try {\n const json = JSON.parse(localSections);\n if (json.length >= 1) sections = json;\n } catch (e) {\n ErrorHandler('Malformed section data in local storage');\n }\n }\n // If sections were not set from local data, then use config file instead\n if (sections.length === 0) {\n sections = this.conf ? this.conf.sections || [] : [];\n }\n // Apply a unique ID to each item\n sections = applyItemId(sections);\n return sections;\n }\n\n /* Complete config */\n config() {\n return {\n appConfig: this.appConfig(),\n pageInfo: this.pageInfo(),\n sections: this.sections(),\n };\n }\n}\n","import sha256 from 'crypto-js/sha256';\nimport ConfigAccumulator from '@/utils/ConfigAccumalator';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport { cookieKeys, localStorageKeys, userStateEnum } from '@/utils/defaults';\n\n/* Uses config accumulator to get and return app config */\nconst getAppConfig = () => {\n const Accumulator = new ConfigAccumulator();\n const config = Accumulator.config();\n return config.appConfig || {};\n};\n\n/**\n * Called when the user is still using array for users, prints warning\n * This was a breaking change, implemented in V 1.6.5\n * Support for old user structure will be removed in V 1.7.0\n */\nconst printWarning = () => {\n ErrorHandler('From V 1.6.5 onwards, the structure of the users object has changed.');\n};\n\n/* Returns true if keycloak is enabled */\nexport const isKeycloakEnabled = () => {\n const appConfig = getAppConfig();\n if (!appConfig.auth) return false;\n return appConfig.auth.enableKeycloak || false;\n};\n\n/* Returns the users keycloak config */\nexport const getKeycloakConfig = () => {\n const appConfig = getAppConfig();\n if (!isKeycloakEnabled()) return false;\n const { keycloak } = appConfig.auth;\n const { serverUrl, realm, clientId } = keycloak;\n if (!serverUrl || !realm || !clientId) {\n ErrorHandler('Keycloak config missing- please ensure you specify: serverUrl, realm, clientId');\n return false;\n }\n return keycloak;\n};\n\n/* Returns array of users from appConfig.auth, if available, else an empty array */\nconst getUsers = () => {\n const appConfig = getAppConfig();\n const auth = appConfig.auth || {};\n // Check if the user is still using previous schema type\n if (Array.isArray(auth)) {\n printWarning(); // Print warning message\n return []; // Support for old data structure now removed\n }\n // Otherwise, return the users array, if available\n return auth.users || [];\n};\n\n/**\n * Generates a 1-way hash, in order to be stored in local storage for authentication\n * @param {String} user The username of user\n * @returns {String} The hashed token\n */\nconst generateUserToken = (user) => {\n const strAndUpper = (input) => input.toString().toUpperCase();\n const sha = sha256(strAndUpper(user.user) + strAndUpper(user.hash));\n return strAndUpper(sha);\n};\n\n/**\n * Checks if the user is currently authenticated\n * @param {Array[Object]} users An array of user objects pulled from the config\n * @returns {Boolean} Will return true if the user is logged in, else false\n */\nexport const isLoggedIn = () => {\n const users = getUsers();\n const validTokens = users.map((user) => generateUserToken(user));\n let userAuthenticated = false;\n document.cookie.split(';').forEach((cookie) => {\n if (cookie && cookie.split('=').length > 1) {\n const cookieKey = cookie.split('=')[0].trim();\n const cookieValue = cookie.split('=')[1].trim();\n if (cookieKey === cookieKeys.AUTH_TOKEN) {\n if (validTokens.includes(cookieValue)) {\n userAuthenticated = true;\n }\n }\n }\n });\n return userAuthenticated;\n};\n\n/* Returns true if authentication is enabled */\nexport const isAuthEnabled = () => {\n const users = getUsers();\n return (users.length > 0);\n};\n\n/* Returns true if guest access is enabled */\nexport const isGuestAccessEnabled = () => {\n const appConfig = getAppConfig();\n if (appConfig.auth && typeof appConfig.auth === 'object') {\n return appConfig.auth.enableGuestAccess || false;\n }\n return false;\n};\n\n/**\n * Checks credentials entered by the user against those in the config\n * Returns an object containing a boolean indicating success/ failure\n * along with a message outlining what's not right\n * @param {String} username The username entered by the user\n * @param {String} pass The password entered by the user\n * @param {String[]} users An array of valid user objects\n * @returns {Object} An object containing a boolean result and a message\n */\nexport const checkCredentials = (username, pass, users, messages) => {\n let response; // Will store an object containing boolean and message\n if (!username) {\n response = { correct: false, msg: messages.missingUsername };\n } else if (!pass) {\n response = { correct: false, msg: messages.missingPassword };\n } else {\n users.forEach((user) => {\n if (user.user.toLowerCase() === username.toLowerCase()) { // User found\n if (user.hash.toLowerCase() === sha256(pass).toString().toLowerCase()) {\n response = { correct: true, msg: messages.successMsg }; // Password is correct\n } else { // User found, but password is not a match\n response = { correct: false, msg: messages.incorrectPassword };\n }\n }\n });\n }\n return response || { correct: false, msg: messages.incorrectUsername };\n};\n\n/**\n * Sets the cookie value in order to login the user locally\n * @param {String} username - The users username\n * @param {String} pass - Password, not yet hashed\n * @param {Number} timeout - A desired timeout for the session, in ms\n */\nexport const login = (username, pass, timeout) => {\n const now = new Date();\n const expiry = new Date(now.setTime(now.getTime() + timeout)).toGMTString();\n const userObject = { user: username, hash: sha256(pass).toString().toLowerCase() };\n document.cookie = `authenticationToken=${generateUserToken(userObject)};`\n + `${timeout > 0 ? `expires=${expiry}` : ''}`;\n localStorage.setItem(localStorageKeys.USERNAME, username);\n};\n\n/**\n * Removed the browsers cookie, causing user to be logged out\n */\nexport const logout = () => {\n document.cookie = 'authenticationToken=null';\n localStorage.removeItem(localStorageKeys.USERNAME);\n};\n\n/**\n * If correctly logged in as a valid, authenticated user,\n * then returns the user object for the current user\n * If not logged in, will return false\n * */\nexport const getCurrentUser = () => {\n if (!isLoggedIn()) return false; // User not logged in\n const username = localStorage[localStorageKeys.USERNAME]; // Get username\n if (!username) return false; // No username\n let foundUserObject = false; // Value to return\n getUsers().forEach((user) => {\n // If current logged in user found, then return that user\n if (user.user === username) foundUserObject = user;\n });\n return foundUserObject;\n};\n\n/**\n * Checks if the user is viewing the dashboard as a guest\n * Returns true if guest mode enabled, and user not logged in\n * */\nexport const isLoggedInAsGuest = () => {\n const guestEnabled = isGuestAccessEnabled();\n const notLoggedIn = !isLoggedIn();\n return guestEnabled && notLoggedIn;\n};\n\n/**\n * Checks if the current user has admin privileges.\n * If no users are setup, then function will always return true\n * But if auth is configured, then will verify user is correctly\n * logged in and then check weather they are of type admin, and\n * return false if any conditions fail\n * @param {String[]} - Array of users\n * @returns {Boolean} - True if admin privileges\n */\nexport const isUserAdmin = () => {\n const users = getUsers();\n if (users.length === 0) return true; // Authentication not setup\n if (!isLoggedIn()) return false; // Auth setup, but not signed in as a valid user\n const currentUser = localStorage[localStorageKeys.USERNAME];\n let isAdmin = false;\n users.forEach((user) => {\n if (user.user === currentUser) {\n if (user.type === 'admin') isAdmin = true;\n }\n });\n return isAdmin;\n};\n\n/**\n * Determines which button should display, based on the user type\n * 0 = Auth not configured (don't show anything)\n * 1 = Auth configured, and user logged in (show logout button)\n * 2 = Auth configured, guest access enabled, not logged in (show login)\n * Note that if auth is enabled, but not guest access, and user not logged in,\n * then they will never be able to view the homepage, so no button needed\n */\nexport const getUserState = () => {\n const { notConfigured, loggedIn, guestAccess } = userStateEnum; // Numeric enum options\n if (!isAuthEnabled()) return notConfigured; // No auth enabled\n if (isLoggedIn()) return loggedIn; // User is logged in\n if (isGuestAccessEnabled()) return guestAccess; // Guest is viewing\n return notConfigured;\n};\n","/**\n * A helper function that filters all the sections based on current users permissions\n * Checks each sections displayData for hideForUsers, showForUsers and hideForGuests\n * Returns an array of sections that the current logged in user has permissions for\n */\n\n// Import helper functions from auth, to get current user, and check if guest\nimport { getCurrentUser, isLoggedInAsGuest } from '@/utils/Auth';\n\n/* Helper function, checks if a given username appears in a user array */\nconst determineVisibility = (visibilityList, cUsername) => {\n let isFound = false;\n visibilityList.forEach((userInList) => {\n if (userInList.toLowerCase() === cUsername) isFound = true;\n });\n return isFound;\n};\n\n/* Returns false if this section should not be rendered for the current user/ guest */\nconst isSectionVisibleToUser = (displayData, currentUser, isGuest) => {\n // Checks if user explicitly has access to a certain section\n const checkVisiblity = () => {\n if (!currentUser) return true;\n const hideFor = displayData.hideForUsers || [];\n const cUsername = currentUser.user.toLowerCase();\n return !determineVisibility(hideFor, cUsername);\n };\n // Checks if user is explicitly prevented from viewing a certain section\n const checkHiddenability = () => {\n if (!currentUser) return true;\n const cUsername = currentUser.user.toLowerCase();\n const showForUsers = displayData.showForUsers || [];\n if (showForUsers.length < 1) return true;\n return determineVisibility(showForUsers, cUsername);\n };\n // Checks if the current user is a guest, and if section allows for guests\n const checkIfHideForGuest = () => {\n const hideForGuest = displayData.hideForGuests;\n return !(hideForGuest && isGuest);\n };\n return checkVisiblity() && checkHiddenability() && checkIfHideForGuest();\n};\n\n/* Putting it all together, the function to export */\nconst checkSectionVisibility = (sections) => {\n const currentUser = getCurrentUser(); // Get current user object\n const isGuest = isLoggedInAsGuest(); // Check if current user is a guest\n return sections.filter((currentSection) => {\n const displayData = currentSection.displayData || {};\n return isSectionVisibleToUser(displayData, currentUser, isGuest);\n });\n};\n\nexport default checkSectionVisibility;\n","// Locales - Import translation files here!\nimport en from '@/assets/locales/en.json';\nimport de from '@/assets/locales/de.json';\nimport nl from '@/assets/locales/nl.json';\nimport pl from '@/assets/locales/pl.json';\nimport fr from '@/assets/locales/fr.json';\nimport sl from '@/assets/locales/sl.json';\nimport es from '@/assets/locales/es.json';\nimport it from '@/assets/locales/it.json';\nimport zhCN from '@/assets/locales/zh-CN.json';\nimport ar from '@/assets/locales/ar.json';\nimport hi from '@/assets/locales/hi.json';\nimport ja from '@/assets/locales/ja.json';\nimport pt from '@/assets/locales/pt.json';\nimport ru from '@/assets/locales/ru.json';\nimport nb from '@/assets/locales/nb.json';\nimport pirate from '@/assets/locales/zz-pirate.json';\n\n// Language data - Next register your language by adding it to this list\nexport const languages = [\n {\n name: 'English',\n code: 'en',\n locale: en,\n flag: '🇬🇧',\n },\n { // German\n name: 'Deutsch',\n code: 'de',\n locale: de,\n flag: '🇩🇪',\n },\n {\n name: 'Dutch',\n code: 'nl',\n locale: nl,\n flag: '🇳🇱',\n },\n {\n name: 'polski',\n code: 'pl',\n locale: pl,\n flag: '🇵🇱',\n },\n {\n name: 'Français',\n code: 'fr',\n locale: fr,\n flag: '🇲🇫',\n },\n {\n name: 'Slovenščina',\n code: 'sl',\n locale: sl,\n flag: '🇸🇮',\n },\n { // Spanish\n name: 'Español',\n code: 'es',\n locale: es,\n flag: '🇪🇸',\n },\n { // Italian\n name: 'Italiano',\n code: 'it',\n locale: it,\n flag: '🇮🇹',\n },\n { // Chinese\n name: '简体中文',\n code: 'cn',\n locale: zhCN,\n flag: '🇨🇳',\n },\n { // Arabic\n name: 'العربية',\n code: 'ar',\n locale: ar,\n flag: '🇦🇪',\n },\n { // Hindi\n name: 'नहीं',\n code: 'hi',\n locale: hi,\n flag: '🇮🇳',\n },\n { // Japanese\n name: '日本語',\n code: 'ja',\n locale: ja,\n flag: '🇯🇵',\n },\n { // Portuguese\n name: 'Português',\n code: 'pt',\n locale: pt,\n flag: '🇵🇹',\n },\n { // Russian\n name: 'Русский',\n code: 'ru',\n locale: ru,\n flag: '🇷🇺',\n },\n { // Norwegian\n name: 'Norsk',\n code: 'nb',\n locale: nb,\n flag: '🇳🇴',\n },\n { // Joke Language - Pirate\n name: 'Pirate',\n code: 'pirate',\n locale: pirate,\n flag: '🏴☠️',\n },\n];\n\n/**\n * Include the following info:\n * name - Human readable name for your language (e.g German)\n * code - ISO language code (e.g. de)\n * locale - The file that you imported above\n * flag - A nice emoji flag (optional, e.g. 🇩🇪)\n */\n\n// All done :)\n// You can also add your language to /README.md and credit yourself if you like\n\n// Prepare each language for export\nconst i18nMessages = {};\nlanguages.forEach((lang) => {\n i18nMessages[lang.code] = lang.locale;\n});\nexport const messages = i18nMessages;\n","import ConfigAccumulator from '@/utils/ConfigAccumalator';\nimport filterUserSections from '@/utils/CheckSectionVisibility';\nimport { languages } from '@/utils/languages';\nimport {\n visibleComponents,\n localStorageKeys,\n theme as defaultTheme,\n language as defaultLanguage,\n} from '@/utils/defaults';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport ConfigSchema from '@/utils/ConfigSchema.json';\n\n/**\n * Initiates the Accumulator class and generates a complete config object\n * Self-executing function, returns the full user config as a JSON object\n */\nexport const config = (() => {\n const Accumulator = new ConfigAccumulator();\n return {\n appConfig: Accumulator.appConfig(),\n pageInfo: Accumulator.pageInfo(),\n sections: filterUserSections(Accumulator.sections()),\n };\n})();\n\n/**\n * Generates an object containing booleans indicating which\n * components should be hidden. This enables the user to hide\n * parts of the page and disable functionality that they don't need/ want\n * All options fallback on the values defined in the defaults\n * @param {object} appConfig The full app config\n * @returns {object} result\n */\nexport const componentVisibility = (appConfig) => {\n // Get users choice from app config\n const usersChoice = appConfig.hideComponents || {};\n // Checks if value is defined, and is a boolean\n const isThere = (userValue) => typeof userValue === 'boolean';\n // For each option, return users choice (if specified), else use the default\n return {\n pageTitle: isThere(usersChoice.hideHeading)\n ? !usersChoice.hideHeading : visibleComponents.pageTitle,\n navigation: isThere(usersChoice.hideNav)\n ? !usersChoice.hideNav : visibleComponents.navigation,\n searchBar: isThere(usersChoice.hideSearch)\n ? !usersChoice.hideSearch : visibleComponents.searchBar,\n settings: isThere(usersChoice.hideSettings)\n ? !usersChoice.hideSettings : visibleComponents.settings,\n footer: isThere(usersChoice.hideFooter)\n ? !usersChoice.hideFooter : visibleComponents.footer,\n splashScreen: isThere(usersChoice.hideSplashScreen)\n ? !usersChoice.hideSplashScreen : visibleComponents.splashScreen,\n };\n};\n\n/**\n * Gets the users saved theme, first looks for local storage theme,\n * then looks at user's appConfig, and finally checks the defaults\n * @returns {string} Name of theme to apply\n */\nexport const getTheme = () => {\n const localTheme = localStorage[localStorageKeys.THEME];\n const appConfigTheme = config.appConfig.theme;\n return localTheme || appConfigTheme || defaultTheme;\n};\n\n/**\n * Gets any custom styles the user has applied, wither from local storage, or from the config\n * @returns {object} An array of objects, one for each theme, containing kvps for variables\n */\nexport const getCustomColors = () => {\n const localColors = JSON.parse(localStorage[localStorageKeys.CUSTOM_COLORS] || '{}');\n const configColors = config.appConfig.customColors || {};\n return Object.assign(configColors, localColors);\n};\n\n/**\n * Returns a list of items which the user has assigned a hotkey to\n * So that when the hotkey is pressed, the app/ service can be launched\n */\nexport const getCustomKeyShortcuts = () => {\n const results = [];\n const sections = config.sections || [];\n sections.forEach((section) => {\n const itemsWithHotKeys = section.items.filter(item => item.hotkey);\n results.push(itemsWithHotKeys.map(item => ({ hotkey: item.hotkey, url: item.url })));\n });\n return results.flat();\n};\n\n/**\n * Gets the users chosen language. Defaults to English.\n * @returns {object} Language, including code, name and flag\n */\nexport const getUsersLanguage = () => {\n const langCode = localStorage[localStorageKeys.LANGUAGE]\n || config.appConfig.language\n || defaultLanguage;\n const langObj = languages.find(lang => lang.code === langCode);\n return langObj;\n};\n\n/**\n * validator for item target attribute\n * Uses enum values from config schema, and shows warning if invalid\n * @param {String} target\n * @returns {Boolean} isValid\n */\nexport const targetValidator = (target) => {\n const acceptedTargets = ConfigSchema.properties.sections.items\n .properties.items.items.properties.target.enum;\n const isTargetValid = acceptedTargets.indexOf(target) !== -1;\n if (!isTargetValid) ErrorHandler(`Unknown target value: ${target}`);\n return isTargetValid;\n};\n","/* Dashy: Licensed under MIT, (C) Alicia Sykes 2021 <https://aliciasykes.com> */\n\n/* Tile filtering utility */\nimport ErrorHandler from '@/utils/ErrorHandler';\n\n/**\n * Extracts the site name from domain\n * @param {string} url The URL to process\n * @returns {string} The hostname from URL\n */\nconst getDomainFromUrl = (url) => {\n if (!url) return '';\n const urlPattern = /^(?:https?:\\/\\/)?(?:w{3}\\.)?([a-z\\d.-]+)\\.(?:[a-z.]{2,10})(?:[/\\w.-]*)*/;\n const domainPattern = url.match(urlPattern);\n return domainPattern ? domainPattern[1] : '';\n};\n\n/**\n * Compares search term to a given data attribute\n * Ignores case, special characters and order\n * @param {string or other} compareStr The value to compare to\n * @param {string} searchStr The users search term\n * @returns {boolean} true if a match, otherwise false\n */\nconst filterHelper = (compareStr, searchStr) => {\n if (!compareStr) return false;\n const process = (input) => input && input.toString().toLowerCase().replace(/[^\\w\\s]/gi, '');\n return process(compareStr).includes(process(searchStr));\n};\n\n/**\n * Filter tiles based on users search term, and returns a filtered list\n * Will match based on title, description, provider, hostname from url and tags\n * Ignores case, special characters and other irrelevant things\n * @param {array} allTiles An array of tiles\n * @param {string} searchTerm The users search term\n * @returns A filtered array of tiles\n */\nexport const searchTiles = (allTiles, searchTerm) => {\n if (!searchTerm) return allTiles; // If no search term, then return all\n if (!allTiles) return []; // If no data, then skip\n return allTiles.filter((tile) => {\n const {\n title, description, provider, url, tags,\n } = tile;\n return filterHelper(title, searchTerm)\n || filterHelper(provider, searchTerm)\n || filterHelper(description, searchTerm)\n || filterHelper(tags, searchTerm)\n || filterHelper(getDomainFromUrl(url), searchTerm);\n });\n};\n\n/* From a list of search bangs, return the URL associated with it */\nexport const getSearchEngineFromBang = (searchQuery, bangList) => {\n const bangNames = Object.keys(bangList);\n const foundBang = bangNames.find((bang) => searchQuery.includes(bang));\n return bangList[foundBang];\n};\n\n/* For a given search engine key, return the corresponding URL, or throw error */\nexport const findUrlForSearchEngine = (searchEngine, availableSearchEngines) => {\n // If missing search engine, report error return false\n if (!searchEngine) { ErrorHandler('No search engine specified'); return undefined; }\n // If search engine is already a URL, then return it\n if ((/(http|https):\\/\\/[^]*/).test(searchEngine)) return searchEngine;\n // If search engine was found successfully, return the URL\n if (availableSearchEngines[searchEngine]) return availableSearchEngines[searchEngine];\n // Otherwise, there's been an error, log it and return false\n ErrorHandler(`Specified Search Engine was not Found: '${searchEngine}'`);\n return undefined;\n};\n\n/* Removes all known bangs from a search query */\nexport const stripBangs = (searchQuery, bangList) => {\n const bangNames = Object.keys(bangList || {});\n let q = searchQuery;\n bangNames.forEach((bang) => { q = q.replace(bang, ''); });\n return q.trim();\n};\n","<template>\n <form @submit.prevent=\"searchSubmitted\" :class=\"minimalSearch ? 'minimal' : 'normal'\">\n <label for=\"filter-tiles\">{{ $t('search.search-label') }}</label>\n <div class=\"search-wrap\">\n <input\n id=\"filter-tiles\"\n v-model=\"input\"\n ref=\"filter\"\n :placeholder=\"$t('search.search-placeholder')\"\n v-on:input=\"userIsTypingSomething\"\n @keydown.esc=\"clearFilterInput\" />\n <p v-if=\"(!searchPrefs.disableWebSearch) && input.length > 0\" class=\"web-search-note\">\n {{ $t('search.enter-to-search-web') }}\n </p>\n </div>\n <i v-if=\"input.length > 0\"\n class=\"clear-search\"\n :title=\"$t('search.clear-search-tooltip')\"\n @click=\"clearFilterInput\">x</i>\n </form>\n</template>\n\n<script>\nimport router from '@/router';\nimport ArrowKeyNavigation from '@/utils/ArrowKeyNavigation';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport { getCustomKeyShortcuts } from '@/utils/ConfigHelpers';\nimport { getSearchEngineFromBang, findUrlForSearchEngine, stripBangs } from '@/utils/Search';\nimport {\n searchEngineUrls,\n defaultSearchEngine,\n defaultSearchOpeningMethod,\n searchBangs as defaultSearchBangs,\n} from '@/utils/defaults';\n\nexport default {\n name: 'FilterTile',\n props: {\n minimalSearch: Boolean, // If true, then keep it simple\n },\n data() {\n return {\n input: '', // Users current search term\n akn: new ArrowKeyNavigation(), // Class that manages arrow key naviagtion\n getCustomKeyShortcuts,\n };\n },\n computed: {\n active() {\n return !this.$store.state.modalOpen;\n },\n searchPrefs() {\n return this.$store.getters.webSearch || {};\n },\n },\n mounted() {\n window.addEventListener('keydown', this.handleKeyPress);\n },\n beforeDestroy() {\n window.removeEventListener('keydown', this.handleKeyPress);\n },\n methods: {\n /* Call correct function dependending on which key is pressed */\n handleKeyPress(event) {\n const currentElem = document.activeElement.id;\n const { key, keyCode } = event;\n const notAlreadySearching = currentElem !== 'filter-tiles';\n // If a modal is open, then do nothing\n if (!this.active) return;\n if (/^[/:!a-zA-Z]$/.test(key) && notAlreadySearching) {\n // Letter or bang key pressed - start searching\n if (this.$refs.filter) this.$refs.filter.focus();\n this.userIsTypingSomething();\n } else if (/^[0-9]$/.test(key)) {\n // Number key pressed, check if user has a custom binding\n this.handleHotKey(key);\n } else if (keyCode >= 37 && keyCode <= 40) {\n // Arrow key pressed - start navigation\n this.akn.arrowNavigation(keyCode);\n } else if (keyCode === 27) {\n // Esc key pressed - reset form\n this.clearFilterInput();\n }\n },\n /* Emmits users's search term up to parent */\n userIsTypingSomething() {\n this.$emit('user-is-searchin', this.input);\n },\n /* Resets everything to initial state, when user is finished */\n clearFilterInput() {\n this.input = ''; // Clear input model\n this.userIsTypingSomething(); // Emmit new empty value\n document.activeElement.blur(); // Remove focus\n this.akn.resetIndex(); // Reset current element index\n },\n /* If configured, launch specific app when hotkey pressed */\n handleHotKey(key) {\n const usersHotKeys = this.getCustomKeyShortcuts();\n usersHotKeys.forEach((hotkey) => {\n if (hotkey.hotkey === parseInt(key, 10)) {\n if (hotkey.url) window.open(hotkey.url, '_blank');\n }\n });\n },\n /* Launch search results, with users desired opening method */\n launchWebSearch(url, method) {\n switch (method) {\n case 'newtab':\n window.open(url, '_blank');\n break;\n case 'sametab':\n window.open(url, '_self');\n break;\n case 'workspace':\n router.push({ name: 'workspace', query: { url } });\n break;\n default:\n ErrorHandler(`Unknown opening method: ${method}`);\n window.open(url, '_blank');\n }\n },\n\n /* Launch web search, to correct search engine, passing in users query */\n searchSubmitted() {\n // Get search preferences from appConfig\n const { searchPrefs } = this;\n if (!searchPrefs.disableWebSearch) { // Only proceed if user hasn't disabled web search\n const bangList = { ...defaultSearchBangs, ...(searchPrefs.searchBangs || {}) };\n const openingMethod = searchPrefs.openingMethod || defaultSearchOpeningMethod;\n const searchBang = getSearchEngineFromBang(this.input, bangList);\n const searchEngine = searchPrefs.searchEngine || defaultSearchEngine;\n // Use either search bang, or preffered search engine\n const desiredSearchEngine = searchBang || searchEngine;\n const isCustomSearch = (searchPrefs.searchEngine === 'custom' && searchPrefs.customSearchEngine);\n let searchUrl = isCustomSearch\n ? searchPrefs.customSearchEngine\n : findUrlForSearchEngine(desiredSearchEngine, searchEngineUrls);\n if (searchUrl) { // Append search query to URL, and launch\n searchUrl += encodeURIComponent(stripBangs(this.input, bangList));\n this.launchWebSearch(searchUrl, openingMethod);\n this.clearFilterInput();\n }\n }\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\n@import '@/styles/media-queries.scss';\n\n form.normal {\n display: flex;\n align-items: center;\n border-radius: 0 0 var(--curve-factor-navbar) 0;\n padding: 0 0.2rem 0.2rem 0;\n background: var(--search-container-background);\n .search-wrap {\n display: flex;\n flex-direction: column;\n width: 100%;\n p.web-search-note {\n margin: 0 0.5rem;\n font-size: 0.8rem;\n color: var(--minimal-view-search-color);\n opacity: var(--dimming-factor);\n }\n }\n label {\n display: inline;\n color: var(--search-label-color);\n margin: 0.5rem;\n display: inline;\n }\n input {\n display: inline-block;\n width: 200px;\n height: 1rem;\n padding: 0.5rem;\n margin: 0.5rem;\n outline: none;\n border: none;\n border-radius: var(--curve-factor);\n background: var(--search-field-background);\n color: var(--settings-text-color);\n border: 1px solid var(--outline-color);\n &:focus {\n border-color: var(--settings-text-color);\n opacity: var(--dimming-factor);\n }\n }\n .clear-search {\n color: var(--settings-text-color);\n padding: 0 0.3rem 0.1rem 0.3rem;\n font-style: normal;\n font-size: 1rem;\n opacity: var(--dimming-factor);\n border-radius: 50px;\n cursor: pointer;\n right: 0.5rem;\n top: 1rem;\n border: 1px solid var(--settings-text-color);\n margin: 0.25rem;\n &:hover {\n opacity: 1;\n background: var(--background-darker);\n }\n }\n }\n\n @include tablet {\n form.normal {\n display: block;\n text-align: center;\n }\n }\n @include phone {\n form.nomral {\n flex: 1;\n border-radius: 0;\n text-align: center;\n padding: 0.25rem 0;\n display: block;\n }\n }\n\n form.minimal {\n display: flex;\n align-items: center;\n label { display: none; }\n .search-wrap {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n p.web-search-note {\n margin: 0;\n color: var(--minimal-view-search-color);\n opacity: var(--dimming-factor);\n }\n }\n input {\n display: inline-block;\n width: 80%;\n max-width: 400px;\n font-size: 1.2rem;\n padding: 0.5rem 1rem;\n margin: 1rem auto;\n outline: none;\n border: 1px solid var(--outline-color);\n border-radius: var(--curve-factor);\n background: var(--minimal-view-search-background);\n color: var(--minimal-view-search-color);\n &:focus {\n border-color: var(--minimal-view-search-color);\n opacity: var(--dimming-factor);\n }\n }\n .clear-search {\n color: var(--minimal-view-search-color);\n padding: 0.15rem 0.5rem 0.2rem 0.5rem;\n font-style: normal;\n font-size: 1rem;\n opacity: var(--dimming-factor);\n border-radius: 50px;\n cursor: pointer;\n right: 0.5rem;\n top: 1rem;\n border: 1px solid var(--minimal-view-search-color);\n margin: 0.5rem;\n &:hover {\n opacity: 1;\n color: var(--minimal-view-search-background);\n background: var(--minimal-view-search-color);\n }\n }\n }\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchBar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchBar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SearchBar.vue?vue&type=template&id=3e12dc6e&scoped=true&\"\nimport script from \"./SearchBar.vue?vue&type=script&lang=js&\"\nexport * from \"./SearchBar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SearchBar.vue?vue&type=style&index=0&id=3e12dc6e&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3e12dc6e\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(_vm.closeViewSwitcher),expression:\"closeViewSwitcher\"}],staticClass:\"config-options\"},[_c('span',{staticClass:\"config-label\"},[_vm._v(_vm._s(_vm.$t('settings.config-launcher-label')))]),_c('div',{staticClass:\"config-buttons\"},[_c('IconSpanner',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.config-launcher-tooltip'))),expression:\"tooltip($t('settings.config-launcher-tooltip'))\"}],attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.showEditor()}}}),_c('IconInteractiveEditor',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.enterEditModeTooltip)),expression:\"tooltip(enterEditModeTooltip)\"}],class:_vm.isEditMode ? 'disabled' : '',attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.startInteractiveEditor()}}}),_c('IconViewMode',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('alternate-views.alternate-view-heading'))),expression:\"tooltip($t('alternate-views.alternate-view-heading'))\"}],attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.openChangeViewMenu()}}})],1),_c('modal',{attrs:{\"name\":_vm.modalNames.CONF_EDITOR,\"resizable\":true,\"width\":\"60%\",\"height\":\"85%\",\"classes\":\"dashy-modal\"},on:{\"closed\":_vm.editorClosed}},[_c('ConfigContainer',{attrs:{\"config\":_vm.combineConfig()}})],1),_c('modal',{attrs:{\"name\":_vm.modalNames.LANG_SWITCHER,\"classes\":\"dashy-modal\",\"resizable\":true,\"width\":\"35%\",\"height\":\"60%\"}},[_c('LanguageSwitcher')],1),(_vm.viewSwitcherOpen)?_c('div',{staticClass:\"view-switcher\"},[_c('ul',[_c('li',[_c('router-link',{attrs:{\"to\":\"/home\"}},[_c('IconHome'),_c('span',[_vm._v(_vm._s(_vm.$t('alternate-views.default')))])],1)],1),_c('li',[_c('router-link',{attrs:{\"to\":\"/minimal\"}},[_c('IconMinimalView'),_c('span',[_vm._v(_vm._s(_vm.$t('alternate-views.minimal')))])],1)],1),_c('li',[_c('router-link',{attrs:{\"to\":\"/workspace\"}},[_c('IconWorkspaceView'),_c('span',[_vm._v(_vm._s(_vm.$t('alternate-views.workspace')))])],1)],1)])]):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Tabs',{ref:\"tabView\",attrs:{\"navAuto\":true,\"name\":\"Add Item\"}},[_c('TabItem',{staticClass:\"main-tab\",attrs:{\"name\":_vm.$t('config.main-tab')}},[_c('div',{staticClass:\"main-options-container\"},[_c('div',{staticClass:\"config-buttons\"},[_c('h2',[_vm._v(_vm._s(_vm.$t('config.heading')))]),_c('a',{staticClass:\"hyperlink-wrapper\",on:{\"click\":function($event){return _vm.openExportConfigModal()}}},[_c('button',{staticClass:\"config-button center\"},[_c('DownloadIcon',{staticClass:\"button-icon\"}),_vm._v(\" \"+_vm._s(_vm.$t('config.download-config-button'))+\" \")],1)]),_c('button',{staticClass:\"config-button center\",on:{\"click\":function () { return _vm.navigateToTab(1); }}},[_c('EditIcon',{staticClass:\"button-icon\"}),_vm._v(\" \"+_vm._s(_vm.$t('config.edit-config-button'))+\" \")],1),_c('button',{staticClass:\"config-button center\",on:{\"click\":function($event){return _vm.openLanguageSwitchModal()}}},[_c('LanguageIcon',{staticClass:\"button-icon\"}),_vm._v(\" \"+_vm._s(_vm.$t('config.change-language-button'))+\" \")],1),_c('button',{staticClass:\"config-button center\",on:{\"click\":function () { return _vm.navigateToTab(3); }}},[_c('CustomCssIcon',{staticClass:\"button-icon\"}),_vm._v(\" \"+_vm._s(_vm.$t('config.edit-css-button'))+\" \")],1),_c('button',{staticClass:\"config-button center\",on:{\"click\":function () { return _vm.navigateToTab(2); }}},[_c('CloudIcon',{staticClass:\"button-icon\"}),_vm._v(\" \"+_vm._s(_vm.backupId ? _vm.$t('config.edit-cloud-sync-button') : _vm.$t('config.cloud-sync-button'))+\" \")],1),_c('button',{staticClass:\"config-button center\",on:{\"click\":function($event){return _vm.openRebuildAppModal()}}},[_c('RebuildIcon',{staticClass:\"button-icon\"}),_vm._v(\" \"+_vm._s(_vm.$t('config.rebuild-app-button'))+\" \")],1),_c('button',{staticClass:\"config-button center\",on:{\"click\":function($event){return _vm.resetLocalSettings()}}},[_c('DeleteIcon',{staticClass:\"button-icon\"}),_vm._v(\" \"+_vm._s(_vm.$t('config.reset-settings-button'))+\" \")],1),_c('button',{staticClass:\"config-button center\",on:{\"click\":function($event){return _vm.openAboutModal()}}},[_c('IconAbout',{staticClass:\"button-icon\"}),_vm._v(\" \"+_vm._s(_vm.$t('config.app-info-button'))+\" \")],1),_c('p',{staticClass:\"small-screen-note\",staticStyle:{\"display\":\"none\"}},[_vm._v(\" You are using a very small screen, and some screens in this menu may not be optimal \")]),_c('p',{staticClass:\"language\"},[_vm._v(_vm._s(_vm.getLanguage()))]),_c('AppVersion')],1),_c('div',{staticClass:\"config-note\"},[_c('span',[_vm._v(_vm._s(_vm.$t('config.backup-note')))])])]),_c('RebuildApp')],1),_c('TabItem',{attrs:{\"name\":_vm.$t('config.edit-config-tab')}},[_c('JsonEditor')],1),_c('TabItem',{attrs:{\"name\":_vm.$t('cloud-sync.title')}},[_c('CloudBackupRestore')],1),_c('TabItem',{attrs:{\"name\":_vm.$t('config.custom-css-tab')}},[_c('CustomCssEditor')],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"json-editor-outer\"},[_c('v-jsoneditor',{attrs:{\"options\":_vm.options},model:{value:(_vm.jsonData),callback:function ($$v) {_vm.jsonData=$$v},expression:\"jsonData\"}}),_c('Radio',{staticClass:\"save-options\",attrs:{\"label\":_vm.$t('config-editor.save-location-label'),\"options\":_vm.saveOptions,\"initialOption\":_vm.initialSaveMode,\"disabled\":!_vm.allowWriteToDisk},model:{value:(_vm.saveMode),callback:function ($$v) {_vm.saveMode=$$v},expression:\"saveMode\"}}),_c('div',{class:(\"btn-container \" + (!_vm.isValid ? 'err' : ''))},[_c('Button',{attrs:{\"click\":_vm.save}},[_vm._v(\" \"+_vm._s(_vm.$t('config-editor.save-button'))+\" \")]),_c('Button',{attrs:{\"click\":_vm.startPreview}},[_vm._v(\" \"+_vm._s(_vm.$t('config-editor.preview-button'))+\" \")])],1),_c('p',{staticClass:\"errors\"},[_c('ul',[_vm._l((_vm.errorMessages),function(error,index){return _c('li',{key:index,class:(\"type-\" + (error.type))},[_vm._v(\" \"+_vm._s(error.msg)+\" \")])}),(_vm.errorMessages.length < 1)?_c('li',{staticClass:\"type-valid\"},[_vm._v(\" \"+_vm._s(_vm.$t('config-editor.valid-label'))+\" \")]):_vm._e()],2)]),(_vm.saveSuccess !== undefined)?_c('p',{class:(\"response-output status-\" + (_vm.saveSuccess ? 'success' : 'fail'))},[_vm._v(\" \"+_vm._s(_vm.saveSuccess ? _vm.$t('config-editor.status-success-msg') : _vm.$t('config-editor.status-fail-msg'))+\" \")]):_vm._e(),(!_vm.allowWriteToDisk)?_c('p',{staticClass:\"no-permission-note\"},[_vm._v(\" \"+_vm._s(_vm.$t('config-editor.not-admin-note'))+\" \")]):_vm._e(),_c('p',{staticClass:\"response-output\"},[_vm._v(_vm._s(_vm.responseText))]),(_vm.saveSuccess)?_c('p',{staticClass:\"response-output\"},[_vm._v(\" \"+_vm._s(_vm.$t('config-editor.success-note-l1'))+\" \"+_vm._s(_vm.$t('config-editor.success-note-l2'))+\" \")]):_vm._e(),_c('p',{staticClass:\"note\"},[_vm._v(_vm._s(_vm.$t('config.backup-note')))])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.hoverText),expression:\"hoverText\"}],class:_vm.disallow ? 'disallowed': '',attrs:{\"type\":_vm.type || 'button',\"disabled\":_vm.disabled,\"title\":_vm.tooltip},on:{\"click\":function($event){_vm.click ? _vm.click() : function () { return null; }}}},[_vm._t(\"default\"),_vm._t(\"text\"),_vm._t(\"icon\")],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <button\n @click=\"click ? click() : () => null\"\n :class=\"disallow ? 'disallowed': ''\"\n :type=\"type || 'button'\"\n :disabled=\"disabled\"\n v-tooltip=\"hoverText\"\n :title=\"tooltip\"\n >\n <slot></slot>\n <slot name=\"text\"></slot>\n <slot name=\"icon\"></slot>\n </button>\n</template>\n\n<script>\n\nexport default {\n name: 'Button',\n props: {\n text: String, // The text to be displayed in the button\n click: Function, // Function to call when clicked\n disabled: Boolean, // If true, button cannot be clicked\n disallow: Boolean, // Show not-allowed cursor when true\n type: String, // The html button type attribute\n tooltip: String, // Text to be displayed on hover\n },\n computed: {\n /* If tooltip prop specified, then return config for v-tooltip */\n hoverText() {\n const content = this.tooltip;\n const trigger = 'hover focus';\n const delay = { show: 350, hide: 100 };\n return (content) ? { content, trigger, delay } : undefined;\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\n/* Layout settings */\nbutton {\n display: flex;\n justify-content: center;\n flex-direction: row-reverse;\n align-items: center;\n padding: 0.5rem 0.75rem;\n margin: 0.5rem auto;\n font-size: 1.2rem;\n min-width: 10rem;\n cursor: pointer;\n svg {\n width: 1.2rem;\n margin: 0 0.5rem;\n path, g {\n fill: currentColor;\n }\n }\n &.disallowed {\n cursor: not-allowed !important;\n }\n}\n\n/* Default visual settings, can be overridden when needed */\nbutton {\n color: var(--primary);\n background: var(--background);\n border: 1px solid var(--primary);\n border-radius: var(--curve-factor);\n &:hover:not(:disabled) {\n color: var(--background);\n background: var(--primary);\n border-color: var(--background);\n }\n &:disabled {\n cursor: progress;\n opacity: var(--dimming-factor);\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Button.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Button.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Button.vue?vue&type=template&id=57605993&scoped=true&\"\nimport script from \"./Button.vue?vue&type=script&lang=js&\"\nexport * from \"./Button.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Button.vue?vue&type=style&index=0&id=57605993&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"57605993\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"radio-container\"},[(_vm.label)?_c('label',{staticClass:\"radio-label\"},[_vm._v(_vm._s(_vm.label))]):_vm._e(),_c('div',{staticClass:\"radio-wrapper\"},_vm._l((_vm.options),function(radio){return _c('div',{key:radio.value,class:(\"radio-option \" + (_vm.disabled ? 'wrap-disabled' : ''))},[_c('label',{staticClass:\"option-label\",attrs:{\"for\":(\"id-\" + (radio.value))}},[_vm._v(_vm._s(radio.label))]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selectedRadio),expression:\"selectedRadio\"}],staticClass:\"radio-input\",attrs:{\"type\":\"radio\",\"id\":(\"id-\" + (radio.value)),\"name\":_vm.makeGroupName,\"disabled\":_vm.disabled || radio.disabled},domProps:{\"value\":radio.value,\"checked\":_vm._q(_vm.selectedRadio,radio.value)},on:{\"input\":function($event){return _vm.updateValue($event.target.value)},\"change\":function($event){_vm.selectedRadio=radio.value}}})])}),0),(_vm.description)?_c('p',{staticClass:\"radio-description\"},[_vm._v(_vm._s(_vm.description))]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"radio-container\">\n <label v-if=\"label\" class=\"radio-label\">{{ label }}</label>\n <div class=\"radio-wrapper\">\n <div v-for=\"radio in options\" :key=\"radio.value\"\n :class=\"`radio-option ${disabled ? 'wrap-disabled' : ''}`\">\n <label :for=\"`id-${radio.value}`\" class=\"option-label\">{{ radio.label }}</label>\n <input type=\"radio\" class=\"radio-input\"\n :id=\" `id-${radio.value}`\"\n :name=\"makeGroupName\"\n :value=\"radio.value\"\n :disabled=\"disabled || radio.disabled\"\n v-model=\"selectedRadio\"\n v-on:input=\"updateValue($event.target.value)\"\n />\n </div>\n </div>\n <p v-if=\"description\" class=\"radio-description\">{{ description }}</p>\n </div>\n</template>\n\n<script>\n\nexport default {\n name: 'Radio',\n components: {},\n props: {\n options: Array, // Array of objects for available options\n initialOption: String, // Optional default option\n label: String, // Form label for element\n description: String, // Optional description text\n disabled: Boolean, // Disable all radio buttons\n },\n data() {\n return {\n selectedRadio: '', // The currently radio val\n };\n },\n created() {\n if (this.initialOption) {\n this.updateValue(this.initialOption);\n }\n },\n computed: {\n makeGroupName() {\n return this.label.toLowerCase().replace(/[^a-z]+/, '');\n },\n },\n methods: {\n updateValue(value) {\n this.$emit('input', value);\n this.selectedRadio = value;\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\ndiv.radio-container {\n margin: 0.25rem auto;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n label.radio-label,\n .radio-wrapper,\n p.radio-description {\n margin: 0.25rem;\n flex-basis: 8rem;\n flex-grow: 1;\n }\n label.radio-label {\n text-transform: capitalize;\n }\n p.radio-description {\n flex-grow: 3;\n opacity: var(--dimming-factor);\n }\n .radio-wrapper {\n display: flex;\n flex-grow: 2;\n margin: 0.5rem auto;\n font-size: 1.2rem;\n color: var(--primary);\n background: var(--background);;\n border-radius: var(--curve-factor);\n min-width: 8rem;\n .radio-option {\n margin: 0.2rem;\n padding: 0.2rem;\n cursor: pointer;\n border: 1px solid transparent;\n border-radius: var(--curve-factor);\n &:hover:not(.wrap-disabled) {\n border: 1px solid var(--primary);\n }\n &:disabled {\n opacity: var(--dimming-factor);\n }\n label.option-label, input.radio-input {\n cursor: pointer;\n text-transform: capitalize;\n margin: 0.2rem;\n }\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Radio.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Radio.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Radio.vue?vue&type=template&id=0ff870ef&scoped=true&\"\nimport script from \"./Radio.vue?vue&type=script&lang=js&\"\nexport * from \"./Radio.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Radio.vue?vue&type=style&index=0&id=0ff870ef&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0ff870ef\",\n null\n \n)\n\nexport default component.exports","<template>\n <div class=\"json-editor-outer\">\n <!-- Main JSON editor -->\n <v-jsoneditor v-model=\"jsonData\" :options=\"options\" />\n <!-- Options raido, and save button -->\n <Radio class=\"save-options\"\n v-model=\"saveMode\"\n :label=\"$t('config-editor.save-location-label')\"\n :options=\"saveOptions\"\n :initialOption=\"initialSaveMode\"\n :disabled=\"!allowWriteToDisk\"\n />\n <!-- Save Buttons -->\n <div :class=\"`btn-container ${!isValid ? 'err' : ''}`\">\n <Button :click=\"save\">\n {{ $t('config-editor.save-button') }}\n </Button>\n <Button :click=\"startPreview\">\n {{ $t('config-editor.preview-button') }}\n </Button>\n </div>\n <!-- List validation warnings -->\n <p class=\"errors\">\n <ul>\n <li v-for=\"(error, index) in errorMessages\" :key=\"index\" :class=\"`type-${error.type}`\">\n {{error.msg}}\n </li>\n <li v-if=\"errorMessages.length < 1\" class=\"type-valid\">\n {{ $t('config-editor.valid-label') }}\n </li>\n </ul>\n </p>\n <!-- Information notes -->\n <p v-if=\"saveSuccess !== undefined\"\n :class=\"`response-output status-${saveSuccess ? 'success' : 'fail'}`\">\n {{saveSuccess\n ? $t('config-editor.status-success-msg') : $t('config-editor.status-fail-msg') }}\n </p>\n <p v-if=\"!allowWriteToDisk\" class=\"no-permission-note\">\n {{ $t('config-editor.not-admin-note') }}\n </p>\n <p class=\"response-output\">{{ responseText }}</p>\n <p v-if=\"saveSuccess\" class=\"response-output\">\n {{ $t('config-editor.success-note-l1') }}\n {{ $t('config-editor.success-note-l2') }}\n </p>\n <p class=\"note\">{{ $t('config.backup-note') }}</p>\n </div>\n</template>\n\n<script>\n\nimport axios from 'axios';\nimport ProgressBar from 'rsup-progress';\nimport VJsoneditor from 'v-jsoneditor';\nimport jsYaml from 'js-yaml';\nimport ErrorHandler, { InfoHandler, InfoKeys } from '@/utils/ErrorHandler';\nimport configSchema from '@/utils/ConfigSchema.json';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { localStorageKeys, serviceEndpoints, modalNames } from '@/utils/defaults';\nimport { isUserAdmin } from '@/utils/Auth';\nimport Button from '@/components/FormElements/Button';\nimport Radio from '@/components/FormElements/Radio';\n\nexport default {\n name: 'JsonEditor',\n components: {\n VJsoneditor,\n Button,\n Radio,\n },\n data() {\n return {\n jsonData: {},\n errorMessages: [],\n saveMode: '',\n options: {\n schema: configSchema,\n mode: 'tree',\n modes: ['tree', 'code', 'preview'],\n name: 'config',\n onValidationError: this.validationErrors,\n },\n responseText: '',\n saveSuccess: undefined,\n progress: new ProgressBar({ color: 'var(--progress-bar)' }),\n saveOptions: [\n { label: this.$t('config-editor.location-disk-label'), value: 'file' },\n { label: this.$t('config-editor.location-local-label'), value: 'local' },\n ],\n };\n },\n computed: {\n config() {\n return this.$store.state.config;\n },\n isValid() {\n return this.errorMessages.length < 1;\n },\n allowWriteToDisk() {\n const { appConfig } = this.config;\n return appConfig.allowConfigEdit !== false && isUserAdmin();\n },\n initialSaveMode() {\n return this.allowWriteToDisk ? 'file' : 'local';\n },\n },\n mounted() {\n this.jsonData = this.config;\n if (!this.allowWriteToDisk) this.saveMode = 'local';\n },\n methods: {\n /* Calls appropriate save method, based on save-type radio selected */\n save() {\n if (this.saveMode === 'local' || !this.allowWriteToDisk) {\n this.saveConfigLocally();\n } else if (this.saveMode === 'file') {\n this.writeConfigToDisk();\n } else {\n this.$toasted.show(this.$t('config-editor.error-msg-save-mode'));\n }\n },\n /* Applies changes to the local state, begins edit mode and closes modal */\n startPreview() {\n InfoHandler('Applying changes to local state...', InfoKeys.RAW_EDITOR);\n const data = this.jsonData;\n this.$store.commit(StoreKeys.SET_APP_CONFIG, data.appConfig);\n this.$store.commit(StoreKeys.SET_PAGE_INFO, data.pageInfo);\n this.$store.commit(StoreKeys.SET_SECTIONS, data.sections);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n this.$store.commit(StoreKeys.SET_EDIT_MODE, true);\n this.$modal.hide(modalNames.CONF_EDITOR);\n },\n /* Converts config to YAML, and writes it to disk */\n writeConfigToDisk() {\n // 1. Convert JSON into YAML\n const yaml = jsYaml.dump(this.config);\n // 2. Prepare the request\n const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin;\n const endpoint = `${baseUrl}${serviceEndpoints.save}`;\n const headers = { 'Content-Type': 'text/plain' };\n const body = { config: yaml, timestamp: new Date() };\n const request = axios.post(endpoint, body, headers);\n // 3. Make the request, and handle response\n this.progress.start();\n request.then((response) => {\n this.saveSuccess = response.data.success || false;\n this.responseText = response.data.message;\n if (this.saveSuccess) {\n this.carefullyClearLocalStorage();\n this.showToast(this.$t('config-editor.success-msg-disk'), true);\n } else {\n this.showToast(this.$t('config-editor.error-msg-cannot-save'), false);\n }\n InfoHandler('Config has been written to disk succesfully', InfoKeys.RAW_EDITOR);\n this.$store.commit(StoreKeys.SET_CONFIG, this.jsonData);\n this.progress.end();\n })\n .catch((error) => {\n this.saveSuccess = false;\n this.responseText = error;\n this.showToast(error, false);\n ErrorHandler(`Failed to save config. ${error}`);\n this.progress.end();\n });\n },\n /* Saves config to local browser storage */\n saveConfigLocally() {\n const data = this.jsonData;\n if (data.sections) {\n localStorage.setItem(localStorageKeys.CONF_SECTIONS, JSON.stringify(data.sections));\n }\n if (data.pageInfo) {\n localStorage.setItem(localStorageKeys.PAGE_INFO, JSON.stringify(data.pageInfo));\n }\n if (data.appConfig) {\n data.appConfig.auth = this.config.appConfig.auth || {};\n localStorage.setItem(localStorageKeys.APP_CONFIG, JSON.stringify(data.appConfig));\n }\n if (data.appConfig.theme) {\n localStorage.setItem(localStorageKeys.THEME, data.appConfig.theme);\n }\n InfoHandler('Config has succesfully been saved in browser storage', InfoKeys.RAW_EDITOR);\n this.showToast(this.$t('config-editor.success-msg-local'), true);\n },\n /* Clears config from browser storage, only removing relevant items */\n carefullyClearLocalStorage() {\n localStorage.removeItem(localStorageKeys.PAGE_INFO);\n localStorage.removeItem(localStorageKeys.APP_CONFIG);\n localStorage.removeItem(localStorageKeys.CONF_SECTIONS);\n },\n /* Convert error messages into readable format for UI */\n validationErrors(errors) {\n const errorMessages = [];\n errors.forEach((error) => {\n switch (error.type) {\n case 'validation':\n errorMessages.push({\n type: 'validation',\n msg: `${this.$t('config-editor.warning-msg-validation')}: `\n + `${error.error.keyword} ${error.error.message}`,\n });\n break;\n case 'error':\n errorMessages.push({\n type: 'parse',\n msg: error.message,\n });\n break;\n default:\n errorMessages.push({\n type: 'editor',\n msg: this.$t('config-editor.error-msg-bad-json'),\n });\n break;\n }\n });\n this.errorMessages = errorMessages;\n },\n /* Shows toast message */\n showToast(message, success) {\n this.$toasted.show(message, { className: `toast-${success ? 'success' : 'error'}` });\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n@import '@/styles/media-queries.scss';\n\n.json-editor-outer {\n text-align: center;\n}\np.note {\n font-size: 0.8rem;\n color: var(--medium-grey);\n margin: 0.2rem;\n}\np.errors {\n text-align: left;\n margin: 0.5rem auto;\n width: 95%;\n ul {\n list-style: none;\n padding: 0;\n margin: 0;\n li {\n &.type-validation {\n color: var(--warning);\n &::before { content: \"⚠️\"; }\n }\n &.type-parse {\n color: var(--danger);\n &::before { content: \"❌\"; }\n }\n &.type-valid {\n color: var(--success);\n &::before { content: \"✅\"; }\n }\n }\n }\n}\np.response-output {\n font-size: 0.8rem;\n text-align: left;\n margin: 0.5rem auto;\n width: 95%;\n color: var(--config-settings-color);\n &.status-success {\n font-weight: bold;\n color: var(--success);\n }\n &.status-fail {\n font-weight: bold;\n color: var(--danger);\n }\n}\n\np.no-permission-note {\n color: var(--config-settings-color);\n}\n\n.btn-container {\n display: flex;\n align-items: center;\n justify-content: center;\n button {\n padding: 0.5rem 1rem;\n margin: 0.25rem;\n font-size: 1.2rem;\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n border: 1px solid var(--config-settings-color);\n border-radius: var(--curve-factor);\n &:hover {\n background: var(--config-settings-color);\n color: var(--config-settings-background);\n border-color: var(--config-settings-background);\n }\n }\n &.err button {\n opacity: 0.8;\n cursor: default;\n &:hover {\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n border-color: var(--danger);\n }\n }\n}\n\ndiv.save-options.radio-container {\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0;\n padding: 0;\n border-top: 2px solid var(--config-settings-background);\n background: var(--code-editor-background);\n label.radio-label {\n font-size: 1rem;\n flex-grow: revert;\n flex-basis: revert;\n color: var(--code-editor-color);\n padding-left: 1rem;\n }\n .radio-wrapper {\n margin: 0;\n font-size: 1rem;\n justify-content: space-around;\n background: var(--code-editor-background);\n color: var(--code-editor-color);\n .radio-option:hover:not(.wrap-disabled) {\n border: 1px solid var(--code-editor-color);\n }\n }\n}\n\n.jsoneditor-container.min-box {\n height: 58vh;\n}\n\n.jsoneditor, .jsoneditor-menu {\n border-color: var(--primary);\n}\n.jsoneditor {\n border-bottom: none;\n}\n\n.jsoneditor-menu, .pico-modal-header {\n background: var(--config-settings-background) !important;\n color: var(--config-settings-color) !important;\n}\n.jsoneditor-contextmenu .jsoneditor-menu li button {\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n &.jsoneditor-selected, &.jsoneditor-selected:focus, &.jsoneditor-selected:hover {\n background: var(--config-settings-color);\n color: var(--config-settings-background);\n }\n}\ndiv.jsoneditor-search div.jsoneditor-frame {\n border-radius: var(--curve-factor);\n}\n.jsoneditor-poweredBy {\n display: none;\n}\n.jsoneditor-tree, pre.jsoneditor-preview {\n background: var(--code-editor-background);\n text-align: left;\n}\n\n.jsoneditor-jmespath-label {\n color: var(--config-settings-color) !important;\n}\n.jsoneditor-jmespath-block.jsoneditor-modal-actions input {\n background: var(--config-settings-color);\n color: var(--config-settings-background);\n border: 1px solid var(--config-settings-background);\n border-radius: var(--curve-factor);\n &:hover {\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n border-color: var(--config-settings-color);\n }\n}\ntextarea.jsoneditor-transform-preview, div.jsoneditor-jmespath-block textarea#query {\n border: 1px solid var(--config-settings-color);\n border-radius: var(--curve-factor);\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JsonEditor.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JsonEditor.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./JsonEditor.vue?vue&type=template&id=ed982e82&\"\nimport script from \"./JsonEditor.vue?vue&type=script&lang=js&\"\nexport * from \"./JsonEditor.vue?vue&type=script&lang=js&\"\nimport style0 from \"./JsonEditor.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"css-editor-outer\"},[_c('div',{staticClass:\"style-section css-wrapper\"},[_c('h3',[_vm._v(\"Custom CSS\")]),_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.customCss),expression:\"customCss\"}],staticClass:\"css-editor\",domProps:{\"value\":(_vm.customCss)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.customCss=$event.target.value}}}),_vm._v(\" \"),_c('Button',{staticClass:\"save-button\",attrs:{\"click\":_vm.save}},[_vm._v(_vm._s(_vm.$t('config.css-save-btn')))]),_c('p',{staticClass:\"quick-note\"},[_c('b',[_vm._v(_vm._s(_vm.$t('config.css-note-label'))+\":\")]),_vm._v(\" \"+_vm._s(_vm.$t('config.css-note-l1'))+\" \"+_vm._s(_vm.$t('config.css-note-l2'))+\" \"+_vm._s(_vm.$t('config.css-note-l3'))+\" \")])],1),_c('div',{staticClass:\"style-section base-theme-wrapper\"},[_c('h3',[_vm._v(\"Base Theme\")]),_c('ThemeSelector',{attrs:{\"hidePallete\":true}})],1),_c('div',{staticClass:\"style-section\"},[_c('CustomThemeMaker',{staticClass:\"color-config\",attrs:{\"themeToEdit\":_vm.currentTheme}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:(\"theme-configurator-wrapper \" + (_vm.showingAllVars ? 'showing-all' : ''))},[_c('h3',{staticClass:\"configurator-title\"},[_vm._v(_vm._s(_vm.$t('theme-maker.title')))]),_c('div',{staticClass:\"color-row-container\"},_vm._l((Object.keys(_vm.customColors)),function(colorName){return _c('div',{key:colorName,staticClass:\"color-row\"},[_c('label',{staticClass:\"color-name\",attrs:{\"for\":(\"color-input-\" + colorName)}},[_vm._v(\" \"+_vm._s(colorName.replaceAll('-', ' '))+\" \")]),(_vm.isColor(colorName, _vm.customColors[colorName]))?_c('v-swatches',{attrs:{\"show-fallback\":\"\",\"fallback-input-type\":\"color\",\"popover-x\":\"left\",\"swatches\":_vm.swatches},on:{\"input\":function($event){return _vm.setVariable(colorName, _vm.customColors[colorName])}},model:{value:(_vm.customColors[colorName]),callback:function ($$v) {_vm.$set(_vm.customColors, colorName, $$v)},expression:\"customColors[colorName]\"}},[_c('input',{staticClass:\"swatch-input form__input__element\",style:(_vm.makeSwatchStyles(colorName)),attrs:{\"slot\":\"trigger\",\"id\":(\"color-input-\" + colorName),\"readonly\":\"\"},domProps:{\"value\":_vm.customColors[colorName]},slot:\"trigger\"})]):_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.customColors[colorName]),expression:\"customColors[colorName]\"}],class:(\"misc-input \" + (_vm.isTextual(colorName, _vm.customColors[colorName]) ? 'long-input' : '')),attrs:{\"id\":(\"color-input-\" + colorName)},domProps:{\"value\":(_vm.customColors[colorName])},on:{\"input\":[function($event){if($event.target.composing){ return; }_vm.$set(_vm.customColors, colorName, $event.target.value)},function($event){return _vm.setVariable(colorName, _vm.customColors[colorName])}]}})],1)}),0),_c('p',{staticClass:\"action-text-btn show-all-vars-btn\",on:{\"click\":_vm.showFontVariables}},[_vm._v(\" \"+_vm._s(_vm.$t('theme-maker.change-fonts-button'))+\" \")]),_c('p',{staticClass:\"action-text-btn show-all-vars-btn\",on:{\"click\":_vm.findAllVariableNames}},[_vm._v(\" \"+_vm._s(_vm.$t('theme-maker.show-all-button'))+\" \")]),_c('p',{staticClass:\"action-text-btn\",on:{\"click\":_vm.exportToClipboard}},[_vm._v(\" \"+_vm._s(_vm.$t('theme-maker.export-button'))+\" \")]),_c('p',{staticClass:\"action-text-btn\",on:{\"click\":_vm.resetAndSave}},[_vm._v(\" \"+_vm._s(_vm.$t('theme-maker.reset-button'))+\" '\"+_vm._s(_vm.themeToEdit)+\"' \")]),_c('div',{staticClass:\"action-buttons\"},[_c('Button',{attrs:{\"click\":_vm.saveChanges}},[_c('SaveIcon'),_vm._v(\" \"+_vm._s(_vm.$t('theme-maker.save-button'))+\" \")],1),_c('Button',{attrs:{\"click\":_vm.resetUnsavedColors}},[_c('CancelIcon'),_vm._v(\" \"+_vm._s(_vm.$t('theme-maker.cancel-button'))+\" \")],1)],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div :class=\"`theme-configurator-wrapper ${showingAllVars ? 'showing-all' : ''}`\">\n <h3 class=\"configurator-title\">{{ $t('theme-maker.title') }}</h3>\n <div class=\"color-row-container\">\n <!-- Show color swatch input for each color -->\n <div class=\"color-row\" v-for=\"colorName in Object.keys(customColors)\" :key=\"colorName\">\n <label :for=\"`color-input-${colorName}`\" class=\"color-name\">\n {{colorName.replaceAll('-', ' ')}}\n </label>\n <v-swatches\n v-if=\"isColor(colorName, customColors[colorName])\"\n v-model=\"customColors[colorName]\"\n show-fallback\n fallback-input-type=\"color\"\n popover-x=\"left\"\n :swatches=\"swatches\"\n @input=\"setVariable(colorName, customColors[colorName])\"\n >\n <input\n :id=\"`color-input-${colorName}`\"\n slot=\"trigger\"\n :value=\"customColors[colorName]\"\n class=\"swatch-input form__input__element\"\n readonly\n :style=\"makeSwatchStyles(colorName)\"\n />\n </v-swatches>\n <input v-else\n :id=\"`color-input-${colorName}`\"\n v-model=\"customColors[colorName]\"\n :class=\"`misc-input ${isTextual(colorName, customColors[colorName]) ? 'long-input' : ''}`\"\n @input=\"setVariable(colorName, customColors[colorName])\"\n />\n </div> <!-- End of color list -->\n </div>\n <!-- More options: Export, Reset, Show all -->\n <p @click=\"showFontVariables\" class=\"action-text-btn show-all-vars-btn\">\n {{ $t('theme-maker.change-fonts-button') }}\n </p>\n <p @click=\"findAllVariableNames\" class=\"action-text-btn show-all-vars-btn\">\n {{ $t('theme-maker.show-all-button') }}\n </p>\n <p @click=\"exportToClipboard\" class=\"action-text-btn\">\n {{ $t('theme-maker.export-button') }}\n </p>\n <p @click=\"resetAndSave\" class=\"action-text-btn\">\n {{ $t('theme-maker.reset-button') }} '{{ themeToEdit }}'\n </p>\n <!-- Save and cancel buttons -->\n <div class=\"action-buttons\">\n <Button :click=\"saveChanges\">\n <SaveIcon /> {{ $t('theme-maker.save-button') }}\n </Button>\n <Button :click=\"resetUnsavedColors\">\n <CancelIcon /> {{ $t('theme-maker.cancel-button') }}\n </Button>\n </div>\n </div>\n</template>\n\n<script>\nimport VSwatches from 'vue-swatches';\nimport 'vue-swatches/dist/vue-swatches.css';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { localStorageKeys, mainCssVars, swatches } from '@/utils/defaults';\nimport Button from '@/components/FormElements/Button';\nimport SaveIcon from '@/assets/interface-icons/save-config.svg';\nimport CancelIcon from '@/assets/interface-icons/config-cancel.svg';\n\nexport default {\n name: 'ThemeMaker',\n components: {\n VSwatches,\n Button,\n SaveIcon,\n CancelIcon,\n },\n data() {\n return {\n customColors: this.makeInitialData(mainCssVars),\n showingAllVars: false,\n swatches,\n };\n },\n props: {\n themeToEdit: String,\n },\n methods: {\n /* Finds the current dominent value for a given CSS variable */\n getCssVariableValue(cssVar) {\n return getComputedStyle(document.documentElement).getPropertyValue(cssVar).trim() || 'inherit';\n },\n /* Sets the value to a given variable in the DOM */\n setVariable(variable, value) {\n document.documentElement.style.setProperty(`--${variable}`, value);\n },\n /* Updates browser storage, and srore with new color settings, and shows success msg */\n saveChanges() {\n const priorSettings = JSON.parse(localStorage[localStorageKeys.CUSTOM_COLORS] || '{}');\n priorSettings[this.themeToEdit] = this.customColors;\n localStorage.setItem(localStorageKeys.CUSTOM_COLORS, JSON.stringify(priorSettings));\n this.$store.commit(StoreKeys.SET_CUSTOM_COLORS, priorSettings);\n this.$toasted.show(this.$t('theme-maker.saved-toast', { theme: this.themeToEdit }));\n this.$emit('closeThemeConfigurator');\n },\n /* Itterates over available variables, removing them from the DOM */\n resetUnsavedColors() {\n const variables = Object.keys(this.customColors);\n variables.forEach((variable) => {\n document.documentElement.style.removeProperty(`--${variable}`);\n });\n this.customColors = this.makeInitialData(mainCssVars);\n this.$emit('closeThemeConfigurator');\n },\n /* Resets styles, and removes data for current theme from local storage */\n resetAndSave() {\n const priorSettings = JSON.parse(localStorage[localStorageKeys.CUSTOM_COLORS] || '{}');\n delete priorSettings[this.themeToEdit];\n localStorage.setItem(localStorageKeys.CUSTOM_COLORS, JSON.stringify(priorSettings));\n this.resetUnsavedColors();\n this.$toasted.show(this.$t('theme-maker.reset-toast', { theme: this.themeToEdit }));\n },\n /* Generates CSS for the currently applied variables, and copys to users clipboard */\n exportToClipboard() {\n const themeName = this.themeToEdit.replace(/^\\w/, c => c.toUpperCase());\n let clipboardText = `// Custom Colors for ${themeName}\\n`;\n Object.keys(this.customColors).forEach((customVar) => {\n clipboardText += (`--${customVar}: ${this.customColors[customVar]};\\n`);\n });\n navigator.clipboard.writeText(clipboardText);\n this.$toasted.show(this.$t('theme-maker.copied-toast', { theme: themeName }));\n },\n /* Returns a JSON object, with the variable name as key, and color as value */\n makeInitialData(variableArray) {\n const data = {};\n const hasDash = (colorVar) => (/^--/.exec(colorVar));\n const addDash = (colorVar) => (hasDash(colorVar) ? colorVar : `--${colorVar}`);\n const removeDash = (colorVar) => (hasDash(colorVar) ? colorVar.replace('--', '') : colorVar);\n variableArray.forEach((colorName) => {\n data[removeDash(colorName)] = this.getCssVariableValue(addDash(colorName));\n });\n return data;\n },\n /* Adds font variables to list */\n showFontVariables() {\n const currentVariables = this.customColors;\n const fonts = ['font-headings', 'font-body', 'font-monospace'];\n const fontVariables = this.makeInitialData(fonts);\n this.customColors = { ...currentVariables, ...fontVariables };\n },\n /* Find all available CSS variables for the current applied theme */\n findAllVariableNames() {\n const availableVariables = Array.from(document.styleSheets)\n .filter(sheet => sheet.href === null || sheet.href.startsWith(window.location.origin))\n .reduce(\n ((acc, sheet) => ([\n ...acc,\n ...Array.from(sheet.cssRules).reduce(\n (def, rule) => (rule.selectorText === ':root' || rule.selectorText === 'html'\n ? [...def, ...Array.from(rule.style).filter(name => name.startsWith('--'))] : def),\n [],\n ),\n ])),\n [],\n );\n this.customColors = this.makeInitialData(availableVariables);\n this.showingAllVars = true;\n },\n /* Returns a complmenting text color for the palete input foreground */\n /* White if the color is dark, otherwise black */\n getForegroundColor(colorHex) {\n /* Converts a 3-digit hex code to a 6-digit hex code (e.g. #f01 --> #ff0011) */\n const threeToSix = (hex) => {\n let digit = hex;\n digit = digit.split('').map((item) => (item === '#' ? item : item + item)).join('');\n return digit;\n };\n /* Converts hex code to RGB (e.g. #ff0011 --> rgb(255,0,0) ) */\n const hexToRgb = (hex) => {\n let hexCode = hex.slice(0, 7);\n if (hex.startsWith('#') && hex.length === 4) hexCode = threeToSix(hexCode);\n const colorParts = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hexCode);\n if (!colorParts || colorParts.length < 3) return 'black';\n const parse = (index) => parseInt(colorParts[index], 16);\n return colorParts ? { r: parse(1), g: parse(2), b: parse(3) } : null;\n };\n /* Given an RGB value, return the lightness ratio */\n const getLightness = (rgb) => (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n if (!colorHex.startsWith('#')) return 'white'; // Not a hex, do nothing\n // Convert hex to RGB obj, get lightness, and return opposing color\n return getLightness(hexToRgb(colorHex.trim())) < 100 ? 'white' : 'black';\n },\n /* The contents of the style attribute, to set background and text color of swatch */\n makeSwatchStyles(colorName) {\n const contrastingColor = this.getForegroundColor(this.customColors[colorName]);\n return `background:${this.customColors[colorName]};`\n + `color:${contrastingColor}; border: 1px solid ${contrastingColor}`;\n },\n /* Determines if a given variable should NOT use the color picker component */\n isColor(variableName, variableValue) {\n // If value is a dimension, then it aint a color\n if ((/rem|px|%/.exec(variableValue))) return false;\n const nonColorVariables = [ // Known non-color variables\n '--font-headings', '--font-body', '--font-monospace',\n '--curve-factor', '--curve-factor-navbar', '--curve-factor-small',\n '--dimming-factor', '--scroll-bar-width', '--header-height', '--footer-height',\n '--item-group-padding', '--item-shadow', '--item-hover-shadow:', '--item-icon-transform',\n '--item-icon-transform-hover', '--item-group-shadow', '--context-menu-shadow',\n '--settings-container-shadow', '--side-bar-width',\n ];\n // If the variable name is known to not be a color (in above list)\n if (nonColorVariables.includes(`--${variableName}`)) return false;\n return true; // It must be a color, we'll use the color picker\n },\n /* Determine if a given key is that of a known font variable, or has a long value */\n isTextual(varName, varValue) {\n return varName.startsWith('font-') || (varValue && varValue.length > 12);\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n\ndiv.theme-configurator-wrapper {\n position: absolute;\n top: 4rem;\n right: 1rem;\n width: 16rem;\n min-height: 12rem;\n max-height: 32rem;\n padding: 0.5rem;\n z-index: 5;\n overflow-y: visible;\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n border-radius: var(--curve-factor);\n box-shadow: 0 8px 10px -2px rgba(0, 0, 0, 0.6), 1px 1px 6px var(--primary);\n\n h3.configurator-title {\n text-align: center;\n font-weight: normal;\n margin: 0.4rem;\n }\n\n div.color-row-container {\n max-height: 20rem;\n overflow-y: visible;\n @extend .scroll-bar;\n div.color-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.25rem 0;\n border-bottom: 1px dashed var(--primary);\n label.color-name {\n text-transform: capitalize;\n }\n }\n }\n\n input.swatch-input, input.misc-input {\n border: none;\n margin: 0.2rem;\n padding: 0.5rem;\n width: 4rem;\n border-radius: var(--curve-factor);\n font-family: var(--font-monospace);\n color: var(--black);\n font-weight: bold;\n cursor: pointer;\n &:hover {\n box-shadow: inset 0 0 4px 4px #00000033;\n }\n &:active {\n box-shadow: inset 0 0 4px 4px #00000080;\n outline: none;\n }\n &.long-input {\n cursor: text;\n font-style: italic;\n font-weight: 200;\n padding: 0.5rem 0.2rem;\n font-size: 0.75rem;\n width: 9rem;\n &:hover { box-shadow: none; }\n }\n }\n}\n\np.action-text-btn {\n cursor: pointer;\n margin: 0.5rem auto 0;\n padding: 0.2rem 0.4rem;\n width: fit-content;\n text-align: center;\n text-decoration: underline;\n border-radius: var(--curve-factor);\n border: 1px solid var(--background-darker);\n &:hover {\n background: var(--background);\n border-color: var(--primary);\n text-decoration: none;\n }\n &:active {\n background: var(--primary);\n color: var(--background);\n }\n &.hide {\n display: none;\n }\n}\n\ndiv.action-buttons {\n display: flex;\n justify-content: center;\n button {\n min-width: 6rem;\n padding: 0.25rem 0.5rem;\n margin: 1rem 0.5rem 0.5rem;\n }\n}\n\ndiv.theme-configurator-wrapper.showing-all {\n overflow: auto;\n div.color-row-container {\n overflow: auto;\n }\n p.show-all-vars-btn {\n display: none;\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomThemeMaker.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomThemeMaker.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CustomThemeMaker.vue?vue&type=template&id=67a8b583&\"\nimport script from \"./CustomThemeMaker.vue?vue&type=script&lang=js&\"\nexport * from \"./CustomThemeMaker.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CustomThemeMaker.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(_vm.closeThemeConfigurator),expression:\"closeThemeConfigurator\"}],staticClass:\"theme-selector-section\"},[_c('div',[_c('span',{staticClass:\"theme-label\"},[_vm._v(_vm._s(_vm.$t('settings.theme-label')))]),_c('v-select',{staticClass:\"theme-dropdown\",attrs:{\"options\":_vm.themeNames,\"value\":_vm.$store.getters.theme,\"tabindex\":-2},on:{\"input\":_vm.themeChanged},model:{value:(_vm.selectedTheme),callback:function ($$v) {_vm.selectedTheme=$$v},expression:\"selectedTheme\"}})],1),(!_vm.hidePallete)?_c('IconPalette',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.$t('theme-maker.title')),expression:\"$t('theme-maker.title')\"}],staticClass:\"color-button\",on:{\"click\":_vm.openThemeConfigurator}}):_vm._e(),(_vm.themeConfiguratorOpen)?_c('CustomThemeMaker',{attrs:{\"themeToEdit\":_vm.selectedTheme},on:{\"closeThemeConfigurator\":function($event){return _vm.closeThemeConfigurator()}}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import ErrorHandler from '@/utils/ErrorHandler';\nimport { getTheme, getCustomColors } from '@/utils/ConfigHelpers';\nimport { mainCssVars } from '@/utils/defaults';\n\n/* Returns users current theme */\nexport const GetTheme = () => getTheme();\n\n/* Gets user custom color preferences for current theme, and applies to DOM */\nexport const ApplyCustomVariables = (theme) => {\n mainCssVars.forEach((vName) => { document.documentElement.style.removeProperty(`--${vName}`); });\n const themeColors = getCustomColors()[theme];\n if (themeColors) {\n Object.keys(themeColors).forEach((customVar) => {\n document.documentElement.style.setProperty(`--${customVar}`, themeColors[customVar]);\n });\n }\n};\n\n/* Sets the theme, by updating data-theme attribute on the html tag */\nexport const ApplyLocalTheme = (newTheme) => {\n const htmlTag = document.getElementsByTagName('html')[0];\n if (htmlTag.hasAttribute('data-theme')) htmlTag.removeAttribute('data-theme');\n htmlTag.setAttribute('data-theme', newTheme);\n};\n\n/**\n * A function for pre-loading, and easy switching of external stylesheets\n * External CSS is preloaded to avoid FOUC\n */\nexport const LoadExternalTheme = function th() {\n /* Preload selected external theme */\n const preloadTheme = (href) => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = href;\n document.head.appendChild(link);\n return new Promise((resolve, reject) => {\n link.onload = e => {\n const { sheet } = e.target;\n sheet.disabled = true;\n resolve(sheet);\n };\n link.onerror = reject;\n });\n };\n\n /* Check theme is selected, and it exists */\n const checkTheme = (themes, name) => {\n if ((!name) || (name !== 'custom' && !themes[name])) {\n ErrorHandler(`Theme: '${name || '[not selected]'}' does not exist.`);\n return false;\n }\n return true;\n };\n\n /* Disable all but selected theme */\n const selectTheme = (themes, name) => {\n if (checkTheme(themes, name)) {\n const t = themes; // To avoid ESLint complaining about mutating a param\n Object.keys(themes).forEach(n => { t[n].disabled = (n !== name); });\n }\n };\n\n const themes = {};\n\n return {\n add(name, href) { return preloadTheme(href).then(s => { themes[name] = s; }); },\n set theme(name) { selectTheme(themes, name); },\n get theme() { return Object.keys(themes).find(n => !themes[n].disabled); },\n };\n};\n","<template>\n <div class=\"theme-selector-section\" v-click-outside=\"closeThemeConfigurator\">\n <div>\n <span class=\"theme-label\">{{ $t('settings.theme-label') }}</span>\n <v-select\n :options=\"themeNames\"\n v-model=\"selectedTheme\"\n :value=\"$store.getters.theme\"\n class=\"theme-dropdown\"\n :tabindex=\"-2\"\n @input=\"themeChanged\"\n />\n </div>\n <IconPalette\n v-if=\"!hidePallete\"\n class=\"color-button\"\n @click=\"openThemeConfigurator\"\n v-tooltip=\"$t('theme-maker.title')\"\n />\n <CustomThemeMaker\n v-if=\"themeConfiguratorOpen\"\n :themeToEdit=\"selectedTheme\"\n @closeThemeConfigurator=\"closeThemeConfigurator()\"\n />\n </div>\n</template>\n\n<script>\n\nimport CustomThemeMaker from '@/components/Settings/CustomThemeMaker';\nimport {\n LoadExternalTheme,\n ApplyLocalTheme,\n ApplyCustomVariables,\n} from '@/utils/ThemeHelper';\nimport Defaults, { localStorageKeys } from '@/utils/defaults';\nimport Keys from '@/utils/StoreMutations';\nimport IconPalette from '@/assets/interface-icons/config-color-palette.svg';\n\nexport default {\n name: 'ThemeSelector',\n props: {\n hidePallete: Boolean,\n },\n components: {\n CustomThemeMaker,\n IconPalette,\n },\n watch: {\n /* When theme in VueX store changes, then update theme */\n themeFromStore(newTheme) {\n this.selectedTheme = newTheme;\n this.updateTheme(newTheme);\n },\n },\n data() {\n return {\n selectedTheme: '',\n themeConfiguratorOpen: false, // Control the opening of theme config popup\n themeHelper: new LoadExternalTheme(),\n ApplyLocalTheme,\n ApplyCustomVariables,\n };\n },\n computed: {\n /* Get appConfig from store */\n appConfig() {\n return this.$store.getters.appConfig;\n },\n /* Get users theme from store */\n themeFromStore() {\n return this.$store.getters.theme;\n },\n /* Combines all theme names (builtin and user defined) together */\n themeNames: function themeNames() {\n const externalThemeNames = Object.keys(this.externalThemes);\n const specialThemes = ['custom'];\n return [...externalThemeNames, ...Defaults.builtInThemes, ...specialThemes];\n },\n extraThemeNames() {\n const userThemes = this.appConfig.cssThemes || [];\n if (typeof userThemes === 'string') return [userThemes];\n return userThemes;\n },\n /* Returns an array of links to external CSS from the Config */\n externalThemes() {\n const availibleThemes = {};\n if (this.appConfig) {\n if (this.appConfig.externalStyleSheet) {\n const externals = this.appConfig.externalStyleSheet;\n if (Array.isArray(externals)) {\n externals.forEach((ext, i) => {\n availibleThemes[`External Stylesheet ${i + 1}`] = ext;\n });\n } else {\n availibleThemes['External Stylesheet'] = this.appConfig.externalStyleSheet;\n }\n }\n }\n availibleThemes.Default = '#';\n return availibleThemes;\n },\n },\n mounted() {\n const initialTheme = this.getInitialTheme();\n this.selectedTheme = initialTheme;\n // Pass all user custom stylesheets to the themehelper\n const added = Object.keys(this.externalThemes).map(\n name => this.themeHelper.add(name, this.externalThemes[name]),\n );\n // Quicker loading, if the theme is local we can apply it immidiatley\n if (this.isThemeLocal(initialTheme)) {\n this.updateTheme(initialTheme);\n // If it's an external stylesheet, then wait for promise to resolve\n } else if (initialTheme !== Defaults.theme) {\n Promise.all(added).then(() => {\n this.updateTheme(initialTheme);\n });\n }\n },\n methods: {\n /* Called when dropdown changed\n * Updates store, which will in turn update theme through watcher\n */\n themeChanged() {\n this.$store.commit(Keys.SET_THEME, this.selectedTheme);\n },\n /* Returns the initial theme */\n getInitialTheme() {\n const localTheme = localStorage[localStorageKeys.THEME];\n if (localTheme && localTheme !== 'undefined') return localTheme;\n return this.appConfig.theme || Defaults.theme;\n },\n /* Determines if a given theme is local / not a custom user stylesheet */\n isThemeLocal(themeToCheck) {\n const localThemes = [...Defaults.builtInThemes, ...this.extraThemeNames];\n return localThemes.includes(themeToCheck);\n },\n /* Opens the theme color configurator popup */\n openThemeConfigurator() {\n this.$store.commit(Keys.SET_MODAL_OPEN, true);\n this.themeConfiguratorOpen = true;\n },\n /* Closes the theme color configurator popup */\n closeThemeConfigurator() {\n if (this.themeConfiguratorOpen) {\n this.$store.commit(Keys.SET_MODAL_OPEN, false);\n this.themeConfiguratorOpen = false;\n }\n },\n /* Updates theme. Checks if the new theme is local or external,\n and calls appropirate updating function. Updates local storage */\n updateTheme(newTheme) {\n if (newTheme === 'Default') {\n this.resetToDefault();\n this.themeHelper.theme = 'Default';\n } else if (this.isThemeLocal(newTheme)) {\n this.ApplyLocalTheme(newTheme);\n } else {\n this.themeHelper.theme = newTheme;\n }\n this.ApplyCustomVariables(newTheme);\n localStorage.setItem(localStorageKeys.THEME, newTheme);\n },\n /* Removes any applied themes */\n resetToDefault() {\n document.getElementsByTagName('html')[0].removeAttribute('data-theme');\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n\n@import 'vue-select/src/scss/vue-select.scss';\n@import '@/styles/style-helpers.scss';\n\n.theme-dropdown {\n div.vs__dropdown-toggle {\n border-color: var(--settings-text-color);\n border-radius: var(--curve-factor);\n min-width: 8rem;\n max-width: 16rem;\n height: 1.8rem;\n font-size: 0.85rem;\n cursor: pointer;\n }\n span.vs__selected, li.vs__dropdown-option {\n color: var(--settings-text-color);\n text-transform: capitalize;\n }\n svg.vs__open-indicator {\n fill: var(--settings-text-color);\n }\n ul.vs__dropdown-menu {\n width: auto;\n z-index: 12;\n max-width: 13rem;\n overflow-x: hidden;\n @extend .scroll-bar;\n background: var(--background);\n border-radius: var(--curve-factor);\n border-top: 1px solid var(--settings-text-color);\n }\n li.vs__dropdown-option--highlight {\n background: var(--settings-text-color);\n color: var(--background);\n }\n button.vs__clear {\n display: none;\n }\n}\n\n.theme-selector-section {\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n justify-content: center;\n height: 100%;\n span.theme-label {\n font-size: 1rem;\n color: var(--settings-text-color);\n margin: 1px 0 2px 0;\n }\n}\n\nsvg.color-button {\n path {\n fill: var(--settings-text-color);\n }\n width: 1rem;\n height: 1rem;\n padding: 0.2rem;\n margin: 0.5rem;\n align-self: flex-end;\n text-align: center;\n background: var(--background);\n border: 1px solid var(--settings-text-color);;\n border-radius: var(--curve-factor);\n cursor: pointer;\n &:hover, &.selected {\n background: var(--settings-text-color);\n path { fill: var(--background); }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThemeSelector.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThemeSelector.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ThemeSelector.vue?vue&type=template&id=2562c2e8&\"\nimport script from \"./ThemeSelector.vue?vue&type=script&lang=js&\"\nexport * from \"./ThemeSelector.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ThemeSelector.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<template>\n <div class=\"css-editor-outer\">\n <!-- Add raw custom CSS -->\n <div class=\"style-section css-wrapper\">\n <h3>Custom CSS</h3>\n <textarea class=\"css-editor\" v-model=\"customCss\" />\n <Button class=\"save-button\" :click=\"save\">{{ $t('config.css-save-btn') }}</Button>\n <p class=\"quick-note\">\n <b>{{ $t('config.css-note-label') }}:</b>\n {{ $t('config.css-note-l1') }} {{ $t('config.css-note-l2') }} {{ $t('config.css-note-l3') }}\n </p>\n </div>\n <!-- Theme Selector -->\n <div class=\"style-section base-theme-wrapper\">\n <h3>Base Theme</h3>\n <ThemeSelector :hidePallete=\"true\" />\n </div>\n <!-- UI color configurator -->\n <div class=\"style-section\">\n <CustomThemeMaker :themeToEdit=\"currentTheme\" class=\"color-config\" />\n </div>\n </div>\n</template>\n\n<script>\n\nimport CustomThemeMaker from '@/components/Settings/CustomThemeMaker';\nimport ThemeSelector from '@/components/Settings/ThemeSelector';\nimport Button from '@/components/FormElements/Button';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { localStorageKeys, theme as defaultTheme } from '@/utils/defaults';\n\nexport default {\n name: 'StyleEditor',\n components: {\n Button,\n ThemeSelector,\n CustomThemeMaker,\n },\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n currentTheme() {\n return this.appConfig.theme || defaultTheme;\n },\n },\n data() {\n return {\n customCss: '',\n };\n },\n mounted() {\n // Get existing custom styles (if present) from appConfig\n this.customCss = this.appConfig.customCss || '\\n\\n';\n },\n methods: {\n /* Sanitizes input, saves to browser and store, applies to page and shows message */\n save() {\n const css = this.customCss.replace(/<\\/?[^>]+(>|$)/g, '');\n this.$store.commit(StoreKeys.UPDATE_CUSTOM_CSS, css);\n this.saveToBrowser(css);\n this.injectToPage(css);\n this.showSuccessMsg();\n if (css === '') this.reloadPage();\n },\n /* Formats CSS, and applies it to page */\n injectToPage(userStyles) {\n const cleanedCss = userStyles.replace(/<\\/?[^>]+(>|$)/g, '');\n const style = document.createElement('style');\n style.textContent = cleanedCss;\n document.head.append(style);\n },\n /* Saves custom CSS local storage */\n saveToBrowser(css) {\n const localAppConfig = JSON.parse(localStorage.getItem(localStorageKeys.APP_CONFIG) || '{}');\n localAppConfig.customCss = css;\n localStorage.setItem(localStorageKeys.APP_CONFIG, JSON.stringify(localAppConfig));\n },\n /* Reload the page (only called if removing styles) */\n reloadPage() {\n setTimeout(() => { location.reload(); }, 1500); // eslint-disable-line no-restricted-globals\n },\n /* Show success toast and lot update */\n showSuccessMsg() {\n this.$toasted.show('Changes saved successfully');\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n\n// Main layout\ndiv.css-editor-outer {\n text-align: center;\n padding-bottom: 1rem;\n display: flex;\n flex-direction: column;\n\n .style-section {\n padding: 1rem;\n &:not(:last-child) { border-bottom: 1px dashed var(--config-settings-color); }\n h3 {\n font-size: 1.4rem;\n margin: 0.5rem 0 0.2rem;\n }\n }\n\n div.css-wrapper {\n display: flex;\n flex-direction: column;\n }\n}\n\n// Save button\nbutton.save-button {\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n border: 1px solid var(--config-settings-color);\n &:hover:not(:disabled) {\n background: var(--config-settings-color);\n color: var(--config-settings-background);\n }\n}\n\n// CSS textarea input\n.css-editor {\n margin: 1rem auto;\n padding: 0.5rem;\n width: 80%;\n height: 8rem;\n max-height: 16rem;\n min-height: 4rem;\n resize: vertical;\n outline: none;\n border: 1px solid var(--config-settings-color);\n border-radius: var(--curve-factor);\n background: var(--transparent-50);\n color: var(--config-settings-color);\n &:focus {\n box-shadow: 0 40px 70px -2px rgba(0, 0, 0, 0.6), 1px 1px 6px var(--config-settings-color);\n }\n}\n\n// Info note\np.quick-note {\n text-align: left;\n width: 80%;\n margin: 1rem auto;\n padding: 0.5rem;\n font-size: 0.9rem;\n opacity: var(--dimming-factor);\n border-radius: var(--curve-factor);\n}\n\n// Base Theme Selector\n.base-theme-wrapper {\n span.theme-label {\n display: none;\n }\n div.vs__dropdown-toggle {\n border-color: var(--config-settings-color);\n min-width: 16rem;\n max-width: 32rem;\n height: 2.4rem;\n font-size: 1rem;\n margin: 0.5rem;\n }\n ul.vs__dropdown-menu {\n min-width: 16rem;\n max-width: 32rem;\n background: var(--config-settings-background);\n border-top: 1px solid var(--config-settings-color);\n }\n li.vs__dropdown-option--highlight {\n background: var(--config-settings-color);\n color: var(--config-settings-background);\n }\n}\n\n// Theme editor\n.color-config.theme-configurator-wrapper {\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n position: relative;\n width: 80%;\n max-width: 32rem;\n margin: 1rem auto;\n box-shadow: none;\n right: 0;\n top: 0;\n max-height: unset;\n .color-row-container {\n text-align: left;\n max-height: unset;\n }\n .misc-input {\n width: 6rem;\n }\n .misc-input.long-input {\n width: 18rem;\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomCss.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomCss.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CustomCss.vue?vue&type=template&id=89206b6e&\"\nimport script from \"./CustomCss.vue?vue&type=script&lang=js&\"\nexport * from \"./CustomCss.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CustomCss.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"cloud-backup-restore-wrapper\"},[_c('div',{staticClass:\"section intro\"},[_c('h2',[_vm._v(_vm._s(_vm.$t('cloud-sync.title')))]),_c('p',{staticClass:\"intro\"},[_vm._v(\" \"+_vm._s(_vm.$t('cloud-sync.intro-l1'))+\" \"),_c('br'),_c('br'),_vm._v(\" \"+_vm._s(_vm.$t('cloud-sync.intro-l2'))+\" \"),_c('br'),_vm._v(\" \"+_vm._s(_vm.$t('cloud-sync.intro-l3'))+\" \"),_c('a',{attrs:{\"href\":\"https://github.com/Lissy93/dashy/blob/master/docs/backup-restore.md\"}},[_vm._v(\"docs\")])])]),_c('div',{staticClass:\"section backup-section\"},[(_vm.backupId)?_c('h3',[_vm._v(_vm._s(_vm.$t('cloud-sync.backup-title-setup')))]):_c('h3',[_vm._v(_vm._s(_vm.$t('cloud-sync.backup-title-setup')))]),_c('Input',{attrs:{\"name\":\"backup-password\",\"label\":_vm.backupId\n ? _vm.$t('cloud-sync.password-label-update') : _vm.$t('cloud-sync.password-label-setup'),\"layout\":\"vertical\",\"type\":\"password\"},model:{value:(_vm.backupPassword),callback:function ($$v) {_vm.backupPassword=$$v},expression:\"backupPassword\"}}),_c('Button',{attrs:{\"click\":_vm.checkPass}},[_vm._v(\" \"+_vm._s(_vm.backupId ? _vm.$t('cloud-sync.backup-button-update') : _vm.$t('cloud-sync.backup-button-setup'))+\" \"),_c('IconBackup')],1),(_vm.backupId)?_c('div',{staticClass:\"results-view\"},[_c('span',{staticClass:\"backup-id-label\"},[_vm._v(_vm._s(_vm.$t('cloud-sync.backup-id-label'))+\": \")]),_c('pre',{staticClass:\"backup-id-value\"},[_vm._v(_vm._s(_vm.backupId))]),_c('span',{staticClass:\"backup-id-note\"},[_vm._v(_vm._s(_vm.$t('cloud-sync.backup-id-note')))])]):_vm._e()],1),_c('div',{staticClass:\"section restore-section\"},[_c('h3',[_vm._v(_vm._s(_vm.$t('cloud-sync.restore-title')))]),_c('Input',{attrs:{\"name\":\"restore-code\",\"label\":_vm.$t('cloud-sync.restore-id-label')},model:{value:(_vm.restoreCode),callback:function ($$v) {_vm.restoreCode=$$v},expression:\"restoreCode\"}}),_c('Input',{attrs:{\"name\":\"restore-password\",\"label\":_vm.$t('cloud-sync.restore-password-label'),\"type\":\"password\"},model:{value:(_vm.restorePassword),callback:function ($$v) {_vm.restorePassword=$$v},expression:\"restorePassword\"}}),_c('Button',{attrs:{\"click\":_vm.restoreBackup}},[_vm._v(\" \"+_vm._s(_vm.$t('cloud-sync.restore-button'))+\" \"),_c('IconRestore')],1)],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:(\"input-container \" + _vm.layout)},[(_vm.label)?_c('label',{staticClass:\"input-label\",attrs:{\"for\":\"name\"}},[_vm._v(\" \"+_vm._s(_vm.label)+\" \")]):_vm._e(),_c('input',{staticClass:\"input-field\",attrs:{\"type\":_vm.type,\"name\":_vm.name,\"id\":_vm.name,\"placeholder\":_vm.placeholder},domProps:{\"value\":_vm.value},on:{\"input\":function($event){return _vm.updateValue($event.target.value)}}}),(_vm.description)?_c('p',{staticClass:\"input-description\"},[_vm._v(\" \"+_vm._s(_vm.description)+\" \")]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div :class=\"`input-container ${layout}`\">\n <label\n v-if=\"label\"\n for=\"name\"\n class=\"input-label\"\n >\n {{label}}\n </label>\n <input\n :type=\"type\"\n :value=\"value\"\n v-on:input=\"updateValue($event.target.value)\"\n :name=\"name\"\n :id=\"name\"\n :placeholder=\"placeholder\"\n class=\"input-field\"\n />\n <p\n v-if=\"description\"\n class=\"input-description\"\n >\n {{ description }}\n </p>\n </div>\n</template>\n\n<script>\n\nexport default {\n name: 'Input',\n props: {\n value: [String, Number], // The value bound to v-model\n label: String, // An optional label to display above\n name: String, // Required unique ID value, for accessibility\n placeholder: String, // Optional placeholder value\n description: String, // Optional info paragraph\n type: {\n default: 'text', // Input type, e.g. text, password, number\n type: String,\n },\n layout: { // Layout alignment direction, either horizonal or verical\n validator: (value) => ['horizontal', 'vertical'].indexOf(value) !== -1,\n type: String,\n default: 'vertical',\n },\n },\n methods: {\n updateValue(value) {\n this.$emit('input', value);\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/media-queries.scss';\n\ndiv.input-container {\n margin: 0.25rem auto;\n display: flex;\n align-items: baseline;\n &.vertical {\n flex-direction: column;\n }\n &.horizontal {\n @include tablet-up {\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n label.input-label,\n input.input-field,\n p.input-description {\n margin: 0.25rem;\n flex-basis: 8rem;\n flex-grow: 1;\n }\n input.input-field { flex-grow: 2; }\n p.input-description { flex-grow: 3; }\n }\n }\n\n input.input-field {\n min-width: 10rem;\n padding: 0.5rem 0.75rem;\n margin: 0.5rem auto;\n font-size: 1.2rem;\n box-sizing: border-box;\n color: var(--primary);\n background: var(--background);;\n border: 1px solid var(--primary);\n border-radius: var(--curve-factor);\n &:focus {\n box-shadow: 1px 1px 6px var(--config-settings-color);\n outline: none;\n }\n }\n\n label.input-label {\n text-transform: capitalize;\n }\n\n p.input-description {\n opacity: var(--dimming-factor);\n }\n\n @include tablet-down {\n flex-direction: column;\n align-items: start;\n input.input-field {\n margin: 0.5rem;\n }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Input.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Input.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Input.vue?vue&type=template&id=dd5e343e&scoped=true&\"\nimport script from \"./Input.vue?vue&type=script&lang=js&\"\nexport * from \"./Input.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Input.vue?vue&type=style&index=0&id=dd5e343e&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"dd5e343e\",\n null\n \n)\n\nexport default component.exports","import sha256 from 'crypto-js/sha256';\nimport aes from 'crypto-js/aes';\nimport Utf8 from 'crypto-js/enc-utf8';\nimport axios from 'axios';\nimport { backupEndpoint } from '@/utils/defaults';\n\nconst ENDPOINT = backupEndpoint; // 'https://dashy-sync-service.as93.net';\n\n/* Stringify, encrypt and encode data for transmission */\nconst encryptData = (data, password) => {\n const stringifiedData = JSON.stringify(data);\n const encryptedData = aes.encrypt(stringifiedData, password);\n return encryptedData.toString();\n};\n\n/* Decrypt, decode and parse received data */\nconst decryptData = (data, password) => aes.decrypt(data, password).toString(Utf8);\n\n/* Returns a splice of the hash of the users password */\nconst makeSubHash = (pass) => sha256(pass).toString().slice(0, 14);\n\n/* Makes the backup */\nexport const backup = (data, password) => axios.post(ENDPOINT, {\n userData: encryptData(data, password),\n subHash: makeSubHash(password),\n});\n\n/* Updates and existing backup */\nexport const update = (data, password, backupId) => axios.put(ENDPOINT, {\n backupId,\n userData: encryptData(data, password),\n subHash: makeSubHash(password),\n});\n\nconst encodeGetParams = p => Object.entries(p).map(kv => kv.map(encodeURIComponent).join('=')).join('&');\n\n/* Restores the backup */\nexport const restore = (backupId, password) => {\n const params = encodeGetParams({ backupId, subHash: makeSubHash(password) });\n const url = `${ENDPOINT}/?${params}`;\n return new Promise((resolve, reject) => {\n axios.get(url).then((response) => {\n if (!response.data || response.data.errorMsg) {\n reject(response.data.errorMsg || 'Error');\n } else {\n const decryptedData = decryptData(response.data.userData.userData, password);\n try { resolve(JSON.parse(decryptedData)); } catch (e) { reject(e); }\n }\n });\n });\n};\n","<template>\n <div class=\"cloud-backup-restore-wrapper\">\n <!-- Intro text -->\n <div class=\"section intro\">\n <h2>{{ $t('cloud-sync.title') }}</h2>\n <p class=\"intro\">\n {{ $t('cloud-sync.intro-l1') }}\n <br><br>\n {{ $t('cloud-sync.intro-l2') }}\n <br>\n {{ $t('cloud-sync.intro-l3') }}\n <a href=\"https://github.com/Lissy93/dashy/blob/master/docs/backup-restore.md\">docs</a>\n </p>\n </div>\n <!-- Create or update a backup form -->\n <div class=\"section backup-section\">\n <h3 v-if=\"backupId\">{{ $t('cloud-sync.backup-title-setup') }}</h3>\n <h3 v-else>{{ $t('cloud-sync.backup-title-setup') }}</h3>\n <Input\n v-model=\"backupPassword\"\n name=\"backup-password\"\n :label=\"backupId\n ? $t('cloud-sync.password-label-update') : $t('cloud-sync.password-label-setup')\"\n layout=\"vertical\"\n type=\"password\"\n />\n <Button :click=\"checkPass\">\n {{backupId\n ? $t('cloud-sync.backup-button-update') : $t('cloud-sync.backup-button-setup')}}\n <IconBackup />\n </Button>\n <div class=\"results-view\" v-if=\"backupId\">\n <span class=\"backup-id-label\">{{ $t('cloud-sync.backup-id-label') }}: </span>\n <pre class=\"backup-id-value\">{{ backupId }}</pre>\n <span class=\"backup-id-note\">{{ $t('cloud-sync.backup-id-note') }}</span>\n </div>\n </div>\n <!-- Restore from backup form -->\n <div class=\"section restore-section\">\n <h3>{{ $t('cloud-sync.restore-title') }}</h3>\n <Input\n v-model=\"restoreCode\"\n name=\"restore-code\"\n :label=\"$t('cloud-sync.restore-id-label')\"\n />\n <Input\n v-model=\"restorePassword\"\n name=\"restore-password\"\n :label=\"$t('cloud-sync.restore-password-label')\"\n type=\"password\"\n />\n <Button :click=\"restoreBackup\">\n {{ $t('cloud-sync.restore-button') }}\n <IconRestore />\n </Button>\n </div>\n </div>\n</template>\n\n<script>\n// Import libraries\nimport sha256 from 'crypto-js/sha256';\nimport ProgressBar from 'rsup-progress';\n// Import form elements\nimport Button from '@/components/FormElements/Button';\nimport Input from '@/components/FormElements/Input';\n// Import utils and constants\nimport StoreKeys from '@/utils/StoreMutations';\nimport { backup, update, restore } from '@/utils/CloudBackup';\nimport { localStorageKeys } from '@/utils/defaults';\nimport { InfoHandler, WarningInfoHandler, InfoKeys } from '@/utils/ErrorHandler';\n// Import Icons\nimport IconBackup from '@/assets/interface-icons/config-backup.svg';\nimport IconRestore from '@/assets/interface-icons/config-restore.svg';\n\nexport default {\n name: 'CloudBackupRestore',\n computed: {\n config() { // Users config from store\n return this.$store.state.config;\n },\n },\n data() {\n return { // Store current form data (temp)\n backupPassword: '',\n restorePassword: '',\n restoreCode: '',\n backupId: localStorage[localStorageKeys.BACKUP_ID] || '',\n progress: new ProgressBar({ color: 'var(--progress-bar)' }),\n };\n },\n components: { // UI components / icons\n Button,\n Input,\n IconBackup,\n IconRestore,\n },\n methods: {\n /* Make request to server-side, then either show error, or proceed to restore */\n restoreBackup() {\n this.progress.start();\n restore(this.restoreCode, this.restorePassword)\n .then((response) => {\n this.applyRestoredData(response, this.restoreCode);\n this.progress.end();\n }).catch((msg) => {\n this.showErrorMsg(msg);\n this.progress.end();\n });\n },\n /* Send request to backup server, to upload a new backup */\n makeBackup() {\n this.progress.start();\n backup(this.config, this.backupPassword)\n .then((response) => {\n if (!response.data || response.data.errorMsg || !response.data.backupId) {\n this.showErrorMsg(response.data.errorMsg || 'Error');\n } else { // All clear, no error\n this.updateUiAfterBackup(response.data.backupId, false);\n }\n this.progress.end();\n }).catch(() => {\n this.showErrorMsg(this.$t('cloud-sync.backup-error-unknown'));\n this.progress.end();\n });\n },\n /* Send request to backup server, to update an existing backup */\n makeUpdate() {\n this.progress.start();\n update(this.config, this.backupPassword, this.backupId)\n .then((response) => {\n if (!response.data || response.data.errorMsg || !response.data.backupId) {\n this.showErrorMsg(response.data.errorMsg || 'Error');\n } else { // All clear, no error\n this.updateUiAfterBackup(response.data.backupId, true);\n }\n this.progress.end();\n }).catch(() => {\n this.showErrorMsg(this.$t('cloud-sync.backup-error-unknown'));\n this.progress.end();\n });\n },\n /* For create / update a backup- checks pass is valid, then calls makeBackup */\n checkPass() {\n const savedHash = localStorage[localStorageKeys.BACKUP_HASH] || undefined;\n if (!this.backupPassword) {\n this.showErrorMsg(this.$t('cloud-sync.backup-missing-password'));\n } else if (!savedHash) {\n this.makeBackup();\n } else if (savedHash === this.makeHash(this.backupPassword)) {\n this.makeUpdate();\n } else {\n this.showErrorMsg(this.$t('cloud-sync.backup-error-password'));\n }\n },\n /* When restored data is revieved, then save to local storage, and apply it in state */\n applyRestoredData(config, backupId) {\n // Store restored data in local storage\n localStorage.setItem(localStorageKeys.CONF_SECTIONS, JSON.stringify(config.sections));\n localStorage.setItem(localStorageKeys.APP_CONFIG, JSON.stringify(config.appConfig));\n localStorage.setItem(localStorageKeys.PAGE_INFO, JSON.stringify(config.pageInfo));\n if (config.appConfig.theme) {\n localStorage.setItem(localStorageKeys.THEME, config.appConfig.theme);\n }\n // Save hashed token in local storage\n this.setBackupIdLocally(backupId, this.restorePassword);\n // Update the current state\n this.$store.commit(StoreKeys.SET_CONFIG, config);\n // Show success message\n this.showSuccessMsg(this.$t('cloud-sync.restore-success-msg'));\n },\n /* After backup/ update is made, then replace 'Make Backup' with 'Update Backup' */\n updateUiAfterBackup(backupId, isUpdate = false) {\n this.setBackupIdLocally(backupId, this.backupPassword);\n this.showSuccessMsg(\n `${isUpdate ? 'Update' : 'Backup'} ${this.$t('cloud-sync.backup-success-msg')}`,\n );\n this.backupPassword = '';\n },\n /* If the server returns a warning, then show to user and log it */\n showErrorMsg(errorMsg) {\n WarningInfoHandler(errorMsg, InfoKeys.CLOUD_BACKUP);\n this.$toasted.show(errorMsg, { className: 'toast-error' });\n },\n /* When server returns success message, then show to user and log it */\n showSuccessMsg(msg) {\n InfoHandler(msg, InfoKeys.CLOUD_BACKUP);\n this.$toasted.show(msg, { className: 'toast-success' });\n },\n /* Call to hash function, to hash the users chosen/ entered password */\n makeHash(pass) {\n return sha256(pass).toString();\n },\n /* After backup is applied, hash the backup ID, and save in browser storage */\n setBackupIdLocally(backupId, pass) {\n this.backupId = backupId;\n const hash = this.makeHash(pass);\n localStorage.setItem(localStorageKeys.BACKUP_ID, backupId);\n localStorage.setItem(localStorageKeys.BACKUP_HASH, hash);\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n @import '@/styles/style-helpers.scss';\n div.cloud-backup-restore-wrapper {\n display: flex;\n flex-wrap: wrap;\n flex-direction: row;\n text-align: center;\n overflow: auto;\n height: 100%;\n color: var(--cloud-backup-color);\n background: var(--cloud-backup-background);\n @extend .scroll-bar;\n\n /* Text styling */\n h2, h3 { font-size: 1.6rem; }\n p.intro {\n text-align: left;\n font-size: 1rem;\n margin: 0.25rem;\n padding: 0.25rem;\n }\n\n /* Main sections */\n .section {\n display: flex;\n flex-direction: column;\n width: fit-content;\n margin: 0 auto 1rem auto;\n padding: 0 0.5rem 1rem 0.5rem;\n }\n /* Intro section */\n .section.intro {\n width: 100%;\n height: fit-content;\n border-bottom: 1px dashed var(--cloud-backup-color);\n a { color: var(--cloud-backup-color); }\n }\n }\n\n /* Container to show backup ID result from server */\n div.results-view {\n width: 16rem;\n margin: 0.5rem auto;\n padding: 0.5rem 0.75rem;\n box-sizing: border-box;\n border: 1px dashed var(--cloud-backup-color);\n border-radius: var(--curve-factor);\n text-align: left;\n .backup-id-label, .backup-id-value {\n display: inline;\n font-size: 1rem;\n margin-right: 0.5rem;\n }\n .backup-id-note {\n font-size: 0.8rem;\n display: block;\n opacity: 0.8;\n margin-top: 0.5rem;\n }\n }\n\n /* Overide form element colors, so that config menu can be themed by user */\n input, button {\n color: var(--cloud-backup-color);\n border: 1px solid var(--cloud-backup-color);\n background: none;\n width: 16rem;\n }\n input:focus {\n box-shadow: 1px 1px 6px var(--cloud-backup-color);\n }\n button:hover {\n color: var(--cloud-backup-background);\n border: 1px solid var(--cloud-backup-background);\n background: var(--cloud-backup-color);\n }\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CloudBackupRestore.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CloudBackupRestore.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CloudBackupRestore.vue?vue&type=template&id=72c986b6&scoped=true&\"\nimport script from \"./CloudBackupRestore.vue?vue&type=script&lang=js&\"\nexport * from \"./CloudBackupRestore.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CloudBackupRestore.vue?vue&type=style&index=0&id=72c986b6&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"72c986b6\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.modalName,\"resizable\":true,\"width\":\"50%\",\"height\":\"60%\",\"classes\":\"dashy-modal\"}},[_c('div',{staticClass:\"rebuild-app-container\"},[_c('h3',{staticClass:\"rebuild-app-title\"},[_vm._v(_vm._s(_vm.$t('app-rebuild.title')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('app-rebuild.rebuild-note-l1'))+\" \"+_vm._s(_vm.$t('app-rebuild.rebuild-note-l2'))),_c('br'),_vm._v(\" \"+_vm._s(_vm.$t('app-rebuild.rebuild-note-l3'))+\" \")]),_c('Button',{attrs:{\"click\":_vm.startBuild,\"disabled\":_vm.loading || !_vm.allowRebuild,\"disallow\":!_vm.allowRebuild},scopedSlots:_vm._u([{key:\"text\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.loading ? _vm.$t('app-rebuild.rebuilding-status-1') : _vm.$t('app-rebuild.rebuild-button'))+\" \")]},proxy:true},{key:\"icon\",fn:function(){return [_c('RebuildIcon')]},proxy:true}])}),(!_vm.allowRebuild)?_c('div',[_c('p',{staticClass:\"disallow-rebuild-msg\"},[_vm._v(_vm._s(_vm.$t('app-rebuild.error-permission')))])]):_vm._e(),(_vm.loading)?_c('div',{staticClass:\"loader-info\"},[_c('LoadingAnimation',{staticClass:\"loader\"}),_c('p',{staticClass:\"loading-message\"},[_vm._v(_vm._s(_vm.$t('app-rebuild.rebuilding-status-2'))+\"...\")])],1):_vm._e(),(_vm.success !== undefined)?_c('div',{staticClass:\"rebuild-response\"},[(_vm.success)?_c('p',{staticClass:\"response-status success\"},[_vm._v(\" ✅ \"+_vm._s(_vm.$t('app-rebuild.success-msg'))+\" \")]):_c('p',{staticClass:\"response-status failure\"},[_vm._v(\" ❌ \"+_vm._s(_vm.$t('app-rebuild.fail-msg'))+\" \")]),_c('pre',{staticClass:\"output\"},[_c('code',[_vm._v(_vm._s(_vm.output || _vm.error))])]),_c('p',{staticClass:\"rebuild-message\"},[_vm._v(_vm._s(_vm.message))]),(_vm.success)?_c('p',{staticClass:\"rebuild-message\"},[_vm._v(\" \"+_vm._s(_vm.$t('app-rebuild.reload-note'))+\" \")]):_vm._e(),(_vm.success)?_c('Button',{attrs:{\"click\":_vm.refreshPage},scopedSlots:_vm._u([{key:\"text\",fn:function(){return [_vm._v(_vm._s(_vm.$t('app-rebuild.reload-button')))]},proxy:true},{key:\"icon\",fn:function(){return [_c('ReloadIcon')]},proxy:true}],null,false,3658341317)}):_vm._e()],1):_vm._e()],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <modal :name=\"modalName\" :resizable=\"true\" width=\"50%\" height=\"60%\" classes=\"dashy-modal\">\n <div class=\"rebuild-app-container\">\n <!-- Title, intro and start button -->\n <h3 class=\"rebuild-app-title\">{{ $t('app-rebuild.title') }}</h3>\n <p>\n {{ $t('app-rebuild.rebuild-note-l1') }}\n {{ $t('app-rebuild.rebuild-note-l2') }}<br>\n {{ $t('app-rebuild.rebuild-note-l3') }}\n </p>\n <Button :click=\"startBuild\" :disabled=\"loading || !allowRebuild\" :disallow=\"!allowRebuild\">\n <template v-slot:text>\n {{ loading ? $t('app-rebuild.rebuilding-status-1') : $t('app-rebuild.rebuild-button') }}\n </template>\n <template v-slot:icon><RebuildIcon /></template>\n </Button>\n <div v-if=\"!allowRebuild\">\n <p class=\"disallow-rebuild-msg\">{{ $t('app-rebuild.error-permission') }}</p>\n </div>\n <!-- Loading animation and text (shown while build is happening) -->\n <div v-if=\"loading\" class=\"loader-info\">\n <LoadingAnimation class=\"loader\" />\n <p class=\"loading-message\">{{ $t('app-rebuild.rebuilding-status-2') }}...</p>\n </div>\n <!-- Build response, and next actions (shown after build is done) -->\n <div class=\"rebuild-response\" v-if=\"success !== undefined\">\n <p v-if=\"success\" class=\"response-status success\">\n ✅ {{ $t('app-rebuild.success-msg') }}\n </p>\n <p v-else class=\"response-status failure\">\n ❌ {{ $t('app-rebuild.fail-msg') }}\n </p>\n <pre class=\"output\"><code>{{ output || error }}</code></pre>\n <p class=\"rebuild-message\">{{ message }}</p>\n <p v-if=\"success\" class=\"rebuild-message\">\n {{ $t('app-rebuild.reload-note') }}\n </p>\n <Button :click=\"refreshPage\" v-if=\"success\">\n <template v-slot:text>{{ $t('app-rebuild.reload-button') }}</template>\n <template v-slot:icon><ReloadIcon /></template>\n </Button>\n </div>\n </div>\n </modal>\n</template>\n\n<script>\nimport axios from 'axios';\nimport ProgressBar from 'rsup-progress';\nimport Button from '@/components/FormElements/Button';\nimport RebuildIcon from '@/assets/interface-icons/application-rebuild.svg';\nimport ReloadIcon from '@/assets/interface-icons/application-reload.svg';\nimport LoadingAnimation from '@/assets/interface-icons/loader.svg';\nimport { modalNames, serviceEndpoints } from '@/utils/defaults';\n\nexport default {\n name: 'RebuildApp',\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n },\n components: {\n Button,\n RebuildIcon,\n ReloadIcon,\n LoadingAnimation,\n },\n data: () => ({\n modalName: modalNames.REBUILD_APP,\n loading: false,\n success: undefined,\n error: '',\n output: '',\n message: '',\n allowRebuild: true,\n progress: new ProgressBar({ color: 'var(--progress-bar)' }),\n }),\n methods: {\n /* Calls to the rebuild endpoint, to kickoff the app build */\n startBuild() {\n const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin;\n const endpoint = `${baseUrl}${serviceEndpoints.rebuild}`;\n this.loading = true;\n this.progress.start();\n axios.get(endpoint)\n .then((response) => {\n this.finished(response.data || false);\n this.progress.end();\n })\n .catch((error) => {\n this.finished({ success: false, error });\n this.progress.end();\n });\n },\n /* Called when rebuild is complete, updates UI with either success or fail message */\n finished(responseData) {\n this.loading = false;\n if (responseData) {\n const {\n success, output, error, message,\n } = responseData;\n this.success = success;\n this.output = output;\n this.message = message;\n this.error = error;\n }\n this.$toasted.show(\n (this.success\n ? `✅ ${this.$t('app-rebuild.success-msg')}` : `❌ ${this.$t('app-rebuild.fail-msg')}`),\n { className: `toast-${this.success ? 'success' : 'error'}` },\n );\n },\n refreshPage() {\n location.reload(); // eslint-disable-line no-restricted-globals\n },\n },\n mounted() {\n if (this.appConfig.allowConfigEdit === false) {\n this.allowRebuild = false;\n }\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n.rebuild-app-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 1rem;\n color: var(--config-settings-color);\n background: var(--config-settings-background);\n overflow: auto;\n\n button {\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n }\n\n p.disallow-rebuild-msg {\n color: var(--danger);\n font-size: 1.2rem;\n margin: 0.2rem auto;\n text-align: center;\n }\n\n h3.rebuild-app-title {\n text-align: center;\n font-size: 2rem;\n margin: 1rem;\n }\n div.loader-info {\n margin: 0.2rem auto;\n text-align: center;\n svg.loader {\n width: 100px;\n }\n p.loading-message {\n margin: 0;\n font-size: 0.8rem;\n opacity: var(--dimming-factor);\n animation: 3s fadeIn;\n animation-fill-mode: forwards;\n opacity: 0;\n @keyframes fadeIn {\n 90% { opacity: 0; }\n 95% { opacity: 0.8; }\n 100% { opacity: 1; }\n }\n }\n }\n div.rebuild-response {\n width: 80%;\n margin: 0 auto 4rem auto;\n text-align: center;\n p.response-status {\n font-size: 1rem;\n text-align: left;\n &.success {\n color: var(--success);\n }\n &.failure {\n color: var(--danger);\n }\n }\n pre.output {\n padding: 1rem;\n font-size: 0.75rem;\n border-radius: var(--curve-factor-small);\n text-align: left;\n color: var(--white);\n background: var(--black);\n white-space: pre-wrap;\n }\n p.rebuild-message {\n font-size: 1rem;\n text-align: left;\n margin: 0.8rem 0;\n color: var(--config-settings-color);\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RebuildApp.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RebuildApp.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./RebuildApp.vue?vue&type=template&id=631127b0&scoped=true&\"\nimport script from \"./RebuildApp.vue?vue&type=script&lang=js&\"\nexport * from \"./RebuildApp.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RebuildApp.vue?vue&type=style&index=0&id=631127b0&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"631127b0\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.isVersionValid())?_c('div',{staticClass:\"app-version\"},[_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('updates.app-version-note'))+\" \"+_vm._s(_vm.appVersion)+\" \")]),(_vm.checksEnabled)?_c('div',[(!_vm.finished)?_c('p',[_vm._v(\" \"+_vm._s(_vm.error ? 'Error checking for updates.' : 'Chcekcing for Updates...')+\" \")]):_vm._e(),(_vm.finished && _vm.isUpToDate)?_c('p',{staticClass:\"up-to-date\"},[_vm._v(\" ✅ \"+_vm._s(_vm.$t('updates.up-to-date'))+\" \")]):(_vm.finished && !_vm.veryOutOfDate)?_c('p',{staticClass:\"update-availible\"},[_vm._v(\" ⚠️\"+_vm._s(_vm.$t('updates.out-of-date'))+\": \"),_c('b',[_vm._v(_vm._s(_vm.latestVersion))])]):(_vm.finished && _vm.veryOutOfDate)?_c('p',{staticClass:\"big-update-availible\"},[_vm._v(\" ❗ \"+_vm._s(_vm.$t('updates.out-of-date'))+\": \"),_c('b',[_vm._v(_vm._s(_vm.latestVersion))]),_c('span',{staticClass:\"please-update\"},[_vm._v(\" \"+_vm._s(_vm.$t('updates.unsupported-version-l1'))+\".\"),_c('br'),_vm._v(\" \"+_vm._s(_vm.$t('updates.unsupported-version-l2'))+\" \"+_vm._s(_vm.latestVersion)+\" \")])]):_vm._e()]):_vm._e()]):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"app-version\" v-if=\"isVersionValid()\">\n <!-- Current Version -->\n <p>\n {{ $t('updates.app-version-note') }} {{ appVersion }}\n </p>\n <div v-if=\"checksEnabled\">\n <!-- Results haven't come in yet, either still checking, or error -->\n <p v-if=\"!finished\">\n {{ error ? 'Error checking for updates.' : 'Chcekcing for Updates...' }}\n </p>\n <!-- App is up-to-date -->\n <p v-if=\"finished && isUpToDate\" class=\"up-to-date\">\n ✅ {{ $t('updates.up-to-date') }}\n </p>\n <!-- An update is available, but not too out-of-date -->\n <p v-else-if=\"finished && !veryOutOfDate\" class=\"update-availible\">\n ⚠️{{ $t('updates.out-of-date') }}: <b>{{ latestVersion }}</b>\n </p>\n <!-- Update available, app is VERY out of date, show some additional info -->\n <p v-else-if=\"finished && veryOutOfDate\" class=\"big-update-availible\">\n ❗ {{ $t('updates.out-of-date') }}: <b>{{ latestVersion }}</b>\n <span class=\"please-update\">\n {{ $t('updates.unsupported-version-l1') }}.<br>\n {{ $t('updates.unsupported-version-l2') }} {{ latestVersion }}\n </span>\n </p>\n </div>\n </div>\n</template>\n\n<script>\nimport axios from 'axios';\nimport ProgressBar from 'rsup-progress';\nimport ErrorHandler from '@/utils/ErrorHandler';\n\nexport default {\n name: 'AppInfoModal',\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n },\n data() {\n return {\n appVersion: process.env.VUE_APP_VERSION, // Current version, from package.json\n progress: new ProgressBar({ color: 'var(--progress-bar)' }),\n latestVersion: '', // Will store latest version, when request returns\n checksEnabled: true, // Should we check for updates\n isUpToDate: true, // Is current version === latest version\n veryOutOfDate: false, // If the app is more than 5 versions out of date\n finished: false, // Set to true when request is done\n error: false, // Set to true if checkig fails\n };\n },\n mounted() {\n if (!this.appVersion || (this.appConfig && this.appConfig.disableUpdateChecks)) {\n // Either current version isn't found, or user disabled checks\n this.checksEnabled = false;\n } else {\n this.checkVersion(); // Trigger the check\n }\n },\n methods: {\n /* Gets the apps latest version from Dashy's git repo */\n checkVersion() {\n const packageUrl = 'https://raw.githubusercontent.com/Lissy93/dashy/master/package.json';\n this.progress.start();\n axios.get(packageUrl).then((response) => {\n if (response && response.data && response.data.version) {\n this.latestVersion = response.data.version;\n this.isUpToDate = this.checkIfUpToDate(this.appVersion, this.latestVersion);\n this.finished = true;\n this.progress.end();\n }\n }).catch(() => {\n this.error = true;\n this.progress.end();\n });\n },\n /* Compares the current version, with the package.json version */\n checkIfUpToDate(currentVersion, latestVersion) {\n const parse = (version) => parseInt(version.replaceAll('.', ''), 10);\n const difference = parse(latestVersion) - parse(currentVersion);\n if (difference > 5) this.veryOutOfDate = true;\n return difference <= 0;\n },\n /* Checks that the input version is correctly parsed */\n isVersionValid() {\n const isValid = !Number.isNaN(parseInt(this.appVersion.replaceAll('.', ''), 10));\n if (!isValid) { // If invalid, then record an error\n ErrorHandler(\n 'Unable to check for updates, because current version is unavailible.'\n + ` ${this.appVersion} is not a valid version.`,\n );\n }\n return isValid;\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\ndiv.app-version {\n color: var(--settings-text-color);\n text-align: center;\n p {\n margin: 0.5rem auto;\n color: var(--transparent-white-50);\n cursor: default;\n &.up-to-date {\n color: var(--success);\n font-weight: bold;\n opacity: 0.8;\n }\n &.update-availible {\n color: var(--warning);\n opacity: 0.8;\n }\n &.big-update-availible {\n color: var(--danger);\n .please-update {\n font-size: 0.8rem;\n color: var(--danger);\n display: block;\n }\n }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppVersion.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppVersion.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AppVersion.vue?vue&type=template&id=2f975a24&scoped=true&\"\nimport script from \"./AppVersion.vue?vue&type=script&lang=js&\"\nexport * from \"./AppVersion.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AppVersion.vue?vue&type=style&index=0&id=2f975a24&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2f975a24\",\n null\n \n)\n\nexport default component.exports","<template>\n <Tabs :navAuto=\"true\" name=\"Add Item\" ref=\"tabView\">\n <TabItem :name=\"$t('config.main-tab')\" class=\"main-tab\">\n <div class=\"main-options-container\">\n <div class=\"config-buttons\">\n <h2>{{ $t('config.heading') }}</h2>\n <a class=\"hyperlink-wrapper\" @click=\"openExportConfigModal()\">\n <button class=\"config-button center\">\n <DownloadIcon class=\"button-icon\"/>\n {{ $t('config.download-config-button') }}\n </button>\n </a>\n <button class=\"config-button center\" @click=\"() => navigateToTab(1)\">\n <EditIcon class=\"button-icon\"/>\n {{ $t('config.edit-config-button') }}\n </button>\n <button class=\"config-button center\" @click=\"openLanguageSwitchModal()\">\n <LanguageIcon class=\"button-icon\"/>\n {{ $t('config.change-language-button') }}\n </button>\n <button class=\"config-button center\" @click=\"() => navigateToTab(3)\">\n <CustomCssIcon class=\"button-icon\"/>\n {{ $t('config.edit-css-button') }}\n </button>\n <button class=\"config-button center\" @click=\"() => navigateToTab(2)\">\n <CloudIcon class=\"button-icon\"/>\n {{backupId ? $t('config.edit-cloud-sync-button') : $t('config.cloud-sync-button') }}\n </button>\n <button class=\"config-button center\" @click=\"openRebuildAppModal()\">\n <RebuildIcon class=\"button-icon\"/>\n {{ $t('config.rebuild-app-button') }}\n </button>\n <button class=\"config-button center\" @click=\"resetLocalSettings()\">\n <DeleteIcon class=\"button-icon\"/>\n {{ $t('config.reset-settings-button') }}\n </button>\n <button class=\"config-button center\" @click=\"openAboutModal()\">\n <IconAbout class=\"button-icon\" />\n {{ $t('config.app-info-button') }}\n </button>\n <p class=\"small-screen-note\" style=\"display: none;\">\n You are using a very small screen, and some screens in this menu may not be optimal\n </p>\n <p class=\"language\">{{ getLanguage() }}</p>\n <AppVersion />\n </div>\n <div class=\"config-note\">\n <span>{{ $t('config.backup-note') }}</span>\n </div>\n </div>\n <!-- Rebuild App Modal -->\n <RebuildApp />\n </TabItem>\n <TabItem :name=\"$t('config.edit-config-tab')\">\n <JsonEditor />\n </TabItem>\n <TabItem :name=\"$t('cloud-sync.title')\">\n <CloudBackupRestore />\n </TabItem>\n <TabItem :name=\"$t('config.custom-css-tab')\">\n <CustomCssEditor />\n </TabItem>\n </Tabs>\n</template>\n\n<script>\n\nimport JsonToYaml from '@/utils/JsonToYaml';\nimport { localStorageKeys, modalNames } from '@/utils/defaults';\nimport { getUsersLanguage } from '@/utils/ConfigHelpers';\nimport StoreKeys from '@/utils/StoreMutations';\nimport JsonEditor from '@/components/Configuration/JsonEditor';\nimport CustomCssEditor from '@/components/Configuration/CustomCss';\nimport CloudBackupRestore from '@/components/Configuration/CloudBackupRestore';\nimport RebuildApp from '@/components/Configuration/RebuildApp';\nimport AppVersion from '@/components/Configuration/AppVersion';\n\nimport DownloadIcon from '@/assets/interface-icons/config-download-file.svg';\nimport DeleteIcon from '@/assets/interface-icons/config-delete-local.svg';\nimport EditIcon from '@/assets/interface-icons/config-edit-json.svg';\nimport CustomCssIcon from '@/assets/interface-icons/config-custom-css.svg';\nimport CloudIcon from '@/assets/interface-icons/cloud-backup-restore.svg';\nimport RebuildIcon from '@/assets/interface-icons/application-rebuild.svg';\nimport LanguageIcon from '@/assets/interface-icons/config-language.svg';\nimport IconAbout from '@/assets/interface-icons/application-about.svg';\n\nexport default {\n name: 'ConfigContainer',\n data() {\n return {\n jsonParser: JsonToYaml,\n backupId: localStorage[localStorageKeys.BACKUP_ID] || '',\n appVersion: process.env.VUE_APP_VERSION,\n latestVersion: '',\n };\n },\n props: {\n config: Object,\n },\n computed: {\n sections: function getSections() {\n return this.config.sections;\n },\n yaml() {\n return this.jsonParser(this.config);\n },\n },\n components: {\n JsonEditor,\n CustomCssEditor,\n CloudBackupRestore,\n RebuildApp,\n AppVersion,\n DownloadIcon,\n DeleteIcon,\n EditIcon,\n CloudIcon,\n CustomCssIcon,\n LanguageIcon,\n RebuildIcon,\n IconAbout,\n },\n methods: {\n /* Progamatically navigates to a given tab by index */\n navigateToTab(tabInxex) {\n const itemToSelect = this.$refs.tabView.navItems[tabInxex];\n this.$refs.tabView.activeTabItem(itemToSelect);\n },\n openRebuildAppModal() {\n this.$modal.show(modalNames.REBUILD_APP);\n },\n openAboutModal() {\n this.$modal.show(modalNames.ABOUT_APP);\n },\n openLanguageSwitchModal() {\n this.$modal.show(modalNames.LANG_SWITCHER);\n },\n openExportConfigModal() {\n this.$modal.show(modalNames.EXPORT_CONFIG_MENU);\n },\n /* Checks that the user is sure, then resets site-wide local storage, and reloads page */\n resetLocalSettings() {\n const msg = `${this.$t('config.reset-config-msg-l1')} `\n + `${this.$t('config.reset-config-msg-l2')}\\n\\n${this.$t('config.reset-config-msg-l3')}`;\n const isTheUserSure = confirm(msg); // eslint-disable-line no-alert, no-restricted-globals\n if (isTheUserSure) {\n localStorage.clear();\n this.$toasted.show(this.$t('config.data-cleared-msg'));\n this.$store.dispatch(StoreKeys.INITIALIZE_CONFIG);\n }\n },\n getLanguage() {\n const lang = getUsersLanguage();\n return lang ? `${lang.flag} ${lang.name}` : '';\n },\n /* If launching menu from editor, navigate to correct starting tab */\n navigateToStartingTab() {\n const navToTab = this.$store.state.navigateConfToTab;\n const isValidTabIndex = (indx) => typeof indx === 'number' && indx >= 0 && indx <= 5;\n if (navToTab && isValidTabIndex(navToTab)) this.navigateToTab(navToTab);\n this.$store.commit(StoreKeys.CONF_MENU_INDEX, undefined);\n },\n },\n mounted() {\n this.navigateToStartingTab();\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n@import '@/styles/media-queries.scss';\n\npre {\n color: var(--config-code-color);\n font-weight: bold !important;\n padding: 0.5rem 1rem;\n}\n\na.config-button, button.config-button {\n display: flex;\n align-items: center;\n padding: 0.5rem 1rem;\n margin: 0.25rem auto;\n font-size: 1.2rem;\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n border: 1px solid var(--config-settings-color);\n border-radius: var(--curve-factor);\n text-decoration: none;\n cursor: pointer;\n margin: 0.5rem auto;\n min-width: 18rem;\n width: 100%;\n svg.button-icon {\n path {\n fill: var(--config-settings-color);\n }\n width: 1rem;\n height: 1rem;\n padding: 0.2rem;\n margin-right: 0.5rem;\n }\n &:hover {\n background: var(--config-settings-color);\n color: var(--config-settings-background);\n svg path {\n fill: var(--config-settings-background);\n }\n }\n}\n\na.hyperlink-wrapper {\n margin: 0 auto;\n text-decoration: none;\n min-width: 18rem;\n width: 100%;\n}\n\np.app-version, p.language {\n margin: 0.5rem auto;\n font-size: 1rem;\n color: var(--transparent-white-50);\n cursor: default;\n}\n\ndiv.code-container {\n background: var(--config-code-background);\n #conf-yaml span {\n font-family: var(--font-monospace), monospace !important;\n &.hljs-attr {\n font-weight: bold !important;\n }\n }\n .yaml-action-buttons {\n position: absolute;\n top: 1.5rem;\n right: 0.5rem;\n display: flex;\n flex-direction: column;\n border: 1px dashed;\n padding: 0.5rem;\n border-radius: 4px;\n h2 {\n margin: 0;\n text-align: center;\n color: var(--config-code-color);\n }\n a.yaml-button {\n padding: 0.25rem 0.5rem;\n font-size: 1rem;\n color: var(--config-code-color);\n border-radius: var(--curve-factor);\n cursor: pointer;\n text-decoration: underline;\n border: 1px solid var(--config-code-background);\n &:hover {\n color: var(--config-code-color);\n border-color: var(--config-code-color);\n text-decoration: none;\n }\n &:active {\n color: var(--config-code-background);\n background-color: var(--config-settings-color);\n text-decoration: none;\n }\n }\n }\n}\n\n.tab-item {\n overflow-y: auto;\n @extend .scroll-bar;\n background: var(--config-settings-background);\n &.main-tab {\n min-height: 500px;\n }\n}\n\n.main-options-container {\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n\n.config-buttons {\n display: flex;\n flex-direction: column;\n background: var(--config-settings-background);\n height: calc(100% - 2rem);\n width: fit-content;\n margin: 0 auto;\n padding: 2rem 1rem 0;\n h2 {\n margin: 0 auto 1rem auto;\n color: var(--config-settings-color);\n }\n}\n\n.config-note {\n width: 80%;\n bottom: 1rem;\n left: 10%;\n margin: 0.5rem auto;\n padding: 0.5rem 0.75rem;\n border: 1px dashed var(--config-settings-color);\n border-radius: var(--curve-factor);\n text-align: left;\n opacity: var(--dimming-factor);\n color: var(--config-settings-color);\n background: var(--config-settings-background);\n cursor: default;\n p.sub-title {\n font-weight: bold;\n margin: 0;\n display: inline;\n }\n &:hover { opacity: 1; }\n display: none;\n @include tablet-up { display: block; }\n}\np.small-screen-note {\n @include phone {\n display: block !important;\n }\n margin: 0.5rem auto;\n padding: 0 0.5rem;\n text-align: center;\n opacity: 0.8;\n font-size: 0.9rem;\n color: var(--warning);\n }\n</style>\n\n<style lang=\"scss\">\n\n.tabs__content {\n height: -webkit-fill-available;\n height: -moz-available;\n height: stretch;\n height: 100%; // Firefox\n}\n\n.tab-item {\n background: var(--config-settings-background) !important;\n}\n\n.tab__pagination {\n background: var(--config-settings-background) !important;\n color: var(--config-settings-color) !important;\n .tab__nav__items .tab__nav__item {\n span {\n color: var(--config-settings-color) !important;\n }\n &:hover {\n background: var(--config-settings-color) !important;\n span {\n color: var(--config-settings-background) !important;\n }\n }\n &.active {\n span {\n font-weight: bold !important;\n color: var(--config-settings-color) !important;\n }\n }\n }\n .tab__nav__items .tab__nav__item.active {\n border-bottom: 2px solid var(--config-settings-color) !important;\n }\n hr.tab__slider {\n background: var(--config-settings-color) !important;\n }\n}\n\n#conf-yaml {\n background: var(--white);\n .hljs-attr {\n color: #9c03f5;\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigContainer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigContainer.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ConfigContainer.vue?vue&type=template&id=7b4f1c0a&scoped=true&\"\nimport script from \"./ConfigContainer.vue?vue&type=script&lang=js&\"\nexport * from \"./ConfigContainer.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ConfigContainer.vue?vue&type=style&index=0&id=7b4f1c0a&scoped=true&lang=scss&\"\nimport style1 from \"./ConfigContainer.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7b4f1c0a\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"language-switcher\"},[_c('h3',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t('language-switcher.title')))]),_c('p',{staticClass:\"intro\"},[_vm._v(_vm._s(_vm.$t('language-switcher.dropdown-label'))+\":\")]),_c('v-select',{staticClass:\"language-dropdown\",attrs:{\"selectOnTab\":true,\"options\":_vm.languageList,\"label\":\"friendlyName\",\"input\":_vm.applyLanguageLocally()},model:{value:(_vm.language),callback:function ($$v) {_vm.language=$$v},expression:\"language\"}}),_c('Button',{staticClass:\"save-button\",attrs:{\"click\":_vm.saveLanguage,\"disallow\":!_vm.language}},[_vm._v(\" \"+_vm._s(_vm.$t('language-switcher.save-button'))+\" \"),_c('SaveConfigIcon')],1),(_vm.language)?_c('p',{staticClass:\"current-lang\"},[_vm._v(\" 🌐 \"+_vm._s(_vm.language.flag)+\" \"+_vm._s(_vm.language.name)+\" \")]):_vm._e(),(_vm.$i18n.availableLocales.length <= 1)?_c('p',{staticClass:\"sad-times\"},[_vm._v(\" There are not currently any additional languages supported, but stay tuned as more are on their way! \")]):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"language-switcher\">\n <h3 class=\"title\">{{ $t('language-switcher.title') }}</h3>\n <p class=\"intro\">{{ $t('language-switcher.dropdown-label') }}:</p>\n <v-select\n v-model=\"language\"\n :selectOnTab=\"true\"\n :options=\"languageList\"\n class=\"language-dropdown\"\n label=\"friendlyName\"\n :input=\"applyLanguageLocally()\"\n />\n <Button class=\"save-button\" :click=\"saveLanguage\" :disallow=\"!language\">\n {{ $t('language-switcher.save-button') }}\n <SaveConfigIcon />\n </Button>\n <p v-if=\"language\" class=\"current-lang\">\n 🌐 {{ language.flag }} {{ language.name }}\n </p>\n <p v-if=\"$i18n.availableLocales.length <= 1\" class=\"sad-times\">\n There are not currently any additional languages supported,\n but stay tuned as more are on their way!\n </p>\n </div>\n</template>\n\n<script>\nimport Button from '@/components/FormElements/Button';\nimport SaveConfigIcon from '@/assets/interface-icons/save-config.svg';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport Keys from '@/utils/StoreMutations';\nimport { languages } from '@/utils/languages';\nimport { localStorageKeys, modalNames } from '@/utils/defaults';\n\nexport default {\n name: 'LanguageSwitcher',\n components: {\n Button,\n SaveConfigIcon,\n },\n data() {\n return {\n language: '', // The currently selected language\n modalName: modalNames.LANG_SWITCHER, // Key for modal\n };\n },\n created() {\n // Initiate the current language, with VueX state\n this.language = this.savedLanguage;\n },\n computed: {\n /* Get appConfig from store */\n appConfig() {\n return this.$store.getters.appConfig;\n },\n /* The ISO code for the users language, synced with VueX store */\n savedLanguage: {\n get() {\n return this.getIsoFromLangObj(this.$store.getters.appConfig.lang);\n },\n set(newLang) {\n this.$store.commit(Keys.SET_LANGUAGE, newLang.code);\n },\n },\n /* Return the array of language objects, plus a friends name */\n languageList: () => languages.map((lang) => {\n const newLang = lang;\n newLang.friendlyName = `${lang.flag} ${lang.name}`;\n return newLang;\n }),\n },\n methods: {\n /* Check if language is supported */\n checkLocale(selectedLanguage) {\n if (!selectedLanguage || !selectedLanguage.code) return false;\n const i18nLocales = this.$i18n.availableLocales;\n return i18nLocales.includes(selectedLanguage.code);\n },\n /* Apply language locally */\n applyLanguageLocally() {\n if (this.language && this.language.code) {\n this.$i18n.locale = this.language.code;\n } else {\n ErrorHandler('Error applying language, it\\'s config may be missing of incomplete');\n }\n },\n /* Save language to local storage, show success msg and close modal */\n saveLanguage() {\n const selectedLanguage = this.language;\n if (this.checkLocale(selectedLanguage)) {\n localStorage.setItem(localStorageKeys.LANGUAGE, selectedLanguage.code);\n this.applyLanguageLocally();\n this.savedLanguage = selectedLanguage;\n const successMsg = `${selectedLanguage.flag} `\n + `${this.$t('language-switcher.success-msg')} ${selectedLanguage.name}`;\n this.$toasted.show(successMsg, { className: 'toast-success' });\n this.$modal.hide(this.modalName);\n } else {\n this.$toasted.show('Unable to update language', { className: 'toast-error' });\n ErrorHandler('Unable to apply language');\n }\n },\n /* Gets the ISO code for a given language object */\n getIsoFromLangObj(langObj) {\n const getLanguageFromIso = (iso) => languages.find((lang) => lang.code === iso);\n return getLanguageFromIso(langObj);\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\n.language-switcher {\n height: 100%;\n margin: 0;\n padding: 1rem;\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n h3.title {\n text-align: center;\n }\n p.intro {\n margin: 0;\n }\n button.save-button {\n margin: 0 auto;\n width: 100%;\n }\n p.sad-times {\n color: var(--warning);\n text-align: center;\n }\n p.current-lang {\n color: var(--success);\n opacity: var(--dimming-factor);\n text-align: center;\n position: absolute;\n margin: 1rem auto;\n cursor: default;\n width: 100%;\n bottom: 0;\n }\n}\n\n</style>\n\n<style lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n.language-dropdown {\n margin: 1rem auto;\n ul.vs__dropdown-menu {\n max-height: 14rem;\n @extend .scroll-bar;\n }\n div.vs__dropdown-toggle {\n padding: 0.2rem 0;\n }\n div, input {\n cursor: pointer;\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LanguageSwitcher.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LanguageSwitcher.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./LanguageSwitcher.vue?vue&type=template&id=35dfeeb8&scoped=true&\"\nimport script from \"./LanguageSwitcher.vue?vue&type=script&lang=js&\"\nexport * from \"./LanguageSwitcher.vue?vue&type=script&lang=js&\"\nimport style0 from \"./LanguageSwitcher.vue?vue&type=style&index=0&id=35dfeeb8&scoped=true&lang=scss&\"\nimport style1 from \"./LanguageSwitcher.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"35dfeeb8\",\n null\n \n)\n\nexport default component.exports","<template>\n <div class=\"config-options\" v-click-outside=\"closeViewSwitcher\">\n <!-- Button and label -->\n <span class=\"config-label\">{{ $t('settings.config-launcher-label') }}</span>\n <div class=\"config-buttons\">\n <IconSpanner @click=\"showEditor()\" tabindex=\"-2\"\n v-tooltip=\"tooltip($t('settings.config-launcher-tooltip'))\" />\n <IconInteractiveEditor @click=\"startInteractiveEditor()\" tabindex=\"-2\"\n v-tooltip=\"tooltip(enterEditModeTooltip)\"\n :class=\"isEditMode ? 'disabled' : ''\" />\n <IconViewMode @click=\"openChangeViewMenu()\" tabindex=\"-2\"\n v-tooltip=\"tooltip($t('alternate-views.alternate-view-heading'))\" />\n </div>\n\n <!-- Modal containing all the configuration options -->\n <modal :name=\"modalNames.CONF_EDITOR\" :resizable=\"true\" width=\"60%\" height=\"85%\"\n @closed=\"editorClosed\" classes=\"dashy-modal\">\n <ConfigContainer :config=\"combineConfig()\" />\n </modal>\n\n <!-- Modal for manually changing locale -->\n <modal :name=\"modalNames.LANG_SWITCHER\" classes=\"dashy-modal\"\n :resizable=\"true\" width=\"35%\" height=\"60%\">\n <LanguageSwitcher />\n </modal>\n\n <!-- Menu for switching view -->\n <div v-if=\"viewSwitcherOpen\" class=\"view-switcher\">\n <ul>\n <li>\n <router-link to=\"/home\">\n <IconHome /><span>{{ $t('alternate-views.default') }}</span>\n </router-link>\n </li>\n <li>\n <router-link to=\"/minimal\">\n <IconMinimalView /><span>{{ $t('alternate-views.minimal') }}</span>\n </router-link>\n <li>\n <router-link to=\"/workspace\">\n <IconWorkspaceView /><span>{{ $t('alternate-views.workspace') }}</span>\n </router-link>\n </li>\n </ul>\n </div>\n </div>\n</template>\n\n<script>\n// Import components, and store-key identifiers\nimport ConfigContainer from '@/components/Configuration/ConfigContainer';\nimport LanguageSwitcher from '@/components/Settings/LanguageSwitcher';\nimport Keys from '@/utils/StoreMutations';\nimport { topLevelConfKeys, localStorageKeys, modalNames } from '@/utils/defaults';\n// Import icons for config launcher buttons\nimport IconSpanner from '@/assets/interface-icons/config-editor.svg';\nimport IconInteractiveEditor from '@/assets/interface-icons/interactive-editor-edit-mode.svg';\nimport IconViewMode from '@/assets/interface-icons/application-change-view.svg';\nimport IconHome from '@/assets/interface-icons/application-home.svg';\nimport IconWorkspaceView from '@/assets/interface-icons/open-workspace.svg';\nimport IconMinimalView from '@/assets/interface-icons/application-minimal.svg';\n\nexport default {\n name: 'ConfigLauncher',\n data() {\n return {\n modalNames,\n viewSwitcherOpen: false,\n };\n },\n components: {\n ConfigContainer,\n LanguageSwitcher,\n IconSpanner,\n IconInteractiveEditor,\n IconViewMode,\n IconHome,\n IconWorkspaceView,\n IconMinimalView,\n },\n computed: {\n sections() {\n return this.$store.getters.sections;\n },\n appConfig() {\n return this.$store.getters.appConfig;\n },\n pageInfo() {\n return this.$store.getters.pageInfo;\n },\n isEditMode() {\n return this.$store.state.editMode;\n },\n /* Tooltip text for Edit Mode button, to change depending on it in edit mode */\n enterEditModeTooltip() {\n return this.$t(\n `interactive-editor.menu.${this.isEditMode\n ? 'edit-mode-subtitle' : 'start-editing-tooltip'}`,\n );\n },\n },\n methods: {\n showEditor: function show() {\n this.$modal.show(modalNames.CONF_EDITOR);\n this.$store.commit(Keys.SET_MODAL_OPEN, true);\n },\n editorClosed: function show() {\n this.$store.commit(Keys.SET_MODAL_OPEN, false);\n },\n combineConfig() {\n const conf = {};\n conf[topLevelConfKeys.APP_CONFIG] = this.appConfig;\n conf[topLevelConfKeys.PAGE_INFO] = this.pageInfo;\n conf[topLevelConfKeys.SECTIONS] = this.sections;\n conf[topLevelConfKeys.APP_CONFIG].theme = localStorage[localStorageKeys.THEME]\n || conf[topLevelConfKeys.APP_CONFIG].theme;\n return conf;\n },\n tooltip(content) {\n return { content, trigger: 'hover focus', delay: 250 };\n },\n openChangeViewMenu() {\n this.viewSwitcherOpen = !this.viewSwitcherOpen;\n },\n closeViewSwitcher() {\n this.viewSwitcherOpen = false;\n },\n startInteractiveEditor() {\n if (!this.isEditMode) {\n this.$store.commit(Keys.SET_EDIT_MODE, true);\n }\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n\n.config-options {\n @extend .svg-button;\n display: flex;\n flex-direction: column;\n color: var(--settings-text-color);\n min-width: 3.2rem;\n}\n\n.view-switcher {\n position: absolute;\n right: 1rem;\n margin-top: 3rem;\n z-index: 5;\n background: var(--background);\n border: 1px solid var(--settings-text-color);\n border-radius: var(--curve-factor);\n box-shadow: var(--settings-container-shadow);\n ul {\n list-style: none;\n margin: 0;\n padding: 0;\n li {\n cursor: pointer;\n padding: 0.25rem 0.75rem;\n a {\n color: var(--settings-text-color);\n text-decoration: none;\n display: flex;\n align-items: center;\n }\n &:hover {\n background: var(--settings-text-color);\n a { color: var(--background); }\n }\n svg {\n margin: 0 0.25rem 0 0;\n border: none;\n }\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigLauncher.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigLauncher.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ConfigLauncher.vue?vue&type=template&id=e0bd5110&scoped=true&\"\nimport script from \"./ConfigLauncher.vue?vue&type=script&lang=js&\"\nexport * from \"./ConfigLauncher.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ConfigLauncher.vue?vue&type=style&index=0&id=e0bd5110&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"e0bd5110\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('span',{staticClass:\"options-label\"},[_vm._v(_vm._s(_vm.$t('settings.layout-label')))]),_c('div',{staticClass:\"display-options\"},[_c('IconDeafault',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.layout-auto'))),expression:\"tooltip($t('settings.layout-auto'))\"}],class:(\"layout-icon \" + (_vm.displayLayout === 'auto' ? 'selected' : '')),attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.updateDisplayLayout('auto')}}}),_c('IconHorizontal',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.layout-horizontal'))),expression:\"tooltip($t('settings.layout-horizontal'))\"}],class:(\"layout-icon \" + (_vm.displayLayout === 'horizontal' ? 'selected' : '')),attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.updateDisplayLayout('horizontal')}}}),_c('IconVertical',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.layout-vertical'))),expression:\"tooltip($t('settings.layout-vertical'))\"}],class:(\"layout-icon \" + (_vm.displayLayout === 'vertical' ? 'selected' : '')),attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.updateDisplayLayout('vertical')}}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div>\n <span class=\"options-label\">{{ $t('settings.layout-label') }}</span>\n <div class=\"display-options\">\n <IconDeafault\n @click=\"updateDisplayLayout('auto')\"\n v-tooltip=\"tooltip($t('settings.layout-auto'))\"\n :class=\"`layout-icon ${displayLayout === 'auto' ? 'selected' : ''}`\"\n tabindex=\"-2\"\n />\n <IconHorizontal\n @click=\"updateDisplayLayout('horizontal')\"\n v-tooltip=\"tooltip($t('settings.layout-horizontal'))\"\n :class=\"`layout-icon ${displayLayout === 'horizontal' ? 'selected' : ''}`\"\n tabindex=\"-2\"\n />\n <IconVertical\n @click=\"updateDisplayLayout('vertical')\"\n v-tooltip=\"tooltip($t('settings.layout-vertical'))\"\n :class=\"`layout-icon ${displayLayout === 'vertical' ? 'selected' : ''}`\"\n tabindex=\"-2\"\n />\n </div>\n </div>\n</template>\n\n<script>\nimport StoreKeys from '@/utils/StoreMutations';\nimport IconDeafault from '@/assets/interface-icons/layout-default.svg';\nimport IconHorizontal from '@/assets/interface-icons/layout-horizontal.svg';\nimport IconVertical from '@/assets/interface-icons/layout-vertical.svg';\n\nexport default {\n name: 'LayoutSelector',\n props: {\n displayLayout: String,\n },\n components: {\n IconDeafault,\n IconHorizontal,\n IconVertical,\n },\n methods: {\n updateDisplayLayout(layout) {\n this.$store.commit(StoreKeys.SET_ITEM_LAYOUT, layout);\n },\n tooltip(content) {\n return { content, trigger: 'hover focus', delay: 250 };\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\nspan.options-label {\n color: var(--settings-text-color);\n}\n\n.display-options {\n color: var(--settings-text-color);\n svg {\n path {\n fill: var(--settings-text-color);\n }\n width: 1rem;\n height: 1rem;\n margin: 0.2rem;\n padding: 0.2rem;\n text-align: center;\n background: var(--background);\n border: 1px solid currentColor;\n border-radius: var(--curve-factor);\n cursor: pointer;\n &:hover, &.selected {\n background: var(--settings-text-color);\n path { fill: var(--background); }\n }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LayoutSelector.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LayoutSelector.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./LayoutSelector.vue?vue&type=template&id=748b80da&scoped=true&\"\nimport script from \"./LayoutSelector.vue?vue&type=script&lang=js&\"\nexport * from \"./LayoutSelector.vue?vue&type=script&lang=js&\"\nimport style0 from \"./LayoutSelector.vue?vue&type=style&index=0&id=748b80da&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"748b80da\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('span',{staticClass:\"options-label\"},[_vm._v(_vm._s(_vm.$t('settings.item-size-label')))]),_c('div',{staticClass:\"display-options\"},[_c('IconSmall',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.item-size-small'))),expression:\"tooltip($t('settings.item-size-small'))\"}],class:(\"layout-icon \" + (_vm.iconSize === 'small' ? 'selected' : '')),attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.updateIconSize('small')}}}),_c('IconMedium',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.item-size-medium'))),expression:\"tooltip($t('settings.item-size-medium'))\"}],class:(\"layout-icon \" + (_vm.iconSize === 'medium' ? 'selected' : '')),attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.updateIconSize('medium')}}}),_c('IconLarge',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.item-size-large'))),expression:\"tooltip($t('settings.item-size-large'))\"}],class:(\"layout-icon \" + (_vm.iconSize === 'large' ? 'selected' : '')),attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.updateIconSize('large')}}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div>\n <span class=\"options-label\">{{ $t('settings.item-size-label') }}</span>\n <div class=\"display-options\">\n <IconSmall\n @click=\"updateIconSize('small')\"\n v-tooltip=\"tooltip($t('settings.item-size-small'))\"\n :class=\"`layout-icon ${iconSize === 'small' ? 'selected' : ''}`\"\n tabindex=\"-2\"\n />\n <IconMedium\n @click=\"updateIconSize('medium')\"\n v-tooltip=\"tooltip($t('settings.item-size-medium'))\"\n :class=\"`layout-icon ${iconSize === 'medium' ? 'selected' : ''}`\"\n tabindex=\"-2\"\n />\n <IconLarge\n @click=\"updateIconSize('large')\"\n v-tooltip=\"tooltip($t('settings.item-size-large'))\"\n :class=\"`layout-icon ${iconSize === 'large' ? 'selected' : ''}`\"\n tabindex=\"-2\"\n />\n </div>\n </div>\n</template>\n\n<script>\nimport StoreKeys from '@/utils/StoreMutations';\nimport IconSmall from '@/assets/interface-icons/icon-size-small.svg';\nimport IconMedium from '@/assets/interface-icons/icon-size-medium.svg';\nimport IconLarge from '@/assets/interface-icons/icon-size-large.svg';\n\nexport default {\n name: 'IconSizeSelector',\n data() {\n return {\n input: '',\n };\n },\n props: {\n iconSize: String,\n },\n components: {\n IconSmall,\n IconMedium,\n IconLarge,\n },\n methods: {\n updateIconSize(iconSize) {\n this.$store.commit(StoreKeys.SET_ITEM_SIZE, iconSize);\n },\n tooltip(content) {\n return { content, trigger: 'hover focus', delay: 250 };\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\nspan.options-label {\n color: var(--settings-text-color);\n}\n\n.display-options {\n color: var(--settings-text-color);\n svg {\n path {\n fill: var(--settings-text-color);\n }\n width: 1rem;\n height: 1rem;\n margin: 0.2rem;\n padding: 0.2rem;\n text-align: center;\n background: var(--background);\n border: 1px solid currentColor;\n border-radius: var(--curve-factor);\n cursor: pointer;\n &:hover, &.selected {\n background: var(--settings-text-color);\n path { fill: var(--background); }\n }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemSizeSelector.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemSizeSelector.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ItemSizeSelector.vue?vue&type=template&id=499e085c&scoped=true&\"\nimport script from \"./ItemSizeSelector.vue?vue&type=script&lang=js&\"\nexport * from \"./ItemSizeSelector.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ItemSizeSelector.vue?vue&type=style&index=0&id=499e085c&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"499e085c\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('span',{staticClass:\"user-type-note\"},[_vm._v(_vm._s(_vm.makeText()))]),_c('div',{staticClass:\"display-options\"},[(_vm.userType == _vm.userStateEnum.loggedIn)?_c('IconLogout',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.sign-out-tooltip'))),expression:\"tooltip($t('settings.sign-out-tooltip'))\"}],staticClass:\"layout-icon\",attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.logout()}}}):_vm._e(),(_vm.userType == _vm.userStateEnum.guestAccess)?_c('IconLogout',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.sign-in-tooltip'))),expression:\"tooltip($t('settings.sign-in-tooltip'))\"}],staticClass:\"layout-icon\",attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.goToLogin()}}}):_vm._e()],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div>\n <!-- If auth configured, show status text -->\n <span class=\"user-type-note\">{{ makeText() }}</span>\n <div class=\"display-options\">\n <!-- If user logged in, show logout button -->\n <IconLogout\n v-if=\"userType == userStateEnum.loggedIn\"\n @click=\"logout()\"\n v-tooltip=\"tooltip($t('settings.sign-out-tooltip'))\"\n class=\"layout-icon\" tabindex=\"-2\"\n />\n <!-- If not logged in, and gues mode enabled, show login button -->\n <IconLogout\n v-if=\"userType == userStateEnum.guestAccess\"\n @click=\"goToLogin()\"\n v-tooltip=\"tooltip($t('settings.sign-in-tooltip'))\"\n class=\"layout-icon\" tabindex=\"-2\"\n />\n </div>\n </div>\n</template>\n\n<script>\nimport router from '@/router';\nimport { logout as registerLogout } from '@/utils/Auth';\nimport { localStorageKeys, userStateEnum } from '@/utils/defaults';\nimport IconLogout from '@/assets/interface-icons/user-logout.svg';\n\nexport default {\n name: 'AuthButtons',\n components: {\n IconLogout,\n },\n props: {\n userType: Number,\n },\n data() {\n return {\n userStateEnum,\n };\n },\n methods: {\n logout() {\n registerLogout();\n this.$toasted.show(this.$t('login.logout-message'));\n setTimeout(() => {\n router.push({ path: '/login' });\n }, 500);\n },\n goToLogin() {\n router.push({ path: '/login' });\n },\n tooltip(content) {\n return { content, trigger: 'hover focus', delay: 250 };\n },\n makeText() {\n if (this.userType === userStateEnum.loggedIn) {\n const username = localStorage[localStorageKeys.USERNAME];\n return username ? this.$t('settings.sign-in-welcome', { username }) : '';\n }\n if (this.userType === userStateEnum.guestAccess) {\n return this.$t('settings.sign-in-tooltip');\n }\n return '';\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n\nspan.user-type-note {\n color: var(--settings-text-color);\n text-transform: capitalize;\n margin-right: 0.5rem;\n}\n\n.display-options {\n @extend .svg-button;\n color: var(--settings-text-color);\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AuthButtons.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AuthButtons.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AuthButtons.vue?vue&type=template&id=67393502&scoped=true&\"\nimport script from \"./AuthButtons.vue?vue&type=script&lang=js&\"\nexport * from \"./AuthButtons.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AuthButtons.vue?vue&type=style&index=0&id=67393502&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"67393502\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('transition',{attrs:{\"name\":\"slide-fade\"}},[(!_vm.shouldHide)?_c('div',{staticClass:\"kb-sc-info\"},[_c('h5',[_vm._v(\"There are keyboard shortcuts! ⌨️🙌\")]),_c('div',{staticClass:\"close\",attrs:{\"title\":\"Hide forever [Esc]\"},on:{\"click\":function($event){return _vm.hideWelcomeHelper()}}},[_vm._v(\"x\")]),_c('p',{attrs:{\"title\":\"Press [Esc] to hide this tip forever. See there's even a shortcut for that! 🚀\"}},[_vm._v(\" Just start typing to filter. Then use the tab key to cycle through results, and press enter to launch the selected item, or alt + enter to open in a modal. You can hit Esc at anytime to clear the search. Easy 🥳 \")])]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <transition name=\"slide-fade\">\n <div class=\"kb-sc-info\" v-if=\"!shouldHide\">\n <h5>There are keyboard shortcuts! ⌨️🙌</h5>\n <div class=\"close\" title=\"Hide forever [Esc]\" @click=\"hideWelcomeHelper()\">x</div>\n <p title=\"Press [Esc] to hide this tip forever. See there's even a shortcut for that! 🚀\">\n Just start typing to filter. Then use the tab key to cycle through results,\n and press enter to launch the selected item, or alt + enter to open in a modal.\n You can hit Esc at anytime to clear the search. Easy 🥳\n </p>\n </div>\n </transition>\n</template>\n\n<script>\n\nimport { localStorageKeys } from '@/utils/defaults';\n\nexport default {\n name: 'KeyboardShortcutInfo',\n data() {\n return {\n shouldHide: true, // False = show/ true = hide. Intuitive, eh?\n timeDelay: 3000, // Short delay in ms before popup appears\n };\n },\n methods: {\n /**\n * Returns true if the key exists in session storage, otherwise false\n * And the !! just converts 'false' to false, as strings resolve to true\n */\n shouldHideWelcomeMessage() {\n return !!localStorage[localStorageKeys.HIDE_WELCOME_BANNER];\n },\n /**\n * Update session storage, so that it won't be shown again\n * Trigger the hide function, and remove the event listerner\n */\n hideWelcomeHelper() {\n this.shouldHide = true;\n localStorage.setItem(localStorageKeys.HIDE_WELCOME_BANNER, true);\n window.removeEventListener('keyup', this.keyPressEvent);\n },\n /* Passed to window function, to add/ remove event listener */\n keyPressEvent(event) {\n if (event.keyCode === 27) this.hideWelcomeHelper();\n },\n },\n /**\n * Once mounted, if it's the users first time here, then we wait 3 seconds,\n * and show the helpfull little keyboard shortcut dialog.\n * Then we listen for the Esc key to be pressed, and hide the dialog.\n */\n mounted() {\n const shouldHide = this.shouldHideWelcomeMessage();\n if (!shouldHide) {\n window.setTimeout(() => { this.shouldHide = shouldHide; }, this.timeDelay);\n window.addEventListener('keyup', this.keyPressEvent);\n } else { // Meh, component not needed.\n // No point wasting valuable bytes of your 32GB Ram, lets kill it\n this.$destroy();\n }\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\n@import '@/styles/media-queries.scss';\n\n.kb-sc-info {\n position: fixed;\n width: 30em;\n bottom: 0;\n right: 10px;\n margin: 0.5em;\n padding: 0.1em 0.3em;\n z-index: 6;\n border-radius: 12px;\n border: 1px solid var(--welcome-popup-background);\n -webkit-box-shadow: 2px 1px 5px #130f23;\n box-shadow: 2px 1px 5px #130f23;\n border: 1px solid var(--welcome-popup-text-color);\n color: var(--welcome-popup-text-color);\n background: var(--welcome-popup-background);\n cursor: default;\n opacity: 0.94;\n @include phone {\n display: none;\n }\n h5 { /* The dialog title */\n position: absolute;\n top: -35px;\n left: 20px;\n border: 1px solid var(--welcome-popup-text-color);\n color: var(--welcome-popup-text-color);\n background: var(--welcome-popup-background);\n padding: 4px;\n border-radius: var(--curve-factor);\n }\n .close { /* The little exit icon, in top-right */\n float: right;\n border-radius: 20px;\n width: 1em;\n padding: 0 0 6px 6px;\n height: 1em;\n background: var(--transparent-50);\n margin-top: 3px;\n border: 1px solid transparent;\n cursor: pointer;\n &:hover {\n border: 1px solid var(--welcome-popup-text-color);\n opacity: var(--dimming-factor);\n }\n }\n}\n/* Animations, animations everywhere */\n.slide-fade-enter-active {\n transition: all 1s ease;\n}\n.slide-fade-leave-active {\n transition: all .8s cubic-bezier(.93,.01,.89,.5);\n}\n.slide-fade-enter, .slide-fade-leave-to {\n transform: translateY(35em);\n opacity: 0;\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KeyboardShortcutInfo.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KeyboardShortcutInfo.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./KeyboardShortcutInfo.vue?vue&type=template&id=c5f17d9a&scoped=true&\"\nimport script from \"./KeyboardShortcutInfo.vue?vue&type=script&lang=js&\"\nexport * from \"./KeyboardShortcutInfo.vue?vue&type=script&lang=js&\"\nimport style0 from \"./KeyboardShortcutInfo.vue?vue&type=style&index=0&id=c5f17d9a&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"c5f17d9a\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.modalName,\"resizable\":true,\"width\":\"55%\",\"height\":\"80%\",\"classes\":\"dashy-modal\"}},[_c('div',{staticClass:\"about-modal\"},[_c('router-link',{staticClass:\"title\",attrs:{\"to\":\"/about\"}},[_c('h2',[_vm._v(\"App Info\")])]),_c('h3',[_vm._v(\"Error Log\")]),(_vm.errorLog)?_c('pre',{staticClass:\"logs\"},[_c('code',[_vm._v(_vm._s(_vm.errorLog))])]):_c('p',[_vm._v(\"No recent errors detected :)\")]),_c('hr'),_c('h3',[_vm._v(\"Help & Support\")]),_vm._v(\" For getting support with running or configuring Dashy, see the \"),_c('a',{attrs:{\"href\":\"https://github.com/Lissy93/dashy/discussions\"}},[_vm._v(\"Discussions\")]),_c('h3',[_vm._v(\"Supporting Dashy\")]),_vm._v(\" For ways that you can get involved, check out the \"),_c('a',{attrs:{\"href\":\"https://github.com/Lissy93/dashy/blob/master/docs/contributing.md\"}},[_vm._v(\"Contributing\")]),_vm._v(\" page. \"),_c('h3',[_vm._v(\"Report a Bug\")]),_vm._v(\" If you think you've found a bug, then please \"),_c('a',{attrs:{\"href\":\"https://github.com/Lissy93/dashy/issues/new/choose\"}},[_vm._v(\"raise an Issue\")]),_vm._v(\". \"),_c('h3',[_vm._v(\"More Info\")]),_vm._v(\" Source: \"),_c('a',{attrs:{\"href\":\"https://github.com/lissy93/dashy\"}},[_vm._v(\"github.com/lissy93/dashy\")]),_c('br'),_vm._v(\" Documentation: \"),_c('a',{attrs:{\"href\":\"https://dashy.to/docs\"}},[_vm._v(\"dashy.to/docs\")]),_c('h3',[_vm._v(\"License\")]),_vm._v(\" Licensed under MIT X11. Copyright \"),_c('a',{attrs:{\"href\":\"https://aliciasykes.com\"}},[_vm._v(\"Alicia Sykes\")]),_vm._v(\" © 2021.\"),_c('br'),_vm._v(\" For licenses for third-party modules, please see \"),_c('a',{attrs:{\"href\":\"https://github.com/Lissy93/dashy/blob/master/.github/LEGAL.md\"}},[_vm._v(\"Legal\")]),_vm._v(\".\"),_c('br'),_vm._v(\" For the full list of contributors and thanks, see \"),_c('a',{attrs:{\"href\":\"https://github.com/Lissy93/dashy/blob/master/docs/credits.md\"}},[_vm._v(\"Credits\")]),_vm._v(\". \"),_c('h3',[_vm._v(\"Version\")]),_c('AppVersion',{staticClass:\"app-version\"})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <modal :name=\"modalName\" :resizable=\"true\" width=\"55%\" height=\"80%\" classes=\"dashy-modal\">\n <div class=\"about-modal\">\n <router-link to=\"/about\" class=\"title\"><h2>App Info</h2></router-link>\n <!-- Error Log -->\n <h3>Error Log</h3>\n <pre v-if=\"errorLog\" class=\"logs\"><code>{{ errorLog }}</code></pre>\n <p v-else>No recent errors detected :)</p>\n <hr />\n <!-- Help Links -->\n <h3>Help & Support</h3>\n For getting support with running or configuring Dashy, see the <a href=\"https://github.com/Lissy93/dashy/discussions\">Discussions</a>\n <h3>Supporting Dashy</h3>\n For ways that you can get involved, check out the <a href=\"https://github.com/Lissy93/dashy/blob/master/docs/contributing.md\">Contributing</a> page.\n <h3>Report a Bug</h3>\n If you think you've found a bug, then please <a href=\"https://github.com/Lissy93/dashy/issues/new/choose\">raise an Issue</a>.\n <h3>More Info</h3>\n Source: <a href=\"https://github.com/lissy93/dashy\">github.com/lissy93/dashy</a><br>\n Documentation: <a href=\"https://dashy.to/docs\">dashy.to/docs</a>\n <!-- License -->\n <h3>License</h3>\n Licensed under MIT X11. Copyright <a href=\"https://aliciasykes.com\">Alicia Sykes</a> © 2021.<br>\n For licenses for third-party modules, please see <a href=\"https://github.com/Lissy93/dashy/blob/master/.github/LEGAL.md\">Legal</a>.<br>\n For the full list of contributors and thanks, see <a href=\"https://github.com/Lissy93/dashy/blob/master/docs/credits.md\">Credits</a>.\n <!-- App Version -->\n <h3>Version</h3>\n <AppVersion class=\"app-version\" />\n </div>\n </modal>\n</template>\n\n<script>\nimport AppVersion from '@/components/Configuration/AppVersion';\nimport { modalNames, sessionStorageKeys } from '@/utils/defaults';\n\nexport default {\n name: 'AppInfoModal',\n components: {\n AppVersion,\n },\n data() {\n return {\n modalName: modalNames.ABOUT_APP,\n appVersion: process.env.VUE_APP_VERSION,\n errorLog: this.getErrorLog(),\n };\n },\n methods: {\n getErrorLog() {\n return sessionStorage.getItem(sessionStorageKeys.ERROR_LOG) || '';\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\nspan.options-label {\n color: var(--settings-text-color);\n}\n\ndiv.about-modal {\n background: var(--about-page-background);\n color: var(--about-page-color);\n overflow-y: auto;\n padding: 0 1rem;\n height: 100%;\n p, ul li, a {\n font-size: 1rem;\n }\n\n a.title {\n text-decoration: none;\n h2 {\n font-size: 1.8rem;\n text-align: center;\n margin: 1rem;\n }\n }\n h3 {\n font-size: 1.2rem;\n margin: 0.75rem 0 0.2rem 0;\n color: var(--about-page-accent);\n }\n a {\n color: var(--about-page-accent);\n }\n a.info {\n text-decoration: underline;\n margin-left: 0.2rem;\n }\n .app-version {\n text-align: left;\n }\n pre.logs {\n max-height: 200px;\n overflow-y: auto;\n padding: 1rem;\n font-size: 0.75rem;\n border-radius: var(--curve-factor-small);\n text-align: left;\n color: var(--white);\n background: var(--black);\n white-space: pre-wrap;\n }\n}\n\n</style>\n\n<style lang=\"scss\">\ndiv.about-modal {\n .app-version {\n text-align: left;\n display: flex;\n align-items: self-end;\n p { margin: 0; }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppInfoModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppInfoModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AppInfoModal.vue?vue&type=template&id=774db33a&scoped=true&\"\nimport script from \"./AppInfoModal.vue?vue&type=script&lang=js&\"\nexport * from \"./AppInfoModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AppInfoModal.vue?vue&type=style&index=0&id=774db33a&scoped=true&lang=scss&\"\nimport style1 from \"./AppInfoModal.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"774db33a\",\n null\n \n)\n\nexport default component.exports","<template>\n <section>\n <SearchBar ref=\"SearchBar\"\n @user-is-searchin=\"userIsTypingSomething\"\n v-if=\"searchVisible\"\n />\n <div class=\"options-outer\">\n <div :class=\"`options-container ${!settingsVisible ? 'hide' : ''}`\">\n <ThemeSelector />\n <LayoutSelector :displayLayout=\"displayLayout\" />\n <ItemSizeSelector :iconSize=\"iconSize\" />\n <ConfigLauncher />\n <AuthButtons v-if=\"userState != 'noone'\" :userType=\"userState\" />\n </div>\n <div :class=\"`show-hide-container ${settingsVisible? 'hide-btn' : 'show-btn'}`\">\n <button @click=\"toggleSettingsVisibility()\"\n v-tooltip=\"`${settingsVisible? 'Hide' : 'Open'} Settings Menu`\" tabindex=\"-2\">\n <IconClose v-if=\"settingsVisible\" />\n <IconOpen v-else />\n </button>\n </div>\n </div>\n <KeyboardShortcutInfo />\n <AppInfoModal />\n </section>\n</template>\n\n<script>\nimport SearchBar from '@/components/Settings/SearchBar';\nimport ConfigLauncher from '@/components/Settings/ConfigLauncher';\nimport ThemeSelector from '@/components/Settings/ThemeSelector';\nimport LayoutSelector from '@/components/Settings/LayoutSelector';\nimport ItemSizeSelector from '@/components/Settings/ItemSizeSelector';\nimport AuthButtons from '@/components/Settings/AuthButtons';\nimport KeyboardShortcutInfo from '@/components/Settings/KeyboardShortcutInfo';\nimport AppInfoModal from '@/components/Configuration/AppInfoModal';\nimport IconOpen from '@/assets/interface-icons/config-open-settings.svg';\nimport IconClose from '@/assets/interface-icons/config-close.svg';\nimport {\n localStorageKeys,\n visibleComponents as defaultVisibleComponents,\n} from '@/utils/defaults';\n\nimport { getUserState } from '@/utils/Auth';\n\nexport default {\n name: 'SettingsContainer',\n props: {\n displayLayout: String,\n iconSize: String,\n externalThemes: Object,\n },\n components: {\n SearchBar,\n ConfigLauncher,\n ThemeSelector,\n LayoutSelector,\n ItemSizeSelector,\n AuthButtons,\n KeyboardShortcutInfo,\n AppInfoModal,\n IconOpen,\n IconClose,\n },\n data() {\n return {\n settingsVisible: true,\n };\n },\n computed: {\n sections() {\n return this.$store.getters.sections;\n },\n appConfig() {\n return this.$store.getters.appConfig;\n },\n pageInfo() {\n return this.$store.getters.pageInfo;\n },\n /**\n * Determines which button should display, based on the user type\n * 0 = Auth not configured, don't show anything\n * 1 = Auth condifured, and user logged in, show logout button\n * 2 = Auth configured, guest access enabled, and not logged in, show login\n * Note that if auth is enabled, but not guest access, and user not logged in,\n * then they will never be able to view the homepage, so no button needed\n */\n userState() {\n return getUserState();\n },\n /* Object indicating which components should be hidden, based on user preferences */\n visibleComponents() {\n return this.$store.getters.visibleComponents;\n },\n searchVisible() {\n return this.$store.getters.visibleComponents.searchBar;\n },\n },\n mounted() {\n this.settingsVisible = this.getSettingsVisibility();\n },\n methods: {\n userIsTypingSomething(something) {\n this.$emit('user-is-searchin', something);\n },\n clearFilterInput() {\n this.$refs.SearchBar.clearFilterInput();\n },\n getInitialTheme() {\n return this.appConfig.theme || '';\n },\n /* Gets user themes if available */\n getUserThemes() {\n const userThemes = this.appConfig.cssThemes || [];\n if (typeof userThemes === 'string') return [userThemes];\n return userThemes;\n },\n toggleSettingsVisibility() {\n this.settingsVisible = !this.settingsVisible;\n localStorage.setItem(localStorageKeys.HIDE_SETTINGS, this.settingsVisible);\n },\n getSettingsVisibility() {\n const screenWidth = document.body.clientWidth;\n if (screenWidth && screenWidth < 600) return false;\n return JSON.parse(localStorage[localStorageKeys.HIDE_SETTINGS]\n || (this.visibleComponents || defaultVisibleComponents).settings);\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\n@import '@/styles/media-queries.scss';\n\n section {\n display: flex;\n align-items: center;\n align-items: stretch;\n background: linear-gradient(0deg, var(--background) 0%, var(--background-darker) 100%);\n box-shadow: var(--settings-container-shadow);\n }\n .options-outer {\n display: flex;\n position: relative;\n flex: 1;\n background: var(--settings-background);\n border-radius: var(--curve-factor-navbar);\n }\n .options-container {\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n justify-content: flex-end;\n flex: 1;\n padding: 0.5rem 1.5rem 0.5rem 1rem;\n border-radius: var(--curve-factor-navbar) 0 0;\n background: var(--settings-background);\n div {\n margin-left: 0.5rem;\n opacity: var(--dimming-factor);\n opacity: 1;\n &:hover { opacity: 1; }\n }\n &.hide {\n display: none;\n }\n @include very-tiny-phone {\n flex-direction: column;\n align-items: baseline;\n div {\n width: 100%;\n text-align: center;\n .theme-selector-section { justify-content: center; }\n }\n }\n }\n\n .show-hide-container {\n display: flex;\n // align-items: center;\n background: var(--settings-background);\n color: var(--settings-text-color);\n width: 1.5rem;\n position: absolute;\n top: 4px;\n right: 4px;\n &.show-btn {\n width: 2rem;\n top: 0.5rem;\n right: 0.5rem;\n @include phone {\n top: -3rem !important;\n }\n }\n button {\n width: 100%;\n padding: 2px 2px 0 2px;\n margin: 2px;\n border-radius: var(--curve-factor);\n height: fit-content;\n background: none;\n border: none;\n color: var(--settings-text-color);\n cursor: pointer;\n opacity: var(--dimming-factor);\n }\n &:hover button {\n background: var(--settings-text-color);\n color: var(--settings-background);\n }\n }\n\n @include tablet {\n section {\n display: block;\n margin: 0 auto;\n background: none;\n .options-container {\n justify-content: center;\n }\n }\n }\n\n @include phone {\n .options-container, .show-hide-button {\n // display: none;\n }\n }\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SettingsContainer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SettingsContainer.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SettingsContainer.vue?vue&type=template&id=37c7f086&scoped=true&\"\nimport script from \"./SettingsContainer.vue?vue&type=script&lang=js&\"\nexport * from \"./SettingsContainer.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SettingsContainer.vue?vue&type=style&index=0&id=37c7f086&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"37c7f086\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Collapsable',{attrs:{\"title\":_vm.title,\"icon\":_vm.icon,\"uniqueKey\":_vm.groupId,\"collapsed\":_vm.displayData.collapsed,\"cols\":_vm.displayData.cols,\"rows\":_vm.displayData.rows,\"color\":_vm.displayData.color,\"customStyles\":_vm.displayData.customStyles},on:{\"openEditSection\":_vm.openEditSection,\"openContextMenu\":_vm.openContextMenu}},[((!_vm.items || _vm.items.length < 1) && !_vm.isEditMode)?_c('div',{staticClass:\"no-items\"},[_vm._v(\" No Items to Show Yet \")]):_c('div',{class:(\"there-are-items \" + (_vm.isGridLayout? 'item-group-grid': '') + \" inner-size-\" + _vm.itemSize),style:(_vm.gridStyle),attrs:{\"id\":(\"section-\" + _vm.groupId)}},[_vm._l((_vm.sortedItems),function(item){return _c('Item',{key:item.id,attrs:{\"id\":item.id,\"url\":item.url,\"title\":item.title,\"description\":item.description,\"icon\":item.icon,\"target\":item.target,\"color\":item.color,\"backgroundColor\":item.backgroundColor,\"statusCheckUrl\":item.statusCheckUrl,\"statusCheckHeaders\":item.statusCheckHeaders,\"itemSize\":_vm.newItemSize,\"hotkey\":item.hotkey,\"provider\":item.provider,\"parentSectionTitle\":_vm.title,\"enableStatusCheck\":_vm.shouldEnableStatusCheck(item.statusCheck),\"statusCheckInterval\":_vm.getStatusCheckInterval(),\"statusCheckAllowInsecure\":item.statusCheckAllowInsecure,\"isAddNew\":false},on:{\"itemClicked\":function($event){return _vm.$emit('itemClicked')},\"triggerModal\":_vm.triggerModal}})}),(_vm.isEditMode)?_c('Item',{key:\"add-new\",staticClass:\"add-new-item\",attrs:{\"isAddNew\":true,\"parentSectionTitle\":_vm.title,\"icon\":\":heavy_plus_sign:\",\"id\":\"add-new\",\"title\":\"Add New Item\",\"description\":\"Click to add new item\",\"itemSize\":_vm.newItemSize}}):_vm._e(),_c('div',{ref:\"modalContainer\"})],2),_c('IframeModal',{ref:(\"iframeModal-\" + _vm.groupId),attrs:{\"name\":(\"iframeModal-\" + _vm.groupId)},on:{\"closed\":function($event){return _vm.$emit('itemClicked')}}}),(_vm.editMenuOpen)?_c('EditSection',{attrs:{\"sectionIndex\":_vm.index,\"isAddNew\":false},on:{\"closeEditSection\":_vm.closeEditSection}}):_vm._e(),_c('ContextMenu',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(_vm.closeContextMenu),expression:\"closeContextMenu\"}],attrs:{\"show\":_vm.contextMenuOpen,\"posX\":_vm.contextPos.posX,\"posY\":_vm.contextPos.posY,\"id\":(\"context-menu-\" + _vm.groupId)},on:{\"openEditSection\":_vm.openEditSection,\"navigateToSection\":_vm.navigateToSection,\"removeSection\":_vm.removeSection}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:(\"item-wrapper wrap-size-\" + _vm.itemSize)},[_c('a',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.getTooltipOptions()),expression:\"getTooltipOptions()\"}],class:(\"item \" + _vm.makeClassList),style:((\"--open-icon: \" + (_vm.getUnicodeOpeningIcon()) + \"; \" + _vm.customStyles)),attrs:{\"href\":_vm.hyperLinkHref,\"target\":_vm.anchorTarget,\"rel\":\"noopener noreferrer\",\"tabindex\":\"0\",\"id\":(\"link-\" + _vm.id)},on:{\"click\":_vm.itemOpened,\"mouseup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"right\",39,$event.key,[\"Right\",\"ArrowRight\"])){ return null; }if('button' in $event && $event.button !== 2){ return null; }return _vm.openContextMenu.apply(null, arguments)},\"contextmenu\":function($event){$event.preventDefault();}}},[_c('div',{class:(\"tile-title \" + (!_vm.icon? 'bounce no-icon': '')),attrs:{\"id\":(\"tile-\" + _vm.id)}},[_c('span',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.title))]),_c('p',{staticClass:\"description\"},[_vm._v(_vm._s(_vm.description))])]),_c('Icon',{staticClass:\"bounce\",style:(_vm.customStyles),attrs:{\"icon\":_vm.icon,\"url\":_vm.url,\"size\":_vm.itemSize,\"color\":_vm.color}}),_c('ItemOpenMethodIcon',{staticClass:\"opening-method-icon\",attrs:{\"isSmall\":!_vm.icon || _vm.itemSize === 'small',\"openingMethod\":_vm.accumulatedTarget,\"position\":\"bottom right\",\"hotkey\":_vm.hotkey}}),(_vm.enableStatusCheck)?_c('StatusIndicator',{staticClass:\"status-indicator\",attrs:{\"statusSuccess\":_vm.statusResponse ? _vm.statusResponse.successStatus : undefined,\"statusText\":_vm.statusResponse ? _vm.statusResponse.message : undefined}}):_vm._e(),(_vm.isEditMode)?_c('EditModeIcon',{staticClass:\"edit-mode-item\",on:{\"click\":function($event){return _vm.openItemSettings()}}}):_vm._e()],1),_c('ContextMenu',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(_vm.closeContextMenu),expression:\"closeContextMenu\"}],attrs:{\"show\":_vm.contextMenuOpen && !_vm.isAddNew,\"posX\":_vm.contextPos.posX,\"posY\":_vm.contextPos.posY,\"id\":(\"context-menu-\" + _vm.id)},on:{\"launchItem\":_vm.launchItem,\"openItemSettings\":_vm.openItemSettings,\"openMoveItemMenu\":_vm.openMoveItemMenu,\"openDeleteItem\":_vm.openDeleteItem}}),(_vm.isEditMode)?_c('MoveItemTo',{attrs:{\"itemId\":_vm.id}}):_vm._e(),(_vm.editMenuOpen)?_c('EditItem',{attrs:{\"itemId\":_vm.id,\"isNew\":_vm.isAddNew,\"parentSectionTitle\":_vm.parentSectionTitle},on:{\"closeEditMenu\":_vm.closeEditMenu}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:(\"item-icon wrapper-\" + _vm.size)},[(_vm.iconType === 'font-awesome')?_c('i',{class:(_vm.icon + \" \" + _vm.size)}):(_vm.iconType === 'emoji')?_c('i',{class:(\"emoji-icon \" + _vm.size)},[_vm._v(_vm._s(_vm.getEmoji(_vm.iconPath)))]):(_vm.iconType === 'mdi')?_c('span',{class:(\"mdi \" + _vm.icon + \" \" + _vm.size)}):(_vm.iconType === 'si')?_c('svg',{class:(\"simple-icons \" + _vm.size),attrs:{\"role\":\"img\",\"viewBox\":\"0 0 24 24\",\"xmlns\":\"http://www.w3.org/2000/svg\"}},[_c('path',{attrs:{\"d\":_vm.getSimpleIcon(_vm.icon)}})]):(_vm.icon)?_c('img',{class:(\"tile-icon \" + _vm.size + \" \" + (_vm.broken ? 'broken' : '')),attrs:{\"src\":_vm.iconPath},on:{\"error\":_vm.imageNotFound}}):_vm._e(),(_vm.broken)?_c('BrokenImage',{staticClass:\"missing-image\"}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div :class=\"`item-icon wrapper-${size}`\">\n <!-- Font-Awesome Icon -->\n <i v-if=\"iconType === 'font-awesome'\" :class=\"`${icon} ${size}`\" ></i>\n <!-- Emoji Icon -->\n <i v-else-if=\"iconType === 'emoji'\" :class=\"`emoji-icon ${size}`\" >{{getEmoji(iconPath)}}</i>\n <!-- Material Design Icon -->\n <span v-else-if=\"iconType === 'mdi'\" :class=\" `mdi ${icon} ${size}`\"></span>\n <!-- Simple-Icons -->\n <svg v-else-if=\"iconType === 'si'\" :class=\"`simple-icons ${size}`\" role=\"img\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path :d=\"getSimpleIcon(icon)\" />\n </svg>\n <!-- Standard image asset icon -->\n <img v-else-if=\"icon\" :src=\"iconPath\" @error=\"imageNotFound\"\n :class=\"`tile-icon ${size} ${broken ? 'broken' : ''}`\"\n />\n <!-- Icon could not load/ broken url -->\n <BrokenImage v-if=\"broken\" class=\"missing-image\" />\n </div>\n</template>\n\n<script>\nimport simpleIcons from 'simple-icons';\nimport BrokenImage from '@/assets/interface-icons/broken-icon.svg';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport EmojiUnicodeRegex from '@/utils/EmojiUnicodeRegex';\nimport emojiLookup from '@/utils/emojis.json';\nimport { faviconApi as defaultFaviconApi, faviconApiEndpoints, iconCdns } from '@/utils/defaults';\nimport { asciiHash } from '@/utils/MiscHelpers';\n\nexport default {\n name: 'Icon',\n props: {\n icon: String, // Path to icon asset\n url: String, // Used for fetching the favicon\n size: String, // Either small, medium or large\n },\n components: {\n BrokenImage,\n },\n computed: {\n /* Get appConfig from store */\n appConfig() {\n return this.$store.getters.appConfig;\n },\n /* Determines the type of icon */\n iconType: function iconType() {\n return this.determineImageType(this.icon);\n },\n /* Gets the icon path, dependent on icon type */\n iconPath: function iconPath() {\n return this.getIconPath(this.icon, this.url);\n },\n },\n data() {\n return {\n broken: false, // If true, was unable to resolve icon\n };\n },\n methods: {\n /* Check if a string is in a URL format. Used to identify tile icon source */\n isUrl(str) {\n const pattern = new RegExp(/(http|https):\\/\\/(\\w+:{0,1}\\w*)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%!\\-/]))?/);\n return pattern.test(str);\n },\n /* Returns true if the input is a path to an image file */\n isImage(img) {\n const fileExtRegex = /(?:\\.([^.]+))?$/;\n const validImgExtensions = ['svg', 'png', 'jpg'];\n const splitPath = fileExtRegex.exec(img);\n if (splitPath.length >= 1) return validImgExtensions.includes(splitPath[1]);\n return false;\n },\n /* Determins if a given string is an emoji, and if so what type it is */\n isEmoji(img) {\n if (EmojiUnicodeRegex.test(img) && img.match(/./gu).length) { // Is a unicode emoji\n return { isEmoji: true, emojiType: 'glyph' };\n } else if (new RegExp(/^:.*:$/).test(img)) { // Is a shortcode emoji\n return { isEmoji: true, emojiType: 'shortcode' };\n } else if (img.substring(0, 2) === 'U+' && img.length === 7) {\n return { isEmoji: true, emojiType: 'unicode' };\n }\n return { isEmoji: false, emojiType: '' };\n },\n /* Formats and gets emoji from unicode or shortcode */\n getEmoji(emojiCode) {\n const { emojiType } = this.isEmoji(emojiCode);\n if (emojiType === 'shortcode') {\n if (emojiLookup[emojiCode]) return emojiLookup[emojiCode];\n } else if (emojiType === 'unicode') {\n return String.fromCodePoint(parseInt(emojiCode.substr(2), 16));\n }\n return emojiCode; // Emoji is a glyph already, just return\n },\n /* Get favicon URL, for items which use the favicon as their icon */\n getFavicon(fullUrl, specificApi) {\n if (this.shouldUseDefaultFavicon(fullUrl)) { // Check if we should use local icon\n const urlParts = fullUrl.split('/');\n if (urlParts.length >= 2) return `${urlParts[0]}/${urlParts[1]}/${urlParts[2]}/${iconCdns.faviconName}`;\n } else if (fullUrl.includes('http')) { // Service is running publicly\n const host = this.getHostName(fullUrl);\n const faviconApi = specificApi || this.appConfig.faviconApi || defaultFaviconApi;\n const endpoint = faviconApiEndpoints[faviconApi];\n return endpoint.replace('$URL', host);\n }\n return '';\n },\n /* Get the URL for a favicon, but using the non-default favicon API */\n getCustomFavicon(fullUrl, faviconIdentifier) {\n const faviconApi = faviconIdentifier.split('favicon-')[1];\n if (!faviconApi) {\n ErrorHandler('Favicon API not specified');\n } else if (!Object.keys(faviconApiEndpoints).includes(faviconApi)) {\n ErrorHandler(`The specified favicon API, '${faviconApi}' cannot be found.`);\n } else {\n return this.getFavicon(fullUrl, faviconApi);\n }\n // Error encountered, favicon service not found\n this.broken = true;\n return undefined;\n },\n /* If using favicon for icon, and if service is running locally (determined by local IP) */\n /* or if user prefers local favicon, then return true */\n shouldUseDefaultFavicon(fullUrl) {\n const isLocalIP = /(127\\.)|(192\\.168\\.)|(10\\.)|(172\\.1[6-9]\\.)|(172\\.2[0-9]\\.)|(172\\.3[0-1]\\.)|(::1$)|([fF][cCdD])|(localhost)/;\n return (isLocalIP.test(fullUrl) || this.appConfig.faviconApi === 'local');\n },\n /* Fetches the path of local images, from Docker container */\n getLocalImagePath(img) {\n return `${iconCdns.localPath}/${img}`;\n },\n /* Formats the URL for fetching the generative icons */\n getGenerativeIcon(url) {\n const host = encodeURI(url) || Math.random().toString();\n return iconCdns.generative.replace('{icon}', asciiHash(host));\n },\n /* Returns the SVG path content */\n getSimpleIcon(img) {\n const imageName = img.replace('si-', '');\n const icon = simpleIcons.Get(imageName);\n return icon.path;\n },\n /* Gets home-lab icon from GitHub */\n getHomeLabIcon(img) {\n const imageName = img.replace('hl-', '').toLocaleLowerCase();\n return iconCdns.homeLabIcons.replace('{icon}', imageName);\n },\n /* Checks if the icon is from a local image, remote URL, SVG or font-awesome */\n getIconPath(img, url) {\n switch (this.determineImageType(img)) {\n case 'url': return img;\n case 'img': return this.getLocalImagePath(img);\n case 'favicon': return this.getFavicon(url);\n case 'custom-favicon': return this.getCustomFavicon(url, img);\n case 'generative': return this.getGenerativeIcon(url);\n case 'mdi': return img; // Material design icons\n case 'simple-icons': return this.getSimpleIcon(img);\n case 'home-lab-icons': return this.getHomeLabIcon(img);\n case 'svg': return img; // Local SVG icon\n case 'emoji': return img; // Emoji/ unicode\n default: return '';\n }\n },\n /* Checks if the icon is from a local image, remote URL, SVG or font-awesome */\n determineImageType(img) {\n let imgType = '';\n if (!img) imgType = 'none';\n else if (this.isUrl(img)) imgType = 'url';\n else if (this.isImage(img)) imgType = 'img';\n else if (img.includes('fa-')) imgType = 'font-awesome';\n else if (img.includes('mdi-')) imgType = 'mdi';\n else if (img.includes('si-')) imgType = 'si';\n else if (img.includes('hl-')) imgType = 'home-lab-icons';\n else if (img.includes('favicon-')) imgType = 'custom-favicon';\n else if (img === 'favicon') imgType = 'favicon';\n else if (img === 'generative') imgType = 'generative';\n else if (this.isEmoji(img).isEmoji) imgType = 'emoji';\n else imgType = 'none';\n return imgType;\n },\n /* For a given URL, return the hostname only. Used for favicon and generative icons */\n getHostName(url) {\n try { return new URL(url).hostname; } catch (e) { return url; }\n },\n /* Called when the path to the image cannot be resolved */\n imageNotFound() {\n this.broken = true;\n ErrorHandler(`The path to '${this.icon}' could not be resolved`);\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n\n/* Icon wraper */\n.item-icon {\n &.wrapper-medium {\n min-height: 2.5rem;\n }\n &.wrapper-large {\n min-width: 3.5rem;\n text-align: center;\n }\n}\n\n /* Default Image Icon */\n .tile-icon {\n min-width: 1rem;\n max-width: 2rem;\n min-height: 1rem;\n max-height: 2rem;\n object-fit: cover;\n filter: var(--item-icon-transform);\n border-radius: var(--curve-factor);\n &.small {\n max-width: 1.5rem;\n max-height: 1.5rem;\n }\n &.large {\n max-width: 3rem;\n max-height: 3rem;\n }\n &.broken {\n display: none;\n }\n }\n /* Font-Awesome and Material Design Icons */\n i.fas, i.fab, i.far, i.fal, i.fad, span.mdi {\n font-size: 2rem;\n color: currentColor;\n margin: 1px 4px;\n &.small {\n font-size: 1.5rem;\n }\n &.large {\n font-size: 2.5rem;\n }\n }\n span.mdi {\n font-size: 2.5rem;\n }\n object.tile-icon {\n width: 55px;\n height: 55px;\n svg, svg g, svg g path {\n fill: currentColor;\n }\n }\n /* Simple Icons */\n .item-icon .simple-icons {\n width: 2rem;\n &.small { width: 1.5rem; }\n &.large { width: 2.5rem; }\n }\n\n .item-icon .simple-icons path {\n fill: currentColor;\n }\n /* Emoji Icons */\n i.emoji-icon {\n font-style: normal;\n font-size: 2rem;\n margin: 0.2rem;\n &.small {\n font-size: 1.5rem;\n }\n &.large {\n font-size: 2.5rem;\n }\n }\n /* Icon Not Found */\n .missing-image {\n width: 3.5rem;\n path {\n fill: currentColor;\n }\n }\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemIcon.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemIcon.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ItemIcon.vue?vue&type=template&id=d4b15db4&\"\nimport script from \"./ItemIcon.vue?vue&type=script&lang=js&\"\nexport * from \"./ItemIcon.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ItemIcon.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{class:_vm.makeClass(_vm.position, _vm.isSmall, _vm.isTransparent)},[(_vm.openingMethod === 'newtab')?_c('NewTabOpenIcon'):(_vm.openingMethod === 'sametab')?_c('SameTabOpenIcon'):(_vm.openingMethod === 'modal')?_c('IframeOpenIcon'):(_vm.openingMethod === 'workspace')?_c('WorkspaceOpenIcon'):(_vm.openingMethod === 'parent')?_c('ParentOpenIcon'):(_vm.openingMethod === 'top')?_c('TopOpenIcon'):_c('UnknownIcon')],1),(_vm.hotkey)?_c('div',{class:(\"hotkey-denominator \" + (_vm.makeClass(_vm.position, _vm.isSmall, _vm.isTransparent)))},[_vm._v(\" \"+_vm._s(_vm.hotkey)+\" \")]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div>\n <div :class=\"makeClass(position, isSmall, isTransparent)\">\n <NewTabOpenIcon v-if=\"openingMethod === 'newtab'\" />\n <SameTabOpenIcon v-else-if=\"openingMethod === 'sametab'\" />\n <IframeOpenIcon v-else-if=\"openingMethod === 'modal'\" />\n <WorkspaceOpenIcon v-else-if=\"openingMethod === 'workspace'\" />\n <ParentOpenIcon v-else-if=\"openingMethod === 'parent'\" />\n <TopOpenIcon v-else-if=\"openingMethod === 'top'\" />\n <UnknownIcon v-else />\n </div>\n <div v-if=\"hotkey\" :class=\"`hotkey-denominator ${makeClass(position, isSmall, isTransparent)}`\">\n {{ hotkey }}\n </div>\n </div>\n</template>\n\n<script>\n/* This component displays a small icon, indicating opening method */\n\n// Import Icons\nimport NewTabOpenIcon from '@/assets/interface-icons/open-new-tab.svg';\nimport SameTabOpenIcon from '@/assets/interface-icons/open-current-tab.svg';\nimport IframeOpenIcon from '@/assets/interface-icons/open-iframe.svg';\nimport WorkspaceOpenIcon from '@/assets/interface-icons/open-workspace.svg';\nimport ParentOpenIcon from '@/assets/interface-icons/open-parent.svg';\nimport TopOpenIcon from '@/assets/interface-icons/open-top.svg';\nimport UnknownIcon from '@/assets/interface-icons/unknown-icon.svg';\n\nexport default {\n name: 'ItemOpenMethodIcon',\n props: {\n openingMethod: String, // newtab | sametab | parent | top | modal | workspace\n isSmall: Boolean, // If true, will apply small class\n position: String, // Position classes: top, bottom, left, right\n isTransparent: Boolean, // If true, will apply opacity\n hotkey: Number, // Optional hotkey to also display\n },\n methods: {\n /* Returns custom class string, from optional props */\n makeClass(position = 'top right', isSmall = false, transparent = false) {\n return `opening-method-icon\n ${position || 'top right'}\n ${isSmall ? 'short' : ''}\n ${transparent ? 'transparent' : ''}`;\n },\n },\n components: {\n NewTabOpenIcon,\n SameTabOpenIcon,\n IframeOpenIcon,\n WorkspaceOpenIcon,\n ParentOpenIcon,\n TopOpenIcon,\n UnknownIcon,\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n.opening-method-icon {\n svg {\n position: absolute;\n width: 1rem;\n margin: 2px;\n path {\n fill: currentColor;\n }\n }\n &.top svg { top: 0; }\n &.bottom svg { bottom: 0; }\n &.left svg { left: 0; }\n &.right svg { right: 0; }\n\n &.short svg {\n width: 0.8rem;\n margin: 0;\n }\n\n &.transparent svg {\n opacity: 0.5;\n }\n}\n\ndiv.hotkey-denominator {\n position: absolute;\n font-size: 0.8rem;\n margin: 2px;\n bottom: 2px;\n color: currentColor;\n border-radius: 18px;\n border: 1px solid currentColor;\n padding: 0.1rem 0.4rem 0.2rem 0.4rem;\n &.top { right: 0; } // Position opposite of opening method icon\n &.bottom { left: 0; }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemOpenMethodIcon.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemOpenMethodIcon.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ItemOpenMethodIcon.vue?vue&type=template&id=3bd0e154&scoped=true&\"\nimport script from \"./ItemOpenMethodIcon.vue?vue&type=script&lang=js&\"\nexport * from \"./ItemOpenMethodIcon.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ItemOpenMethodIcon.vue?vue&type=style&index=0&id=3bd0e154&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3bd0e154\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:({\n content: _vm.statusText || _vm.otherStatusText,\n classes: ['status-tooltip', (\"tip-\" + (_vm.color()))],\n delay: { show: 0, hide: 150 }\n }),expression:\"{\\n content: statusText || otherStatusText,\\n classes: ['status-tooltip', `tip-${color()}`],\\n delay: { show: 0, hide: 150 }\\n }\"}],staticClass:\"indicator\"},[_c('div',{class:(\"dot dot-\" + (_vm.color()))},[_vm._m(0)])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',[_c('span')])}]\n\nexport { render, staticRenderFns }","<template>\n <div class=\"indicator\"\n v-tooltip=\"{\n content: statusText || otherStatusText,\n classes: ['status-tooltip', `tip-${color()}`],\n delay: { show: 0, hide: 150 }\n }\">\n <div :class=\"`dot dot-${color()}`\">\n <span><span></span></span>\n </div>\n </div>\n</template>\n\n<script>\n\nexport default {\n name: 'StatusIndicator',\n props: {\n statusText: String,\n statusSuccess: Boolean,\n },\n methods: {\n /* Returns a color, based on success status */\n color() {\n switch (this.statusSuccess) {\n case undefined: return ((new Date() - this.startTime) > 2000) ? 'grey' : 'yellow';\n case true: return 'green'; // Success!\n default: return 'red'; // Not success, therefore failure\n }\n },\n },\n data() {\n return {\n startTime: new Date(), // Used for timeout\n otherStatusText: 'Checking...', // Used before server has responded\n };\n },\n mounted() {\n setTimeout(() => {\n if (!this.statusText) this.otherStatusText = 'Request timed out';\n }, 2000);\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\n.indicator {\n padding: 5px;\n transition: all .2s ease-in-out;\n cursor: help;\n z-index: 5;\n &:hover {\n transform: scale(1.25);\n filter: saturate(2);\n opacity: 1;\n }\n}\n\n@keyframes pulse {\n 0% { opacity: .75; transform: scale(1); }\n 25% { opacity: 0.75; transform: scale(1); }\n 100% { opacity: 0; transform: scale(1.8); }\n}\n@keyframes applyOpacity {\n 50% { opacity: 0.9; }\n to { opacity: 0.8; }\n}\n\n.dot {\n border-radius: 50%;\n height: 12px;\n width: 12px;\n animation: applyOpacity 1s ease-in 8s forwards;\n > span, > span span, > span span:after {\n animation: pulse 1s linear 0.5s 2;\n border-radius: 50%;\n display: block;\n height: 12px;\n width: 12px;\n content: '';\n }\n &.dot-green {\n background-color: var(--success);\n span, span:after {\n background-color: var(--success);\n opacity: 0.4;\n }\n }\n &.dot-red {\n background-color: var(--danger);\n span, span:after {\n background-color: var(--danger);\n opacity: 0.4;\n }\n }\n &.dot-yellow {\n background-color: var(--warning);\n span, span:after {\n background-color: var(--warning);\n opacity: 0.4;\n }\n }\n &.dot-grey {\n background-color: var(--medium-grey);\n span, span:after {\n background-color: var(--medium-grey);\n opacity: 0.4;\n }\n }\n}\n\n</style>\n\n<style lang=\"scss\">\n.status-tooltip {\n background: var(--status-check-tooltip-background) !important;\n color: var(--status-check-tooltip-color);\n font-size: 1rem;\n z-index: 10;\n &.tip-grey { --status-color: var(--medium-grey); }\n &.tip-green { --status-color: var(--success); }\n &.tip-yellow { --status-color: var(--warning); }\n &.tip-red { --status-color: var(--danger); }\n .tooltip-inner {\n border: 1px solid var(--status-color);\n // color: var(--status-color);\n }\n .tooltip-arrow {\n --description-tooltip-color: var(--status-color);\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./StatusIndicator.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./StatusIndicator.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./StatusIndicator.vue?vue&type=template&id=d1a6f18c&scoped=true&\"\nimport script from \"./StatusIndicator.vue?vue&type=script&lang=js&\"\nexport * from \"./StatusIndicator.vue?vue&type=script&lang=js&\"\nimport style0 from \"./StatusIndicator.vue?vue&type=style&index=0&id=d1a6f18c&scoped=true&lang=scss&\"\nimport style1 from \"./StatusIndicator.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"d1a6f18c\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.modalName,\"resizable\":true,\"width\":\"50%\",\"height\":\"80%\",\"classes\":\"dashy-modal edit-item\"},on:{\"closed\":_vm.modalClosed}},[_c('div',{staticClass:\"edit-item-inner\"},[_c('h3',{staticClass:\"title\"},[_vm._v(\"Edit Item\")]),_c('p',{staticClass:\"sub-title\"},[_vm._v(\"Editing \"+_vm._s(_vm.item.title)+\" (ID: \"+_vm._s(_vm.itemId)+\")\")]),(_vm.formData.length === 0)?_c('p',{staticClass:\"warning-note\"},[_vm._v(\" No data configured yet. Click an attribute in the list below to add the field to the form. \")]):_vm._e(),_vm._l((_vm.formData),function(row,index){return _c('div',{key:row.name,staticClass:\"row\"},[(row.type === 'text' || row.type === 'number')?_c('Input',{attrs:{\"description\":row.description,\"label\":row.title || row.name,\"type\":row.type,\"layout\":\"horizontal\"},model:{value:(_vm.formData[index].value),callback:function ($$v) {_vm.$set(_vm.formData[index], \"value\", $$v)},expression:\"formData[index].value\"}}):(row.type === 'boolean')?_c('Radio',{attrs:{\"description\":row.description,\"label\":row.title || row.name,\"options\":[].concat( _vm.boolRadioOptions ),\"initialOption\":_vm.boolToStr(_vm.formData[index].value)},model:{value:(_vm.formData[index].value),callback:function ($$v) {_vm.$set(_vm.formData[index], \"value\", $$v)},expression:\"formData[index].value\"}}):(row.type === 'select')?_c('Select',{staticClass:\"edit-item-select\",attrs:{\"options\":_vm.formData[index].enum,\"description\":row.description,\"initialOption\":_vm.formData[index].value,\"label\":row.title || row.name},model:{value:(_vm.formData[index].value),callback:function ($$v) {_vm.$set(_vm.formData[index], \"value\", $$v)},expression:\"formData[index].value\"}}):_c('div',[_vm._v(\" \"+_vm._s(row.name)+\" cannot currently be edited through the UI. \")]),_c('BinIcon',{on:{\"click\":function () { return _vm.removeField(row.name); }}})],1)}),(_vm.additionalFormData.length > 0)?_c('div',{staticClass:\"add-more-inputs\"},[_c('h4',[_vm._v(\"More Fields\")]),_c('div',{staticClass:\"more-fields\"},_vm._l((_vm.additionalFormData),function(row){return _c('span',{key:row.name,staticClass:\"add-field-tag\",on:{\"click\":function () { return _vm.appendNewField(row.name); }}},[_c('AddIcon'),_vm._v(\" \"+_vm._s(row.title || row.name)+\" \")],1)}),0)]):_vm._e(),_c('SaveCancelButtons',{attrs:{\"saveClick\":_vm.saveItem,\"cancelClick\":_vm.modalClosed}})],2)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"save-cancel-btn-container\"},[_c('Button',{staticClass:\"save-app-config-btn\",attrs:{\"click\":_vm.saveClick}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.save-stage-btn'))+\" \"),_c('SaveIcon')],1),_c('Button',{staticClass:\"save-app-config-btn\",attrs:{\"click\":_vm.cancelClick}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.cancel-stage-btn'))+\" \"),_c('CancelIcon')],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"save-cancel-btn-container\">\n <Button class=\"save-app-config-btn\" :click=\"saveClick\">\n {{ $t('interactive-editor.menu.save-stage-btn') }}\n <SaveIcon />\n </Button>\n <Button class=\"save-app-config-btn\" :click=\"cancelClick\">\n {{ $t('interactive-editor.menu.cancel-stage-btn') }}\n <CancelIcon />\n </Button>\n </div>\n</template>\n\n<script>\n\nimport Button from '@/components/FormElements/Button';\nimport SaveIcon from '@/assets/interface-icons/save-config.svg';\nimport CancelIcon from '@/assets/interface-icons/config-close.svg';\n\nexport default {\n name: 'SaveCancelButton',\n props: {\n saveClick: Function,\n cancelClick: Function,\n },\n components: {\n Button,\n SaveIcon,\n CancelIcon,\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n.save-cancel-btn-container {\n display: flex;\n margin: 0.5rem 0;\n justify-content: center;\n border-top: 1px dashed var(--interactive-editor-color);\n button {\n margin: 1rem 0.5rem;\n color: var(--interactive-editor-color);\n border-color: var(--interactive-editor-color);\n background: var(--interactive-editor-background);\n svg {\n border: none;\n width: 1.2rem;\n height: 1.2rem;\n }\n &:hover {\n color: var(--interactive-editor-background);\n border-color: var(--interactive-editor-color);\n background: var(--interactive-editor-color);\n svg {\n background: var(--interactive-editor-color);\n path { fill: var(--interactive-editor-background); }\n }\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SaveCancelButtons.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SaveCancelButtons.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SaveCancelButtons.vue?vue&type=template&id=e813bfa0&scoped=true&\"\nimport script from \"./SaveCancelButtons.vue?vue&type=script&lang=js&\"\nexport * from \"./SaveCancelButtons.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SaveCancelButtons.vue?vue&type=style&index=0&id=e813bfa0&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"e813bfa0\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"select-container\"},[(_vm.label)?_c('label',{staticClass:\"select-label\"},[_vm._v(_vm._s(_vm.label))]):_vm._e(),_c('v-select',{staticClass:\"form-dropdown\",attrs:{\"value\":_vm.selectedOption,\"selectOnTab\":true,\"options\":_vm.options},on:{\"input\":_vm.updateValue}}),(_vm.description)?_c('p',{staticClass:\"select-description\"},[_vm._v(_vm._s(_vm.description))]):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"select-container\">\n <label v-if=\"label\" class=\"select-label\">{{ label }}</label>\n <v-select\n @input=\"updateValue\"\n :value=\"selectedOption\"\n :selectOnTab=\"true\"\n :options=\"options\"\n class=\"form-dropdown\"\n />\n <p v-if=\"description\" class=\"select-description\">{{ description }}</p>\n </div>\n</template>\n\n<script>\n\nexport default {\n name: 'Select',\n components: {},\n props: {\n options: Array, // Array of available options\n initialOption: String, // Optional default option\n label: String, // Form label for element\n description: String, // Optional description text\n },\n data() {\n return {\n selectedOption: '', // The currently selected val\n };\n },\n created() {\n if (this.initialOption) {\n this.selectedOption = this.initialOption;\n }\n },\n methods: {\n updateValue(value) {\n this.$emit('input', value);\n this.selectedOption = value;\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/media-queries.scss';\n\ndiv.select-container {\n margin: 0.25rem auto;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n label.select-label,\n .form-dropdown,\n p.select-description {\n margin: 0.25rem;\n flex-basis: 8rem;\n flex-grow: 1;\n }\n label.select-label {\n text-transform: capitalize;\n }\n p.select-description {\n flex-grow: 3;\n opacity: var(--dimming-factor);\n }\n .form-dropdown {\n flex-grow: 2;\n min-width: 12rem;\n margin: 0.5rem auto;\n font-size: 1.2rem;\n box-sizing: border-box;\n color: var(--primary);\n background: var(--background);;\n border-radius: var(--curve-factor);\n &:focus {\n box-shadow: 1px 1px 6px var(--config-settings-color);\n outline: none;\n }\n }\n @include tablet-down {\n flex-direction: column;\n align-items: start;\n label.select-label,\n .form-dropdown,\n p.select-description {\n margin: 0.5rem;\n flex-basis: auto;\n }\n }\n}\n</style>\n\n<style lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n\n.form-dropdown {\n margin: 1rem auto;\n ul.vs__dropdown-menu {\n max-height: 14rem;\n @extend .scroll-bar;\n }\n input.vs__search {\n color: var(--primary);\n }\n div.vs__dropdown-toggle {\n padding: 0.2rem 0;\n border-color: var(--primary);\n background: var(--background);\n .vs__actions svg {\n height: 1.2rem;\n width: 1.2rem;\n border: none;\n margin: 0;\n padding: 0.2rem 0 0 0.2rem;\n &:hover {\n background: var(--primary);\n path { fill: var(--background); }\n }\n }\n }\n div, input {\n cursor: pointer;\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Select.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Select.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Select.vue?vue&type=template&id=3921c087&scoped=true&\"\nimport script from \"./Select.vue?vue&type=script&lang=js&\"\nexport * from \"./Select.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Select.vue?vue&type=style&index=0&id=3921c087&scoped=true&lang=scss&\"\nimport style1 from \"./Select.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3921c087\",\n null\n \n)\n\nexport default component.exports","<template>\n <modal\n :name=\"modalName\"\n :resizable=\"true\"\n width=\"50%\"\n height=\"80%\"\n classes=\"dashy-modal edit-item\"\n @closed=\"modalClosed\"\n >\n <div class=\"edit-item-inner\">\n <!-- Title and Item ID -->\n <h3 class=\"title\">Edit Item</h3>\n <p class=\"sub-title\">Editing {{item.title}} (ID: {{itemId}})</p>\n <!-- If no elements added to form, show info message -->\n <p class=\"warning-note\" v-if=\"formData.length === 0\">\n No data configured yet. Click an attribute in the list below to add the field to the form.\n </p>\n <!-- For each data attribute, render the correct type of input field -->\n <div class=\"row\" v-for=\"(row, index) in formData\" :key=\"row.name\">\n <!-- Text box, for text/ number/ raw input elements -->\n <Input\n v-if=\"row.type === 'text' || row.type === 'number'\"\n v-model=\"formData[index].value\"\n :description=\"row.description\"\n :label=\"row.title || row.name\"\n :type=\"row.type\"\n layout=\"horizontal\"\n />\n <!-- Radio button, used for True or False input -->\n <Radio\n v-else-if=\"row.type === 'boolean'\"\n v-model=\"formData[index].value\"\n :description=\"row.description\"\n :label=\"row.title || row.name\"\n :options=\"[ ...boolRadioOptions ]\"\n :initialOption=\"boolToStr(formData[index].value)\"\n />\n <!-- Select/ dropdown for enum multiple-choice input -->\n <Select\n v-else-if=\"row.type === 'select'\"\n v-model=\"formData[index].value\"\n :options=\"formData[index].enum\"\n :description=\"row.description\"\n :initialOption=\"formData[index].value\"\n :label=\"row.title || row.name\"\n class=\"edit-item-select\"\n />\n <!-- Warning note, for any other data types, that aren't yet supported -->\n <div v-else>\n {{ row.name }} cannot currently be edited through the UI.\n </div>\n <BinIcon @click=\"() => removeField(row.name)\" />\n </div>\n <!-- Show Add chips, for adding more data elements to the form -->\n <div class=\"add-more-inputs\" v-if=\"additionalFormData.length > 0\">\n <h4>More Fields</h4>\n <div class=\"more-fields\">\n <span\n v-for=\"row in additionalFormData\"\n :key=\"row.name\"\n @click=\"() => appendNewField(row.name)\"\n class=\"add-field-tag\">\n <AddIcon /> {{ row.title || row.name }}\n </span>\n </div>\n </div>\n <!-- Save to state button -->\n <SaveCancelButtons :saveClick=\"saveItem\" :cancelClick=\"modalClosed\" />\n </div>\n </modal>\n</template>\n\n<script>\nimport AddIcon from '@/assets/interface-icons/interactive-editor-add.svg';\nimport BinIcon from '@/assets/interface-icons/interactive-editor-remove.svg';\nimport SaveCancelButtons from '@/components/InteractiveEditor/SaveCancelButtons';\nimport Input from '@/components/FormElements/Input';\nimport Radio from '@/components/FormElements/Radio';\nimport Select from '@/components/FormElements/Select';\nimport StoreKeys from '@/utils/StoreMutations';\nimport DashySchema from '@/utils/ConfigSchema';\nimport { modalNames } from '@/utils/defaults';\n\nexport default {\n name: 'EditItem',\n data() {\n return {\n modalName: modalNames.EDIT_ITEM,\n schema: DashySchema.properties.sections.items.properties.items.items.properties,\n formData: [], // Array of form fields\n additionalFormData: [], // Array of not-yet-used form fields\n item: {},\n boolRadioOptions: [\n { label: 'true', value: 'true' },\n { label: 'false', value: 'false' },\n ],\n };\n },\n props: {\n itemId: String,\n isNew: Boolean,\n parentSectionTitle: String, // If adding new item, which section to add it under\n },\n computed: {},\n components: {\n Input,\n Radio,\n Select,\n AddIcon,\n BinIcon,\n SaveCancelButtons,\n },\n mounted() {\n if (!this.isNew) { // Get existing item data\n this.item = this.getItemFromState(this.itemId);\n }\n this.formData = this.makeInitialFormData();\n this.$modal.show(modalNames.EDIT_ITEM);\n },\n methods: {\n /* For a given item ID, return the item obj from store */\n getItemFromState(id) {\n return this.$store.getters.getItemById(id);\n },\n /* Using the schema, make data structure for the UI form fields to use */\n makeRowData(property) {\n return {\n name: property,\n description: this.schema[property].description,\n value: this.item[property],\n type: this.getInputType(this.schema[property]),\n enum: this.schema[property].enum,\n title: this.schema[property].title,\n };\n },\n /* Make formatted data structure to be rendered as form elements */\n makeInitialFormData() {\n const formData = [];\n const requiredFields = ['title', 'description', 'url', 'icon', 'target'];\n const unneededFields = ['id'];\n const isPrimaryField = (property) => (\n this.item[property] || requiredFields.includes(property)\n ) && !unneededFields.includes(property);\n Object.keys(this.schema).forEach((property) => {\n const singleRow = this.makeRowData(property);\n if (isPrimaryField(property)) {\n formData.push(singleRow);\n } else {\n this.additionalFormData.push(singleRow);\n }\n });\n return formData;\n },\n /* Convert boolean to string */\n boolToStr(bool) {\n if (bool) return 'true';\n if (bool === false) return 'false';\n return undefined;\n },\n /* Adds field from extras list to main form, then removes from extras list */\n appendNewField(fieldId) {\n Object.keys(this.schema).forEach((property) => {\n if (property === fieldId) {\n this.formData.push(this.makeRowData(property));\n }\n });\n this.additionalFormData.forEach((elem, index) => {\n if (elem.name === fieldId) {\n this.additionalFormData.splice(index, 1);\n }\n });\n },\n /* On Remove Field click, removes field from main form, and adds to chip list */\n removeField(fieldId) {\n this.formData.forEach((elem, index) => {\n if (elem.name === fieldId) {\n this.formData.splice(index, 1);\n this.additionalFormData.push(elem);\n }\n });\n },\n /* Use schema to determine type of form element to render, for a given attribute */\n getInputType(schemaItem) {\n const definedType = schemaItem.type;\n if (definedType === 'text') {\n return 'text';\n } else if (definedType === 'number') {\n return 'number';\n } else if (definedType === 'boolean') {\n return 'boolean';\n } else if (schemaItem.enum) {\n return 'select';\n }\n return 'text';\n },\n /* Saves the updated item to VueX Store */\n saveItem() {\n // Convert form data back into section.item data structure\n const structured = {};\n this.formData.forEach((row) => { structured[row.name] = row.value; });\n // Some attributes need a little extra formatting\n const newItem = this.formatBeforeSave(structured);\n if (this.isNew) { // Insert new item into data store\n newItem.id = `temp_${newItem.title}`;\n const payload = { newItem, targetSection: this.parentSectionTitle };\n this.$store.commit(StoreKeys.INSERT_ITEM, payload);\n } else { // Update existing item from form data, in the store\n this.$store.commit(StoreKeys.UPDATE_ITEM, { newItem, itemId: this.itemId });\n }\n // If we're not already in edit mode, enable it now\n this.$store.commit(StoreKeys.SET_EDIT_MODE, true);\n // Close edit menu\n this.$emit('closeEditMenu');\n },\n /* Some fields require a bit of extra processing before they're saved */\n formatBeforeSave(item) {\n const newItem = item;\n newItem.id = this.itemId;\n if (newItem.hotkey) newItem.hotkey = parseInt(newItem.hotkey, 10);\n const strToTags = (str) => {\n const tagArr = str.split(',');\n return tagArr.map((tag) => tag.trim().toLowerCase().replace(/[^a-z]+/, ''));\n };\n const strToBool = (str) => {\n if (str === undefined) return undefined;\n return str === 'true';\n };\n if (newItem.tags) newItem.tags = strToTags(newItem.tags);\n if (newItem.statusCheck) newItem.statusCheck = strToBool(newItem.statusCheck);\n // if (newItem.hotkey) newItem.hotkey = parseInt(newItem.hotkey, 10);\n return newItem;\n },\n /* Clean up work, triggered when modal closed */\n modalClosed() {\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n this.$emit('closeEditMenu');\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n@import '@/styles/media-queries.scss';\n\n.edit-item-inner {\n padding: 1rem;\n background: var(--interactive-editor-background);\n color: var(--interactive-editor-color);\n height: 100%;\n overflow-y: auto;\n @extend .svg-button;\n h3.title {\n font-size: 1.5rem;\n margin: 0.25rem 0;\n }\n p.sub-title {\n margin: 0.25rem 0;\n font-size: 0.8rem;\n font-style: italic;\n opacity: var(--dimming-factor);\n }\n p.warning-note {\n color: var(--warning);\n }\n .row {\n display: flex;\n padding: 0.5rem 0.25rem;\n &:not(:last-child) {\n border-bottom: 1px dotted var(--interactive-editor-color);\n }\n .input-container, .select-container {\n width: 100%;\n input.input-field {\n font-size: 1rem;\n padding: 0.35rem 0.5rem;\n }\n }\n }\n .more-fields {\n display: flex;\n flex-wrap: wrap;\n span.add-field-tag {\n margin: 0.2rem;\n padding: 0.2rem 0.5rem;;\n min-width: 2rem;\n display: flex;\n align-items: center;\n cursor: pointer;\n text-align: center;\n border: 1px solid var(--interactive-editor-color);\n border-radius: var(--curve-factor);\n &:hover {\n background: var(--interactive-editor-color);\n color: var(--interactive-editor-background);\n svg {\n background: var(--interactive-editor-color);\n path { fill: var(--interactive-editor-background); }\n }\n }\n svg {\n margin-right: 0.25rem;\n border: none;\n }\n }\n }\n\n /* Override form element colors, with local CSS variables */\n div.input-container input.input-field,\n .radio-container div.radio-wrapper,\n .form-dropdown div.vs__dropdown-toggle {\n color: var(--interactive-editor-color);\n border-color: var(--interactive-editor-color);\n background: var(--interactive-editor-background);\n }\n svg {\n path { fill: var(--interactive-editor-color); }\n background: var(--interactive-editor-background);\n &:hover, &.selected {\n path { fill: var(--interactive-editor-background); }\n background: var(--interactive-editor-color);\n }\n }\n .edit-item-select .v-select {\n input.vs__search { color: var(--interactive-editor-color); }\n div.vs__dropdown-toggle {\n border-color: var(--interactive-editor-color);\n background: var(--interactive-editor-background);\n span.vs__selected { color: var(--interactive-editor-color); }\n .vs__actions svg {\n background: var(--interactive-editor-background);\n path { fill: var(--interactive-editor-color); }\n &:hover {\n background: var(--interactive-editor-color);\n path { fill: var(--interactive-editor-background); }\n }\n }\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./EditItem.vue?vue&type=template&id=1b4da836&\"\nimport script from \"./EditItem.vue?vue&type=script&lang=js&\"\nexport * from \"./EditItem.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EditItem.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.modalName,\"resizable\":true,\"width\":\"40%\",\"height\":\"40%\",\"classes\":\"dashy-modal\"},on:{\"closed\":_vm.close}},[_c('div',{staticClass:\"move-menu-inner\"},[_c('h3',{staticClass:\"move-title\"},[_vm._v(\"Move or Copy Item\")]),_c('p',{staticClass:\"item-id\"},[_vm._v(\"Editing \"+_vm._s(_vm.itemId))]),_c('Radio',{attrs:{\"options\":_vm.operationRadioOptions,\"label\":\"Operation Type\",\"initialOption\":_vm.operation},model:{value:(_vm.operation),callback:function ($$v) {_vm.operation=$$v},expression:\"operation\"}}),_c('Select',{attrs:{\"options\":_vm.sectionList,\"initialOption\":_vm.selectedSection,\"label\":\"Destination\"},model:{value:(_vm.selectedSection),callback:function ($$v) {_vm.selectedSection=$$v},expression:\"selectedSection\"}}),_c('Radio',{attrs:{\"options\":_vm.appendToRadioOptions,\"label\":\"Append To\",\"initialOption\":_vm.appendTo},model:{value:(_vm.appendTo),callback:function ($$v) {_vm.appendTo=$$v},expression:\"appendTo\"}}),_c('SaveCancelButtons',{attrs:{\"saveClick\":_vm.save,\"cancelClick\":_vm.close}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <modal\n :name=\"modalName\" @closed=\"close\"\n :resizable=\"true\" width=\"40%\" height=\"40%\" classes=\"dashy-modal\">\n <div class=\"move-menu-inner\">\n <!-- Title and item ID -->\n <h3 class=\"move-title\">Move or Copy Item</h3>\n <p class=\"item-id\">Editing {{ itemId }}</p>\n <!-- Radio, for move or copy -->\n <Radio\n v-model=\"operation\"\n :options=\"operationRadioOptions\"\n label=\"Operation Type\"\n :initialOption=\"operation\"\n />\n <!-- Select destionation section -->\n <Select\n v-model=\"selectedSection\"\n :options=\"sectionList\"\n :initialOption=\"selectedSection\"\n label=\"Destination\"\n />\n <!-- Radio, for choosing append to beginning or end -->\n <Radio\n v-model=\"appendTo\"\n :options=\"appendToRadioOptions\"\n label=\"Append To\"\n :initialOption=\"appendTo\"\n />\n <!-- Save and cancel buttons -->\n <SaveCancelButtons :saveClick=\"save\" :cancelClick=\"close\" />\n </div>\n </modal>\n</template>\n\n<script>\nimport Select from '@/components/FormElements/Select';\nimport Radio from '@/components/FormElements/Radio';\nimport SaveCancelButtons from '@/components/InteractiveEditor/SaveCancelButtons';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { modalNames } from '@/utils/defaults';\n\nexport default {\n name: 'MoveItemTo',\n components: {\n Select,\n Radio,\n SaveCancelButtons,\n },\n props: {\n itemId: String, // Unique ID for item\n initialSection: String, // The current section\n },\n data() {\n return {\n selectedSection: '',\n operation: 'move',\n appendTo: 'end',\n modalName: `${modalNames.MOVE_ITEM_TO}-${this.itemId}`,\n operationRadioOptions: [\n { label: 'Move', value: 'move' },\n { label: 'Copy', value: 'copy' },\n ],\n appendToRadioOptions: [\n { label: 'Beginning', value: 'beginning' },\n { label: 'End', value: 'end' },\n ],\n };\n },\n computed: {\n sections() {\n return this.$store.getters.sections;\n },\n sectionList() {\n return this.sections.map((section) => section.name);\n },\n currentSection() {\n let sectionName = '';\n this.sections.forEach((section) => {\n section.items.forEach((item) => {\n if (item.id === this.itemId) sectionName = section.name;\n });\n });\n return sectionName;\n },\n },\n mounted() {\n this.selectedSection = this.currentSection;\n },\n methods: {\n save() {\n const item = this.$store.getters.getItemById(this.itemId);\n // Copy item to new section\n const copyPayload = { item, toSection: this.selectedSection, appendTo: this.appendTo };\n this.$store.commit(StoreKeys.COPY_ITEM, copyPayload);\n // Remove item from previous section\n if (this.operation === 'move') {\n const payload = { itemId: this.itemId, sectionName: this.currentSection };\n this.$store.commit(StoreKeys.REMOVE_ITEM, payload);\n }\n this.close();\n },\n close() {\n this.$modal.hide(this.modalName);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n.move-menu-inner {\n padding: 1rem;\n background: var(--interactive-editor-background);\n color: var(--interactive-editor-color);\n height: 100%;\n overflow-y: auto;\n h3.move-title {\n margin: 0.25rem 0;\n }\n p.item-id {\n font-size: 1rem;\n font-style: italic;\n margin: 0.25rem 0;\n opacity: var(--dimming-factor);\n }\n .button-wrapper {\n display: flex;\n width: fit-content;\n margin: 1.5rem auto;\n button {\n margin: 0 0.5rem;\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MoveItemTo.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MoveItemTo.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MoveItemTo.vue?vue&type=template&id=00eee648&scoped=true&\"\nimport script from \"./MoveItemTo.vue?vue&type=script&lang=js&\"\nexport * from \"./MoveItemTo.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MoveItemTo.vue?vue&type=style&index=0&id=00eee648&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"00eee648\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('transition',{attrs:{\"name\":\"slide\"}},[(_vm.show && !_vm.isMenuDisabled)?_c('div',{staticClass:\"context-menu\",style:(_vm.posX && _vm.posY ? (\"top:\" + _vm.posY + \"px;left:\" + _vm.posX + \"px;\") : '')},[_c('ul',{staticClass:\"menu-section\"},[_c('li',{staticClass:\"section-title\"},[_vm._v(\" \"+_vm._s(_vm.$t('context-menus.item.open-section-title'))+\" \")]),_c('li',{on:{\"click\":function($event){return _vm.launch('sametab')}}},[_c('SameTabOpenIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.item.sametab')))])],1),_c('li',{on:{\"click\":function($event){return _vm.launch('newtab')}}},[_c('NewTabOpenIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.item.newtab')))])],1),_c('li',{on:{\"click\":function($event){return _vm.launch('modal')}}},[_c('IframeOpenIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.item.modal')))])],1),_c('li',{on:{\"click\":function($event){return _vm.launch('workspace')}}},[_c('WorkspaceOpenIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.item.workspace')))])],1)]),_c('ul',{staticClass:\"menu-section\"},[_c('li',{staticClass:\"section-title\"},[_vm._v(\" \"+_vm._s(_vm.$t('context-menus.item.options-section-title'))+\" \")]),_c('li',{on:{\"click\":function($event){return _vm.openSettings()}}},[_c('EditIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.item.edit-item')))])],1),(_vm.isEditMode)?_c('li',{on:{\"click\":function($event){return _vm.openMoveMenu()}}},[_c('MoveIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.item.move-item')))])],1):_vm._e(),(_vm.isEditMode)?_c('li',{on:{\"click\":function($event){return _vm.openDeleteItem()}}},[_c('BinIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.item.remove-item')))])],1):_vm._e()])]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <transition name=\"slide\">\n <div class=\"context-menu\" v-if=\"show && !isMenuDisabled\"\n :style=\"posX && posY ? `top:${posY}px;left:${posX}px;` : ''\">\n <!-- Open Options -->\n <ul class=\"menu-section\">\n <li class=\"section-title\">\n {{ $t('context-menus.item.open-section-title') }}\n </li>\n <li @click=\"launch('sametab')\">\n <SameTabOpenIcon />\n <span>{{ $t('context-menus.item.sametab') }}</span>\n </li>\n <li @click=\"launch('newtab')\">\n <NewTabOpenIcon />\n <span>{{ $t('context-menus.item.newtab') }}</span>\n </li>\n <li @click=\"launch('modal')\">\n <IframeOpenIcon />\n <span>{{ $t('context-menus.item.modal') }}</span>\n </li>\n <li @click=\"launch('workspace')\">\n <WorkspaceOpenIcon />\n <span>{{ $t('context-menus.item.workspace') }}</span>\n </li>\n </ul>\n <!-- Edit Options -->\n <ul class=\"menu-section\">\n <li class=\"section-title\">\n {{ $t('context-menus.item.options-section-title') }}\n </li>\n <li @click=\"openSettings()\">\n <EditIcon />\n <span>{{ $t('context-menus.item.edit-item') }}</span>\n </li>\n <li v-if=\"isEditMode\" @click=\"openMoveMenu()\">\n <MoveIcon />\n <span>{{ $t('context-menus.item.move-item') }}</span>\n </li>\n <li v-if=\"isEditMode\" @click=\"openDeleteItem()\">\n <BinIcon />\n <span>{{ $t('context-menus.item.remove-item') }}</span>\n </li>\n </ul>\n </div>\n </transition>\n</template>\n\n<script>\n// Import icons for each element\nimport EditIcon from '@/assets/interface-icons/config-edit-json.svg';\nimport BinIcon from '@/assets/interface-icons/interactive-editor-remove.svg';\nimport MoveIcon from '@/assets/interface-icons/interactive-editor-move-to.svg';\nimport SameTabOpenIcon from '@/assets/interface-icons/open-current-tab.svg';\nimport NewTabOpenIcon from '@/assets/interface-icons/open-new-tab.svg';\nimport IframeOpenIcon from '@/assets/interface-icons/open-iframe.svg';\nimport WorkspaceOpenIcon from '@/assets/interface-icons/open-workspace.svg';\n\nexport default {\n name: 'ContextMenu',\n components: {\n EditIcon,\n MoveIcon,\n BinIcon,\n SameTabOpenIcon,\n NewTabOpenIcon,\n IframeOpenIcon,\n WorkspaceOpenIcon,\n },\n props: {\n posX: Number, // The X coordinate for positioning\n posY: Number, // The Y coordinate for positioning\n show: Boolean, // Should show or hide the menu\n },\n computed: {\n isMenuDisabled() {\n return !!this.$store.getters.appConfig.disableContextMenu;\n },\n isEditMode() {\n return this.$store.state.editMode;\n },\n },\n methods: {\n /* Called on item click, emits an event up to Item */\n /* in order to launch the current app to a given target */\n launch(target) {\n this.$emit('launchItem', target);\n },\n openSettings() {\n this.$emit('openItemSettings');\n },\n openMoveMenu() {\n this.$emit('openMoveItemMenu');\n },\n openDeleteItem() {\n this.$emit('openDeleteItem');\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n\ndiv.context-menu {\n position: absolute;\n margin: 0;\n padding: 0;\n z-index: 8;\n background: var(--context-menu-background);\n color: var(--context-menu-color);\n border: 1px solid var(--context-menu-secondary-color);\n border-radius: var(--curve-factor);\n box-shadow: var(--context-menu-shadow);\n opacity: 0.98;\n\n ul.menu-section {\n list-style-type: none;\n margin: 0;\n padding: 0;\n &:not(:last-child) {\n border-bottom: 1px solid var(--context-menu-color);\n }\n li {\n cursor: pointer;\n padding: 0.5rem 1rem;\n display: flex;\n flex-direction: row;\n font-size: 1rem;\n &:not(:last-child) {\n border-bottom: 1px solid var(--context-menu-secondary-color);\n }\n &:hover:not(.section-title) {\n background: var(--context-menu-secondary-color);\n }\n &.section-title {\n cursor: default;\n font-weight: bold;\n justify-content: center;\n }\n svg {\n width: 1rem;\n margin-right: 0.5rem;\n path { fill: currentColor; }\n }\n }\n }\n}\n\n// Define enter and leave transitions\n.slide-enter-active { animation: slide-in .1s; }\n.slide-leave-active { animation: slide-in .1s reverse; }\n@keyframes slide-in {\n 0% { transform: scaleY(0.5) scaleX(0.8) translateY(-50px); }\n 100% { transform: scaleY(1) translateY(0) translateY(0); }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemContextMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemContextMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ItemContextMenu.vue?vue&type=template&id=026cc865&\"\nimport script from \"./ItemContextMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./ItemContextMenu.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ItemContextMenu.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<template ref=\"container\">\n <div :class=\"`item-wrapper wrap-size-${itemSize}`\">\n <a @click=\"itemOpened\"\n @mouseup.right=\"openContextMenu\"\n @contextmenu.prevent\n :href=\"hyperLinkHref\"\n :target=\"anchorTarget\"\n :class=\"`item ${makeClassList}`\"\n v-tooltip=\"getTooltipOptions()\"\n rel=\"noopener noreferrer\" tabindex=\"0\"\n :id=\"`link-${id}`\"\n :style=\"`--open-icon: ${getUnicodeOpeningIcon()}; ${customStyles}`\"\n >\n <!-- Item Text -->\n <div :class=\"`tile-title ${!icon? 'bounce no-icon': ''}`\" :id=\"`tile-${id}`\" >\n <span class=\"text\">{{ title }}</span>\n <p class=\"description\">{{ description }}</p>\n </div>\n <!-- Item Icon -->\n <Icon :icon=\"icon\" :url=\"url\" :size=\"itemSize\" :color=\"color\"\n v-bind:style=\"customStyles\" class=\"bounce\" />\n <!-- Small icon, showing opening method on hover -->\n <ItemOpenMethodIcon class=\"opening-method-icon\" :isSmall=\"!icon || itemSize === 'small'\"\n :openingMethod=\"accumulatedTarget\" position=\"bottom right\"\n :hotkey=\"hotkey\" />\n <!-- Status indicator dot (if enabled) showing weather srevice is availible -->\n <StatusIndicator\n class=\"status-indicator\"\n v-if=\"enableStatusCheck\"\n :statusSuccess=\"statusResponse ? statusResponse.successStatus : undefined\"\n :statusText=\"statusResponse ? statusResponse.message : undefined\"\n />\n <!-- Edit icon (displayed only when in edit mode) -->\n <EditModeIcon v-if=\"isEditMode\" class=\"edit-mode-item\" @click=\"openItemSettings()\" />\n </a>\n <!-- Right-click context menu -->\n <ContextMenu\n :show=\"contextMenuOpen && !isAddNew\"\n v-click-outside=\"closeContextMenu\"\n :posX=\"contextPos.posX\"\n :posY=\"contextPos.posY\"\n :id=\"`context-menu-${id}`\"\n @launchItem=\"launchItem\"\n @openItemSettings=\"openItemSettings\"\n @openMoveItemMenu=\"openMoveItemMenu\"\n @openDeleteItem=\"openDeleteItem\"\n />\n <!-- Edit and move item menu modals -->\n <MoveItemTo v-if=\"isEditMode\" :itemId=\"id\" />\n <EditItem v-if=\"editMenuOpen\" :itemId=\"id\"\n @closeEditMenu=\"closeEditMenu\"\n :isNew=\"isAddNew\" :parentSectionTitle=\"parentSectionTitle\" />\n </div>\n</template>\n\n<script>\nimport axios from 'axios';\nimport router from '@/router';\nimport Icon from '@/components/LinkItems/ItemIcon.vue';\nimport ItemOpenMethodIcon from '@/components/LinkItems/ItemOpenMethodIcon';\nimport StatusIndicator from '@/components/LinkItems/StatusIndicator';\nimport EditItem from '@/components/InteractiveEditor/EditItem';\nimport MoveItemTo from '@/components/InteractiveEditor/MoveItemTo';\nimport ContextMenu from '@/components/LinkItems/ItemContextMenu';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { targetValidator } from '@/utils/ConfigHelpers';\nimport EditModeIcon from '@/assets/interface-icons/interactive-editor-edit-mode.svg';\nimport {\n localStorageKeys,\n serviceEndpoints,\n modalNames,\n openingMethod as defaultOpeningMethod,\n} from '@/utils/defaults';\n\nexport default {\n name: 'Item',\n props: {\n id: String, // The unique ID of a tile (e.g. 001)\n title: String, // The main text of tile, required\n subtitle: String, // Optional sub-text\n description: String, // Optional tooltip hover text\n icon: String, // Optional path to icon, within public/img/tile-icons\n color: String, // Optional text and icon color, specified in hex code\n backgroundColor: String, // Optional item background color\n url: String, // URL to the resource, optional but recommended\n provider: String, // Optional provider name, for external apps\n hotkey: Number, // Shortcut for quickly launching app\n target: { // Where resource will open, either 'newtab', 'sametab' or 'modal'\n type: String,\n validator: targetValidator,\n },\n itemSize: String, // Item size: small | medium | large\n enableStatusCheck: Boolean, // Should run status checks\n statusCheckHeaders: Object, // Custom status check headers\n statusCheckUrl: String, // Custom URL for status check endpoint\n statusCheckInterval: Number, // Num seconds beteween repeating checks\n statusCheckAllowInsecure: Boolean, // Status check ignore SSL certs\n parentSectionTitle: String, // Title of parent section (for add new)\n isAddNew: Boolean, // Only set if 'fake' item used as Add New button\n },\n components: {\n Icon,\n ItemOpenMethodIcon,\n StatusIndicator,\n ContextMenu,\n MoveItemTo,\n EditItem,\n EditModeIcon,\n },\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n isEditMode() {\n return this.$store.state.editMode;\n },\n accumulatedTarget() {\n return this.target || this.appConfig.defaultOpeningMethod || defaultOpeningMethod;\n },\n /* Based on item props, adjust class names */\n makeClassList() {\n const {\n icon, itemSize, isAddNew, isEditMode,\n } = this;\n return `size-${itemSize} ${!icon ? 'short' : ''} `\n + `${isAddNew ? 'add-new' : ''} ${isEditMode ? 'is-edit-mode' : ''}`;\n },\n /* Convert config target value, into HTML anchor target attribute */\n anchorTarget() {\n if (this.isEditMode) return '_self';\n const target = this.accumulatedTarget;\n switch (target) {\n case 'sametab': return '_self';\n case 'newtab': return '_blank';\n case 'parent': return '_parent';\n case 'top': return '_top';\n default: return undefined;\n }\n },\n /* Get href for anchor, if not in edit mode, or opening in modal/ workspace */\n hyperLinkHref() {\n const nothing = '#';\n if (this.isEditMode) return nothing;\n const noAnchorNeeded = ['modal', 'workspace'];\n return noAnchorNeeded.includes(this.accumulatedTarget) ? nothing : this.url;\n },\n },\n data() {\n return {\n contextMenuOpen: false,\n getId: this.id,\n customStyles: {\n color: this.color,\n background: this.backgroundColor,\n },\n statusResponse: undefined,\n contextPos: {\n posX: undefined,\n posY: undefined,\n },\n editMenuOpen: false,\n };\n },\n methods: {\n /* Called when an item is clicked, manages the opening of modal & resets the search field */\n itemOpened(e) {\n if (this.isEditMode) {\n // If in edit mode, open settings, and don't launch app\n this.openItemSettings();\n return;\n }\n if (e.altKey || this.accumulatedTarget === 'modal') {\n e.preventDefault();\n this.$emit('triggerModal', this.url);\n } else if (this.accumulatedTarget === 'workspace') {\n router.push({ name: 'workspace', query: { url: this.url } });\n } else {\n this.$emit('itemClicked');\n }\n // Update the most/ last used ledger, for smart-sorting\n if (!this.appConfig.disableSmartSort) {\n this.incrementMostUsedCount(this.id);\n this.incrementLastUsedCount(this.id);\n }\n },\n /* Open custom context menu, and set position */\n openContextMenu(e) {\n this.contextMenuOpen = !this.contextMenuOpen;\n if (e && window) {\n // Calculate placement based on cursor and scroll position\n this.contextPos = {\n posX: e.clientX + window.pageXOffset,\n posY: e.clientY + window.pageYOffset,\n };\n }\n },\n /* Closes the context menu, called when user clicks literally anywhere */\n closeContextMenu() {\n this.contextMenuOpen = false;\n },\n /* Returns configuration object for the tooltip */\n getTooltipOptions() {\n if (!this.description && !this.provider) return {}; // If no description, then skip\n const description = this.description ? this.description : '';\n const providerText = this.provider ? `<b>Provider</b>: ${this.provider}` : '';\n const lb1 = description && providerText ? '<br>' : '';\n const hotkeyText = this.hotkey ? `<br>Press '${this.hotkey}' to launch` : '';\n const tooltipText = providerText + lb1 + description + hotkeyText;\n const editText = this.$t('interactive-editor.edit-section.edit-tooltip');\n return {\n content: (this.isEditMode ? editText : tooltipText),\n trigger: 'hover focus',\n hideOnTargetClick: true,\n html: true,\n placement: this.statusResponse ? 'left' : 'auto',\n delay: { show: 600, hide: 200 },\n classes: `item-description-tooltip tooltip-is-${this.itemSize}`,\n };\n },\n /* Used by certain themes (material), to show animated CSS icon */\n getUnicodeOpeningIcon() {\n switch (this.accumulatedTarget) {\n case 'newtab': return '\"\\\\f360\"';\n case 'sametab': return '\"\\\\f24d\"';\n case 'parent': return '\"\\\\f3bf\"';\n case 'top': return '\"\\\\f102\"';\n case 'modal': return '\"\\\\f2d0\"';\n case 'workspace': return '\"\\\\f0b1\"';\n default: return '\"\\\\f054\"';\n }\n },\n /* Pulls together all user options, returns URL + Get params for ping endpoint */\n makeApiUrl() {\n const {\n url, statusCheckUrl, statusCheckHeaders, statusCheckAllowInsecure,\n } = this;\n const encode = (str) => encodeURIComponent(str);\n this.statusResponse = undefined;\n // Find base URL, where the API is hosted\n const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin;\n // Find correct URL to check, and encode\n const urlToCheck = `?&url=${encode(statusCheckUrl || url)}`;\n // Get, stringify and encode any headers\n const headers = statusCheckHeaders\n ? `&headers=${encode(JSON.stringify(statusCheckHeaders))}` : '';\n // Deterimine if user disabled security\n const enableInsecure = statusCheckAllowInsecure ? '&enableInsecure=true' : '';\n // Construct the full API endpoint's URL with GET params\n return `${baseUrl}${serviceEndpoints.statusCheck}/${urlToCheck}${headers}${enableInsecure}`;\n },\n /* Checks if a given service is currently online */\n checkWebsiteStatus() {\n const endpoint = this.makeApiUrl();\n axios.get(endpoint)\n .then((response) => {\n if (response.data) this.statusResponse = response.data;\n })\n .catch(() => { // Something went very wrong.\n this.statusResponse = {\n statusText: 'Failed to make request',\n statusSuccess: false,\n };\n });\n },\n /* Handle navigation options from the context menu */\n launchItem(method) {\n const { url } = this;\n this.contextMenuOpen = false;\n switch (method) {\n case 'newtab':\n window.open(url, '_blank');\n break;\n case 'sametab':\n window.open(url, '_self');\n break;\n case 'modal':\n this.$emit('triggerModal', url);\n break;\n case 'workspace':\n router.push({ name: 'workspace', query: { url } });\n break;\n default: window.open(url, '_blank');\n }\n },\n /* Open the Edit Item moal form */\n openItemSettings() {\n this.editMenuOpen = true;\n this.contextMenuOpen = false;\n this.$modal.show(modalNames.EDIT_ITEM);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n },\n /* Ensure conditional is updated, once menu closed */\n closeEditMenu() {\n this.editMenuOpen = false;\n this.$modal.hide(modalNames.EDIT_ITEM);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n },\n /* Used for smart-sort when sorting items by most used apps */\n incrementMostUsedCount(itemId) {\n const mostUsed = JSON.parse(localStorage.getItem(localStorageKeys.MOST_USED) || '{}');\n let counter = mostUsed[itemId] || 0;\n counter += 1;\n mostUsed[itemId] = counter;\n localStorage.setItem(localStorageKeys.MOST_USED, JSON.stringify(mostUsed));\n },\n /* Used for smart-sort when sorting by last used apps */\n incrementLastUsedCount(itemId) {\n const lastUsed = JSON.parse(localStorage.getItem(localStorageKeys.LAST_USED) || '{}');\n lastUsed[itemId] = new Date().getTime();\n localStorage.setItem(localStorageKeys.LAST_USED, JSON.stringify(lastUsed));\n },\n /* Open the modal for moving/ copying item to other section */\n openMoveItemMenu() {\n this.$modal.show(`${modalNames.MOVE_ITEM_TO}-${this.id}`);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n this.closeContextMenu();\n },\n /* Deletes the current item from the state */\n openDeleteItem() {\n const parentSection = this.$store.getters.getParentSectionOfItem(this.id);\n const payload = { itemId: this.id, sectionName: parentSection.name };\n this.$store.commit(StoreKeys.REMOVE_ITEM, payload);\n this.closeContextMenu();\n },\n },\n mounted() {\n // If ststus checking is enabled, then check service status\n if (this.enableStatusCheck) this.checkWebsiteStatus();\n // If continious status checking is enabled, then start ever-lasting loop\n if (this.statusCheckInterval > 0) {\n setInterval(this.checkWebsiteStatus, this.statusCheckInterval * 1000);\n }\n },\n};\n</script>\n\n<style lang=\"scss\">\n\n.item-wrapper {\n flex-grow: 1;\n flex-basis: 6rem;\n &.wrap-size-large {\n flex-basis: 12rem;\n }\n}\n\n.item {\n flex-grow: 1;\n color: var(--item-text-color);\n vertical-align: middle;\n margin: 0.5rem;\n background: var(--item-background);\n text-align: center;\n padding: 2px;\n outline: 2px solid transparent;\n border: 1px solid var(--outline-color);\n border-radius: var(--curve-factor);\n box-shadow: var(--item-shadow);\n cursor: pointer;\n text-decoration: none;\n position: relative;\n transition: all 0.2s ease-in-out 0s;\n &:hover {\n box-shadow: var(--item-hover-shadow);\n background: var(--item-background-hover);\n color: var(--item-text-color-hover);\n // position: relative;\n // .tile-title span.text {\n // white-space: pre-wrap;\n // }\n }\n &:focus {\n outline: 2px solid var(--primary);\n }\n &.short:not(.size-large) {\n height: 2rem;\n }\n &.add-new {\n border: 2px dashed var(--primary) !important;\n }\n}\n\n/* Text in tile */\n.tile-title {\n white-space: nowrap;\n text-overflow: ellipsis;\n min-width: 120px;\n height: 30px;\n position: relative;\n padding: 0;\n z-index: 2;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n word-break: keep-all;\n span.text {\n white-space: nowrap;\n }\n}\n\n/* Colored dot showing service status */\n.status-indicator {\n position: absolute;\n top: 0;\n right: 0;\n}\n\n.opening-method-icon {\n display: none; // Hidden by default, visible on hover\n}\n\n/* Manage hover and focus actions */\n.item:hover, .item:focus {\n /* Show opening-method icon */\n .opening-method-icon {\n display: block;\n }\n\n /* Trigger text-marquee for text that doesn't fit */\n .tile-title.is-overflowing{\n .overflow-dots {\n opacity: 0;\n }\n span.text {\n transform: translateX(calc(100px - 100%));\n }\n }\n\n /* Apply transofmation of icons on hover */\n .tile-icon, .tile-svg {\n filter: var(--item-icon-transform-hover);\n }\n}\n\n/* Edit Mode Icon */\n.item .edit-mode-item {\n width: 1rem;\n height: 1rem;\n position: absolute;\n top: 0.2rem;\n right: 0.2rem;\n}\n\n/* Specify layout for alternate sized icons */\n.item {\n /* Small Tile Specific Themes */\n &.size-small {\n display: flex;\n flex-direction: row-reverse;\n justify-content: flex-end;\n align-items: center;\n height: 2rem;\n padding-top: 4px;\n max-width: 14rem;\n div img, div svg.missing-image {\n width: 2rem;\n }\n .tile-title {\n height: fit-content;\n min-height: 1.2rem;\n text-align: left;\n max-width: 12rem;\n overflow: hidden;\n span.text {\n text-align: left;\n padding-left: 10%;\n }\n }\n }\n /* Medium Tile Specific Themes */\n &.size-medium {\n display: flex;\n flex-direction: column;\n align-items: center;\n height: auto;\n div img, div svg.missing-image {\n width: 2.5rem;\n margin-bottom: 0.25rem;\n }\n .tile-title {\n min-width: 100px;\n max-width: 160px;\n &.no-icon {\n text-align: left;\n width: 100%;\n max-width: inherit;\n margin-left: 0.5rem;\n }\n }\n }\n /* Large Tile Specific Themes */\n &.size-large {\n display: flex;\n flex-direction: row-reverse;\n justify-content: flex-end;\n text-align: left;\n overflow: hidden;\n align-items: center;\n max-height: 6rem;\n margin: 0.2rem;\n padding: 0.5rem;\n img {\n padding: 0.1rem 0.25rem;\n }\n .tile-title {\n height: auto;\n padding: 0.1rem 0.25rem;\n span.text {\n position: relative;\n font-weight: bold;\n font-size: 1.1rem;\n width: 100%;\n }\n p.description {\n margin: 0;\n display: block;\n white-space: pre-wrap;\n text-overflow: ellipsis;\n font-size: .9em;\n line-height: 1rem;\n height: 2rem;\n }\n }\n }\n p.description {\n display: none; // By default, we don't show the description\n }\n &:before { // Certain themes (e.g. material) show css animated fas icon on hover\n display: none;\n font-family: FontAwesome;\n content: var(--open-icon, \"\\f054\") !important;\n }\n}\n\n/* Adjust positioning of status indicator, when in edit mode */\na.item.is-edit-mode {\n &.size-medium .status-indicator { top: 1rem; }\n &.size-small .status-indicator { right: 1rem; }\n &.size-large .status-indicator { top: 1.5rem; }\n}\n\n</style>\n\n<!-- An un-scoped style tag, since tooltip is outside this DOM tree -->\n<style lang=\"scss\">\n.disabled-link {\n pointer-events: none;\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Item.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Item.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Item.vue?vue&type=template&id=d60e722c&ref=container&\"\nimport script from \"./Item.vue?vue&type=script&lang=js&\"\nexport * from \"./Item.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Item.vue?vue&type=style&index=0&lang=scss&\"\nimport style1 from \"./Item.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:(\"collapsable \" + _vm.rowColSpanClass + \" \" + _vm.collapseClass),style:(((_vm.color ? 'background: '+_vm.color : '') + \"; \" + (_vm.sanitizeCustomStyles(_vm.customStyles)) + \";\"))},[_c('input',{staticClass:\"toggle\",attrs:{\"id\":_vm.sectionKey,\"type\":\"checkbox\",\"tabIndex\":\"-1\"},domProps:{\"checked\":_vm.isExpanded},on:{\"change\":_vm.collapseChanged}}),_c('label',{staticClass:\"lbl-toggle\",attrs:{\"for\":_vm.sectionKey,\"tabindex\":\"-1\"},on:{\"mouseup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"right\",39,$event.key,[\"Right\",\"ArrowRight\"])){ return null; }if('button' in $event && $event.button !== 2){ return null; }return _vm.openContextMenu.apply(null, arguments)},\"contextmenu\":function($event){$event.preventDefault();}}},[(_vm.icon)?_c('Icon',{staticClass:\"section-icon\",attrs:{\"icon\":_vm.icon,\"size\":\"small\",\"url\":_vm.title}}):_vm._e(),_c('h3',[_vm._v(_vm._s(_vm.title))]),(_vm.isEditMode)?_c('EditModeIcon',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.editTooltip()),expression:\"editTooltip()\"}],staticClass:\"edit-mode-item\",on:{\"click\":_vm.openEditModal}}):_vm._e()],1),_c('div',{staticClass:\"collapsible-content\"},[_c('div',{staticClass:\"content-inner\"},[_vm._t(\"default\")],2)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div\n :class=\"`collapsable ${rowColSpanClass} ${collapseClass}`\"\n :style=\"`${color ? 'background: '+color : ''}; ${sanitizeCustomStyles(customStyles)};`\"\n >\n <input\n :id=\"sectionKey\"\n class=\"toggle\"\n type=\"checkbox\"\n :checked=\"isExpanded\"\n @change=\"collapseChanged\"\n tabIndex=\"-1\"\n >\n <label :for=\"sectionKey\" class=\"lbl-toggle\" tabindex=\"-1\"\n @mouseup.right=\"openContextMenu\" @contextmenu.prevent>\n <Icon v-if=\"icon\" :icon=\"icon\" size=\"small\" :url=\"title\" class=\"section-icon\" />\n <h3>{{ title }}</h3>\n <EditModeIcon v-if=\"isEditMode\" @click=\"openEditModal\"\n v-tooltip=\"editTooltip()\" class=\"edit-mode-item\" />\n </label>\n <div class=\"collapsible-content\">\n <div class=\"content-inner\">\n <slot></slot>\n </div>\n </div>\n </div>\n</template>\n\n<script>\n\nimport { localStorageKeys } from '@/utils/defaults';\nimport Icon from '@/components/LinkItems/ItemIcon.vue';\nimport EditModeIcon from '@/assets/interface-icons/interactive-editor-edit-mode.svg';\n\nexport default {\n name: 'CollapsableContainer',\n props: {\n uniqueKey: String, // Generated unique ID\n title: String, // The section title\n icon: String, // An optional section icon\n collapsed: Boolean, // Optional override collapse state\n cols: Number, // Set section horizontal col span / width\n rows: Number, // Set section vertical row span / height\n color: String, // Optional color override\n customStyles: String, // Optional custom stylings\n },\n components: {\n Icon,\n EditModeIcon,\n },\n computed: {\n isEditMode() {\n return this.$store.state.editMode;\n },\n sectionKey() {\n if (this.isEditMode) return undefined;\n return `collapsible-${this.uniqueKey}`;\n },\n collapseClass() {\n return !this.isExpanded ? ' is-collapsed' : 'is-open';\n },\n rowColSpanClass() {\n const { rows, cols, checkSpanNum } = this;\n return `${checkSpanNum(cols, 'col')} ${checkSpanNum(rows, 'row')}`;\n },\n },\n data: () => ({\n isExpanded: false,\n }),\n mounted() {\n this.isExpanded = this.getCollapseState();\n },\n methods: {\n /* Check that row & column span is valid, and not over the max */\n checkSpanNum(span, classPrefix) {\n const maxSpan = 5;\n let numSpan = /^\\d*$/.test(span) ? parseInt(span, 10) : 1;\n numSpan = (numSpan > maxSpan) ? maxSpan : numSpan;\n return `${classPrefix}-${numSpan}`;\n },\n /* Removes all special characters, except those allowed in valid CSS */\n sanitizeCustomStyles(userCss) {\n return userCss ? userCss.replace(/[^a-zA-Z0-9- :;.]/g, '') : '';\n },\n /* Returns local storage collapse state data, and if not yet set then initialized is */\n initialiseStorage() {\n const storageKey = localStorageKeys.COLLAPSE_STATE;\n /* Initialize function will create and set a blank object to storage */\n const initStorage = () => localStorage.setItem(storageKey, JSON.stringify({}));\n // If not yet set, then call initialize\n if (!localStorage[storageKey]) {\n initStorage();\n return {};\n }\n // Otherwise, return value of local storage\n return JSON.parse(localStorage[storageKey]);\n },\n /* If specified by user, return conf collapse state, otherwise check local storage */\n getCollapseState() {\n if (this.collapsed !== undefined) return !this.collapsed; // Check users config\n const collapseStateObject = this.initialiseStorage(); // Check local storage\n if (collapseStateObject[this.uniqueKey] !== undefined) {\n return collapseStateObject[this.uniqueKey];\n }\n // Nothing specified, return Open\n return true;\n },\n /* When section collapsed, update local storage, to remember for next time */\n setCollapseState(id, newState) {\n // Get the current localstorage collapse state object\n const collapseState = JSON.parse(localStorage[localStorageKeys.COLLAPSE_STATE]);\n // Add the new state to it\n collapseState[id] = newState;\n // Stringify, and set the new object into local storage\n localStorage.setItem(localStorageKeys.COLLAPSE_STATE, JSON.stringify(collapseState));\n },\n /* Called when collapse state changes, trigger local storage update if needed */\n collapseChanged(whatChanged) {\n this.isExpanded = whatChanged.srcElement.checked;\n if (this.collapseState === undefined) { // Only run, if user hasn't manually set prop\n this.initialiseStorage();\n this.setCollapseState(this.uniqueKey.toString(), this.isExpanded);\n }\n },\n openEditModal() {\n this.$emit('openEditSection');\n },\n openContextMenu(e) {\n this.$emit('openContextMenu', e);\n },\n editTooltip() {\n const content = this.$t('interactive-editor.edit-section.edit-tooltip');\n return { content, trigger: 'hover focus', delay: { show: 100, hide: 0 } };\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\n@import '@/styles/media-queries.scss';\n\n.collapsable {\n padding: var(--item-group-padding);\n margin: 10px;\n border-radius: var(--curve-factor);\n background: var(--item-group-outer-background);\n box-shadow: var(--item-group-shadow);\n height: fit-content;\n width: 100%;\n width: stretch;\n\n grid-row-start: span 1;\n &.row-2 { grid-row-start: span 2; }\n &.row-3 { grid-row-start: span 3; }\n &.row-4 { grid-row-start: span 4; }\n &.row-5 { grid-row-start: span 5; }\n\n grid-column-start: span 1;\n @include tablet-up {\n &.col-2 { grid-column-start: span 2; }\n &.col-3 { grid-column-start: span 2; }\n &.col-4 { grid-column-start: span 2; }\n &.col-5 { grid-column-start: span 2; }\n }\n @include laptop-up {\n &.col-2 { grid-column-start: span 2; }\n &.col-3 { grid-column-start: span 3; }\n &.col-4 { grid-column-start: span 3; }\n &.col-5 { grid-column-start: span 3; }\n }\n @include monitor-up {\n &.col-2 { grid-column-start: span 2; }\n &.col-3 { grid-column-start: span 3; }\n &.col-4 { grid-column-start: span 4; }\n &.col-5 { grid-column-start: span 5; }\n }\n\n .wrap-collabsible {\n margin-bottom: 1.2rem 0;\n }\n\n input[type='checkbox'] {\n display: none;\n }\n\n label.lbl-toggle {\n outline: none;\n display: block;\n padding: 0.25rem;\n cursor: pointer;\n border-radius: var(--curve-factor);\n transition: all 0.25s ease-out;\n text-align: left;\n color: var(--item-group-heading-text-color);\n h3 {\n margin: 0;\n padding: 0;\n display: inline;\n }\n .section-icon {\n display: inline;\n margin-right: 0.5rem;\n }\n }\n\n .lbl-toggle:hover {\n color: var(--item-group-heading-text-color-hover);\n }\n\n .lbl-toggle::before {\n content: ' ';\n display: inline-block;\n border-top: 5px solid transparent;\n border-bottom: 5px solid transparent;\n border-left: 5px solid currentColor;\n vertical-align: middle;\n margin-right: .7rem;\n transform: translateY(-2px);\n transition: transform .2s ease-out;\n }\n\n .toggle:checked + .lbl-toggle::before {\n transform: rotate(90deg) translateX(-3px);\n }\n\n .collapsible-content {\n max-height: 0px;\n overflow: hidden;\n transition: max-height .25s ease-in-out;\n background: var(--item-group-background);\n border-radius: 0 0 var(--curve-factor) var(--curve-factor);\n }\n\n .toggle:checked + .lbl-toggle + .collapsible-content {\n max-height: 3000px;\n }\n\n .toggle:checked + .lbl-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n }\n\n .collapsible-content .content-inner {\n padding: 0.5rem;\n }\n\n .edit-mode-item {\n width: 1rem;\n height: 1rem;\n float: right;\n right: 0.5rem;\n top: 0.5rem;\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Collapsable.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Collapsable.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Collapsable.vue?vue&type=template&id=6150e7a7&scoped=true&\"\nimport script from \"./Collapsable.vue?vue&type=script&lang=js&\"\nexport * from \"./Collapsable.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Collapsable.vue?vue&type=style&index=0&id=6150e7a7&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6150e7a7\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.name,\"resizable\":true,\"width\":\"80%\",\"height\":\"80%\",\"classes\":\"dashy-modal\"},on:{\"closed\":function($event){return _vm.modalClosed()}}},[_c('div',{attrs:{\"slot\":\"top-right\"},on:{\"click\":function($event){return _vm.hide()}},slot:\"top-right\"},[_vm._v(\"Close\")]),_c('a',{staticClass:\"close-button\",attrs:{\"title\":\"Close\"},on:{\"click\":function($event){return _vm.hide()}}},[_vm._v(\"x\")]),(_vm.url)?_c('iframe',{staticClass:\"frame\",attrs:{\"src\":_vm.url},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }return _vm.close.apply(null, arguments)}}}):_c('div',{staticClass:\"no-url\"},[_vm._v(\"No URL Specified\")])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <modal :name=\"name\" :resizable=\"true\" width=\"80%\" height=\"80%\" @closed=\"modalClosed()\"\n classes=\"dashy-modal\">\n <div slot=\"top-right\" @click=\"hide()\">Close</div>\n <a @click=\"hide()\" class=\"close-button\" title=\"Close\">x</a>\n <iframe v-if=\"url\" :src=\"url\" @keydown.esc=\"close\" class=\"frame\"/>\n <div v-else class=\"no-url\">No URL Specified</div>\n </modal>\n</template>\n\n<script>\nimport Keys from '@/utils/StoreMutations';\n\nexport default {\n name: 'IframeModal',\n props: {\n name: String,\n },\n data: () => ({\n url: '#',\n }),\n methods: {\n show(url) {\n this.url = url;\n this.$modal.show(this.name);\n this.$store.commit(Keys.SET_MODAL_OPEN, true);\n },\n hide() {\n this.$modal.hide(this.name);\n },\n modalClosed() {\n this.$store.commit(Keys.SET_MODAL_OPEN, false);\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n\n.frame {\n width: 100%;\n height: 100%;\n border: none;\n}\n\n.no-url {\n margin: 4rem auto;\n width: fit-content;\n font-size: 2rem;\n padding: 0.5rem;\n border: 1px dashed #ff0000;\n border-radius: 3px;\n background: #f4f2f2;\n}\n\n.close-button {\n position: absolute;\n right: 0;\n padding: 0.5rem;\n border: 0;\n border-radius: 0 0 0 10px;\n background: var(--primary);\n color: var(--background);\n border-left: 1px solid var(--primary);\n border-bottom: 1px solid var(--primary);\n cursor: pointer;\n &:hover {\n background: var(--background);\n color: var(--primary);\n }\n\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IframeModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IframeModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./IframeModal.vue?vue&type=template&id=9d1b92c8&\"\nimport script from \"./IframeModal.vue?vue&type=script&lang=js&\"\nexport * from \"./IframeModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./IframeModal.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.modalName,\"resizable\":true,\"width\":\"50%\",\"height\":\"80%\",\"classes\":\"dashy-modal edit-section\"},on:{\"closed\":_vm.modalClosed}},[_c('div',{staticClass:\"edit-section-inner\"},[_c('h3',[_vm._v(\" \"+_vm._s(_vm.$t((\"interactive-editor.edit-section.\" + (_vm.isAddNew ? 'add' : 'edit') + \"-section-title\")))+\" \")]),_c('FormSchema',{staticClass:\"edit-section-form\",attrs:{\"schema\":_vm.customSchema,\"name\":\"editSectionForm\"},model:{value:(_vm.sectionData),callback:function ($$v) {_vm.sectionData=$$v},expression:\"sectionData\"}}),_c('SaveCancelButtons',{attrs:{\"saveClick\":_vm.saveSection,\"cancelClick\":_vm.modalClosed}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <modal\n :name=\"modalName\" @closed=\"modalClosed\"\n :resizable=\"true\" width=\"50%\" height=\"80%\"\n classes=\"dashy-modal edit-section\"\n >\n <div class=\"edit-section-inner\">\n <h3>\n {{ $t(`interactive-editor.edit-section.${isAddNew ? 'add' : 'edit'}-section-title`) }}\n </h3>\n <FormSchema\n :schema=\"customSchema\"\n v-model=\"sectionData\"\n name=\"editSectionForm\"\n class=\"edit-section-form\"\n />\n <SaveCancelButtons\n :saveClick=\"saveSection\"\n :cancelClick=\"modalClosed\"\n />\n </div>\n </modal>\n</template>\n\n<script>\nimport FormSchema from '@formschema/native';\nimport StoreKeys from '@/utils/StoreMutations';\nimport DashySchema from '@/utils/ConfigSchema';\nimport { modalNames } from '@/utils/defaults';\nimport SaveCancelButtons from '@/components/InteractiveEditor/SaveCancelButtons';\n\nexport default {\n name: 'EditSection',\n props: {\n sectionIndex: Number,\n isAddNew: Boolean,\n },\n components: {\n SaveCancelButtons,\n FormSchema,\n },\n data() {\n return {\n modalName: modalNames.EDIT_SECTION,\n schema: DashySchema.properties.sections.items.properties,\n sectionData: {},\n };\n },\n computed: {\n /* Make a custom schema object, using fields from ConfigSchema */\n customSchema() {\n const sectionSchema = this.schema;\n const displayDataSchema = this.schema.displayData.properties;\n return {\n type: 'object',\n properties: {\n name: sectionSchema.name,\n icon: sectionSchema.icon,\n displayData: {\n title: '',\n description: '',\n type: 'object',\n properties: {\n sortBy: displayDataSchema.sortBy,\n rows: displayDataSchema.rows,\n cols: displayDataSchema.cols,\n collapsed: displayDataSchema.collapsed,\n hideForGuests: displayDataSchema.hideForGuests,\n },\n },\n },\n };\n },\n },\n mounted() {\n this.sectionData = this.$store.getters.getSectionByIndex(this.sectionIndex);\n this.$modal.show(modalNames.EDIT_SECTION);\n },\n methods: {\n /* From the current index, return section data */\n getSectionFromState(index) {\n if (this.isAddNew) return {};\n return this.$store.getters.getSectionByIndex(index);\n },\n /* Clean up work, triggered when modal closed */\n modalClosed() {\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n this.$emit('closeEditSection');\n },\n /* Either update existing section, or insert new one, then close modal */\n saveSection() {\n const { sectionIndex, sectionData } = this;\n if (this.isAddNew) {\n this.$store.commit(StoreKeys.INSERT_SECTION, sectionData);\n } else {\n this.$store.commit(StoreKeys.UPDATE_SECTION, { sectionIndex, sectionData });\n }\n this.$store.commit(StoreKeys.SET_EDIT_MODE, true);\n this.$emit('closeEditSection');\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n@import '@/styles/media-queries.scss';\n@import '@/styles/schema-editor.scss';\n\n.edit-section-inner {\n padding: 1rem;\n background: var(--interactive-editor-background);\n color: var(--interactive-editor-color);\n height: 100%;\n overflow-y: auto;\n @extend .scroll-bar;\n h3 {\n font-size: 1.4rem;\n margin: 0.5rem;\n }\n .edit-section-form {\n @extend .schema-form;\n margin-bottom: 2.5rem;\n }\n .edit-section-save-btn {\n margin-bottom: 2rem;\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditSection.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditSection.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./EditSection.vue?vue&type=template&id=685776cc&\"\nimport script from \"./EditSection.vue?vue&type=script&lang=js&\"\nexport * from \"./EditSection.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EditSection.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('transition',{attrs:{\"name\":\"slide\"}},[(_vm.show && !_vm.isMenuDisabled)?_c('div',{staticClass:\"context-menu\",style:(_vm.posX && _vm.posY ? (\"top:\" + _vm.posY + \"px;left:\" + _vm.posX + \"px;\") : '')},[_c('ul',{staticClass:\"menu-section\"},[_c('li',{on:{\"click\":function($event){return _vm.openSection()}}},[_c('SameTabOpenIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.section.open-section')))])],1),_c('li',{on:{\"click\":_vm.openEditSectionMenu}},[_c('EditIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.section.edit-section')))])],1),(_vm.isEditMode)?_c('li',{on:{\"click\":_vm.removeSection}},[_c('BinIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.section.remove-section')))])],1):_vm._e()])]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <transition name=\"slide\">\n <div class=\"context-menu\" v-if=\"show && !isMenuDisabled\"\n :style=\"posX && posY ? `top:${posY}px;left:${posX}px;` : ''\">\n <!-- Open Options -->\n <ul class=\"menu-section\">\n <li @click=\"openSection()\">\n <SameTabOpenIcon />\n <span>{{ $t('context-menus.section.open-section') }}</span>\n </li>\n <li @click=\"openEditSectionMenu\">\n <EditIcon />\n <span>{{ $t('context-menus.section.edit-section') }}</span>\n </li>\n <li v-if=\"isEditMode\" @click=\"removeSection\">\n <BinIcon />\n <span>{{ $t('context-menus.section.remove-section') }}</span>\n </li>\n </ul>\n </div>\n </transition>\n</template>\n\n<script>\n// Import icons for each element\nimport EditIcon from '@/assets/interface-icons/config-edit-json.svg';\nimport BinIcon from '@/assets/interface-icons/interactive-editor-remove.svg';\nimport SameTabOpenIcon from '@/assets/interface-icons/open-current-tab.svg';\n\nexport default {\n name: 'ContextMenu',\n components: {\n EditIcon,\n BinIcon,\n SameTabOpenIcon,\n },\n props: {\n posX: Number, // The X coordinate for positioning\n posY: Number, // The Y coordinate for positioning\n show: Boolean, // Should show or hide the menu\n },\n computed: {\n isMenuDisabled() {\n return !!this.$store.getters.appConfig.disableContextMenu;\n },\n isEditMode() {\n return this.$store.state.editMode;\n },\n },\n methods: {\n /* Called on item click, emits an event up to Item */\n /* in order to launch the current app to a given target */\n openSection() {\n this.$emit('navigateToSection');\n },\n openEditSectionMenu() {\n this.$emit('openEditSection');\n },\n removeSection() {\n this.$emit('removeSection');\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\ndiv.context-menu {\n position: absolute;\n margin: 0;\n padding: 0;\n z-index: 8;\n background: var(--context-menu-background);\n color: var(--context-menu-color);\n border: 1px solid var(--context-menu-secondary-color);\n border-radius: var(--curve-factor);\n box-shadow: var(--context-menu-shadow);\n opacity: 0.98;\n\n ul.menu-section {\n list-style-type: none;\n margin: 0;\n padding: 0;\n &:not(:last-child) {\n border-bottom: 1px solid var(--context-menu-color);\n }\n li {\n cursor: pointer;\n padding: 0.5rem 1rem;\n display: flex;\n flex-direction: row;\n font-size: 1rem;\n &:not(:last-child) {\n border-bottom: 1px solid var(--context-menu-secondary-color);\n }\n svg {\n width: 1rem;\n margin-right: 0.5rem;\n path { fill: currentColor; }\n }\n }\n }\n}\n\n// Define enter and leave transitions\n.slide-enter-active { animation: slide-in .1s; }\n.slide-leave-active { animation: slide-in .1s reverse; }\n@keyframes slide-in {\n 0% { transform: scaleY(0.5) scaleX(0.8) translateY(-50px); }\n 100% { transform: scaleY(1) translateY(0) translateY(0); }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SectionContextMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SectionContextMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SectionContextMenu.vue?vue&type=template&id=04bcadf7&scoped=true&\"\nimport script from \"./SectionContextMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./SectionContextMenu.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SectionContextMenu.vue?vue&type=style&index=0&id=04bcadf7&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"04bcadf7\",\n null\n \n)\n\nexport default component.exports","<template>\n <Collapsable\n :title=\"title\"\n :icon=\"icon\"\n :uniqueKey=\"groupId\"\n :collapsed=\"displayData.collapsed\"\n :cols=\"displayData.cols\"\n :rows=\"displayData.rows\"\n :color=\"displayData.color\"\n :customStyles=\"displayData.customStyles\"\n @openEditSection=\"openEditSection\"\n @openContextMenu=\"openContextMenu\"\n >\n <!-- If no items, show message -->\n <div v-if=\"(!items || items.length < 1) && !isEditMode\" class=\"no-items\">\n No Items to Show Yet\n </div>\n <!-- Item Container -->\n <div v-else\n :class=\"`there-are-items ${isGridLayout? 'item-group-grid': ''} inner-size-${itemSize}`\"\n :style=\"gridStyle\" :id=\"`section-${groupId}`\"\n > <!-- Show for each item -->\n <Item\n v-for=\"(item) in sortedItems\"\n :id=\"item.id\"\n :key=\"item.id\"\n :url=\"item.url\"\n :title=\"item.title\"\n :description=\"item.description\"\n :icon=\"item.icon\"\n :target=\"item.target\"\n :color=\"item.color\"\n :backgroundColor=\"item.backgroundColor\"\n :statusCheckUrl=\"item.statusCheckUrl\"\n :statusCheckHeaders=\"item.statusCheckHeaders\"\n :itemSize=\"newItemSize\"\n :hotkey=\"item.hotkey\"\n :provider=\"item.provider\"\n :parentSectionTitle=\"title\"\n :enableStatusCheck=\"shouldEnableStatusCheck(item.statusCheck)\"\n :statusCheckInterval=\"getStatusCheckInterval()\"\n :statusCheckAllowInsecure=\"item.statusCheckAllowInsecure\"\n @itemClicked=\"$emit('itemClicked')\"\n @triggerModal=\"triggerModal\"\n :isAddNew=\"false\"\n />\n <!-- When in edit mode, show additional item, for Add New item -->\n <Item v-if=\"isEditMode\"\n :isAddNew=\"true\"\n :parentSectionTitle=\"title\"\n icon=\":heavy_plus_sign:\"\n id=\"add-new\"\n title=\"Add New Item\"\n description=\"Click to add new item\"\n key=\"add-new\"\n class=\"add-new-item\"\n :itemSize=\"newItemSize\"\n />\n <div ref=\"modalContainer\"></div>\n </div>\n <!-- Modal for opening in modal view -->\n <IframeModal\n :ref=\"`iframeModal-${groupId}`\"\n :name=\"`iframeModal-${groupId}`\"\n @closed=\"$emit('itemClicked')\"\n />\n <!-- Edit item menu -->\n <EditSection\n v-if=\"editMenuOpen\"\n @closeEditSection=\"closeEditSection\"\n :sectionIndex=\"index\"\n :isAddNew=\"false\"\n />\n <!-- Right-click item options context menu -->\n <ContextMenu\n :show=\"contextMenuOpen\"\n :posX=\"contextPos.posX\"\n :posY=\"contextPos.posY\"\n :id=\"`context-menu-${groupId}`\"\n v-click-outside=\"closeContextMenu\"\n @openEditSection=\"openEditSection\"\n @navigateToSection=\"navigateToSection\"\n @removeSection=\"removeSection\"\n />\n </Collapsable>\n</template>\n\n<script>\nimport router from '@/router';\nimport Item from '@/components/LinkItems/Item.vue';\nimport Collapsable from '@/components/LinkItems/Collapsable.vue';\nimport IframeModal from '@/components/LinkItems/IframeModal.vue';\nimport EditSection from '@/components/InteractiveEditor/EditSection.vue';\nimport ContextMenu from '@/components/LinkItems/SectionContextMenu.vue';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport StoreKeys from '@/utils/StoreMutations';\nimport {\n sortOrder as defaultSortOrder,\n localStorageKeys,\n modalNames,\n} from '@/utils/defaults';\n\nexport default {\n name: 'Section',\n props: {\n groupId: String,\n title: String,\n icon: String,\n displayData: Object,\n items: Array,\n itemSize: String,\n index: Number,\n },\n components: {\n Collapsable,\n ContextMenu,\n Item,\n IframeModal,\n EditSection,\n },\n data() {\n return {\n editMenuOpen: false,\n contextMenuOpen: false,\n contextPos: {\n posX: undefined,\n posY: undefined,\n },\n };\n },\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n sortOrder() {\n return this.displayData.sortBy || defaultSortOrder;\n },\n /* If the sortBy attribute is specified, then return sorted data */\n sortedItems() {\n let { items } = this;\n if (this.appConfig.disableSmartSort) return items;\n if (this.sortOrder === 'alphabetical') {\n this.sortAlphabetically(items);\n } else if (this.sortOrder === 'reverse-alphabetical') {\n this.sortAlphabetically(items).reverse();\n } else if (this.sortOrder === 'most-used') {\n items = this.sortByMostUsed(items);\n } else if (this.sortOrder === 'last-used') {\n items = this.sortBLastUsed(items);\n } else if (this.sortOrder === 'random') {\n items = this.sortRandomly(items);\n } else if (this.sortOrder && this.sortOrder !== 'default') {\n ErrorHandler(`Unknown Sort order '${this.sortOrder}' under '${this.title}'`);\n }\n return items;\n },\n newItemSize() {\n return this.displayData.itemSize || this.itemSize;\n },\n isGridLayout() {\n return this.displayData.sectionLayout === 'grid'\n || !!(this.displayData.itemCountX || this.displayData.itemCountY);\n },\n gridStyle() {\n let styles = '';\n if (document.body.clientWidth > 600) { // Only proceed if not on tiny screen\n styles += this.displayData.itemCountX\n ? `grid-template-columns: repeat(${this.displayData.itemCountX}, minmax(0, 1fr));` : '';\n styles += this.displayData.itemCountY\n ? `grid-template-rows: repeat(${this.displayData.itemCountY}, minmax(0, 1fr));` : '';\n }\n return styles;\n },\n isEditMode() {\n return this.$store.state.editMode;\n },\n },\n methods: {\n /* Opens the iframe modal */\n triggerModal(url) {\n this.$refs[`iframeModal-${this.groupId}`].show(url);\n },\n /* Determines if user has enabled online status checks */\n shouldEnableStatusCheck(itemPreference) {\n const globalPreference = this.appConfig.statusCheck || false;\n return itemPreference !== undefined ? itemPreference : globalPreference;\n },\n /* Determine how often to re-fire status checks */\n getStatusCheckInterval() {\n let interval = this.appConfig.statusCheckInterval;\n if (!interval) return 0;\n if (interval > 60) interval = 60;\n if (interval < 1) interval = 0;\n return interval;\n },\n /* Sorts items alphabetically using the title attribute */\n sortAlphabetically(items) {\n return items.sort((a, b) => (a.title > b.title ? 1 : -1));\n },\n /* Sorts items by most used to least used, based on click-count */\n sortByMostUsed(items) {\n const usageCount = JSON.parse(localStorage.getItem(localStorageKeys.MOST_USED) || '{}');\n const gmu = (item) => usageCount[item.id] || 0;\n items.reverse().sort((a, b) => (gmu(a) < gmu(b) ? 1 : -1));\n return items;\n },\n /* Sorts items by most recently used */\n sortBLastUsed(items) {\n const usageCount = JSON.parse(localStorage.getItem(localStorageKeys.LAST_USED) || '{}');\n const glu = (item) => usageCount[item.id] || 0;\n items.reverse().sort((a, b) => (glu(a) < glu(b) ? 1 : -1));\n return items;\n },\n /* Sorts items randomly */\n sortRandomly(items) {\n return items\n .map((value) => ({ value, sort: Math.random() }))\n .sort((a, b) => a.sort - b.sort)\n .map(({ value }) => value);\n },\n /* Navigate to the section's single-section view page */\n navigateToSection() {\n const parse = (section) => section.replace(' ', '-').toLowerCase().trim();\n const sectionIdentifier = parse(this.title);\n router.push({ path: `/home/${sectionIdentifier}` });\n this.closeContextMenu();\n },\n /* Open the Section Edit Menu */\n openEditSection() {\n this.editMenuOpen = true;\n this.$modal.show(modalNames.EDIT_SECTION);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n this.closeContextMenu();\n },\n /* Close the section edit menu */\n closeEditSection() {\n this.editMenuOpen = false;\n this.$modal.hide(modalNames.EDIT_SECTION);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n },\n /* Deletes current section, in local state */\n removeSection() {\n const confirmMsg = this.$t('interactive-editor.edit-section.remove-confirm');\n const youSure = confirm(confirmMsg); // eslint-disable-line no-alert, no-restricted-globals\n if (youSure) {\n const payload = { sectionIndex: this.index, sectionName: this.title };\n this.$store.commit(StoreKeys.REMOVE_SECTION, payload);\n }\n this.closeContextMenu();\n },\n /* Open custom context menu, and set position */\n openContextMenu(e) {\n this.contextMenuOpen = true;\n if (e && window) {\n this.contextPos = {\n posX: e.clientX + window.pageXOffset,\n posY: e.clientY + window.pageYOffset,\n };\n }\n },\n /* Hide the right-click context menu */\n closeContextMenu() {\n this.contextMenuOpen = false;\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/media-queries.scss';\n@import '@/styles/style-helpers.scss';\n\n.no-items {\n width: 100px;\n margin: 0 auto;\n padding: 0.8rem;\n text-align: center;\n cursor: default;\n color: var(--primary);\n background: var(--item-background);\n border-radius: var(--curve-factor);\n box-shadow: var(--item-shadow);\n}\n\n.there-are-items {\n height: 100%;\n display: flex;\n flex-wrap: wrap;\n &.item-group-grid {\n display: grid;\n overflow: auto;\n @extend .scroll-bar;\n @include phone { --item-col-count: 1; }\n @include tablet { --item-col-count: 2; }\n @include laptop { --item-col-count: 2; }\n @include monitor { --item-col-count: 3; }\n @include big-screen { --item-col-count: 4; }\n @include big-screen-up { --item-col-count: 5; }\n grid-template-columns: repeat(var(--item-col-count, 2), minmax(0, 1fr));\n }\n}\n.orientation-horizontal:not(.single-section-view) {\n display: flex;\n flex-direction: column;\n .there-are-items {\n display: grid;\n @include phone { --item-col-count: 2; }\n @include tablet { --item-col-count: 4; }\n @include laptop { --item-col-count: 6; }\n @include monitor { --item-col-count: 8; }\n @include big-screen { --item-col-count: 10; }\n @include big-screen-up { --item-col-count: 12; }\n grid-template-columns: repeat(var(--item-col-count, 2), minmax(0, 1fr));\n }\n .there-are-items.inner-size-large {\n display: grid;\n @include phone { --item-col-count: 1; }\n @include tablet { --item-col-count: 2; }\n @include laptop { --item-col-count: 3; }\n @include monitor { --item-col-count: 5; }\n @include big-screen { --item-col-count: 6; }\n @include big-screen-up { --item-col-count: 8; }\n grid-template-columns: repeat(var(--item-col-count, 2), minmax(0, 1fr));\n }\n}\n\n.add-new-item {\n display: flex;\n a {\n border-style: dashed;\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Section.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Section.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Section.vue?vue&type=template&id=64cbaaaf&scoped=true&\"\nimport script from \"./Section.vue?vue&type=script&lang=js&\"\nexport * from \"./Section.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Section.vue?vue&type=style&index=0&id=64cbaaaf&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"64cbaaaf\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"edit-mode-bottom-banner\"},[_c('div',{staticClass:\"edit-banner-section intro-container\"},[_c('p',{staticClass:\"section-sub-title edit-mode-intro l-1\"},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.edit-mode-subtitle'))+\" \")]),_c('p',{staticClass:\"edit-mode-intro l-2\"},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.edit-mode-description'))+\" \")])]),_c('div',{staticClass:\"edit-banner-section empty-space\"}),_c('div',{staticClass:\"edit-banner-section save-buttons-container\"},[_c('p',{staticClass:\"section-sub-title\"},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.config-save-methods-subheading'))+\" \")]),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.menu.save-locally-tooltip'))),expression:\"tooltip($t('interactive-editor.menu.save-locally-tooltip'))\"}],attrs:{\"click\":_vm.saveLocally}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.save-locally-btn'))+\" \"),_c('SaveLocallyIcon')],1),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.menu.save-disk-tooltip'))),expression:\"tooltip($t('interactive-editor.menu.save-disk-tooltip'))\"}],attrs:{\"click\":_vm.writeToDisk}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.save-disk-btn'))+\" \"),_c('SaveToDiskIcon')],1),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.menu.export-config-tooltip'))),expression:\"tooltip($t('interactive-editor.menu.export-config-tooltip'))\"}],attrs:{\"click\":_vm.openExportConfigMenu}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.export-config-btn'))+\" \"),_c('ExportIcon')],1),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.menu.cloud-backup-tooltip'))),expression:\"tooltip($t('interactive-editor.menu.cloud-backup-tooltip'))\"}],attrs:{\"click\":_vm.openCloudBackupMenu}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.cloud-backup-btn'))+\" \"),_c('CloudBackupIcon')],1),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.menu.edit-raw-config-tooltip'))),expression:\"tooltip($t('interactive-editor.menu.edit-raw-config-tooltip'))\"}],attrs:{\"click\":_vm.openRawConfigEditor}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.edit-raw-config-btn'))+\" \"),_c('EditRawIcon')],1),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.menu.cancel-changes-tooltip'))),expression:\"tooltip($t('interactive-editor.menu.cancel-changes-tooltip'))\"}],attrs:{\"click\":_vm.reset}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.cancel-changes-btn'))+\" \"),_c('CancelIcon')],1)],1),_c('div',{staticClass:\"edit-banner-section edit-site-config-buttons\"},[_c('p',{staticClass:\"section-sub-title\"},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.edit-site-data-subheading'))+\" \")]),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.menu.edit-page-info-tooltip'))),expression:\"tooltip($t('interactive-editor.menu.edit-page-info-tooltip'))\"}],attrs:{\"click\":_vm.openEditPageInfo}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.edit-page-info-btn'))+\" \"),_c('PageInfoIcon')],1),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.menu.edit-app-config-tooltip'))),expression:\"tooltip($t('interactive-editor.menu.edit-app-config-tooltip'))\"}],attrs:{\"click\":_vm.openEditAppConfig}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.edit-app-config-btn'))+\" \"),_c('AppConfigIcon')],1)],1),_c('EditPageInfo'),_c('EditAppConfig')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.modalName,\"resizable\":true,\"width\":\"50%\",\"height\":\"80%\",\"classes\":\"dashy-modal edit-page-info\"},on:{\"closed\":_vm.modalClosed}},[_c('div',{staticClass:\"edit-page-info-inner\"},[_c('h3',[_vm._v(_vm._s(_vm.$t('interactive-editor.menu.edit-page-info-btn')))]),_c('FormSchema',{staticClass:\"page-info-form\",attrs:{\"schema\":_vm.schema,\"name\":\"pageInfoForm\"},on:{\"submit\":function($event){$event.preventDefault();return _vm.saveToState.apply(null, arguments)}},model:{value:(_vm.formData),callback:function ($$v) {_vm.formData=$$v},expression:\"formData\"}},[_c('Button',{attrs:{\"type\":\"submit\"}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.save-stage-btn'))+\" \"),_c('SaveIcon')],1)],1)],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <modal\n :name=\"modalName\" @closed=\"modalClosed\"\n :resizable=\"true\" width=\"50%\" height=\"80%\"\n classes=\"dashy-modal edit-page-info\"\n >\n <div class=\"edit-page-info-inner\">\n <h3>{{ $t('interactive-editor.menu.edit-page-info-btn') }}</h3>\n <FormSchema\n :schema=\"schema\"\n v-model=\"formData\"\n @submit.prevent=\"saveToState\"\n class=\"page-info-form\"\n name=\"pageInfoForm\"\n >\n <Button type=\"submit\">\n {{ $t('interactive-editor.menu.save-stage-btn') }}\n <SaveIcon />\n </Button>\n </FormSchema>\n </div>\n </modal>\n</template>\n\n<script>\nimport FormSchema from '@formschema/native';\nimport DashySchema from '@/utils/ConfigSchema';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { modalNames } from '@/utils/defaults';\nimport Button from '@/components/FormElements/Button';\nimport SaveIcon from '@/assets/interface-icons/save-config.svg';\n\nexport default {\n name: 'EditPageInfo',\n data() {\n return {\n formData: {},\n schema: DashySchema.properties.pageInfo,\n modalName: modalNames.EDIT_PAGE_INFO,\n };\n },\n components: {\n FormSchema,\n Button,\n SaveIcon,\n },\n mounted() {\n this.formData = this.pageInfo;\n },\n computed: {\n pageInfo() {\n return this.$store.getters.pageInfo;\n },\n },\n methods: {\n /* When form submitteed, update VueX store with new pageInfo, and close modal */\n saveToState() {\n this.$store.commit(StoreKeys.SET_PAGE_INFO, this.formData);\n this.$modal.hide(this.modalName);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n this.$store.commit(StoreKeys.SET_EDIT_MODE, true);\n },\n /* Called when modal manually closed, updates state to allow searching again */\n modalClosed() {\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n@import '@/styles/media-queries.scss';\n@import '@/styles/schema-editor.scss';\n\n.edit-page-info-inner {\n padding: 1rem;\n background: var(--interactive-editor-background);\n color: var(--interactive-editor-color);\n height: 100%;\n overflow-y: auto;\n @extend .scroll-bar;\n h3 {\n font-size: 1.4rem;\n margin: 0.5rem;\n }\n .page-info-form {\n @extend .schema-form;\n margin-bottom: 2.5rem;\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditPageInfo.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditPageInfo.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./EditPageInfo.vue?vue&type=template&id=01a248f1&\"\nimport script from \"./EditPageInfo.vue?vue&type=script&lang=js&\"\nexport * from \"./EditPageInfo.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EditPageInfo.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.modalName,\"resizable\":true,\"width\":\"50%\",\"height\":\"80%\",\"classes\":\"dashy-modal edit-app-config\"},on:{\"closed\":_vm.modalClosed}},[_c('div',{staticClass:\"edit-app-config-inner\"},[_c('h3',[_vm._v(_vm._s(_vm.$t('interactive-editor.menu.edit-app-config-btn')))]),_c('div',{staticClass:\"app-config-intro\"},[_c('p',{staticClass:\"use-caution\"},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.edit-app-config.warning-msg-title'))+\" \")]),_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.edit-app-config.warning-msg-l1'))+\" \"+_vm._s(_vm.$t('interactive-editor.edit-app-config.warning-msg-l2'))+\" \"),_c('a',{attrs:{\"href\":\"https://dashy.to/docs/configuring#appconfig-optional\"}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.edit-app-config.warning-msg-docs'))+\" \")]),_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.edit-app-config.warning-msg-l3'))+\" \")]),_c('SaveCancelButtons',{attrs:{\"saveClick\":_vm.saveToState,\"cancelClick\":_vm.cancelEditing}}),_c('FormSchema',{staticClass:\"app-config-form\",attrs:{\"schema\":_vm.schema,\"search\":true,\"name\":\"appConfigForm\"},on:{\"submit\":function($event){$event.preventDefault();return _vm.saveToState.apply(null, arguments)}},model:{value:(_vm.formData),callback:function ($$v) {_vm.formData=$$v},expression:\"formData\"}}),_c('SaveCancelButtons',{attrs:{\"saveClick\":_vm.saveToState,\"cancelClick\":_vm.cancelEditing}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <modal\n :name=\"modalName\"\n :resizable=\"true\"\n width=\"50%\"\n height=\"80%\"\n classes=\"dashy-modal edit-app-config\"\n @closed=\"modalClosed\"\n >\n <div class=\"edit-app-config-inner\">\n <h3>{{ $t('interactive-editor.menu.edit-app-config-btn') }}</h3>\n <!-- Show caution message -->\n <div class=\"app-config-intro\">\n <p class=\"use-caution\">\n {{ $t('interactive-editor.edit-app-config.warning-msg-title') }}\n </p>\n {{ $t('interactive-editor.edit-app-config.warning-msg-l1') }}\n {{ $t('interactive-editor.edit-app-config.warning-msg-l2') }}\n <a href=\"https://dashy.to/docs/configuring#appconfig-optional\">\n {{ $t('interactive-editor.edit-app-config.warning-msg-docs') }}\n </a>\n {{ $t('interactive-editor.edit-app-config.warning-msg-l3') }}\n </div>\n <!-- Save Button, upper -->\n <SaveCancelButtons :saveClick=\"saveToState\" :cancelClick=\"cancelEditing\" />\n <!-- The main form -->\n <FormSchema\n :schema=\"schema\"\n v-model=\"formData\"\n @submit.prevent=\"saveToState\"\n :search=\"true\"\n class=\"app-config-form\"\n name=\"appConfigForm\"\n ></FormSchema>\n <!-- Save Button, lower -->\n <SaveCancelButtons :saveClick=\"saveToState\" :cancelClick=\"cancelEditing\" />\n </div>\n </modal>\n</template>\n\n<script>\nimport FormSchema from '@formschema/native';\nimport DashySchema from '@/utils/ConfigSchema';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { modalNames } from '@/utils/defaults';\nimport SaveCancelButtons from '@/components/InteractiveEditor/SaveCancelButtons';\n\nexport default {\n name: 'EditAppConfig',\n data() {\n return {\n formData: {},\n schema: DashySchema.properties.appConfig,\n modalName: modalNames.EDIT_APP_CONFIG,\n };\n },\n props: {},\n components: {\n FormSchema,\n SaveCancelButtons,\n },\n mounted() {\n this.formData = this.appConfig;\n },\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n },\n methods: {\n /* When form submitteed, update VueX store with new appConfig, and close modal */\n saveToState() {\n const processedFormData = this.removeUndefinedValues(this.formData);\n this.$store.commit(StoreKeys.SET_APP_CONFIG, processedFormData);\n this.$modal.hide(this.modalName);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n this.$store.commit(StoreKeys.SET_EDIT_MODE, true);\n },\n cancelEditing() {\n this.$modal.hide(this.modalName);\n },\n /* Called when modal manually closed, updates state to allow searching again */\n modalClosed() {\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n },\n /* Remove any attribute which has an undefined value before saving */\n removeUndefinedValues(rawAppConfig) {\n const raw = rawAppConfig;\n const isEmpty = (value) => (value === undefined);\n Object.keys(raw).forEach(key => isEmpty(raw[key]) && delete raw[key]);\n return raw;\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n@import '@/styles/media-queries.scss';\n@import '@/styles/schema-editor.scss';\n\n.edit-app-config-inner {\n padding: 1rem;\n background: var(--interactive-editor-background);\n color: var(--interactive-editor-color);\n height: 100%;\n overflow-y: auto;\n @extend .scroll-bar;\n h3 {\n font-size: 1.4rem;\n margin: 0.5rem;\n }\n .app-config-form {\n @extend .schema-form;\n border-top: 1px dashed var(--interactive-editor-color);\n }\n .app-config-intro {\n padding: 0.5rem;\n font-size: 0.9rem;\n color: var(--interactive-editor-color);\n background: var(--interactive-editor-background-darker);\n border-radius: var(--interactive-editor-color);\n p.use-caution {\n color: var(--warning);\n margin: 0;\n font-weight: bold;\n }\n a {\n color: var(--interactive-editor-color);\n }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditAppConfig.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditAppConfig.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./EditAppConfig.vue?vue&type=template&id=7e7e9b78&\"\nimport script from \"./EditAppConfig.vue?vue&type=script&lang=js&\"\nexport * from \"./EditAppConfig.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EditAppConfig.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<template>\n <!-- Intro Info -->\n <div class=\"edit-mode-bottom-banner\">\n <div class=\"edit-banner-section intro-container\">\n <p class=\"section-sub-title edit-mode-intro l-1\">\n {{ $t('interactive-editor.menu.edit-mode-subtitle') }}\n </p>\n <p class=\"edit-mode-intro l-2\">\n {{ $t('interactive-editor.menu.edit-mode-description') }}\n </p>\n </div>\n <div class=\"edit-banner-section empty-space\"></div>\n <!-- Save Buttons -->\n <div class=\"edit-banner-section save-buttons-container\">\n <p class=\"section-sub-title\">\n {{ $t('interactive-editor.menu.config-save-methods-subheading') }}\n </p>\n <Button\n :click=\"saveLocally\"\n v-tooltip=\"tooltip($t('interactive-editor.menu.save-locally-tooltip'))\"\n >\n {{ $t('interactive-editor.menu.save-locally-btn') }}\n <SaveLocallyIcon />\n </Button>\n <Button\n :click=\"writeToDisk\"\n v-tooltip=\"tooltip($t('interactive-editor.menu.save-disk-tooltip'))\"\n >\n {{ $t('interactive-editor.menu.save-disk-btn') }}\n <SaveToDiskIcon />\n </Button>\n <Button\n :click=\"openExportConfigMenu\"\n v-tooltip=\"tooltip($t('interactive-editor.menu.export-config-tooltip'))\"\n >\n {{ $t('interactive-editor.menu.export-config-btn') }}\n <ExportIcon />\n </Button>\n <Button\n :click=\"openCloudBackupMenu\"\n v-tooltip=\"tooltip($t('interactive-editor.menu.cloud-backup-tooltip'))\"\n >\n {{ $t('interactive-editor.menu.cloud-backup-btn') }}\n <CloudBackupIcon />\n </Button>\n <Button\n :click=\"openRawConfigEditor\"\n v-tooltip=\"tooltip($t('interactive-editor.menu.edit-raw-config-tooltip'))\"\n >\n {{ $t('interactive-editor.menu.edit-raw-config-btn') }}\n <EditRawIcon />\n </Button>\n <Button\n :click=\"reset\"\n v-tooltip=\"tooltip($t('interactive-editor.menu.cancel-changes-tooltip'))\"\n >\n {{ $t('interactive-editor.menu.cancel-changes-btn') }}\n <CancelIcon />\n </Button>\n </div>\n <!-- Open Modal Buttons -->\n <div class=\"edit-banner-section edit-site-config-buttons\">\n <p class=\"section-sub-title\">\n {{ $t('interactive-editor.menu.edit-site-data-subheading') }}\n </p>\n <Button\n :click=\"openEditPageInfo\"\n v-tooltip=\"tooltip($t('interactive-editor.menu.edit-page-info-tooltip'))\"\n >\n {{ $t('interactive-editor.menu.edit-page-info-btn') }}\n <PageInfoIcon />\n </Button>\n <Button\n :click=\"openEditAppConfig\"\n v-tooltip=\"tooltip($t('interactive-editor.menu.edit-app-config-tooltip'))\"\n >\n {{ $t('interactive-editor.menu.edit-app-config-btn') }}\n <AppConfigIcon />\n </Button>\n </div>\n <!-- Modals for editing appConfig + pageInfo -->\n <EditPageInfo />\n <EditAppConfig />\n </div>\n</template>\n\n<script>\nimport axios from 'axios';\nimport jsYaml from 'js-yaml';\nimport ProgressBar from 'rsup-progress';\n\nimport Button from '@/components/FormElements/Button';\nimport StoreKeys from '@/utils/StoreMutations';\nimport EditPageInfo from '@/components/InteractiveEditor/EditPageInfo';\nimport EditAppConfig from '@/components/InteractiveEditor/EditAppConfig';\nimport { modalNames, localStorageKeys, serviceEndpoints } from '@/utils/defaults';\nimport ErrorHandler, { InfoHandler } from '@/utils/ErrorHandler';\n\nimport SaveLocallyIcon from '@/assets/interface-icons/interactive-editor-save-locally.svg';\nimport SaveToDiskIcon from '@/assets/interface-icons/interactive-editor-save-disk.svg';\nimport ExportIcon from '@/assets/interface-icons/interactive-editor-export-changes.svg';\nimport CancelIcon from '@/assets/interface-icons/interactive-editor-cancel-changes.svg';\nimport AppConfigIcon from '@/assets/interface-icons/interactive-editor-app-config.svg';\nimport PageInfoIcon from '@/assets/interface-icons/interactive-editor-page-info.svg';\nimport CloudBackupIcon from '@/assets/interface-icons/cloud-backup-restore.svg';\nimport EditRawIcon from '@/assets/interface-icons/config-edit-json.svg';\n\nexport default {\n name: 'EditModeSaveMenu',\n components: {\n Button,\n EditPageInfo,\n SaveLocallyIcon,\n SaveToDiskIcon,\n ExportIcon,\n CancelIcon,\n AppConfigIcon,\n PageInfoIcon,\n EditAppConfig,\n CloudBackupIcon,\n EditRawIcon,\n },\n computed: {\n config() {\n return this.$store.state.config;\n },\n },\n data() {\n return {\n saveSuccess: undefined,\n responseText: '',\n progress: new ProgressBar({ color: 'var(--progress-bar)' }),\n };\n },\n methods: {\n reset() {\n this.$store.dispatch(StoreKeys.INITIALIZE_CONFIG);\n this.$store.commit(StoreKeys.SET_EDIT_MODE, false);\n },\n openExportConfigMenu() {\n this.$modal.show(modalNames.EXPORT_CONFIG_MENU);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n },\n openEditPageInfo() {\n this.$modal.show(modalNames.EDIT_PAGE_INFO);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n },\n openEditAppConfig() {\n this.$modal.show(modalNames.EDIT_APP_CONFIG);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n },\n openCloudBackupMenu() {\n this.$store.commit(StoreKeys.CONF_MENU_INDEX, 2);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n this.$modal.show(modalNames.CONF_EDITOR);\n },\n openRawConfigEditor() {\n this.$store.commit(StoreKeys.CONF_MENU_INDEX, 1);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n this.$modal.show(modalNames.CONF_EDITOR);\n },\n tooltip(content) {\n return { content, trigger: 'hover focus', delay: 250 };\n },\n showToast(message, success) {\n this.$toasted.show(message, { className: `toast-${success ? 'success' : 'error'}` });\n },\n carefullyClearLocalStorage() {\n localStorage.removeItem(localStorageKeys.PAGE_INFO);\n localStorage.removeItem(localStorageKeys.APP_CONFIG);\n localStorage.removeItem(localStorageKeys.CONF_SECTIONS);\n },\n saveLocally() {\n const data = this.config;\n localStorage.setItem(localStorageKeys.CONF_SECTIONS, JSON.stringify(data.sections));\n localStorage.setItem(localStorageKeys.PAGE_INFO, JSON.stringify(data.pageInfo));\n localStorage.setItem(localStorageKeys.APP_CONFIG, JSON.stringify(data.appConfig));\n if (data.appConfig.theme) {\n localStorage.setItem(localStorageKeys.THEME, data.appConfig.theme);\n }\n InfoHandler('Config has succesfully been saved in browser storage', 'Config Update');\n this.showToast(this.$t('config-editor.success-msg-local'), true);\n this.$store.commit(StoreKeys.SET_EDIT_MODE, false);\n },\n writeToDisk() {\n // 1. Convert JSON into YAML\n const yamlOptions = {};\n const yaml = jsYaml.dump(this.config, yamlOptions);\n // 2. Prepare the request\n const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin;\n const endpoint = `${baseUrl}${serviceEndpoints.save}`;\n const headers = { 'Content-Type': 'text/plain' };\n const body = { config: yaml, timestamp: new Date() };\n const request = axios.post(endpoint, body, headers);\n // 3. Make the request, and handle response\n this.progress.start();\n request.then((response) => {\n this.saveSuccess = response.data.success || false;\n this.responseText = response.data.message;\n if (this.saveSuccess) {\n this.carefullyClearLocalStorage();\n this.showToast(this.$t('config-editor.success-msg-disk'), true);\n } else {\n this.showToast(this.$t('config-editor.error-msg-cannot-save'), false);\n }\n InfoHandler('Config has been written to disk succesfully', 'Config Update');\n this.progress.end();\n this.$store.commit(StoreKeys.SET_EDIT_MODE, false);\n })\n .catch((error) => {\n this.saveSuccess = false;\n this.responseText = error;\n this.showToast(error, false);\n ErrorHandler(`Failed to save config. ${error}`);\n this.progress.end();\n });\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/media-queries.scss';\n\ndiv.edit-mode-bottom-banner {\n position: fixed;\n display: grid;\n z-index: 5;\n bottom: 0;\n width: 100%;\n padding: 0.25rem 0;\n border-top: 2px solid var(--interactive-editor-color);\n background: var(--interactive-editor-background-darker);\n box-shadow: 0 -5px 7px var(--transparent-50);\n grid-template-columns: 45% 10% 45%;\n @include laptop-up { grid-template-columns: 40% 20% 40%; }\n @include monitor-up { grid-template-columns: 30% 40% 30%; }\n @include big-screen-up { grid-template-columns: 25% 50% 25%; }\n\n /* Main sections */\n .edit-banner-section {\n padding: 0.5rem;\n height: 90%;\n /* Section sub-titles */\n p.section-sub-title {\n margin: 0;\n color: var(--interactive-editor-color);\n font-weight: bold;\n cursor: default;\n }\n /* Intro-text container */\n &.intro-container {\n p.edit-mode-intro {\n margin: 0;\n color: var(--interactive-editor-color);\n cursor: default;\n }\n }\n /* Button containers */\n &.edit-site-config-buttons,\n &.save-buttons-container {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n button {\n margin: 0.25rem;\n height: stretch;\n }\n p.section-sub-title {\n grid-column-start: span 2;\n }\n }\n &.save-buttons-container {\n grid-row-start: span 2;\n }\n }\n\n /* Mobile layout */\n @include tablet-down {\n display: flex;\n flex-direction: column;\n .edit-banner-section,\n .edit-banner-section.intro-container {\n max-width: 90%;\n width: 100%;\n margin: 0.2rem auto;\n flex-direction: column;\n }\n }\n /* Set colors for buttons */\n .edit-banner-section button {\n color: var(--interactive-editor-color);\n border-color: var(--interactive-editor-color);\n background: var(--interactive-editor-background);\n &:hover {\n color: var(--interactive-editor-background);\n border-color: var(--interactive-editor-color);\n background: var(--interactive-editor-color);\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditModeSaveMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditModeSaveMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./EditModeSaveMenu.vue?vue&type=template&id=1893de4e&scoped=true&\"\nimport script from \"./EditModeSaveMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./EditModeSaveMenu.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EditModeSaveMenu.vue?vue&type=style&index=0&id=1893de4e&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1893de4e\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.modalName,\"resizable\":true,\"width\":\"50%\",\"height\":\"80%\",\"classes\":\"dashy-modal edit-item\"},on:{\"closed\":_vm.modalClosed}},[_c('div',{staticClass:\"export-config-inner\"},[_c('h3',[_vm._v(_vm._s(_vm.$t('interactive-editor.export.export-title')))]),_c('div',{staticClass:\"download-button-container\"},[_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.export.copy-clipboard-tooltip'))),expression:\"tooltip($t('interactive-editor.export.copy-clipboard-tooltip'))\"}],attrs:{\"click\":_vm.copyConfigToClipboard}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.export.copy-clipboard-btn'))+\" \"),_c('CopyConfigIcon')],1),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.export.download-file-tooltip'))),expression:\"tooltip($t('interactive-editor.export.download-file-tooltip'))\"}],attrs:{\"click\":_vm.downloadConfig}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.export.download-file-btn'))+\" \"),_c('DownloadConfigIcon')],1)],1),_c('h3',[_vm._v(_vm._s(_vm.$t('interactive-editor.export.view-title')))]),_c('tree-view',{staticClass:\"config-tree-view\",attrs:{\"data\":_vm.config}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n<modal\n :name=\"modalName\"\n :resizable=\"true\"\n width=\"50%\"\n height=\"80%\"\n classes=\"dashy-modal edit-item\"\n @closed=\"modalClosed\"\n >\n <div class=\"export-config-inner\">\n <!-- Download and Copy to CLipboard Buttons -->\n <h3>{{ $t('interactive-editor.export.export-title') }}</h3>\n <div class=\"download-button-container\">\n <Button :click=\"copyConfigToClipboard\"\n v-tooltip=\"tooltip($t('interactive-editor.export.copy-clipboard-tooltip'))\">\n {{ $t('interactive-editor.export.copy-clipboard-btn') }}\n <CopyConfigIcon />\n </Button>\n <Button :click=\"downloadConfig\"\n v-tooltip=\"tooltip($t('interactive-editor.export.download-file-tooltip'))\">\n {{ $t('interactive-editor.export.download-file-btn') }}\n <DownloadConfigIcon />\n </Button>\n </div>\n <!-- View Config in Tree Mode Section -->\n <h3>{{ $t('interactive-editor.export.view-title') }}</h3>\n <tree-view :data=\"config\" class=\"config-tree-view\" />\n </div>\n </modal>\n</template>\n\n<script>\nimport JsYaml from 'js-yaml';\nimport Button from '@/components/FormElements/Button';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { modalNames } from '@/utils/defaults';\nimport DownloadConfigIcon from '@/assets/interface-icons/config-download-file.svg';\nimport CopyConfigIcon from '@/assets/interface-icons/interactive-editor-copy-clipboard.svg';\nimport { InfoHandler, InfoKeys } from '@/utils/ErrorHandler';\n\nexport default {\n name: 'ExportConfigMenu',\n components: {\n Button,\n CopyConfigIcon,\n DownloadConfigIcon,\n },\n data() {\n return {\n modalName: modalNames.EXPORT_CONFIG_MENU,\n };\n },\n props: {},\n computed: {\n config() {\n return this.$store.state.config;\n },\n },\n methods: {\n convertJsonToYaml() {\n return JsYaml.dump(this.config);\n },\n downloadConfig() {\n const filename = 'dashy_conf.yml';\n const config = this.convertJsonToYaml();\n const element = document.createElement('a');\n element.setAttribute('href', `data:text/plain;charset=utf-8, ${encodeURIComponent(config)}`);\n element.setAttribute('download', filename);\n element.style.display = 'none';\n document.body.appendChild(element);\n element.click();\n document.body.removeChild(element);\n InfoHandler('Config downloaded as YAML file', InfoKeys.EDITOR);\n },\n copyConfigToClipboard() {\n const config = this.convertJsonToYaml();\n navigator.clipboard.writeText(config);\n this.$toasted.show(this.$t('config.data-copied-msg'));\n InfoHandler('Config copied to clipboard', InfoKeys.EDITOR);\n },\n modalClosed() {\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n },\n tooltip(content) {\n return {\n content, trigger: 'hover focus', delay: 250, classes: 'in-modal-tt',\n };\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n@import '@/styles/media-queries.scss';\n.tooltip { z-index: 99; }\n.export-config-inner {\n padding: 1rem;\n background: var(--interactive-editor-background);\n color: var(--interactive-editor-color);\n height: 100%;\n overflow-y: auto;\n h3 {\n margin: 1rem 0;\n }\n .download-button-container {\n display: flex;\n justify-content: center;\n padding: 0 0.5rem 1rem;\n border-bottom: 1px dashed var(--interactive-editor-color);\n button { margin: 0 1rem; }\n }\n .config-tree-view {\n padding: 0.5rem;\n font-family: var(--font-monospace);\n color: var(--interactive-editor-color);\n background: var(--interactive-editor-background-darker);\n border-radius: var(--curve-factor);\n box-shadow: 0px 0px 3px var(--interactive-editor-color);\n margin-bottom: 1.5rem;\n span {\n font-family: var(--font-monospace);\n }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ExportConfigMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ExportConfigMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ExportConfigMenu.vue?vue&type=template&id=2769904e&\"\nimport script from \"./ExportConfigMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./ExportConfigMenu.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ExportConfigMenu.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"add-section\"},[(_vm.isEditMode)?_c('div',{staticClass:\"add-new-section\",on:{\"click\":function($event){return _vm.openAddNewSectionMenu()}}},[_c('p',[_vm._v(\"➕ \"+_vm._s(_vm.$t('interactive-editor.edit-section.add-section-title')))])]):_vm._e(),(_vm.isEditMode && _vm.addNewSectionOpen)?_c('EditSectionMenu',{attrs:{\"isAddNew\":true},on:{\"closeEditSection\":_vm.closeEditSection}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!-- Main homepage for default view -->\n<template>\n <div class=\"add-section\">\n <!-- When in edit mode, show Add New Section button -->\n <div v-if=\"isEditMode\" @click=\"openAddNewSectionMenu()\" class=\"add-new-section\">\n <p>➕ {{ $t('interactive-editor.edit-section.add-section-title') }}</p>\n </div>\n <!-- Add new section form -->\n <EditSectionMenu\n v-if=\"isEditMode && addNewSectionOpen\"\n :isAddNew=\"true\"\n @closeEditSection=\"closeEditSection\"\n />\n </div>\n</template>\n\n<script>\n\nimport EditSectionMenu from '@/components/InteractiveEditor/EditSection.vue';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { modalNames } from '@/utils/defaults';\n\nexport default {\n name: 'add-section-container',\n components: {\n EditSectionMenu,\n },\n data: () => ({\n addNewSectionOpen: false,\n }),\n computed: {\n isEditMode() {\n return this.$store.state.editMode;\n },\n },\n methods: {\n openAddNewSectionMenu() {\n this.addNewSectionOpen = true;\n this.$modal.show(modalNames.EDIT_SECTION);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n },\n closeEditSection() {\n this.addNewSectionOpen = false;\n this.$modal.hide(modalNames.EDIT_SECTION);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.add-new-section {\n border: 2px dashed var(--primary);\n border-radius: var(--curve-factor);\n padding: var(--item-group-padding);\n background: var(--item-group-background);\n color: var(--primary);\n font-size: 1.2rem;\n cursor: pointer;\n text-align: center;\n height: fit-content;\n margin: 10px;\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddNewSectionLauncher.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddNewSectionLauncher.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AddNewSectionLauncher.vue?vue&type=template&id=53ced373&scoped=true&\"\nimport script from \"./AddNewSectionLauncher.vue?vue&type=script&lang=js&\"\nexport * from \"./AddNewSectionLauncher.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AddNewSectionLauncher.vue?vue&type=style&index=0&id=53ced373&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"53ced373\",\n null\n \n)\n\nexport default component.exports","<!-- Main homepage for default view -->\n<template>\n <div class=\"home\" :style=\"getBackgroundImage()\">\n <!-- Search bar, layout options and settings -->\n <SettingsContainer ref=\"filterComp\"\n @user-is-searchin=\"searching\"\n @change-modal-visibility=\"updateModalVisibility\"\n :displayLayout=\"layout\"\n :iconSize=\"itemSizeBound\"\n :externalThemes=\"getExternalCSSLinks()\"\n :modalOpen=\"modalOpen\"\n class=\"settings-outer\"\n />\n <!-- Show back button, when on single-section view -->\n <div v-if=\"singleSectionView\">\n <router-link to=\"/home\" class=\"back-to-all-link\">\n <BackIcon />\n <span>Back to All</span>\n </router-link>\n </div>\n <!-- Main content, section for each group of items -->\n <div v-if=\"checkTheresData(sections)\"\n :class=\"`item-group-container `\n + `orientation-${layout} `\n + `item-size-${itemSizeBound} `\n + (isEditMode ? 'edit-mode ' : '')\n + (singleSectionView ? 'single-section-view ' : '')\n + (this.colCount ? `col-count-${this.colCount} ` : '')\"\n >\n <Section\n v-for=\"(section, index) in filteredTiles\"\n :key=\"index\"\n :index=\"index\"\n :title=\"section.name\"\n :icon=\"section.icon || undefined\"\n :displayData=\"getDisplayData(section)\"\n :groupId=\"`section-${index}`\"\n :items=\"filterTiles(section.items, searchValue)\"\n :searchTerm=\"searchValue\"\n :itemSize=\"itemSizeBound\"\n @itemClicked=\"finishedSearching()\"\n @change-modal-visibility=\"updateModalVisibility\"\n :class=\"\n (searchValue && filterTiles(section.items, searchValue).length === 0) ? 'no-results' : ''\"\n />\n <!-- Show add new section button, in edit mode -->\n <AddNewSection v-if=\"isEditMode\" />\n </div>\n <!-- Show message when there's no data to show -->\n <div v-if=\"checkIfResults()\" class=\"no-data\">\n {{searchValue ? $t('home.no-results') : $t('home.no-data')}}\n </div>\n <!-- Show banner at bottom of screen, for Saving config changes -->\n <EditModeSaveMenu v-if=\"isEditMode\" />\n <!-- Modal for viewing and exporting configuration file -->\n <ExportConfigMenu />\n </div>\n</template>\n\n<script>\n\nimport SettingsContainer from '@/components/Settings/SettingsContainer.vue';\nimport Section from '@/components/LinkItems/Section.vue';\nimport EditModeSaveMenu from '@/components/InteractiveEditor/EditModeSaveMenu.vue';\nimport ExportConfigMenu from '@/components/InteractiveEditor/ExportConfigMenu.vue';\nimport AddNewSection from '@/components/InteractiveEditor/AddNewSectionLauncher.vue';\nimport { searchTiles } from '@/utils/Search';\nimport StoreKeys from '@/utils/StoreMutations';\nimport Defaults, { localStorageKeys, iconCdns, modalNames } from '@/utils/defaults';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport BackIcon from '@/assets/interface-icons/back-arrow.svg';\n\nexport default {\n name: 'home',\n components: {\n SettingsContainer,\n EditModeSaveMenu,\n ExportConfigMenu,\n AddNewSection,\n Section,\n BackIcon,\n },\n data: () => ({\n searchValue: '',\n layout: '',\n itemSizeBound: '',\n addNewSectionOpen: false,\n }),\n computed: {\n sections() {\n return this.$store.getters.sections;\n },\n appConfig() {\n return this.$store.getters.appConfig;\n },\n pageInfo() {\n return this.$store.getters.pageInfo;\n },\n modalOpen() {\n return this.$store.state.modalOpen;\n },\n singleSectionView() {\n return this.findSingleSection(this.$store.getters.sections, this.$route.params.section);\n },\n isEditMode() {\n return this.$store.state.editMode;\n },\n /* Get class for num columns, if specified by user */\n colCount() {\n let { colCount } = this.appConfig;\n if (!colCount) return null;\n if (colCount < 1) colCount = 1;\n if (colCount > 8) colCount = 8;\n return colCount;\n },\n /* Return all sections, that match users search term */\n filteredTiles() {\n const sections = this.singleSectionView || this.sections;\n return sections.filter((section) => this.filterTiles(section.items, this.searchValue));\n },\n /* Updates layout (when button clicked), and saves in local storage */\n layoutOrientation() {\n return this.$store.getters.layout;\n },\n /* Updates icon size (when button clicked), and saves in local storage */\n iconSize() {\n return this.$store.getters.iconSize;\n },\n },\n watch: {\n layoutOrientation(layout) {\n localStorage.setItem(localStorageKeys.LAYOUT_ORIENTATION, layout);\n this.layout = layout;\n },\n iconSize(size) {\n localStorage.setItem(localStorageKeys.ICON_SIZE, size);\n this.itemSizeBound = size;\n },\n },\n methods: {\n /* Returns true if there is one or more sections in the config */\n checkTheresData(sections) {\n const localSections = localStorage[localStorageKeys.CONF_SECTIONS];\n return (sections && sections.length >= 1) || (localSections && localSections.length >= 1);\n },\n /* Updates local data with search value, triggered from filter comp */\n searching(searchValue) {\n this.searchValue = searchValue || '';\n },\n /* Clears input field, once a searched item is opened */\n finishedSearching() {\n this.$refs.filterComp.clearFilterInput();\n },\n /* Returns only the tiles that match the users search query */\n filterTiles(allTiles, searchTerm) {\n return searchTiles(allTiles, searchTerm);\n },\n /* Returns optional section display preferences if available */\n getDisplayData(section) {\n return !section.displayData ? {} : section.displayData;\n },\n /* Update data when modal is open (so that key bindings can be disabled) */\n updateModalVisibility(modalState) {\n this.$store.commit('SET_MODAL_OPEN', modalState);\n },\n openAddNewSectionMenu() {\n this.addNewSectionOpen = true;\n this.$modal.show(modalNames.EDIT_SECTION);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n },\n closeEditSection() {\n this.addNewSectionOpen = false;\n this.$modal.hide(modalNames.EDIT_SECTION);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n },\n /* If on sub-route, and section exists, then return only that section */\n findSingleSection: (allSections, sectionTitle) => {\n if (!sectionTitle) return undefined;\n let sectionToReturn;\n const parse = (section) => section.replaceAll(' ', '-').toLowerCase().trim();\n allSections.forEach((section) => {\n if (parse(sectionTitle) === parse(section.name)) {\n sectionToReturn = [section];\n }\n });\n if (!sectionToReturn) ErrorHandler(`No section named '${sectionTitle}' was found`);\n return sectionToReturn;\n },\n /* Returns an array of links to external CSS from the Config */\n getExternalCSSLinks() {\n const availibleThemes = {};\n if (this.appConfig) {\n if (this.appConfig.externalStyleSheet) {\n const externals = this.appConfig.externalStyleSheet;\n if (Array.isArray(externals)) {\n externals.forEach((ext, i) => {\n availibleThemes[`External Stylesheet ${i + 1}`] = ext;\n });\n } else {\n availibleThemes['External Stylesheet'] = this.appConfig.externalStyleSheet;\n }\n }\n }\n availibleThemes.Default = '#';\n return availibleThemes;\n },\n /* Checks if any sections or items use icons from a given CDN */\n checkIfIconLibraryNeeded(prefix) {\n let isNeeded = false;\n if (!this.sections) return false;\n this.sections.forEach((section) => {\n if (section.icon && section.icon.includes(prefix)) isNeeded = true;\n section.items.forEach((item) => {\n if (item.icon && item.icon.includes(prefix)) isNeeded = true;\n });\n });\n return isNeeded;\n },\n /* Checks if any of the icons are Font Awesome glyphs */\n checkIfFontAwesomeNeeded() {\n let isNeeded = this.checkIfIconLibraryNeeded('fa-');\n const currentTheme = localStorage[localStorageKeys.THEME]; // Some themes require FA\n if (['material', 'material-dark'].includes(currentTheme)) isNeeded = true;\n return isNeeded;\n },\n /* Injects font-awesome's script tag, only if needed */\n initiateFontAwesome() {\n if (this.appConfig.enableFontAwesome || this.checkIfFontAwesomeNeeded()) {\n const fontAwesomeScript = document.createElement('script');\n const faKey = this.appConfig.fontAwesomeKey || Defaults.fontAwesomeKey;\n fontAwesomeScript.setAttribute('src', `${iconCdns.fa}/${faKey}.js`);\n document.head.appendChild(fontAwesomeScript);\n }\n },\n /* Checks if any of the icons are Material Design Icons */\n checkIfMdiNeeded() {\n return this.checkIfIconLibraryNeeded('mdi-');\n },\n /* Injects Material Design Icons, only if needed */\n initiateMaterialDesignIcons() {\n if (this.checkIfMdiNeeded()) {\n const mdiStylesheet = document.createElement('link');\n mdiStylesheet.setAttribute('rel', 'stylesheet');\n mdiStylesheet.setAttribute('href', iconCdns.mdi);\n document.head.appendChild(mdiStylesheet);\n }\n },\n /* Returns true if there is more than 1 sub-result visible during searching */\n checkIfResults() {\n if (!this.sections) return false;\n else {\n let itemsFound = true;\n this.sections.forEach((section) => {\n if (this.filterTiles(section.items, this.searchValue).length > 0) itemsFound = false;\n });\n return itemsFound;\n }\n },\n /* If user has a background image, then generate CSS attributes */\n getBackgroundImage() {\n if (this.appConfig && this.appConfig.backgroundImg) {\n return `background: url('${this.appConfig.backgroundImg}');background-size:cover;`;\n }\n return '';\n },\n },\n mounted() {\n this.initiateFontAwesome();\n this.initiateMaterialDesignIcons();\n this.layout = this.layoutOrientation;\n this.itemSizeBound = this.iconSize;\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@/styles/media-queries.scss';\n@import '@/styles/style-helpers.scss';\n\n.home {\n padding-bottom: 1px;\n background: var(--background);\n min-height: calc(99.9vh - var(--footer-height));\n}\n\n.back-to-all-link {\n display: flex;\n align-items: center;\n padding: 0.25rem;\n margin: 0.25rem;\n @extend .svg-button;\n svg { margin-right: 0.5rem; }\n text-decoration: none;\n}\n\n/* Outside container wrapping the item groups*/\n.item-group-container {\n display: grid;\n gap: 0.5rem;\n margin: 0 auto;\n max-width: 90%;\n overflow: auto;\n @extend .scroll-bar;\n @include monitor-up {\n max-width: 1400px;\n }\n\n /* Options for alternate layouts, triggered by buttons */\n &.orientation-horizontal {\n display: flex;\n flex-direction: column;\n }\n &.orientation-vertical {\n max-width: 100%;\n @include tablet-up {\n display: flex;\n flex-direction: row;\n }\n }\n &.orientation-horizontal, &.orientation-vertical, &.single-section-view {\n @include phone { --content-max-width: 100%; }\n @include tablet { --content-max-width: 98%; }\n @include laptop { --content-max-width: 90%; }\n @include monitor { --content-max-width: 85%; }\n @include big-screen { --content-max-width: 80%; }\n @include big-screen-up { --content-max-width: 60%; }\n max-width: var(--content-max-width, 90%);\n }\n\n /* Specify number of columns, based on screen size or user preference */\n @include phone { --col-count: 1; }\n @include tablet { --col-count: 2; }\n @include laptop { --col-count: 2; }\n @include monitor { --col-count: 3; }\n @include big-screen { --col-count: 4; }\n @include big-screen-up { --col-count: 5; }\n\n @include tablet-up {\n &.col-count-1 { --col-count: 1; }\n &.col-count-2 { --col-count: 2; }\n &.col-count-3 { --col-count: 3; }\n &.col-count-4 { --col-count: 4; }\n &.col-count-5 { --col-count: 5; }\n &.col-count-6 { --col-count: 6; }\n &.col-count-7 { --col-count: 7; }\n &.col-count-8 { --col-count: 8; }\n }\n\n grid-template-columns: repeat(var(--col-count, 2), minmax(0, 1fr));\n\n /* Hide when search term returns nothing */\n .no-results { display: none; }\n\n /* Additional spacing when in edit mode */\n &.edit-mode {\n margin-bottom: 12rem;\n }\n\n /* When in single-section view mode */\n &.single-section-view {\n display: block;\n }\n .add-new-section {\n border: 2px dashed var(--primary);\n border-radius: var(--curve-factor);\n padding: var(--item-group-padding);\n background: var(--item-group-background);\n color: var(--primary);\n font-size: 1.2rem;\n cursor: pointer;\n text-align: center;\n height: fit-content;\n margin: 10px;\n }\n}\n\n/* Custom styles only applied when there is no sections in config */\n.no-data {\n font-size: 2rem;\n color: var(--background);\n background: #ffffffeb;\n width: fit-content;\n margin: 2rem auto;\n padding: 0.5rem 1rem;\n border-radius: var(--curve-factor);\n}\n\n/* Settings section, includes search, config and user settings */\nsection.settings-outer {\n border-bottom: 1px solid var(--outline-color);\n @include phone {\n flex-direction: column;\n }\n}\n\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Home.vue?vue&type=template&id=36369dae&scoped=true&\"\nimport script from \"./Home.vue?vue&type=script&lang=js&\"\nexport * from \"./Home.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Home.vue?vue&type=style&index=0&id=36369dae&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"36369dae\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"login-page\"},[(_vm.isUserAlreadyLoggedIn)?_c('div',{staticClass:\"already-logged-in\"},[_c('h2',[_vm._v(_vm._s(_vm.$t('login.already-logged-in-title')))]),_c('p',{staticClass:\"already-logged-in\"},[_vm._v(\" \"+_vm._s(_vm.$t('login.already-logged-in-text'))+\" \"),_c('span',{staticClass:\"username\"},[_vm._v(_vm._s(_vm.existingUsername))])]),_c('Button',{staticClass:\"login-button\",attrs:{\"click\":_vm.stayLoggedIn}},[_vm._v(\" \"+_vm._s(_vm.$t('login.proceed-to-dashboard'))+\" \")]),_c('Button',{staticClass:\"login-button\",attrs:{\"click\":_vm.getOut}},[_vm._v(_vm._s(_vm.$t('login.log-out-button')))]),_c('span',{staticClass:\"already-logged-in-note\"},[_vm._v(\" You need to log out, in order to proceed as a different user. \")]),_c('transition',{attrs:{\"name\":\"bounce\"}},[_c('p',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.message),expression:\"message\"}],class:(\"login-error-message \" + _vm.status)},[_vm._v(_vm._s(_vm.message))])])],1):_vm._e(),((!_vm.isUserAlreadyLoggedIn) && _vm.isAuthenticationEnabled)?_c('form',{staticClass:\"login-form\"},[_c('h2',{staticClass:\"login-title\"},[_vm._v(_vm._s(_vm.$t('login.title')))]),_c('Input',{staticClass:\"login-field username\",attrs:{\"type\":\"text\",\"label\":_vm.$t('login.username-label')},model:{value:(_vm.username),callback:function ($$v) {_vm.username=$$v},expression:\"username\"}}),_c('Input',{staticClass:\"login-field password\",attrs:{\"type\":\"password\",\"label\":_vm.$t('login.password-label')},model:{value:(_vm.password),callback:function ($$v) {_vm.password=$$v},expression:\"password\"}}),_c('label',[_vm._v(_vm._s(_vm.$t('login.remember-me-label')))]),_c('v-select',{staticClass:\"login-time-dropdown\",attrs:{\"selectOnTab\":true,\"options\":_vm.dropDownMenu},model:{value:(_vm.timeout),callback:function ($$v) {_vm.timeout=$$v},expression:\"timeout\"}}),_c('Button',{staticClass:\"login-button\",attrs:{\"click\":_vm.submitLogin}},[_vm._v(\" \"+_vm._s(_vm.$t('login.login-button'))+\" \")]),_c('transition',{attrs:{\"name\":\"bounce\"}},[_c('p',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.message),expression:\"message\"}],class:(\"login-error-message \" + _vm.status)},[_vm._v(_vm._s(_vm.message))])])],1):_vm._e(),(_vm.isGuestAccessEnabled && !_vm.isUserAlreadyLoggedIn && _vm.isAuthenticationEnabled)?_c('form',{staticClass:\"guest-form\"},[_c('h2',{staticClass:\"login-title\"},[_vm._v(\"Guest Access\")]),_c('Button',{staticClass:\"login-button\",attrs:{\"click\":_vm.guestLogin}},[_vm._v(\" \"+_vm._s(_vm.$t('login.proceed-guest-button'))+\" \")]),_vm._m(0)],1):_vm._e(),(!_vm.isAuthenticationEnabled)?_c('div',{staticClass:\"not-configured\"},[_c('h2',[_vm._v(\"Error\")]),_c('p',[_vm._v(\"Authentication is not enabled, or no users have been configured\")]),_c('Button',{staticClass:\"login-button\",attrs:{\"click\":_vm.guestLogin}},[_vm._v(\" Go Home \")])],1):_vm._e()])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('p',{staticClass:\"guest-intro\"},[_vm._v(\" This instance has guest access enabled.\"),_c('br'),_vm._v(\" Guests have view-only access to dashboards, so cannot write any changes to disk. \")])}]\n\nexport { render, staticRenderFns }","<template>\n <div class=\"login-page\">\n <!-- User is already logged in -->\n <div v-if=\"isUserAlreadyLoggedIn\" class=\"already-logged-in\">\n <h2>{{ $t('login.already-logged-in-title') }}</h2>\n <p class=\"already-logged-in\">\n {{ $t('login.already-logged-in-text') }}\n <span class=\"username\">{{ existingUsername }}</span>\n </p>\n <Button class=\"login-button\" :click=\"stayLoggedIn\">\n {{ $t('login.proceed-to-dashboard') }}\n </Button>\n <Button class=\"login-button\" :click=\"getOut\">{{ $t('login.log-out-button') }}</Button>\n <span class=\"already-logged-in-note\">\n You need to log out, in order to proceed as a different user.\n </span>\n <transition name=\"bounce\">\n <p :class=\"`login-error-message ${status}`\" v-show=\"message\">{{ message }}</p>\n </transition>\n </div>\n <!-- Main login form -->\n <form class=\"login-form\" v-if=\"(!isUserAlreadyLoggedIn) && isAuthenticationEnabled\">\n <h2 class=\"login-title\">{{ $t('login.title') }}</h2>\n <Input\n v-model=\"username\"\n type=\"text\"\n :label=\"$t('login.username-label')\"\n class=\"login-field username\"\n />\n <Input\n v-model=\"password\"\n type=\"password\"\n :label=\"$t('login.password-label')\"\n class=\"login-field password\"\n />\n <label>{{ $t('login.remember-me-label') }}</label>\n <v-select\n v-model=\"timeout\"\n :selectOnTab=\"true\"\n :options=\"dropDownMenu\"\n class=\"login-time-dropdown\"\n />\n <Button class=\"login-button\" :click=\"submitLogin\">\n {{ $t('login.login-button') }}\n </Button>\n <transition name=\"bounce\">\n <p :class=\"`login-error-message ${status}`\" v-show=\"message\">{{ message }}</p>\n </transition>\n </form>\n <!-- Guest login form -->\n <form class=\"guest-form\"\n v-if=\"isGuestAccessEnabled && !isUserAlreadyLoggedIn && isAuthenticationEnabled\">\n <h2 class=\"login-title\">Guest Access</h2>\n <Button class=\"login-button\" :click=\"guestLogin\">\n {{ $t('login.proceed-guest-button') }}\n </Button>\n <p class=\"guest-intro\">\n This instance has guest access enabled.<br>\n Guests have view-only access to dashboards,\n so cannot write any changes to disk.\n </p>\n </form>\n <!-- Edge case - guest mode enabled, but no users configured -->\n <div class=\"not-configured\" v-if=\"!isAuthenticationEnabled\">\n <h2>Error</h2>\n <p>Authentication is not enabled, or no users have been configured</p>\n <Button class=\"login-button\" :click=\"guestLogin\">\n Go Home\n </Button>\n </div>\n </div>\n</template>\n\n<script>\nimport router from '@/router';\nimport Button from '@/components/FormElements/Button';\nimport Input from '@/components/FormElements/Input';\nimport Defaults, { localStorageKeys } from '@/utils/defaults';\nimport { InfoHandler, WarningInfoHandler, InfoKeys } from '@/utils/ErrorHandler';\nimport {\n checkCredentials,\n login,\n isLoggedIn,\n logout,\n isGuestAccessEnabled,\n} from '@/utils/Auth';\n\nexport default {\n name: 'login',\n components: {\n Button,\n Input,\n },\n data() {\n return {\n username: '',\n password: '',\n message: '',\n status: 'waiting', // wating, error, success\n timeout: undefined,\n };\n },\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n /* Data for timeout dropdown menu, translated label + value in ms */\n dropDownMenu() {\n return [\n { label: this.$t('login.remember-me-never'), time: 0 },\n { label: this.$t('login.remember-me-hour'), time: 14400 * 1000 },\n { label: this.$t('login.remember-me-day'), time: 86400 * 1000 },\n { label: this.$t('login.remember-me-week'), time: 604800 * 1000 },\n ];\n },\n /* Translations for login response messages */\n responseMessages() {\n return {\n missingUsername: this.$t('login.error-missing-username'),\n missingPassword: this.$t('login.error-missing-password'),\n incorrectUsername: this.$t('login.error-incorrect-username'),\n incorrectPassword: this.$t('login.error-incorrect-password'),\n successMsg: this.$t('login.success-message'),\n };\n },\n existingUsername() {\n return localStorage[localStorageKeys.USERNAME];\n },\n users() {\n const auth = this.appConfig.auth || {};\n return Array.isArray(auth) ? auth : auth.users || [];\n },\n isUserAlreadyLoggedIn() {\n const loggedIn = (!this.users || this.users.length === 0 || isLoggedIn());\n return (loggedIn && this.existingUsername);\n },\n isGuestAccessEnabled() {\n return isGuestAccessEnabled();\n },\n isAuthenticationEnabled() {\n return (this.appConfig && this.appConfig.auth && this.users.length > 0);\n },\n },\n methods: {\n /* Checks form is filled in, then initiates the login, and redirects to /home */\n submitLogin() {\n // Use selected timeout, if available,else revedrt to zero\n const timeout = this.timeout ? this.timeout.time : 0;\n // Check users credentials\n const response = checkCredentials(\n this.username,\n this.password,\n this.users, // All users\n this.responseMessages, // Translated response messages\n );\n this.message = response.msg; // Show error or success message to the user\n this.status = response.correct ? 'success' : 'error';\n if (response.correct) { // Yay, credentials were correct :)\n login(this.username, this.password, timeout); // Login, to set the cookie\n this.goHome();\n InfoHandler(`Succesfully signed in as ${this.username}`, InfoKeys.AUTH);\n } else {\n WarningInfoHandler('Unable to Sign In', InfoKeys.AUTH, this.message);\n }\n },\n /* Calls function to double-check guest access enabled, then log in as guest */\n guestLogin() {\n const isAllowed = this.isGuestAccessEnabled;\n if (isAllowed) {\n this.$toasted.show('Logged in as Guest, Redirecting...', { className: 'toast-success' });\n InfoHandler('Logged in as Guest', InfoKeys.AUTH);\n this.goHome();\n } else {\n this.$toasted.show('Guest Access Not Allowed', { className: 'toast-error' });\n WarningInfoHandler('Guest Access Not Allowed', InfoKeys.AUTH);\n }\n },\n /* Calls logout, shows status message, and refreshed page */\n getOut() {\n logout();\n this.status = 'success';\n this.message = 'Logging out...';\n this.refreshPage();\n },\n /* Logged in user redirects to home page */\n stayLoggedIn() {\n this.status = 'success';\n this.message = 'Redirecting...';\n this.goHome();\n },\n /* Refreshes the page */\n refreshPage() {\n setTimeout(() => { location.reload(); }, 250); // eslint-disable-line no-restricted-globals\n },\n /* Redirects to the homepage */\n goHome() {\n setTimeout(() => { // Wait a short while, then redirect back home\n router.push({ path: '/' });\n }, 250);\n },\n /* Since Theme setter isn't loaded at this point, we must manually get and apply users theme */\n setTheme() {\n const theme = localStorage[localStorageKeys.THEME] || Defaults.theme;\n document.getElementsByTagName('html')[0].setAttribute('data-theme', theme);\n },\n },\n created() {\n this.setTheme();\n setTimeout(() => { this.timeout = this.dropDownMenu[0]; }, 1); //eslint-disable-line\n },\n};\n\n</script>\n\n<style lang=\"scss\">\n\n/* Login page base styles */\n.login-page {\n display: flex;\n align-items: center;\n justify-content: center;\n justify-content: space-evenly;\n min-height: calc(100vh - var(--footer-height));\n\n /* User is already logged in note */\n div.already-logged-in {\n margin: 0 auto 0.5rem;\n p.already-logged-in {\n margin: 0 auto 0.5rem;\n text-align: center;\n }\n span.username {\n font-weight: bold;\n text-transform: capitalize;\n }\n span.already-logged-in-note {\n font-size: 0.8rem;\n opacity: var(--dimming-factor);\n text-align: left;\n }\n }\n\n /* Login form container */\n form.login-form, form.guest-form, div.already-logged-in, div.not-configured {\n background: var(--login-form-background);\n color: var(--login-form-color);\n border: 1px solid var(--login-form-color);\n border-radius: var(--curve-factor);\n font-size: 1.4rem;\n padding: 2rem;\n margin: 2rem;\n max-width: 22rem;\n display: flex;\n flex-direction: column;\n\n /* Login form title */\n h2 {\n font-size: 2rem;\n margin: 0 0 1rem 0;\n text-align: center;\n cursor: default;\n }\n\n /* Set sizings for input fields and login button */\n .login-field input, Button.login-button {\n width: 20rem;\n margin: 0.5rem auto;\n font-size: 1.4rem;\n padding: 0.5rem 1rem;\n }\n\n /* Custom colors for username/ password input fields */\n .login-field input {\n color: var(--login-form-color);\n border-color: var(--login-form-color);\n background: var(--login-form-background);\n }\n /* Custom colors for Login Button */\n Button.login-button {\n background: var(--login-form-color);\n border-color: var(--login-form-background);\n color: var(--login-form-background);\n &:hover {\n color: var(--login-form-color);\n border-color: var(--login-form-color);\n background: var(--login-form-background);\n }\n &:active, &:focus {\n box-shadow: 1px 1px 6px var(--login-form-color);\n }\n }\n /* Apply color to status message, depending on status */\n p.login-error-message {\n font-size: 1rem;\n text-align: center;\n &.waiting { color: var(--login-form-color); }\n &.success { color: var(--success); }\n &.error { color: var(--warning); }\n }\n p.guest-intro {\n font-size: 0.8rem;\n opacity: var(--dimming-factor);\n text-align: left;\n }\n }\n}\n\n/* Enter animations for error/ success message */\n.bounce-enter-active { animation: bounce-in 0.25s; }\n.bounce-leave-active { animation: bounce-in 0.25s reverse; }\n@keyframes bounce-in {\n 0% { transform: scale(0); }\n 50% { transform: scale(1.25); }\n 100% { transform: scale(1); }\n}\n\n/* Custom styles for dropdown component */\n.v-select.login-time-dropdown {\n margin: 0.5rem 0;\n .vs__dropdown-toggle {\n border-color: var(--login-form-color);\n background: var(--login-form-background);\n cursor: pointer;\n span.vs__selected {\n color: var(--login-form-color);\n }\n .vs__actions svg path { fill: var(--login-form-color); }\n }\n ul.vs__dropdown-menu {\n background: var(--login-form-background);\n border-color: var(--login-form-color);\n li {\n color: var(--login-form-color);\n &:hover {\n color: var(--login-form-background);\n background: var(--login-form-color);\n }\n &.vs__dropdown-option--highlight {\n color: var(--login-form-background) !important;\n background: var(--login-form-color);\n }\n }\n }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Login.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Login.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Login.vue?vue&type=template&id=3c1c7fcd&\"\nimport script from \"./Login.vue?vue&type=script&lang=js&\"\nexport * from \"./Login.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Login.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"work-space\"},[_c('SideBar',{attrs:{\"sections\":_vm.sections,\"initUrl\":_vm.getInitialUrl()},on:{\"launch-app\":_vm.launchApp}}),(!_vm.isMultiTaskingEnabled)?_c('WebContent',{attrs:{\"url\":_vm.url}}):_c('MultiTaskingWebComtent',{attrs:{\"url\":_vm.url}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('nav',{staticClass:\"side-bar\"},[_vm._l((_vm.sections),function(section,index){return _c('div',{key:index,staticClass:\"side-bar-section\"},[_c('div',{staticClass:\"side-bar-item-container\",on:{\"click\":function($event){return _vm.openSection(index)}}},[_c('SideBarItem',{staticClass:\"item\",attrs:{\"icon\":section.icon,\"title\":section.name}})],1),_c('transition',{attrs:{\"name\":\"slide\"}},[(_vm.isOpen[index])?_c('SideBarSection',{attrs:{\"items\":section.items},on:{\"launch-app\":_vm.launchApp}}):_vm._e()],1)],1)}),_c('div',{staticClass:\"switch-view-buttons\"},[_c('router-link',{attrs:{\"to\":\"/home\"}},[_c('IconHome',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.$t('alternate-views.default')),expression:\"$t('alternate-views.default')\"}],staticClass:\"view-icon\"})],1),_c('router-link',{attrs:{\"to\":\"/minimal\"}},[_c('IconMinimalView',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.$t('alternate-views.minimal')),expression:\"$t('alternate-views.minimal')\"}],staticClass:\"view-icon\"})],1)],1)],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip),expression:\"tooltip\"}],class:(\"side-bar-item \" + (_vm.icon ? 'w-icon' : 'text-only')),on:{\"click\":function($event){return _vm.itemClicked()}}},[(_vm.icon)?_c('Icon',{attrs:{\"icon\":_vm.icon,\"size\":\"small\",\"url\":_vm.url}}):_c('p',{staticClass:\"small-title\"},[_vm._v(_vm._s(_vm.title))])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div @click=\"itemClicked()\"\n :class=\"`side-bar-item ${icon ? 'w-icon' : 'text-only'}`\" v-tooltip=\"tooltip\">\n <Icon v-if=\"icon\" :icon=\"icon\" size=\"small\" :url=\"url\" />\n <p class=\"small-title\" v-else>{{ title }}</p>\n </div>\n</template>\n\n<script>\n\nimport Icon from '@/components/LinkItems/ItemIcon.vue';\n\nexport default {\n name: 'SideBarItem',\n props: {\n icon: String,\n title: String,\n url: String,\n target: String,\n click: Function,\n },\n components: {\n Icon,\n },\n methods: {\n itemClicked() {\n if (this.url) this.$emit('launch-app', { url: this.url, target: this.target });\n },\n },\n data() {\n return {\n tooltip: {\n disabled: !this.title,\n content: this.title,\n trigger: 'hover focus',\n placement: 'bottom-end',\n },\n };\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\ndiv.side-bar-item {\n color: var(--side-bar-item-color);\n background: var(--side-bar-item-background);\n text-align: center;\n &.text-only {\n background: none;\n border: none;\n box-shadow: none;\n p.small-title {\n margin: 0.1rem 0 0 -0.5rem;\n font-size: 0.6rem;\n transform: rotate(-25deg);\n padding: 0.5rem 0;\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBarItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBarItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SideBarItem.vue?vue&type=template&id=df79d1ee&scoped=true&\"\nimport script from \"./SideBarItem.vue?vue&type=script&lang=js&\"\nexport * from \"./SideBarItem.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SideBarItem.vue?vue&type=style&index=0&id=df79d1ee&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"df79d1ee\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"sub-side-bar\"},_vm._l((_vm.items),function(item,index){return _c('div',{key:index},[_c('SideBarItem',{staticClass:\"item\",attrs:{\"icon\":item.icon,\"title\":item.title,\"url\":item.url,\"target\":item.target},on:{\"launch-app\":_vm.launchApp}})],1)}),0)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"sub-side-bar\">\n <div v-for=\"(item, index) in items\" :key=\"index\">\n <SideBarItem\n class=\"item\"\n :icon=\"item.icon\"\n :title=\"item.title\"\n :url=\"item.url\"\n :target=\"item.target\"\n @launch-app=\"launchApp\"\n />\n </div>\n </div>\n</template>\n\n<script>\n\nimport SideBarItem from '@/components/Workspace/SideBarItem.vue';\n\nexport default {\n name: 'SideBarSection',\n props: {\n items: Array,\n },\n components: {\n SideBarItem,\n },\n methods: {\n launchApp(options) {\n this.$emit('launch-app', options);\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@/styles/media-queries.scss';\n@import '@/styles/style-helpers.scss';\n\ndiv.sub-side-bar {\n display: flex;\n flex-direction: column;\n background: var(--side-bar-background-lighter);\n border-radius: var(--curve-factor);\n margin: 0.2rem;\n color: var(--side-bar-color);\n text-align: center;\n z-index: 3;\n .item:not(:last-child) {\n border-bottom: 1px dashed var(--side-bar-color);\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBarSection.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBarSection.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SideBarSection.vue?vue&type=template&id=26fe765a&scoped=true&\"\nimport script from \"./SideBarSection.vue?vue&type=script&lang=js&\"\nexport * from \"./SideBarSection.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SideBarSection.vue?vue&type=style&index=0&id=26fe765a&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"26fe765a\",\n null\n \n)\n\nexport default component.exports","<template>\n <nav class=\"side-bar\">\n <div v-for=\"(section, index) in sections\" :key=\"index\" class=\"side-bar-section\">\n <div @click=\"openSection(index)\" class=\"side-bar-item-container\">\n <SideBarItem\n class=\"item\"\n :icon=\"section.icon\"\n :title=\"section.name\"\n />\n </div>\n <transition name=\"slide\">\n <SideBarSection\n v-if=\"isOpen[index]\"\n :items=\"section.items\"\n @launch-app=\"launchApp\"\n />\n </transition>\n </div>\n <div class=\"switch-view-buttons\">\n <router-link to=\"/home\">\n <IconHome class=\"view-icon\" v-tooltip=\"$t('alternate-views.default')\" />\n </router-link>\n <router-link to=\"/minimal\">\n <IconMinimalView class=\"view-icon\" v-tooltip=\"$t('alternate-views.minimal')\" />\n </router-link>\n </div>\n </nav>\n</template>\n\n<script>\n\nimport SideBarItem from '@/components/Workspace/SideBarItem.vue';\nimport SideBarSection from '@/components/Workspace/SideBarSection.vue';\nimport IconHome from '@/assets/interface-icons/application-home.svg';\nimport IconMinimalView from '@/assets/interface-icons/application-minimal.svg';\n\nexport default {\n name: 'SideBar',\n props: {\n sections: Array,\n initUrl: String,\n },\n data() {\n return {\n isOpen: new Array(this.sections.length).fill(false),\n };\n },\n components: {\n SideBarItem,\n SideBarSection,\n IconMinimalView,\n IconHome,\n },\n methods: {\n /* Toggles the section clicked, and closes all other sections */\n openSection(index) {\n this.isOpen = this.isOpen.map((val, ind) => (ind !== index ? false : !val));\n },\n /* When item clicked, emit a launch event */\n launchApp(options) {\n this.$emit('launch-app', options);\n },\n /* If an initial URL is specified, then open relevant section */\n openDefaultSection() {\n if (!this.initUrl) return;\n const process = (url) => url.replace(/[^\\w\\s]/gi, '').toLowerCase();\n const compare = (item) => (process(item.url) === process(this.initUrl));\n this.sections.forEach((section, sectionIndex) => {\n if (section.items.findIndex(compare) !== -1) this.openSection(sectionIndex);\n });\n },\n },\n mounted() {\n if (this.sections.length === 1) { // If only 1 section, go ahead and open it\n this.openSection(0);\n } else { // Otherwise, see if user set a default section, and open that\n this.openDefaultSection();\n }\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n@import '@/styles/media-queries.scss';\n@import '@/styles/style-helpers.scss';\n\nnav.side-bar {\n position: fixed;\n display: flex;\n flex-direction: column;\n background: var(--side-bar-background);\n color: var(--side-bar-color);\n height: 100%;\n width: var(--side-bar-width);\n text-align: center;\n overflow: auto;\n @extend .scroll-bar;\n .side-bar-item-container {\n z-index: 5;\n }\n .item:not(:last-child) {\n border-bottom: 1px dashed var(--side-bar-color);\n z-index: 5;\n }\n}\n\n.slide-leave-active,\n.slide-enter-active {\n transition: all 0.1s ease-in-out;\n}\n.slide-enter {\n transform: translate(0, -80%);\n}\n.slide-leave-to {\n transform: translate(0, -80%);\n}\n\n.switch-view-buttons {\n margin-top: 0.5rem;\n display: flex;\n @extend .svg-button;\n .view-icon {\n border: none;\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SideBar.vue?vue&type=template&id=5a56ca84&scoped=true&\"\nimport script from \"./SideBar.vue?vue&type=script&lang=js&\"\nexport * from \"./SideBar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SideBar.vue?vue&type=style&index=0&id=5a56ca84&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5a56ca84\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"web-content\",attrs:{\"id\":_vm.id}},[_c('iframe',{attrs:{\"src\":_vm.url}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"web-content\" :id=\"id\">\n <iframe :src=\"url\" />\n </div>\n</template>\n\n<script>\n\nexport default {\n name: 'WebContent',\n props: {\n url: String,\n id: {\n type: String,\n default: 'web-app-view',\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\niframe {\n position: absolute;\n left: var(--side-bar-width);\n height: calc(100% - var(--header-height));\n width: calc(100% - var(--side-bar-width));\n border: none;\n background: white;\n}\n\n.web-content.hide {\n display: none;\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebContent.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebContent.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./WebContent.vue?vue&type=template&id=f1f96a0a&scoped=true&\"\nimport script from \"./WebContent.vue?vue&type=script&lang=js&\"\nexport * from \"./WebContent.vue?vue&type=script&lang=js&\"\nimport style0 from \"./WebContent.vue?vue&type=style&index=0&id=f1f96a0a&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"f1f96a0a\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"container\",staticClass:\"multi-taking-view\"})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"multi-taking-view\" ref=\"container\"></div>\n</template>\n\n<script>\nimport Vue from 'vue';\nimport WebContent from '@/components/Workspace/WebContent';\n\nexport default {\n name: 'WebContent',\n props: {\n url: String, // The URL of currently visible app\n },\n data: () => ({\n openApps: [], // List of all currently open apps\n }),\n watch: {\n /* Update the currently open app, when URL changes */\n url() { this.launchApp(); },\n },\n methods: {\n /* Check if app already open or not, and call appropriate opener */\n launchApp() {\n if (this.openApps.includes(this.url)) {\n this.openExistingApp();\n } else {\n this.openApps.push(this.url);\n this.appendNewApp();\n }\n },\n /* Opens a new app */\n appendNewApp() {\n const ComponentClass = Vue.extend(WebContent);\n const instance = new ComponentClass({\n propsData: { url: this.url, id: btoa(this.url) },\n });\n instance.$mount(); // pass nothing\n this.$refs.container.appendChild(instance.$el);\n },\n /* Switches visibility to an already open app */\n openExistingApp() {\n Array.from(document.getElementsByClassName('web-content')).forEach((frame) => {\n frame.classList.add('hide');\n });\n document.getElementById(btoa(this.url)).classList.remove('hide');\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\niframe {\n position: absolute;\n left: var(--side-bar-width);\n height: calc(100% - var(--header-height));\n width: calc(100% - var(--side-bar-width));\n border: none;\n background: white;\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultiTaskingWebComtent.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultiTaskingWebComtent.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MultiTaskingWebComtent.vue?vue&type=template&id=2a7b9297&scoped=true&\"\nimport script from \"./MultiTaskingWebComtent.vue?vue&type=script&lang=js&\"\nexport * from \"./MultiTaskingWebComtent.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MultiTaskingWebComtent.vue?vue&type=style&index=0&id=2a7b9297&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2a7b9297\",\n null\n \n)\n\nexport default component.exports","<template>\n <div class=\"work-space\">\n <SideBar :sections=\"sections\" @launch-app=\"launchApp\" :initUrl=\"getInitialUrl()\" />\n <WebContent :url=\"url\" v-if=\"!isMultiTaskingEnabled\" />\n <MultiTaskingWebComtent :url=\"url\" v-else />\n </div>\n</template>\n\n<script>\n\nimport SideBar from '@/components/Workspace/SideBar';\nimport WebContent from '@/components/Workspace/WebContent';\nimport MultiTaskingWebComtent from '@/components/Workspace/MultiTaskingWebComtent';\nimport Defaults from '@/utils/defaults';\nimport { GetTheme, ApplyLocalTheme, ApplyCustomVariables } from '@/utils/ThemeHelper';\n\nexport default {\n name: 'Workspace',\n data: () => ({\n url: '',\n GetTheme,\n ApplyLocalTheme,\n ApplyCustomVariables,\n }),\n computed: {\n sections() {\n return this.$store.getters.sections;\n },\n appConfig() {\n return this.$store.getters.appConfig;\n },\n isMultiTaskingEnabled() {\n return this.appConfig.enableMultiTasking || false;\n },\n },\n components: {\n SideBar,\n WebContent,\n MultiTaskingWebComtent,\n },\n methods: {\n launchApp(options) {\n if (options.target === 'newtab') {\n window.open(options.url, '_blank');\n } else {\n this.url = options.url;\n }\n },\n setTheme() {\n const theme = this.GetTheme();\n this.ApplyLocalTheme(theme);\n this.ApplyCustomVariables(theme);\n },\n initiateFontAwesome() {\n const fontAwesomeScript = document.createElement('script');\n const faKey = this.appConfig.fontAwesomeKey || Defaults.fontAwesomeKey;\n fontAwesomeScript.setAttribute('src', `https://kit.fontawesome.com/${faKey}.js`);\n document.head.appendChild(fontAwesomeScript);\n },\n /* Returns a service URL, if set as a URL param, or if user has specified landing URL */\n getInitialUrl() {\n const route = this.$route;\n if (route.query && route.query.url) {\n return decodeURI(route.query.url);\n } else if (this.appConfig.workspaceLandingUrl) {\n return this.appConfig.workspaceLandingUrl;\n }\n return undefined;\n },\n },\n mounted() {\n this.setTheme();\n this.initiateFontAwesome();\n this.url = this.getInitialUrl();\n },\n};\n\n</script>\n\n<style scoped lang=\"scss\">\n.work-space {\n min-height: calc(100vh - var(--footer-height));\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Workspace.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Workspace.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Workspace.vue?vue&type=template&id=188fee4a&scoped=true&\"\nimport script from \"./Workspace.vue?vue&type=script&lang=js&\"\nexport * from \"./Workspace.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Workspace.vue?vue&type=style&index=0&id=188fee4a&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"188fee4a\",\n null\n \n)\n\nexport default component.exports","var render = function () {\nvar this$1 = this;\nvar _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"minimal-home\",style:(_vm.getBackgroundImage() + _vm.setColumnCount())},[_c('div',{staticClass:\"minimal-buttons\"},[_c('ConfigLauncher',{staticClass:\"config-launcher\",on:{\"modalChanged\":_vm.modalChanged}})],1),_c('div',{staticClass:\"title-and-search\"},[_c('router-link',{attrs:{\"to\":\"/\"}},[_c('h1',[_vm._v(_vm._s(_vm.pageInfo.title))])]),_c('MinimalSearch',{ref:\"filterComp\",attrs:{\"active\":!_vm.modalOpen},on:{\"user-is-searchin\":function (s) { this$1.searchValue = s; }}})],1),(_vm.checkTheresData(_vm.sections))?_c('div',{class:(\"item-group-container \" + (!_vm.tabbedView ? 'showing-all' : ''))},[_vm._l((_vm.getSections(_vm.sections)),function(section,index){return _c('MinimalHeading',{key:(\"heading-\" + index),staticClass:\"headings\",attrs:{\"index\":index,\"title\":section.name,\"selected\":_vm.selectedSection === index},on:{\"sectionSelected\":_vm.sectionSelected}})}),_vm._l((_vm.getSections(_vm.sections)),function(section,index){return _c('MinimalSection',{key:(\"body-\" + index),attrs:{\"index\":index,\"title\":section.name,\"icon\":section.icon || undefined,\"groupId\":(\"section-\" + index),\"items\":_vm.filterTiles(section.items),\"selected\":_vm.selectedSection === index,\"showAll\":!_vm.tabbedView,\"itemSize\":\"small\"},on:{\"sectionSelected\":_vm.sectionSelected,\"itemClicked\":function($event){return _vm.finishedSearching()},\"change-modal-visibility\":_vm.updateModalVisibility}})}),(_vm.checkIfResults())?_c('div',{staticClass:\"no-data\"},[_vm._v(\" \"+_vm._s(_vm.searchValue ? _vm.$t('home.no-results') : _vm.$t('home.no-data'))+\" \")]):_vm._e()],2):_c('div',{staticClass:\"no-data\"},[_vm._v(\" \"+_vm._s(_vm.$t('home.no-data'))+\" \")])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:(\"minimal-section-inner \" + (_vm.selected ? 'selected' : '') + \" \" + (_vm.showAll ? 'show-all': ''))},[(_vm.selected || _vm.showAll)?_c('div',{staticClass:\"section-items\"},_vm._l((_vm.items),function(item,index){return _c('Item',{key:(index + \"_\" + (_vm.makeId(item.title))),attrs:{\"id\":(index + \"_\" + (_vm.makeId(item.title))),\"url\":item.url,\"title\":item.title,\"description\":item.description,\"icon\":item.icon,\"target\":item.target,\"color\":item.color,\"backgroundColor\":item.backgroundColor,\"statusCheckUrl\":item.statusCheckUrl,\"statusCheckHeaders\":item.statusCheckHeaders,\"itemSize\":_vm.itemSize,\"hotkey\":item.hotkey,\"enableStatusCheck\":_vm.shouldEnableStatusCheck(item.statusCheck),\"statusCheckInterval\":_vm.getStatusCheckInterval()},on:{\"itemClicked\":function($event){return _vm.$emit('itemClicked')},\"triggerModal\":_vm.triggerModal}})}),1):_vm._e(),_c('IframeModal',{ref:(\"iframeModal-\" + _vm.groupId),attrs:{\"name\":(\"iframeModal-\" + _vm.groupId)},on:{\"closed\":function($event){return _vm.$emit('itemClicked')}}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div :class=\"`minimal-section-inner ${selected ? 'selected' : ''} ${showAll ? 'show-all': ''}`\">\n <div class=\"section-items\" v-if=\"selected || showAll\">\n <Item\n v-for=\"(item, index) in items\"\n :id=\"`${index}_${makeId(item.title)}`\"\n :key=\"`${index}_${makeId(item.title)}`\"\n :url=\"item.url\"\n :title=\"item.title\"\n :description=\"item.description\"\n :icon=\"item.icon\"\n :target=\"item.target\"\n :color=\"item.color\"\n :backgroundColor=\"item.backgroundColor\"\n :statusCheckUrl=\"item.statusCheckUrl\"\n :statusCheckHeaders=\"item.statusCheckHeaders\"\n :itemSize=\"itemSize\"\n :hotkey=\"item.hotkey\"\n :enableStatusCheck=\"shouldEnableStatusCheck(item.statusCheck)\"\n :statusCheckInterval=\"getStatusCheckInterval()\"\n @itemClicked=\"$emit('itemClicked')\"\n @triggerModal=\"triggerModal\"\n />\n </div>\n <IframeModal\n :ref=\"`iframeModal-${groupId}`\"\n :name=\"`iframeModal-${groupId}`\"\n @closed=\"$emit('itemClicked')\"\n />\n </div>\n</template>\n\n<script>\nimport Item from '@/components/LinkItems/Item.vue';\nimport IframeModal from '@/components/LinkItems/IframeModal.vue';\n\nexport default {\n name: 'ItemGroup',\n props: {\n groupId: String,\n title: String,\n icon: String,\n displayData: Object,\n items: Array,\n itemSize: String,\n modalOpen: Boolean,\n index: Number,\n selected: Boolean,\n showAll: Boolean,\n },\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n },\n components: {\n Item,\n IframeModal,\n },\n methods: {\n selectSection(index) {\n this.$emit('sectionSelected', index);\n },\n /* Returns a unique lowercase string, based on name, for section ID */\n makeId(str) {\n return str.replace(/\\s+/g, '-').replace(/[^a-zA-Z ]/g, '').toLowerCase();\n },\n /* Opens the iframe modal */\n triggerModal(url) {\n this.$refs[`iframeModal-${this.groupId}`].show(url);\n },\n shouldEnableStatusCheck(itemPreference) {\n const globalPreference = this.appConfig.statusCheck || false;\n return itemPreference !== undefined ? itemPreference : globalPreference;\n },\n getStatusCheckInterval() {\n let interval = this.appConfig.statusCheckInterval;\n if (!interval) return 0;\n if (interval > 60) interval = 60;\n if (interval < 1) interval = 0;\n return interval;\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/media-queries.scss';\n@import '@/styles/style-helpers.scss';\n\n.minimal-section-inner {\n height: 100%;\n display: flex;\n flex-wrap: wrap;\n flex-direction: column;\n background: var(--minimal-view-group-background);\n border-radius: 0 0 var(--curve-factor) var(--curve-factor);\n .section-items {\n display: grid;\n @include phone { --minimal-col-count: 1; }\n @include tablet { --minimal-col-count: 2; }\n @include laptop { --minimal-col-count: 3; }\n @include monitor { --minimal-col-count: 4; }\n @include big-screen { --minimal-col-count: 5; }\n @include big-screen-up { --minimal-col-count: 6; }\n grid-template-columns: repeat(var(--minimal-col-count, 1), minmax(0, 1fr));\n }\n &.selected {\n border: 1px solid var(--minimal-view-group-color);\n grid-column-start: span var(--col-count, 3);\n }\n &.show-all {\n border: none;\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MinimalSection.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MinimalSection.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MinimalSection.vue?vue&type=template&id=59c3b7ad&scoped=true&\"\nimport script from \"./MinimalSection.vue?vue&type=script&lang=js&\"\nexport * from \"./MinimalSection.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MinimalSection.vue?vue&type=style&index=0&id=59c3b7ad&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"59c3b7ad\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:(\"minimal-section-heading \" + (_vm.selected ? 'selected' : '')),on:{\"click\":function($event){return _vm.selectSection(_vm.index)}}},[_c('h3',[_vm._v(_vm._s(_vm.title))])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div\n @click=\"selectSection(index)\"\n :class=\"`minimal-section-heading ${selected ? 'selected' : ''}`\">\n <h3>{{ title }}</h3>\n </div>\n</template>\n\n<script>\n\nexport default {\n name: 'MinimalHeadings',\n props: {\n index: Number,\n title: String,\n selected: Boolean,\n },\n methods: {\n selectSection(index) {\n this.$emit('sectionSelected', index);\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/media-queries.scss';\n@import '@/styles/style-helpers.scss';\n\ndiv.minimal-section-heading {\n cursor: pointer;\n padding: 0.5rem 0.25rem;\n margin-bottom: 0;\n background: var(--minimal-view-section-heading-background);\n border: 1px solid var(--minimal-view-section-heading-color);\n border-bottom: none;\n border-radius: var(--curve-factor) var(--curve-factor) 0 0;\n h3 {\n margin: 0;\n color: var(--minimal-view-section-heading-color);\n }\n &.selected {\n background: var(--minimal-view-section-heading-color);\n h3 {\n color: var(--minimal-view-section-heading-background);\n }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MinimalHeading.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MinimalHeading.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MinimalHeading.vue?vue&type=template&id=5f187f16&scoped=true&\"\nimport script from \"./MinimalHeading.vue?vue&type=script&lang=js&\"\nexport * from \"./MinimalHeading.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MinimalHeading.vue?vue&type=style&index=0&id=5f187f16&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5f187f16\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('SearchBar',{ref:\"MinimalSearchBar\",attrs:{\"active\":true,\"minimalSearch\":true},on:{\"user-is-searchin\":_vm.userIsTypingSomething}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <SearchBar\n ref=\"MinimalSearchBar\"\n @user-is-searchin=\"userIsTypingSomething\"\n :active=\"true\"\n :minimalSearch=\"true\"\n />\n</template>\n\n<script>\nimport SearchBar from '@/components/Settings/SearchBar';\n\nexport default {\n name: 'MinimalSearch',\n components: {\n SearchBar,\n },\n props: {\n active: Boolean,\n },\n data() {\n return {\n input: '', // Users current search term\n };\n },\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n webSearchEnabled() {\n if (this.appConfig && this.appConfig.webSearch) {\n return !this.appConfig.webSearch.disableWebSearch;\n }\n return true;\n },\n },\n methods: {\n /* Emmits users's search term up to parent */\n userIsTypingSomething(searchValue) {\n this.input = searchValue;\n this.$emit('user-is-searchin', searchValue);\n },\n },\n mounted() {\n window.addEventListener('keydown', this.startFiltering);\n },\n beforeDestroy() {\n window.removeEventListener('keydown', this.startFiltering);\n },\n};\n</script>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MinimalSearch.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MinimalSearch.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MinimalSearch.vue?vue&type=template&id=6ad901f4&\"\nimport script from \"./MinimalSearch.vue?vue&type=script&lang=js&\"\nexport * from \"./MinimalSearch.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<template>\n <div class=\"minimal-home\" :style=\"getBackgroundImage() + setColumnCount()\">\n <!-- Buttons for config and home page -->\n <div class=\"minimal-buttons\">\n <ConfigLauncher @modalChanged=\"modalChanged\" class=\"config-launcher\" />\n </div>\n <!-- Page title and search bar -->\n <div class=\"title-and-search\">\n <router-link to=\"/\">\n <h1>{{ pageInfo.title }}</h1>\n </router-link>\n <MinimalSearch\n @user-is-searchin=\"(s) => { this.searchValue = s; }\"\n :active=\"!modalOpen\" ref=\"filterComp\" />\n </div>\n <div v-if=\"checkTheresData(sections)\"\n :class=\"`item-group-container ${!tabbedView ? 'showing-all' : ''}`\">\n <!-- Section heading buttons -->\n <MinimalHeading\n v-for=\"(section, index) in getSections(sections)\"\n :key=\"`heading-${index}`\"\n :index=\"index\"\n :title=\"section.name\"\n :selected=\"selectedSection === index\"\n @sectionSelected=\"sectionSelected\"\n class=\"headings\"\n />\n <!-- Section item groups -->\n <MinimalSection\n v-for=\"(section, index) in getSections(sections)\"\n :key=\"`body-${index}`\"\n :index=\"index\"\n :title=\"section.name\"\n :icon=\"section.icon || undefined\"\n :groupId=\"`section-${index}`\"\n :items=\"filterTiles(section.items)\"\n :selected=\"selectedSection === index\"\n :showAll=\"!tabbedView\"\n itemSize=\"small\"\n @sectionSelected=\"sectionSelected\"\n @itemClicked=\"finishedSearching()\"\n @change-modal-visibility=\"updateModalVisibility\"\n />\n <div v-if=\"checkIfResults()\" class=\"no-data\">\n {{searchValue ? $t('home.no-results') : $t('home.no-data')}}\n </div>\n </div>\n <div v-else class=\"no-data\"> {{ $t('home.no-data') }} </div>\n </div>\n</template>\n\n<script>\n\nimport MinimalSection from '@/components/MinimalView/MinimalSection.vue';\nimport MinimalHeading from '@/components/MinimalView/MinimalHeading.vue';\nimport MinimalSearch from '@/components/MinimalView/MinimalSearch.vue';\nimport { GetTheme, ApplyLocalTheme, ApplyCustomVariables } from '@/utils/ThemeHelper';\nimport { searchTiles } from '@/utils/Search';\nimport Defaults, { localStorageKeys } from '@/utils/defaults';\nimport ConfigLauncher from '@/components/Settings/ConfigLauncher';\n\nexport default {\n name: 'home',\n components: {\n MinimalSection,\n MinimalHeading,\n MinimalSearch,\n ConfigLauncher,\n },\n data: () => ({\n searchValue: '',\n layout: '',\n modalOpen: false, // When true, keybindings are disabled\n selectedSection: 0, // The index of currently selected section\n tabbedView: true, // By default use tabs, when searching then show all instead\n theme: GetTheme(),\n }),\n computed: {\n sections() {\n return this.$store.getters.sections;\n },\n appConfig() {\n return this.$store.getters.appConfig;\n },\n pageInfo() {\n return this.$store.getters.pageInfo;\n },\n },\n watch: {\n /* When the theme changes, then call the update method */\n searchValue() {\n this.tabbedView = !this.searchValue || this.searchValue.length === 0;\n },\n },\n methods: {\n sectionSelected(index) {\n this.selectedSection = index;\n },\n /* Returns true if there is one or more sections in the config */\n checkTheresData(sections) {\n const localSections = localStorage[localStorageKeys.CONF_SECTIONS];\n return (sections && sections.length >= 1) || (localSections && localSections.length >= 1);\n },\n /* Returns sections from local storage if available, otherwise uses the conf.yml */\n getSections(sections) {\n // If the user has stored sections in local storage, return those\n const localSections = localStorage[localStorageKeys.CONF_SECTIONS];\n if (localSections) {\n const json = JSON.parse(localSections);\n if (json.length >= 1) return json;\n }\n // Otherwise, return the usuall data from conf.yml\n return sections;\n },\n /* Updates local data with search value, triggered from filter comp */\n searching(searchValue) {\n this.searchValue = searchValue || '';\n },\n /* Clears input field, once a searched item is opened */\n finishedSearching() {\n this.$refs.filterComp.clearMinFilterInput();\n },\n /* Extracts the site name from domain, used for the searching functionality */\n getDomainFromUrl(url) {\n if (!url) return '';\n const urlPattern = /^(?:https?:\\/\\/)?(?:w{3}\\.)?([a-z\\d.-]+)\\.(?:[a-z.]{2,10})(?:[/\\w.-]*)*/;\n const domainPattern = url.match(urlPattern);\n return domainPattern ? domainPattern[1] : '';\n },\n /* Returns only the tiles that match the users search query */\n filterTiles(allTiles) {\n if (!allTiles) return [];\n return searchTiles(allTiles, this.searchValue);\n },\n /* Update data when modal is open (so that key bindings can be disabled) */\n updateModalVisibility(modalState) {\n this.modalOpen = modalState;\n },\n /* Checks if any of the icons are Font Awesome glyphs */\n checkIfFontAwesomeNeeded() {\n let isNeeded = false;\n if (!this.sections) return false;\n this.sections.forEach((section) => {\n if (section.icon && section.icon.includes('fa-')) isNeeded = true;\n section.items.forEach((item) => {\n if (item.icon && item.icon.includes('fa-')) isNeeded = true;\n });\n });\n return isNeeded;\n },\n /* Injects font-awesome's script tag, only if needed */\n initiateFontAwesome() {\n if (this.appConfig.enableFontAwesome || this.checkIfFontAwesomeNeeded()) {\n const fontAwesomeScript = document.createElement('script');\n const faKey = this.appConfig.fontAwesomeKey || Defaults.fontAwesomeKey;\n fontAwesomeScript.setAttribute('src', `https://kit.fontawesome.com/${faKey}.js`);\n document.head.appendChild(fontAwesomeScript);\n }\n },\n /* Returns true if there is more than 1 sub-result visible during searching */\n checkIfResults() {\n if (!this.sections) return false;\n else {\n let itemsFound = true;\n this.sections.forEach((section) => {\n if (this.filterTiles(section.items).length > 0) itemsFound = false;\n });\n return itemsFound;\n }\n },\n /* Make CSS to set the number of columns based on the number of sections */\n setColumnCount() {\n return `--col-count: ${this.sections.length};`;\n },\n /* Make CSS styles to apply the users custom background image */\n getBackgroundImage() {\n if (this.appConfig && this.appConfig.backgroundImg) {\n return `background: url('${this.appConfig.backgroundImg}');background-size:cover;`;\n }\n return '';\n },\n /* If theme present, then call helper to apply it, and any custom colors */\n applyTheme() {\n if (this.theme) {\n ApplyLocalTheme(this.theme);\n ApplyCustomVariables(this.theme);\n }\n },\n modalChanged(modalState) {\n this.modalOpen = modalState;\n },\n },\n mounted() {\n this.initiateFontAwesome();\n this.applyTheme();\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@/styles/media-queries.scss';\n@import '@/styles/style-helpers.scss';\n\n.minimal-home {\n display: flex;\n flex-direction: column;\n margin: 1rem auto;\n padding-bottom: 1px;\n padding-top: 10vh;\n min-height: calc(99vh - var(--footer-height));\n width: 90%;\n max-width: 1000px;\n background: var(--minimal-view-background-color);\n}\n\n.title-and-search {\n text-align: center;\n h1 {\n color: var(--minimal-view-title-color);\n margin: 0;\n font-size: 3rem;\n }\n a {\n text-decoration: none;\n }\n}\n\n/* Outside container wrapping the item groups*/\n.item-group-container {\n display: grid;\n gap: 0 0.5rem;\n margin: 3rem auto;\n width: 90%;\n grid-template-columns: repeat(var(--col-count), 1fr);\n @extend .scroll-bar;\n\n &.showing-all {\n flex-direction: column;\n display: flex;\n .headings {\n display: none;\n }\n }\n}\n\n @include phone {\n .item-group-container {\n display: flex;\n flex-direction: column;\n }\n}\n\n.no-data {\n font-size: 2rem;\n color: var(--minimal-view-background-color);\n background: #ffffffeb;\n width: fit-content;\n margin: 2rem auto;\n padding: 0.5rem 1rem;\n border-radius: var(--curve-factor);\n}\n\n.minimal-buttons {\n position: absolute;\n top: 0.5rem;\n right: 1rem;\n display: flex;\n .home-page-icon {\n color: var(--minimal-view-settings-color);\n width: 1.5rem;\n height: 1.5rem;\n @extend .svg-button;\n }\n}\n</style>\n\n<style lang=\"scss\">\n.minimal-home .minimal-buttons {\n .config-launcher span.config-label { display: none; }\n svg { opacity: var(--dimming-factor); border: none; }\n &:hover svg { opacity: 1; }\n .view-switcher {\n margin-top: 2rem;\n right: 0;\n }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Minimal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Minimal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Minimal.vue?vue&type=template&id=31e46608&scoped=true&\"\nimport script from \"./Minimal.vue?vue&type=script&lang=js&\"\nexport * from \"./Minimal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Minimal.vue?vue&type=style&index=0&id=31e46608&lang=scss&scoped=true&\"\nimport style1 from \"./Minimal.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"31e46608\",\n null\n \n)\n\nexport default component.exports","/**\n * This is the router config, which defined the location for\n * each page within the app, and how they should be loaded\n * Note that the page paths are defined in @/utils/defaults.js\n */\n\n// Import Vue.js and vue router\nimport Vue from 'vue';\nimport Router from 'vue-router';\nimport ProgressBar from 'rsup-progress';\n\n// Import views, that are not lazy-loaded\nimport Home from '@/views/Home.vue';\nimport Login from '@/views/Login.vue';\nimport Workspace from '@/views/Workspace.vue';\nimport Minimal from '@/views/Minimal.vue';\nimport ConfigAccumulator from '@/utils/ConfigAccumalator';\n\n// Import helper functions, config data and defaults\nimport { isAuthEnabled, isLoggedIn, isGuestAccessEnabled } from '@/utils/Auth';\nimport { metaTagData, startingView, routePaths } from '@/utils/defaults';\nimport ErrorHandler from '@/utils/ErrorHandler';\n\nVue.use(Router);\nconst progress = new ProgressBar({ color: 'var(--progress-bar)' });\n\n/* Returns true if user is already authenticated, or if auth is not enabled */\nconst isAuthenticated = () => {\n const authEnabled = isAuthEnabled();\n const userLoggedIn = isLoggedIn();\n const guestEnabled = isGuestAccessEnabled();\n return (!authEnabled || userLoggedIn || guestEnabled);\n};\n\nconst getConfig = () => {\n const Accumulator = new ConfigAccumulator();\n return {\n appConfig: Accumulator.appConfig(),\n pageInfo: Accumulator.pageInfo(),\n };\n};\n\nconst { appConfig, pageInfo } = getConfig();\n\n/* Get the users chosen starting view from app config, or return default */\nconst getStartingView = () => appConfig.startingView || startingView;\n\n/**\n * Returns the component that should be rendered at the base path,\n * Defaults to Home, but the user can change this to Workspace of Minimal\n */\nconst getStartingComponent = () => {\n const usersPreference = getStartingView();\n switch (usersPreference) {\n case 'default': return Home;\n case 'minimal': return Minimal;\n case 'workspace': return Workspace;\n default: return Home;\n }\n};\n\n/* Returns the meta tags for each route */\nconst makeMetaTags = (defaultTitle) => ({\n title: pageInfo.title || defaultTitle,\n metaTags: metaTagData,\n});\n\n/* Routing mode, can be either 'hash', 'history' or 'abstract' */\nconst mode = appConfig.routingMode || 'history';\n\n/* List of all routes, props, components and metadata */\nconst router = new Router({\n mode,\n routes: [\n { // The default view can be customized by the user\n path: '/',\n name: `landing-page-${getStartingView()}`,\n component: getStartingComponent(),\n meta: makeMetaTags('Home Page'),\n },\n { // Default home page\n path: routePaths.home,\n name: 'home',\n component: Home,\n meta: makeMetaTags('Home Page'),\n },\n { // View only single section\n path: `${routePaths.home}/:section`,\n name: 'home-section',\n component: Home,\n meta: makeMetaTags('Home Page'),\n },\n { // Workspace view page\n path: routePaths.workspace,\n name: 'workspace',\n component: Workspace,\n meta: makeMetaTags('Workspace'),\n },\n { // Minimal view page\n path: routePaths.minimal,\n name: 'minimal',\n component: Minimal,\n meta: makeMetaTags('Start Page'),\n },\n { // The login page\n path: routePaths.login,\n name: 'login',\n component: Login,\n beforeEnter: (to, from, next) => {\n // If the user already logged in + guest mode not enabled, then redirect home\n if (isAuthenticated() && !isGuestAccessEnabled()) router.push({ path: '/' });\n next();\n },\n },\n { // The about app page\n path: routePaths.about,\n name: 'about', // We lazy load the About page so as to not slow down the app\n component: () => import('./views/About.vue'),\n meta: makeMetaTags('About Dashy'),\n },\n { // The export config page\n path: routePaths.download,\n name: 'download',\n component: () => import('./views/DownloadConfig.vue'),\n meta: makeMetaTags('Download Config'),\n },\n { // Page not found, any non-defined routes will land here\n path: routePaths.notFound,\n name: '404',\n component: () => import('./views/404.vue'),\n meta: makeMetaTags('404 Not Found'),\n beforeEnter: (to, from, next) => {\n if (to.redirectedFrom) { // Log error, if redirected here from another route\n ErrorHandler(`Route not found: '${to.redirectedFrom}'`);\n }\n next();\n },\n },\n { // Redirect any not-found routed to the 404 view\n path: '*',\n redirect: '/404',\n },\n ],\n});\n\n/**\n * Before loading a route, check if the user has authentication enabled\n * if so, then ensure that they are correctly logged in as a valid user\n * If not logged in, prevent all access and redirect them to login page\n * */\nrouter.beforeEach((to, from, next) => {\n progress.start();\n if (to.name !== 'login' && !isAuthenticated()) next({ name: 'login' });\n else next();\n});\n\n/* If title is missing, then apply default page title */\nrouter.afterEach((to) => {\n progress.end();\n Vue.nextTick(() => {\n document.title = to.meta.title || 'Dashy';\n });\n});\n\n// All done - export the now configured router\nexport default router;\n","/* eslint-disable no-param-reassign */\nimport Vue from 'vue';\nimport Vuex from 'vuex';\nimport Keys from '@/utils/StoreMutations';\nimport ConfigAccumulator from '@/utils/ConfigAccumalator';\nimport { componentVisibility } from '@/utils/ConfigHelpers';\nimport { applyItemId } from '@/utils/MiscHelpers';\nimport filterUserSections from '@/utils/CheckSectionVisibility';\nimport { InfoHandler, InfoKeys } from '@/utils/ErrorHandler';\n\nVue.use(Vuex);\n\nconst {\n INITIALIZE_CONFIG,\n SET_CONFIG,\n SET_MODAL_OPEN,\n SET_LANGUAGE,\n SET_ITEM_LAYOUT,\n SET_ITEM_SIZE,\n SET_THEME,\n SET_CUSTOM_COLORS,\n UPDATE_ITEM,\n SET_EDIT_MODE,\n SET_PAGE_INFO,\n SET_APP_CONFIG,\n SET_SECTIONS,\n UPDATE_SECTION,\n INSERT_SECTION,\n REMOVE_SECTION,\n COPY_ITEM,\n REMOVE_ITEM,\n INSERT_ITEM,\n UPDATE_CUSTOM_CSS,\n CONF_MENU_INDEX,\n} = Keys;\n\nconst store = new Vuex.Store({\n state: {\n config: {},\n editMode: false, // While true, the user can drag and edit items + sections\n modalOpen: false, // KB shortcut functionality will be disabled when modal is open\n navigateConfToTab: undefined, // Used to switch active tab in config modal\n },\n getters: {\n config(state) {\n return state.config;\n },\n pageInfo(state) {\n return state.config.pageInfo || {};\n },\n appConfig(state) {\n return state.config.appConfig || {};\n },\n theme(state) {\n return state.config.appConfig.theme;\n },\n sections(state) {\n return filterUserSections(state.config.sections || []);\n },\n webSearch(state, getters) {\n return getters.appConfig.webSearch || {};\n },\n visibleComponents(state, getters) {\n return componentVisibility(getters.appConfig);\n },\n // eslint-disable-next-line arrow-body-style\n getSectionByIndex: (state, getters) => (index) => {\n return getters.sections[index];\n },\n getItemById: (state, getters) => (id) => {\n let item;\n getters.sections.forEach(sec => {\n const foundItem = sec.items.find((itm) => itm.id === id);\n if (foundItem) item = foundItem;\n });\n return item;\n },\n getParentSectionOfItem: (state, getters) => (itemId) => {\n let foundSection;\n getters.sections.forEach((section) => {\n section.items.forEach((item) => {\n if (item.id === itemId) foundSection = section;\n });\n });\n return foundSection;\n },\n layout(state) {\n return state.config.appConfig.layout || 'auto';\n },\n iconSize(state) {\n return state.config.appConfig.iconSize || 'medium';\n },\n },\n mutations: {\n [SET_CONFIG](state, config) {\n state.config = config;\n },\n [SET_LANGUAGE](state, lang) {\n const newConfig = state.config;\n newConfig.appConfig.language = lang;\n state.config = newConfig;\n },\n [SET_MODAL_OPEN](state, modalOpen) {\n state.modalOpen = modalOpen;\n },\n [SET_EDIT_MODE](state, editMode) {\n if (editMode !== state.editMode) {\n InfoHandler(editMode ? 'Edit session started' : 'Edit session ended', InfoKeys.EDITOR);\n state.editMode = editMode;\n }\n },\n [UPDATE_ITEM](state, payload) {\n const { itemId, newItem } = payload;\n const newConfig = { ...state.config };\n newConfig.sections.forEach((section, secIndex) => {\n section.items.forEach((item, itemIndex) => {\n if (item.id === itemId) {\n newConfig.sections[secIndex].items[itemIndex] = newItem;\n InfoHandler('Item updated', InfoKeys.EDITOR);\n }\n });\n });\n state.config = newConfig;\n },\n [SET_PAGE_INFO](state, newPageInfo) {\n const newConfig = state.config;\n newConfig.pageInfo = newPageInfo;\n state.config = newConfig;\n InfoHandler('Page info updated', InfoKeys.EDITOR);\n },\n [SET_APP_CONFIG](state, newAppConfig) {\n const newConfig = state.config;\n newConfig.appConfig = newAppConfig;\n state.config = newConfig;\n InfoHandler('App config updated', InfoKeys.EDITOR);\n },\n [SET_SECTIONS](state, newSections) {\n const newConfig = state.config;\n newConfig.sections = newSections;\n state.config = newConfig;\n InfoHandler('Sections updated', InfoKeys.EDITOR);\n },\n [UPDATE_SECTION](state, payload) {\n const { sectionIndex, sectionData } = payload;\n const newConfig = { ...state.config };\n newConfig.sections[sectionIndex] = sectionData;\n state.config = newConfig;\n InfoHandler('Section updated', InfoKeys.EDITOR);\n },\n [INSERT_SECTION](state, newSection) {\n const newConfig = { ...state.config };\n newSection.items = [];\n newConfig.sections.push(newSection);\n state.config = newConfig;\n InfoHandler('New section added', InfoKeys.EDITOR);\n },\n [REMOVE_SECTION](state, payload) {\n const { sectionIndex, sectionName } = payload;\n const newConfig = { ...state.config };\n if (newConfig.sections[sectionIndex].name === sectionName) {\n newConfig.sections.splice(sectionIndex, 1);\n InfoHandler('Section removed', InfoKeys.EDITOR);\n }\n state.config = newConfig;\n },\n [INSERT_ITEM](state, payload) {\n const { newItem, targetSection } = payload;\n const config = { ...state.config };\n config.sections.forEach((section) => {\n if (section.name === targetSection) {\n section.items.push(newItem);\n InfoHandler('New item added', InfoKeys.EDITOR);\n }\n });\n config.sections = applyItemId(config.sections);\n state.config = config;\n },\n [COPY_ITEM](state, payload) {\n const { item, toSection, appendTo } = payload;\n const config = { ...state.config };\n const newItem = { ...item };\n config.sections.forEach((section) => {\n if (section.name === toSection) {\n if (appendTo === 'beginning') {\n section.items.unshift(newItem);\n } else {\n section.items.push(newItem);\n }\n InfoHandler('Item copied', InfoKeys.EDITOR);\n }\n });\n config.sections = applyItemId(config.sections);\n state.config = config;\n },\n [REMOVE_ITEM](state, payload) {\n const { itemId, sectionName } = payload;\n const config = { ...state.config };\n config.sections.forEach((section) => {\n if (section.name === sectionName) {\n section.items.forEach((item, index) => {\n if (item.id === itemId) {\n section.items.splice(index, 1);\n InfoHandler('Item removed', InfoKeys.EDITOR);\n }\n });\n }\n });\n state.config = config;\n },\n [SET_THEME](state, theme) {\n const newConfig = { ...state.config };\n newConfig.appConfig.theme = theme;\n state.config = newConfig;\n InfoHandler('Theme updated', InfoKeys.VISUAL);\n },\n [SET_CUSTOM_COLORS](state, customColors) {\n const newConfig = { ...state.config };\n newConfig.appConfig.customColors = customColors;\n state.config = newConfig;\n InfoHandler('Color palette updated', InfoKeys.VISUAL);\n },\n [SET_ITEM_LAYOUT](state, layout) {\n state.config.appConfig.layout = layout;\n InfoHandler('Layout updated', InfoKeys.VISUAL);\n },\n [SET_ITEM_SIZE](state, iconSize) {\n state.config.appConfig.iconSize = iconSize;\n InfoHandler('Item size updated', InfoKeys.VISUAL);\n },\n [UPDATE_CUSTOM_CSS](state, customCss) {\n state.config.appConfig.customCss = customCss;\n InfoHandler('Custom colors updated', InfoKeys.VISUAL);\n },\n [CONF_MENU_INDEX](state, index) {\n state.navigateConfToTab = index;\n },\n },\n actions: {\n /* Called when app first loaded. Reads config and sets state */\n [INITIALIZE_CONFIG]({ commit }) {\n const deepCopy = (json) => JSON.parse(JSON.stringify(json));\n const config = deepCopy(new ConfigAccumulator().config());\n commit(SET_CONFIG, config);\n },\n },\n modules: {},\n});\n\nexport default store;\n","import { register } from 'register-service-worker';\nimport { sessionStorageKeys } from '@/utils/defaults';\nimport { statusMsg, statusErrorMsg } from '@/utils/CoolConsole';\nimport conf from '../../public/conf.yml';\n\n/* Sets a local storage item with the state from the SW lifecycle */\nconst setSwStatus = (swStateToSet) => {\n const initialSwState = {\n ready: false,\n registered: false,\n cached: false,\n updateFound: false,\n updated: false,\n offline: false,\n error: false,\n devMode: false,\n disabledByUser: false,\n };\n const sessionData = sessionStorage[sessionStorageKeys.SW_STATUS];\n const currentSwState = sessionData ? JSON.parse(sessionData) : initialSwState;\n try {\n const newSwState = { ...currentSwState, ...swStateToSet };\n sessionStorage.setItem(sessionStorageKeys.SW_STATUS, JSON.stringify(newSwState));\n } catch (e) {\n statusErrorMsg('Service Worker Status', 'Error Updating SW Status', e);\n }\n};\n\n/**\n * Checks if service workers should be enabled\n * Disable if not running in production\n * Or disable if user specified to disable\n */\nconst shouldEnableServiceWorker = () => {\n if (conf && conf.appConfig && conf.appConfig.enableServiceWorker) {\n setSwStatus({ disabledByUser: false });\n return true;\n } else if (process.env.NODE_ENV !== 'production') {\n setSwStatus({ devMode: true });\n return false;\n }\n setSwStatus({ disabledByUser: true });\n return false;\n};\n\n/* Calls to the print status function */\nconst printSwStatus = (msg) => {\n statusMsg('Service Worker Status', msg);\n};\n\nconst swUrl = `${process.env.BASE_URL || '/'}service-worker.js`;\n\n/* If service worker enabled, then register it, and print message when status changes */\nconst registerServiceWorker = () => {\n if (shouldEnableServiceWorker()) {\n register(swUrl, {\n ready() {\n setSwStatus({ ready: true });\n printSwStatus(\n 'Dashy is being served from cache by a service worker.\\n'\n + 'For more details, visit https://goo.gl/AFskqB',\n );\n },\n registered() {\n setSwStatus({ registered: true });\n printSwStatus('Service worker has been registered.');\n },\n cached() {\n setSwStatus({ cached: true });\n printSwStatus('App has been cached for offline use.');\n },\n updatefound() {\n setSwStatus({ updateFound: true });\n printSwStatus('New content is downloading...');\n },\n updated() {\n setSwStatus({ updated: true });\n printSwStatus('New content is available; please refresh the page.');\n },\n offline() {\n setSwStatus({ offline: true });\n printSwStatus('No internet connection found. Dashy is running in offline mode.');\n },\n error(error) {\n setSwStatus({ error: true });\n statusErrorMsg('Service Worker Status', 'Error during SW registration', error);\n },\n });\n }\n};\n\nexport default registerServiceWorker;\n","/**\n * A simple Vue directive to trigger an event when the user\n * clicks anywhere other than the specified element.\n * Used to close context menu's popup menus and tips.\n */\n\nconst instances = [];\n\nfunction onDocumentClick(e, el, fn) {\n const { target } = e;\n if (el !== target && !el.contains(target)) {\n fn(e);\n }\n}\n\nexport default {\n bind(element, binding) {\n const el = element;\n el.dataset.outsideClickIndex = instances.length;\n\n const fn = binding.value;\n const click = (e) => {\n onDocumentClick(e, el, fn);\n };\n\n document.addEventListener('click', click);\n document.addEventListener('touchstart', click);\n instances.push(click);\n },\n unbind(el) {\n if (!el.dataset) return;\n const index = el.dataset.outsideClickIndex;\n const handler = instances[index];\n document.removeEventListener('click', handler);\n instances.splice(index, 1);\n },\n};\n","/**\n * NOTE: No data is EVER sent to any external service without your explicit consent.\n * In the case of error reporting, Sentry will not even be initialized unless\n * you have purposely set appConfig.enableErrorReporting: true.\n * It is false by default.\n * You may want to enable error reporting if you have encountered a bug,\n * as access to the console errors enable it to be triaged an fixed effectively\n */\n\n/* eslint-disable global-require */\n\nimport ConfigAccumulator from '@/utils/ConfigAccumalator';\nimport { sentryDsn } from '@/utils/defaults';\n\nconst ErrorReporting = (Vue, router) => {\n // Fetch users config\n const appConfig = new ConfigAccumulator().appConfig() || {};\n // Check if error reporting is enabled. Only proceed if user has turned it on.\n if (appConfig.enableErrorReporting) {\n // Get current app version\n const appVersion = process.env.VUE_APP_VERSION ? `Dashy@${process.env.VUE_APP_VERSION}` : '';\n // Import Sentry\n const Sentry = require('@sentry/vue');\n const { Integrations } = require('@sentry/tracing');\n // Get the Data Source Name for your or Dashy's Sentry instance\n const dsn = appConfig.sentryDsn || sentryDsn;\n // Initialize Sentry\n Sentry.init({\n Vue,\n dsn,\n integrations: [\n new Integrations.BrowserTracing({\n routingInstrumentation: Sentry.vueRouterInstrumentation(router),\n }),\n ],\n tracesSampleRate: 1.0,\n release: appVersion,\n });\n } else {\n // Error reporting has not been enabled by the user. Do Nothing.\n }\n};\n\nexport default ErrorReporting;\n","/* eslint-disable no-multi-spaces */\n// Import core framework and essential utils\nimport Vue from 'vue';\nimport VueI18n from 'vue-i18n'; // i18n for localization\nimport Keycloak from 'keycloak-js';\n\n// Import component Vue plugins, used throughout the app\nimport VTooltip from 'v-tooltip'; // A Vue directive for Popper.js, tooltip component\nimport VModal from 'vue-js-modal'; // Modal component\nimport VSelect from 'vue-select'; // Select dropdown component\nimport VTabs from 'vue-material-tabs'; // Tab view component, used on the config page\nimport Toasted from 'vue-toasted'; // Toast component, used to show confirmation notifications\nimport TreeView from 'vue-json-tree-view';\n\n// Import base Dashy components and utils\nimport Dashy from '@/App.vue'; // Main Dashy Vue app\nimport router from '@/router'; // Router, for navigation\nimport store from '@/store'; // Store, for local state management\nimport serviceWorker from '@/utils/InitServiceWorker'; // Service worker initialization\nimport clickOutside from '@/utils/ClickOutside'; // Directive for closing popups, modals, etc\nimport { messages } from '@/utils/languages'; // Language texts\nimport ErrorReporting from '@/utils/ErrorReporting'; // Error reporting initializer (off)\nimport { toastedOptions, tooltipOptions, language as defaultLanguage } from '@/utils/defaults';\nimport { isKeycloakEnabled, getKeycloakConfig } from '@/utils/Auth'; // Keycloak auth config\n\n// Initialize global Vue components\nVue.use(VueI18n);\nVue.use(VTooltip, tooltipOptions);\nVue.use(VModal);\nVue.use(VTabs);\nVue.use(TreeView);\nVue.use(Toasted, toastedOptions);\nVue.component('v-select', VSelect);\nVue.directive('clickOutside', clickOutside);\n\nVue.config.productionTip = false; // Disable annoying console message\n\n// Setup i18n translations\nconst i18n = new VueI18n({\n locale: defaultLanguage,\n fallbackLocale: defaultLanguage,\n messages,\n});\n\n// Checks if service worker not disable, and if so will registers it\nserviceWorker();\n\n// Checks if user enabled error reporting, and if so will initialize it\nErrorReporting(Vue, router);\n\n// Render function\nconst render = (awesome) => awesome(Dashy);\n\n// Mount the app, with router, store i18n and render func\nconst mount = () => new Vue({\n store, router, render, i18n,\n}).$mount('#app');\n\n// If Keycloak not enabled, then proceed straight to the app\nif (!isKeycloakEnabled()) {\n mount();\n} else { // Keycloak is enabled, redirect to KC login page\n const { serverUrl, realm, clientId } = getKeycloakConfig();\n const initOptions = {\n url: `${serverUrl}/auth`, realm, clientId, onLoad: 'login-required',\n };\n const keycloak = Keycloak(initOptions);\n keycloak.init({ onLoad: initOptions.onLoad }).then((auth) => {\n if (!auth) {\n // Not authenticated, reload to Keycloak login page\n window.location.reload();\n } else {\n // Yay - user successfully authenticated with Keycloak, render the app!\n mount();\n }\n });\n}\n","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-sliders-h fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"sliders-h\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M496 384H160v-16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h80v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h336c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-160h-80v-16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h336v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h80c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-160H288V48c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16C7.2 64 0 71.2 0 80v32c0 8.8 7.2 16 16 16h208v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h208c8.8 0 16-7.2 16-16V80c0-8.8-7.2-16-16-16z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-th-list fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"th-list\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M149.333 216v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24v-80c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24zM0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24zM125.333 32H24C10.745 32 0 42.745 0 56v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24zm80 448H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24zm-24-424v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24zm24 264H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MoveItemTo.vue?vue&type=style&index=0&id=00eee648&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-exchange fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"exchange\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M0 168v-16c0-13.255 10.745-24 24-24h381.97l-30.467-27.728c-9.815-9.289-10.03-24.846-.474-34.402l10.84-10.84c9.373-9.373 24.568-9.373 33.941 0l82.817 82.343c12.497 12.497 12.497 32.758 0 45.255l-82.817 82.343c-9.373 9.373-24.569 9.373-33.941 0l-10.84-10.84c-9.556-9.556-9.341-25.114.474-34.402L405.97 192H24c-13.255 0-24-10.745-24-24zm488 152H106.03l30.467-27.728c9.815-9.289 10.03-24.846.474-34.402l-10.84-10.84c-9.373-9.373-24.568-9.373-33.941 0L9.373 329.373c-12.497 12.497-12.497 32.758 0 45.255l82.817 82.343c9.373 9.373 24.569 9.373 33.941 0l10.84-10.84c9.556-9.556 9.341-25.113-.474-34.402L106.03 384H488c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-home fa-w-18\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"home\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 576 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M570.24 247.41L512 199.52V104a8 8 0 00-8-8h-32a8 8 0 00-7.95 7.88v56.22L323.87 45a56.06 56.06 0 00-71.74 0L5.76 247.41a16 16 0 00-2 22.54L14 282.25a16 16 0 0022.53 2L64 261.69V448a32.09 32.09 0 0032 32h128a32.09 32.09 0 0032-32V344h64v104a32.09 32.09 0 0032 32h128a32.07 32.07 0 0032-31.76V261.67l27.53 22.62a16 16 0 0022.53-2L572.29 270a16 16 0 00-2.05-22.59zM463.85 432H368V328a32.09 32.09 0 00-32-32h-96a32.09 32.09 0 00-32 32v104h-96V222.27L288 77.65l176 144.56z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-copy fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"copy\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M433.941 65.941l-51.882-51.882A48 48 0 00348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 00-14.059-33.941zM266 464H54a6 6 0 01-6-6V150a6 6 0 016-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 01-6 6zm128-96H182a6 6 0 01-6-6V54a6 6 0 016-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 01-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 011.757 4.243V112z\"}})])\n )\n }\n }\n ","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss&\"","module.exports = {\n /* Default pageInfo object, used if user does not specify their own */\n pageInfo: {\n title: 'Dashy',\n description: '',\n navLinks: [\n { title: 'Home', path: '/' },\n { title: 'Source', path: 'https://github.com/Lissy93/dashy' },\n ],\n footerText: '',\n },\n /* Default appConfig to be used, if user does not specify their own */\n appConfig: {},\n /* Default language code */\n language: 'en',\n /* The page to use as the starting homepage */\n startingView: 'default',\n /* Default icon size to be applied on initial load */\n iconSize: 'medium',\n /* Default layout to be applied on initial load */\n layout: 'auto',\n /* Default theme to be applied on initial load */\n theme: 'default',\n /* Default Font-Awesome API key, for FA icons (if used) */\n fontAwesomeKey: '0821c65656',\n /* Default API to use for fetching of user service favicon icons (if enabled) */\n faviconApi: 'faviconkit',\n /* The default sort order for sections */\n sortOrder: 'default',\n /* The page paths for each route within the app for the router */\n routePaths: {\n home: '/home',\n minimal: '/minimal',\n workspace: '/workspace',\n about: '/about',\n login: '/login',\n download: '/download',\n notFound: '/404',\n },\n /* Server Endpoints */\n serviceEndpoints: {\n statusPing: '/status-ping',\n statusCheck: '/status-check',\n save: '/config-manager/save',\n rebuild: '/config-manager/rebuild',\n },\n /* List of built-in themes, to be displayed within the theme-switcher dropdown */\n builtInThemes: [\n 'callisto',\n 'oblivion',\n 'material',\n 'material-dark',\n 'dashy-docs',\n 'colorful',\n 'one-dark',\n 'dracula',\n 'adventure',\n 'nord-frost',\n 'nord',\n 'minimal-dark',\n 'minimal-light',\n 'thebe',\n 'cyberpunk',\n 'matrix',\n 'matrix-red',\n 'color-block',\n 'glow',\n 'raspberry-jam',\n 'bee',\n 'tiger',\n 'vaporware',\n 'material-original',\n 'material-dark-original',\n 'high-contrast-dark',\n 'high-contrast-light',\n ],\n /* Which structural components should be visible by default */\n visibleComponents: {\n splashScreen: false,\n navigation: true,\n pageTitle: true,\n searchBar: true,\n settings: true,\n footer: true,\n },\n /* A list of route names that page furniture (header, footer, etc) should be hidden on */\n hideFurnitureOn: [\n 'minimal',\n 'login',\n 'download',\n 'landing-page-minimal',\n // '404',\n ],\n /* Key names for local storage identifiers */\n localStorageKeys: {\n LANGUAGE: 'language',\n HIDE_WELCOME_BANNER: 'hideWelcomeHelpers',\n LAYOUT_ORIENTATION: 'layoutOrientation',\n COLLAPSE_STATE: 'collapseState',\n ICON_SIZE: 'iconSize',\n THEME: 'theme',\n CUSTOM_COLORS: 'customColors',\n CONF_SECTIONS: 'confSections',\n PAGE_INFO: 'pageInfo',\n APP_CONFIG: 'appConfig',\n BACKUP_ID: 'backupId',\n BACKUP_HASH: 'backupHash',\n HIDE_SETTINGS: 'hideSettings',\n USERNAME: 'username',\n MOST_USED: 'mostUsed',\n LAST_USED: 'lastUsed',\n },\n /* Key names for cookie identifiers */\n cookieKeys: {\n AUTH_TOKEN: 'authenticationToken',\n },\n /* Key names for session storage identifiers */\n sessionStorageKeys: {\n SW_STATUS: 'serviceWorkerStatus',\n ERROR_LOG: 'errorLog',\n },\n /* Unique IDs of modals within the app */\n modalNames: {\n CONF_EDITOR: 'CONF_EDITOR',\n REBUILD_APP: 'REBUILD_APP',\n ABOUT_APP: 'ABOUT_APP',\n LANG_SWITCHER: 'LANG_SWITCHER',\n EDIT_ITEM: 'EDIT_ITEM',\n EDIT_SECTION: 'EDIT_SECTION',\n EDIT_PAGE_INFO: 'EDIT_PAGE_INFO',\n EDIT_APP_CONFIG: 'EDIT_APP_CONFIG',\n EXPORT_CONFIG_MENU: 'EXPORT_CONFIG_MENU',\n MOVE_ITEM_TO: 'MOVE_ITEM_TO',\n },\n /* Key names for the top-level objects in conf.yml */\n topLevelConfKeys: {\n PAGE_INFO: 'pageInfo',\n APP_CONFIG: 'appConfig',\n SECTIONS: 'sections',\n },\n /* Which CSS variables to show in the first view of theme configurator */\n mainCssVars: ['primary', 'background', 'background-darker'],\n /* Amount of time to show splash screen, when enabled, in milliseconds */\n splashScreenTime: 1900,\n /* Page meta-data, rendered in the header of each view */\n metaTagData: [\n { name: 'description', content: 'A simple static homepage for you\\'re server' },\n ],\n /* If no 'target' specified, this is the default opening method */\n openingMethod: 'newtab',\n /* Default option for Toast messages */\n toastedOptions: {\n position: 'bottom-center',\n duration: 2500,\n keepOnHover: true,\n className: 'toast-message',\n iconPack: 'fontawesome',\n },\n /* Default tooltip options */\n tooltipOptions: {\n defaultTrigger: 'hover focus',\n defaultHideOnTargetClick: true,\n autoHide: true,\n defaultHtml: false,\n defaultPlacement: 'auto',\n defaultLoadingContent: 'Loading...',\n defaultDelay: { show: 380, hide: 0 },\n // delay: { show: 380, hide: 0 },\n },\n /* Server location of the Backup & Sync cloud function */\n backupEndpoint: 'https://dashy-sync-service.as93.net',\n /* Available services for fetching favicon icon for user apps */\n faviconApiEndpoints: {\n mcapi: 'https://eu.mc-api.net/v3/server/favicon/$URL',\n clearbit: 'https://logo.clearbit.com/$URL',\n faviconkit: 'https://api.faviconkit.com/$URL/64',\n google: 'https://www.google.com/s2/favicons?sz=128&domain_url=$URL',\n allesedv: 'https://f1.allesedv.com/128/$URL',\n webmasterapi: 'https://api.webmasterapi.com/v1/favicon/yEwx0ZFs0CSPshHq/$URL',\n },\n /* The URL to CDNs used for external icons. These are only loaded when required */\n iconCdns: {\n fa: 'https://kit.fontawesome.com',\n mdi: 'https://cdn.jsdelivr.net/npm/@mdi/font@5.9.55/css/materialdesignicons.min.css',\n si: 'https://unpkg.com/simple-icons@v5/icons',\n generative: 'https://avatars.dicebear.com/api/identicon/{icon}.svg',\n localPath: './item-icons',\n faviconName: 'favicon.ico',\n homeLabIcons: 'https://raw.githubusercontent.com/WalkxCode/dashboard-icons/master/png/{icon}.png',\n },\n /* URLs for web search engines */\n searchEngineUrls: {\n // Common\n duckduckgo: 'https://duckduckgo.com/?q=',\n google: 'https://google.com/search?q=',\n whoogle: 'https://whoogle.sdf.org/search?q=',\n qwant: 'https://www.qwant.com/?q=',\n startpage: 'https://www.startpage.com/do/search?query=',\n // Niche\n 'searx-bar': 'https://searx.bar/search?q=',\n 'searx-info': 'https://searx.info/search?q=',\n 'searx-tiekoetter': 'https://searx.tiekoetter.com/search?q=',\n 'searx-bissisoft': 'https://searx.bissisoft.com/search?q=',\n ecosia: 'https://www.ecosia.org/search?q=',\n metager: 'https://metager.org/meta/meta.ger3?eingabe=',\n swisscows: 'https://swisscows.com/web?query=',\n mojeek: 'https://www.mojeek.com/search?q=',\n peekier: 'https://peekier.com/#!',\n // Specific\n wikipedia: 'https://en.wikipedia.org/w/?search=',\n stackoverflow: 'https://stackoverflow.com/search?q=',\n wolframalpha: 'https://www.wolframalpha.com/input/?i=',\n reddit: 'https://www.reddit.com/search/?q=',\n youtube: 'https://youtube.com/results?q=',\n github: 'https://github.com/search?q=',\n bbc: 'https://www.bbc.co.uk/search?q=',\n },\n defaultSearchEngine: 'duckduckgo',\n defaultSearchOpeningMethod: 'newtab',\n searchBangs: {\n '/b': 'bbc',\n '/d': 'duckduckgo',\n '/g': 'google',\n '/r': 'reddit',\n '/w': 'wikipedia',\n '/y': 'youtube',\n '/gh': 'github',\n '/so': 'stackoverflow',\n '/wa': 'wolframalpha',\n },\n /* Available built-in colors for the theme builder */\n swatches: [\n ['#eb5cad', '#985ceb', '#5346f3', '#5c90eb'],\n ['#5cdfeb', '#00CCB4', '#5ceb8d', '#afeb5c'],\n ['#eff961', '#ebb75c', '#eb615c', '#eb2d6c'],\n ['#060913', '#141b33', '#1c2645', '#263256'],\n ['#2b2d42', '#1a535c', '#372424', '#312437'],\n ['#f5f5f5', '#d9d9d9', '#bfbfbf', '#9a9a9a'],\n ['#636363', '#363636', '#313941', '#0d0d0d'],\n ],\n /* Use your own self-hosted Sentry instance. Only used if error reporting is turned on */\n sentryDsn: 'https://3138ea85f15a4fa883a5b27a4dc8ee28@o937511.ingest.sentry.io/5887934',\n /* A JS enum for indicating the user state, when guest mode + authentication is enabled */\n userStateEnum: {\n notConfigured: 0,\n loggedIn: 1,\n guestAccess: 2,\n notLoggedIn: 3,\n },\n /* Progressive Web App settings, used by Vue Config */\n pwa: {\n name: 'Dashy',\n manifestPath: './manifest.json',\n themeColor: '#00af87',\n msTileColor: '#0b1021',\n mode: 'production',\n iconPaths: {\n manifestCrossorigin: 'use-credentials',\n favicon64: './web-icons/favicon-64x64.png',\n favicon32: './web-icons/favicon-32x32.png',\n maskIcon: './web-icons/dashy-logo.png',\n msTileImage: './web-icons/dashy-logo.png',\n },\n },\n};\n","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-times-circle fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"times-circle\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm101.8-262.2L295.6 256l62.2 62.2c4.7 4.7 4.7 12.3 0 17l-22.6 22.6c-4.7 4.7-12.3 4.7-17 0L256 295.6l-62.2 62.2c-4.7 4.7-12.3 4.7-17 0l-22.6-22.6c-4.7-4.7-4.7-12.3 0-17l62.2-62.2-62.2-62.2c-4.7-4.7-4.7-12.3 0-17l22.6-22.6c4.7-4.7 12.3-4.7 17 0l62.2 62.2 62.2-62.2c4.7-4.7 12.3-4.7 17 0l22.6 22.6c4.7 4.7 4.7 12.3 0 17z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":\"100\",\"height\":\"100\",\"preserveAspectRatio\":\"xMidYMid\"}, attrs),\n ...rest,\n },\n children.concat([_c('defs',[_c('clipPath',{attrs:{\"id\":\"a\"}},[_c('path',{attrs:{\"d\":\"M20 0h60v100H20z\"}})])]),_c('path',{attrs:{\"fill\":\"none\",\"stroke\":\"var(--primary, #00af87)\",\"stroke-width\":\"6\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\",\"stroke-miterlimit\":\"10\",\"clip-path\":\"url(#a)\",\"d\":\"M90 76.7V28.3c0-2.7-2.2-5-5-5h-3.4c-2.7 0-5 2.2-5 5v43.4c0 2.7-2.2 5-5 5h-3.4c-2.7 0-5-2.2-5-5V28.3c0-2.7-2.2-5-5-5H55c-2.7 0-5 2.2-5 5v43.4c0 2.7-2.2 5-5 5h-3.4c-2.7 0-5-2.2-5-5V28.3c0-2.7-2.2-5-5-5h-3.4c-2.7 0-5 2.2-5 5v43.4c0 2.7-2.2 5-5 5H15c-2.7 0-5-2.2-5-5V23.3\"}},[_c('animateTransform',{attrs:{\"attributeName\":\"transform\",\"type\":\"translate\",\"repeatCount\":\"indefinite\",\"dur\":\"1.4925373134328357s\",\"values\":\"-20 0;7 0\",\"keyTimes\":\"0;1\"}}),_c('animate',{attrs:{\"attributeName\":\"stroke-dasharray\",\"repeatCount\":\"indefinite\",\"dur\":\"1.4925373134328357s\",\"values\":\"0 72 125 232;0 197 125 233\",\"keyTimes\":\"0;1\"}})])])\n )\n }\n }\n ","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Minimal.vue?vue&type=style&index=1&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-cloud-upload-alt fa-w-20\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"cloud-upload-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 640 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M395.5 267.5l-99-99c-4.7-4.7-12.3-4.7-17 0l-99 99c-7.6 7.6-2.2 20.5 8.5 20.5h67v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-84h67c10.7 0 16.1-12.9 8.5-20.5zm148.2-67.4C539.7 142.1 491.4 96 432 96c-7.6 0-15.1.8-22.4 2.3C377.7 58.3 328.1 32 272 32c-84.6 0-155.5 59.7-172.3 139.8C39.9 196.1 0 254.4 0 320c0 88.4 71.6 160 160 160h336c79.5 0 144-64.5 144-144 0-61.8-39.2-115.8-96.3-135.9zM496 432H160c-61.9 0-112-50.1-112-112 0-56.4 41.7-103.1 96-110.9V208c0-70.7 57.3-128 128-128 53.5 0 99.3 32.8 118.4 79.4 11.2-9.6 25.7-15.4 41.6-15.4 35.3 0 64 28.7 64 64 0 11.8-3.2 22.9-8.8 32.4 2.9-.3 5.9-.4 8.8-.4 53 0 96 43 96 96s-43 96-96 96z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PageTitle.vue?vue&type=style&index=0&id=3b5dde54&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MinimalSection.vue?vue&type=style&index=0&id=59c3b7ad&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-arrow-alt-left fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"arrow-alt-left\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M448 208v96c0 13.3-10.7 24-24 24H224v103.8c0 21.4-25.8 32.1-41 17L7 273c-9.4-9.4-9.4-24.6 0-34L183 63.3c15.1-15.1 41-4.4 41 17V184h200c13.3 0 24 10.7 24 24z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Button.vue?vue&type=style&index=0&id=57605993&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBarSection.vue?vue&type=style&index=0&id=26fe765a&lang=scss&scoped=true&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-expand fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"expand\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M0 180V56c0-13.3 10.7-24 24-24h124c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H64v84c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12zM288 44v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12V56c0-13.3-10.7-24-24-24H300c-6.6 0-12 5.4-12 12zm148 276h-40c-6.6 0-12 5.4-12 12v84h-84c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24V332c0-6.6-5.4-12-12-12zM160 468v-40c0-6.6-5.4-12-12-12H64v-84c0-6.6-5.4-12-12-12H12c-6.6 0-12 5.4-12 12v124c0 13.3 10.7 24 24 24h124c6.6 0 12-5.4 12-12z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SectionContextMenu.vue?vue&type=style&index=0&id=04bcadf7&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-trash-alt fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"trash-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M268 416h24a12 12 0 0012-12V188a12 12 0 00-12-12h-24a12 12 0 00-12 12v216a12 12 0 0012 12zM432 80h-82.41l-34-56.7A48 48 0 00274.41 0H173.59a48 48 0 00-41.16 23.3L98.41 80H16A16 16 0 000 96v16a16 16 0 0016 16h16v336a48 48 0 0048 48h288a48 48 0 0048-48V128h16a16 16 0 0016-16V96a16 16 0 00-16-16zM171.84 50.91A6 6 0 01177 48h94a6 6 0 015.15 2.91L293.61 80H154.39zM368 464H80V128h288zm-212-48h24a12 12 0 0012-12V188a12 12 0 00-12-12h-24a12 12 0 00-12 12v216a12 12 0 0012 12z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AuthButtons.vue?vue&type=style&index=0&id=67393502&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-css3-alt fa-w-12\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fab\",\"data-icon\":\"css3-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 384 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M0 32l34.9 395.8L192 480l157.1-52.2L384 32H0zm313.1 80l-4.8 47.3L193 208.6l-.3.1h111.5l-12.8 146.6-98.2 28.7-98.8-29.2-6.4-73.9h48.9l3.2 38.3 52.6 13.3 54.7-15.4 3.7-61.6-166.3-.5v-.1l-.2.1-3.6-46.3L193.1 162l6.5-2.7H76.7L70.9 112h242.2z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultiTaskingWebComtent.vue?vue&type=style&index=0&id=2a7b9297&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./StatusIndicator.vue?vue&type=style&index=0&id=d1a6f18c&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JsonEditor.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Item.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MinimalHeading.vue?vue&type=style&index=0&id=5f187f16&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-box-open fa-w-20\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"box-open\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 640 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M638.3 143.8L586.8 41c-4-8-12.1-9.5-16.7-8.9L320 64 69.8 32.1c-4.6-.6-12.6.9-16.6 8.9L1.7 143.8c-4.6 9.2.3 20.2 10.1 23L64 181.7V393c0 14.7 10 27.5 24.2 31l216.2 54.1c6 1.5 17.4 3.4 31 0L551.8 424c14.2-3.6 24.2-16.4 24.2-31V181.7l52.1-14.9c9.9-2.8 14.7-13.8 10.2-23zM86 82.6l154.8 19.7-41.2 68.3-138-39.4L86 82.6zm26 112.8l97.8 27.9c8 2.3 15.2-1.8 18.5-7.3L296 103.8v322.7l-184-46V195.4zm416 185.1l-184 46V103.8l67.7 112.3c3.3 5.5 10.6 9.6 18.5 7.3l97.8-27.9v185zm-87.7-209.9l-41.2-68.3L554 82.6l24.3 48.6-138 39.4z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Input.vue?vue&type=style&index=0&id=dd5e343e&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemContextMenu.vue?vue&type=style&index=0&lang=scss&\"","module.exports = {\"pageInfo\":{\"title\":\"Dashy\",\"description\":\"Welcome to your new dashboard!\",\"navLinks\":[{\"title\":\"GitHub\",\"path\":\"https://github.com/Lissy93/dashy\"},{\"title\":\"Documentation\",\"path\":\"https://dashy.to/docs\"}]},\"appConfig\":{\"theme\":\"colorful\"},\"sections\":[{\"name\":\"Getting Started\",\"icon\":\"fas fa-rocket\",\"items\":[{\"title\":\"Dashy Live\",\"description\":\"Development a project management links for Dashy\",\"icon\":\"https://i.ibb.co/qWWpD0v/astro-dab-128.png\",\"url\":\"https://live.dashy.to/\",\"target\":\"newtab\"},{\"title\":\"GitHub\",\"description\":\"Source Code, Issues and Pull Requests\",\"url\":\"https://github.com/lissy93/dashy\",\"icon\":\"favicon\"},{\"title\":\"Docs\",\"description\":\"Configuring & Usage Documentation\",\"provider\":\"Dashy.to\",\"icon\":\"far fa-book\",\"url\":\"https://dashy.to/docs\"},{\"title\":\"Showcase\",\"description\":\"See how others are using Dashy\",\"url\":\"https://github.com/Lissy93/dashy/blob/master/docs/showcase.md\",\"icon\":\"far fa-grin-hearts\"},{\"title\":\"Config Guide\",\"description\":\"See full list of configuration options\",\"url\":\"https://github.com/Lissy93/dashy/blob/master/docs/configuring.md\",\"icon\":\"fas fa-wrench\"},{\"title\":\"Support\",\"description\":\"Get help with Dashy, raise a bug, or get in contact\",\"url\":\"https://github.com/Lissy93/dashy/blob/master/.github/SUPPORT.md\",\"icon\":\"far fa-hands-helping\"}]}]}","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppInfoModal.vue?vue&type=style&index=0&id=774db33a&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-quote-right fa-w-18\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"quote-right\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 576 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M200 32H72C32.3 32 0 64.3 0 104v112c0 39.7 32.3 72 72 72h56v8c0 22.1-17.9 40-40 40h-8c-26.5 0-48 21.5-48 48v48c0 26.5 21.5 48 48 48h8c101.5 0 184-82.5 184-184V104c0-39.7-32.3-72-72-72zm24 264c0 75-61 136-136 136h-8v-48h8c48.5 0 88-39.5 88-88v-56H72c-13.2 0-24-10.8-24-24V104c0-13.2 10.8-24 24-24h128c13.2 0 24 10.8 24 24v192zM504 32H376c-39.7 0-72 32.3-72 72v112c0 39.7 32.3 72 72 72h56v8c0 22.1-17.9 40-40 40h-8c-26.5 0-48 21.5-48 48v48c0 26.5 21.5 48 48 48h8c101.5 0 184-82.5 184-184V104c0-39.7-32.3-72-72-72zm24 264c0 75-61 136-136 136h-8v-48h8c48.5 0 88-39.5 88-88v-56H376c-13.2 0-24-10.8-24-24V104c0-13.2 10.8-24 24-24h128c13.2 0 24 10.8 24 24v192z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-window-close fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"window-close\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h404c3.3 0 6 2.7 6 6v340zM356.5 194.6L295.1 256l61.4 61.4c4.6 4.6 4.6 12.1 0 16.8l-22.3 22.3c-4.6 4.6-12.1 4.6-16.8 0L256 295.1l-61.4 61.4c-4.6 4.6-12.1 4.6-16.8 0l-22.3-22.3c-4.6-4.6-4.6-12.1 0-16.8l61.4-61.4-61.4-61.4c-4.6-4.6-4.6-12.1 0-16.8l22.3-22.3c4.6-4.6 12.1-4.6 16.8 0l61.4 61.4 61.4-61.4c4.6-4.6 12.1-4.6 16.8 0l22.3 22.3c4.7 4.6 4.7 12.1 0 16.8z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-save fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"save\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M433.941 129.941l-83.882-83.882A48 48 0 00316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 00-14.059-33.941zM272 80v80H144V80h128zm122 352H54a6 6 0 01-6-6V86a6 6 0 016-6h42v104c0 13.255 10.745 24 24 24h176c13.255 0 24-10.745 24-24V83.882l78.243 78.243a6 6 0 011.757 4.243V426a6 6 0 01-6 6zM224 232c-48.523 0-88 39.477-88 88s39.477 88 88 88 88-39.477 88-88-39.477-88-88-88zm0 128c-22.056 0-40-17.944-40-40s17.944-40 40-40 40 17.944 40 40-17.944 40-40 40z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-expand-arrows-alt fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"expand-arrows-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M448 344v112a23.94 23.94 0 01-24 24H312c-21.39 0-32.09-25.9-17-41l36.2-36.2L224 295.6 116.77 402.9 153 439c15.09 15.1 4.39 41-17 41H24a23.94 23.94 0 01-24-24V344c0-21.4 25.89-32.1 41-17l36.19 36.2L184.46 256 77.18 148.7 41 185c-15.1 15.1-41 4.4-41-17V56a23.94 23.94 0 0124-24h112c21.39 0 32.09 25.9 17 41l-36.2 36.2L224 216.4l107.23-107.3L295 73c-15.09-15.1-4.39-41 17-41h112a23.94 23.94 0 0124 24v112c0 21.4-25.89 32.1-41 17l-36.19-36.2L263.54 256l107.28 107.3L407 327.1c15.1-15.2 41-4.5 41 16.9z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KeyboardShortcutInfo.vue?vue&type=style&index=0&id=c5f17d9a&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"d\":\"M132.893 310.534l-30.082 10.911L91.9 291.364l30.081-10.911z\"}}),_c('path',{attrs:{\"d\":\"M271.552 301.072l-77.856-46.72-41.616 15.152 10.944 30.064 27.28-9.92 82.144 49.28 97.6-65.072L480 315.088V480H32V347.2l40.8-14.848-10.928-30.048L0 324.8V512h512V292.912l-146.048-54.768z\"}}),_c('path',{attrs:{\"d\":\"M0 0v278.848l66.576-24.224-10.928-30.064L32 233.152V32h448v168.912l-114.048-42.768-94.4 62.928-77.856-46.72-47.84 17.392 10.944 30.064 33.504-12.16 82.144 49.28 97.6-65.072L512 247.088V0z\"}}),_c('path',{attrs:{\"d\":\"M96.656 243.686L85.721 213.63l30.07-10.94 10.935 30.055z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Section.vue?vue&type=style&index=0&id=64cbaaaf&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomCss.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Footer.vue?vue&type=style&index=0&id=d162889c&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Nav.vue?vue&type=style&index=0&id=0cb96044&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigLauncher.vue?vue&type=style&index=0&id=e0bd5110&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Select.vue?vue&type=style&index=1&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditModeTopBanner.vue?vue&type=style&index=0&id=3cb5bf99&scoped=true&lang=scss&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Workspace.vue?vue&type=style&index=0&id=188fee4a&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SaveCancelButtons.vue?vue&type=style&index=0&id=e813bfa0&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-question fa-w-12\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"question\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 384 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M202.021 0C122.202 0 70.503 32.703 29.914 91.026c-7.363 10.58-5.093 25.086 5.178 32.874l43.138 32.709c10.373 7.865 25.132 6.026 33.253-4.148 25.049-31.381 43.63-49.449 82.757-49.449 30.764 0 68.816 19.799 68.816 49.631 0 22.552-18.617 34.134-48.993 51.164-35.423 19.86-82.299 44.576-82.299 106.405V320c0 13.255 10.745 24 24 24h72.471c13.255 0 24-10.745 24-24v-5.773c0-42.86 125.268-44.645 125.268-160.627C377.504 66.256 286.902 0 202.021 0zM192 373.459c-38.196 0-69.271 31.075-69.271 69.271 0 38.195 31.075 69.27 69.271 69.27s69.271-31.075 69.271-69.271-31.075-69.27-69.271-69.27z\"}})])\n )\n }\n }\n ","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Minimal.vue?vue&type=style&index=0&id=31e46608&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Collapsable.vue?vue&type=style&index=0&id=6150e7a7&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Select.vue?vue&type=style&index=0&id=3921c087&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditAppConfig.vue?vue&type=style&index=0&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-pencil-alt fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fal\",\"data-icon\":\"pencil-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M493.255 56.236l-37.49-37.49c-24.993-24.993-65.515-24.994-90.51 0L12.838 371.162.151 485.346c-1.698 15.286 11.22 28.203 26.504 26.504l114.184-12.687 352.417-352.417c24.992-24.994 24.992-65.517-.001-90.51zM164.686 347.313c6.249 6.249 16.379 6.248 22.627 0L368 166.627l30.059 30.059L174 420.745V386h-48v-48H91.255l224.059-224.059L345.373 144 164.686 324.687c-6.249 6.248-6.249 16.378 0 22.626zm-38.539 121.285l-58.995 6.555-30.305-30.305 6.555-58.995L63.255 366H98v48h48v34.745l-19.853 19.853zm344.48-344.48l-49.941 49.941-82.745-82.745 49.941-49.941c12.505-12.505 32.748-12.507 45.255 0l37.49 37.49c12.506 12.506 12.507 32.747 0 45.255z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-memory fa-w-20\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"memory\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 640 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M480 160h-64v128h64V160zm-128 0h-64v128h64V160zm-128 0h-64v128h64V160zm408 0h8V96c0-17.67-14.33-32-32-32H32C14.33 64 0 78.33 0 96v64h8c13.26 0 24 10.74 24 24 0 13.25-10.74 24-24 24H0v240h640V208h-8c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24zm-40 240h-64c0-8.84-7.16-16-16-16s-16 7.16-16 16h-96c0-8.84-7.16-16-16-16s-16 7.16-16 16h-96c0-8.84-7.16-16-16-16s-16 7.16-16 16h-96c0-8.84-7.16-16-16-16s-16 7.16-16 16H48v-48h544v48zm0-275.84c-19.29 12.93-32 34.93-32 59.84s12.71 46.91 32 59.84V320H48v-76.16c19.29-12.93 32-34.93 32-59.84s-12.71-46.91-32-59.84V112h544v12.16z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBar.vue?vue&type=style&index=0&id=5a56ca84&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Radio.vue?vue&type=style&index=0&id=0ff870ef&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-table fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"table\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM224 416H64v-96h160v96zm0-160H64v-96h160v96zm224 160H288v-96h160v96zm0-160H288v-96h160v96z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-file-download fa-w-12\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"file-download\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 384 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M216 236.07c0-6.63-5.37-12-12-12h-24c-6.63 0-12 5.37-12 12v84.01h-48.88c-10.71 0-16.05 12.97-8.45 20.52l72.31 71.77c4.99 4.95 13.04 4.95 18.03 0l72.31-71.77c7.6-7.54 2.26-20.52-8.45-20.52H216v-84.01zM369.83 97.98L285.94 14.1c-9-9-21.2-14.1-33.89-14.1H47.99C21.5.1 0 21.6 0 48.09v415.92C0 490.5 21.5 512 47.99 512h287.94c26.5 0 48.07-21.5 48.07-47.99V131.97c0-12.69-5.17-24.99-14.17-33.99zM255.95 51.99l76.09 76.08h-76.09V51.99zM336 464.01H47.99V48.09h159.97v103.98c0 13.3 10.7 23.99 24 23.99H336v287.95z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditPageInfo.vue?vue&type=style&index=0&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-compress-arrows-alt fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"compress-arrows-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M200 288H88c-21.4 0-32.1 25.8-17 41l32.9 31-99.2 99.3c-6.2 6.2-6.2 16.4 0 22.6l25.4 25.4c6.2 6.2 16.4 6.2 22.6 0L152 408l31.1 33c15.1 15.1 40.9 4.4 40.9-17V312c0-13.3-10.7-24-24-24zm112-64h112c21.4 0 32.1-25.9 17-41l-33-31 99.3-99.3c6.2-6.2 6.2-16.4 0-22.6L481.9 4.7c-6.2-6.2-16.4-6.2-22.6 0L360 104l-31.1-33C313.8 55.9 288 66.6 288 88v112c0 13.3 10.7 24 24 24zm96 136l33-31.1c15.1-15.1 4.4-40.9-17-40.9H312c-13.3 0-24 10.7-24 24v112c0 21.4 25.9 32.1 41 17l31-32.9 99.3 99.3c6.2 6.2 16.4 6.2 22.6 0l25.4-25.4c6.2-6.2 6.2-16.4 0-22.6L408 360zM183 71.1L152 104 52.7 4.7c-6.2-6.2-16.4-6.2-22.6 0L4.7 30.1c-6.2 6.2-6.2 16.4 0 22.6L104 152l-33 31.1C55.9 198.2 66.6 224 88 224h112c13.3 0 24-10.7 24-24V88c0-21.3-25.9-32-41-16.9z\"}})])\n )\n }\n }\n ","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=style&index=0&id=36369dae&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemIcon.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppInfoModal.vue?vue&type=style&index=1&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-level-up fa-w-11\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"level-up\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 352 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M345.04 144l-136-136.901c-9.388-9.465-24.691-9.465-34.079 0L38.96 144c-9.307 9.384-9.277 24.526.069 33.872l22.056 22.056c9.619 9.619 25.301 9.329 34.557-.639L152 138.84V432H68.024a11.996 11.996 0 00-8.485 3.515l-56 56C-4.021 499.074 1.333 512 12.024 512H208c13.255 0 24-10.745 24-24V138.84l56.357 60.448c9.256 9.968 24.938 10.258 34.557.639l22.056-22.056c9.346-9.345 9.377-24.487.07-33.871z\"}})])\n )\n }\n }\n ","module.exports = /(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\u0023-\\u0039]\\ufe0f?\\u20e3|\\u3299|\\u3297|\\u303d|\\u3030|\\u24c2|\\ud83c[\\udd70-\\udd71]|\\ud83c[\\udd7e-\\udd7f]|\\ud83c\\udd8e|\\ud83c[\\udd91-\\udd9a]|\\ud83c[\\udde6-\\uddff]|[\\ud83c[\\ude01-\\ude02]|\\ud83c\\ude1a|\\ud83c\\ude2f|[\\ud83c[\\ude32-\\ude3a]|[\\ud83c[\\ude50-\\ude51]|\\u203c|\\u2049|[\\u25aa-\\u25ab]|\\u25b6|\\u25c0|[\\u25fb-\\u25fe]|\\u00a9|\\u00ae|\\u2122|\\u2139|\\ud83c\\udc04|[\\u2600-\\u26FF]|\\u2b05|\\u2b06|\\u2b07|\\u2b1b|\\u2b1c|\\u2b50|\\u2b55|\\u231a|\\u231b|\\u2328|\\u23cf|[\\u23e9-\\u23f3]|[\\u23f8-\\u23fa]|\\ud83c\\udccf|\\u2934|\\u2935|[\\u2190-\\u21ff])/;\n","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-bars fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"bars\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-plus fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"plus\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-download fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fal\",\"data-icon\":\"download\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M452 432c0 11-9 20-20 20s-20-9-20-20 9-20 20-20 20 9 20 20zm-84-20c-11 0-20 9-20 20s9 20 20 20 20-9 20-20-9-20-20-20zm144-48v104c0 24.3-19.7 44-44 44H44c-24.3 0-44-19.7-44-44V364c0-24.3 19.7-44 44-44h99.4L87 263.6c-25.2-25.2-7.3-68.3 28.3-68.3H168V40c0-22.1 17.9-40 40-40h96c22.1 0 40 17.9 40 40v155.3h52.7c35.6 0 53.4 43.1 28.3 68.3L368.6 320H468c24.3 0 44 19.7 44 44zm-261.7 17.7c3.1 3.1 8.2 3.1 11.3 0L402.3 241c5-5 1.5-13.7-5.7-13.7H312V40c0-4.4-3.6-8-8-8h-96c-4.4 0-8 3.6-8 8v187.3h-84.7c-7.1 0-10.7 8.6-5.7 13.7l140.7 140.7zM480 364c0-6.6-5.4-12-12-12H336.6l-52.3 52.3c-15.6 15.6-41 15.6-56.6 0L175.4 352H44c-6.6 0-12 5.4-12 12v104c0 6.6 5.4 12 12 12h424c6.6 0 12-5.4 12-12V364z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-edit fa-w-18\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"edit\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 576 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M402.3 344.9l32-32c5-5 13.7-1.5 13.7 5.7V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h273.5c7.1 0 10.7 8.6 5.7 13.7l-32 32c-1.5 1.5-3.5 2.3-5.7 2.3H48v352h352V350.5c0-2.1.8-4.1 2.3-5.6zm156.6-201.8L296.3 405.7l-90.4 10c-26.2 2.9-48.5-19.2-45.6-45.6l10-90.4L432.9 17.1c22.9-22.9 59.9-22.9 82.7 0l43.2 43.2c22.9 22.9 22.9 60 .1 82.8zM460.1 174L402 115.9 216.2 301.8l-7.3 65.3 65.3-7.3L460.1 174zm64.8-79.7l-43.2-43.2c-4.1-4.1-10.8-4.1-14.8 0L436 82l58.1 58.1 30.9-30.9c4-4.2 4-10.8-.1-14.9z\"}})])\n )\n }\n }\n ","import { typeOf } from 'remedial';\n\nconst trimWhitespace = (input) => input.split('\\n').map(x => x.trimRight()).join('\\n');\n\nconst throwError = (msg) => {\n throw new Error(`Error in Json to YAML conversion: ${msg}`);\n};\n\n/* A function that converts valid JSON into valid YAML */\nconst stringify = (data) => {\n let indentLevel = '';\n const handlers = {\n undefined() {\n return 'null';\n },\n null() {\n return 'null';\n },\n number(x) {\n return x;\n },\n boolean(x) {\n return x ? 'true' : 'false';\n },\n string(x) {\n return JSON.stringify(x);\n },\n array(x) {\n let output = '';\n if (x.length === 0) {\n output += '[]';\n return output;\n }\n\n indentLevel = indentLevel.replace(/$/, ' ');\n x.forEach((y) => {\n const handler = handlers[typeOf(y)];\n\n if (!handler) throwError(typeOf(y));\n\n output += `\\n${indentLevel}- ${handler(y, true)}`;\n });\n indentLevel = indentLevel.replace(/ {2}/, '');\n\n return output;\n },\n object(x, inArray, rootNode) {\n let output = '';\n\n if (Object.keys(x).length === 0) {\n output += '{}';\n return output;\n }\n\n if (!rootNode) {\n indentLevel = indentLevel.replace(/$/, ' ');\n }\n\n Object.keys(x).forEach((k, i) => {\n const val = x[k];\n const handler = handlers[typeOf(val)];\n\n if (typeof val === 'undefined') {\n return;\n }\n\n if (!handler) throwError(typeOf(val));\n\n if (!(inArray && i === 0)) {\n output += `\\n${indentLevel}`;\n }\n\n output += `${k}: ${handler(val)}`;\n });\n indentLevel = indentLevel.replace(/ {2}/, '');\n\n return output;\n },\n function() {\n return '[object Function]';\n },\n };\n\n return trimWhitespace(`${handlers[typeOf(data)](data, true, true)}\\n`);\n};\n\nexport default stringify;\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Header.vue?vue&type=style&index=0&id=68e7510c&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IframeModal.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SettingsContainer.vue?vue&type=style&index=0&id=37c7f086&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LanguageSwitcher.vue?vue&type=style&index=1&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RebuildApp.vue?vue&type=style&index=0&id=631127b0&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Item.vue?vue&type=style&index=1&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-columns fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"columns\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM224 416H64V160h160v256zm224 0H288V160h160v256z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CloudBackupRestore.vue?vue&type=style&index=0&id=72c986b6&scoped=true&lang=scss&\""],"sourceRoot":""} |