{"version":3,"sources":["utils/index.ts","utils/path/use-path.ts","hooks/use-actions.ts","hooks/use-toggle.ts","hooks/useEventListener.tsx","hooks/use-window-resize.ts","components/navigation/navigation/navigation.module.scss","components/images-icons/icon/icon.tsx","components/overlays/tooltip/tooltip-overlay.tsx","components/overlays/tooltip/tooltip-container.tsx","components/overlays/tooltip/tooltip.tsx","api/search/ingredients.ts","api/track/error.ts","api/index.ts","components/overlays/tooltip/slice.ts","api/post.ts","api/recipe/utils/map-media-src.ts","components/forms/input/input.module.scss","store/layout.ts","store/navigation.ts","components/feedback-indicators/spinner/index.ts","utils/track/index.ts","features/layout/layout.module.scss","components/actions/checkbox/checkbox.module.scss","features/ingredients/convert/convert.module.scss","utils/element/get-element-rect.ts","components/lists-tables/alphabetical-list/alphabetical-list.module.scss","utils/formatting/formatting.module.scss","utils/element/get-scroll-position.ts","utils/array/sort/get-int-array.ts","utils/array/sort/sort-by.ts","features/counter/counterSlice.ts","store/user.ts","store/index.ts","utils/element/get-content-rect.ts","components/structure/preview-recipe/preview-recipe.module.scss","components/forms/select/select.module.scss","components/titles-text/removeable-badge/removeable-badge.module.scss","components/forms/input-with-header/input-with-header.module.scss","utils/math/is-within.ts","utils/element/is-visible.ts","components/overlays/tooltip/tooltip.module.scss","features/showroom/showroom.module.scss","features/layout/topbar.module.scss","utils/json/index.ts","utils/random/number.ts","components/navigation/navigation/context/initial-state.ts","components/navigation/navigation/context/reducer.ts","components/navigation/navigation/context/contexts.ts","components/navigation/navigation/context/provider.tsx","components/navigation/navigation/routes.ts","components/navigation/navigation/components/categories.tsx","components/navigation/navigation/components/link.tsx","components/navigation/navigation/components/content.tsx","components/navigation/navigation/components/container.tsx","components/navigation/navigation/navigation.tsx","components/navigation/navigation/navigation-button.tsx","components/images-icons/logo/logo.svg","components/images-icons/logo/logo.tsx","utils/path/get-path.ts","api/media/index.ts","api/get.ts","features/recipe/slice.ts","features/recipe/components/section.tsx","features/recipe/hooks/use-load-recipe.ts","features/recipe/hooks/use-current-recipe.ts","features/recipe/components/sections.tsx","features/recipe/components/ingredients.tsx","features/recipe/utils/get-ingredients.ts","features/recipe/recipe.tsx","features/recipe/handler.tsx","components/actions/button/button.module.scss","components/titles-text/badge/badge.module.scss","utils/random/string.ts","components/lists-tables/numbered-list/numbered-list.module.scss","components/actions/autocomplete/autocomplete.module.scss","components/actions/checkbox/checkbox.tsx","components/actions/button/button.tsx","components/feedback-indicators/spinner/spinner.tsx","components/forms/select/select.tsx","components/forms/input-with-header/input.tsx","components/actions/autocomplete/actions/generate-display-list.tsx","components/actions/autocomplete/reducer.autocomplete.ts","components/actions/autocomplete/initial-state.autocomplete.ts","components/actions/autocomplete/use-autocomplete-state.ts","components/actions/autocomplete/initializer.autocomplete.ts","components/actions/autocomplete/actions.autocomplete.ts","components/actions/autocomplete/autocomplete.tsx","utils/validate/index.ts","components/forms/input/number-input.tsx","components/forms/input/text-input.tsx","components/forms/input/input.tsx","utils/classNames/index.ts","utils/match/testString.ts","utils/string/capitalize-first-letter.ts","utils/events/debounce.ts","utils/events/throttle.ts","utils/element/get-element-dimensions.ts","utils/element/scroll-to-element.ts","utils/link/link.tsx","utils/local-storage/index.ts","utils/array/filter/filerUnique.ts","utils/promise/delay.ts","components/images-icons/icon/icons.ts","features/recipe/styles/recipe.module.scss","api/recipe/get.ts","api/recipe/search.ts","api/recipe/all.ts","api/recipe/picture.ts","api/ingredient/recipes.ts","components/lists-tables/check-list/check-list.tsx","components/lists-tables/numbered-list/numbered-list.tsx","utils/local-storage/local-storage.ts","components/images-icons/icon/icon.module.scss","api/recipe/index.ts","api/ingredient/index.ts","components/lists-tables/check-list/check-list.module.scss","components/navigation/breadcrumb/breadcrumb.module.scss","components/feedback-indicators/spinner/spinner.module.scss","features/ingredients/fridge/fridge.module.scss","components/feedback-indicators/loading-bar/loading-bar.module.scss","components/design lazy /^/.//.*//show$/ groupOptions: {} namespace object","components lazy /^/.//.*//show$/ groupOptions: {} namespace object","utils/array/extensions.ts","features/showroom/list.ts","features/showroom/rooms.ts","components/behavior/toggle-theme/toggle-theme.tsx","components/structure/preview-recipe/preview-recipe.tsx","hooks/use-in-view.ts","components/lists-tables/alphabetical-list/category-list.tsx","components/lists-tables/alphabetical-list/alphabetical-list.tsx","components/lists-tables/alphabetical-list/helpers/get-keys.ts","components/lists-tables/alphabetical-list/helpers/get-list.ts","features/recipes/recipes.tsx","features/layout/topbar.tsx","features/layout/wrapper.tsx","components/navigation/breadcrumb/breadcrumb.tsx","components/titles-text/badge/badge.tsx","features/ingredients/ingredients.tsx","utils/ingredient/convert.ts","features/ingredients/convert/actions/get-selection-types.ts","features/ingredients/convert/actions/convert-amount.ts","features/ingredients/convert/reducer.convert.ts","features/ingredients/convert/initial-state.convert.ts","features/ingredients/convert/index.tsx","features/ingredients/convert/use-convert-state.ts","features/ingredients/convert/actions.convert.ts","components/titles-text/removeable-badge/removeable-badge.tsx","features/ingredients/fridge/reducer.fridge.ts","features/ingredients/fridge/initial-state.fridge.ts","features/ingredients/fridge/actions/search.ts","features/ingredients/fridge/fridge.tsx","features/ingredients/fridge/use-fridge-state.ts","features/ingredients/fridge/actions.fridge.ts","features/ingredients/route.tsx","utils/formatting/index.tsx","features/misc/cookies/index.tsx","features/misc/privacy/index.tsx","routes.tsx","serviceWorker.ts","features/layout/helper.tsx","components/feedback-indicators/loading-bar/loading-bar.tsx","components/index.tsx","components/feedback-indicators/error-boundary/index.tsx","index.tsx"],"names":["usePath","pathname","useLocation","useMemo","getPath","useActions","actions","dispatch","useDispatch","remapped","Object","entries","forEach","key","value","useToggle","defaultValue","options","timeout","useRef","useState","state","setState","delay","openCallback","closeCallback","open","useCallback","window","clearTimeout","current","close","toggle","delayedClose","setTimeout","listeners","breakpoints","throttle","event","type","target","callback","eventTarget","fromElement","contains","getBreakpoint","width","useWindowSize","innerWidth","height","innerHeight","breakpoint","windowSize","setWindowSize","handleResize","useEffect","addEventListener","removeEventListener","module","exports","Icon","icon","className","icons","path","iconClassName","classNames","style","aria-hidden","focusable","role","xmlns","viewBox","fill","d","getCoordinates","dimensions","position","placement","previousPlacements","indexOf","newPosition","top","left","Math","round","max","TooltipOverlay","content","tooltipRef","tooltipPlacement","tooltipPosition","setTooltipPosition","getElementDimensions","ref","styles","overlay","TooltipContainer","activeTooltips","useSelector","getState","length","map","tooltip","id","Tooltip","children","title","tooltipInitiater","triggerClassName","trigger","generateId","remove","handleEnter","debounce","data","getElementRect","hover","handleLeave","onMouseEnter","onMouseLeave","ingredients","name","getData","url","error","postData","errorMessage","toString","stack","JSON","stringify","getOwnPropertyNames","api","recipe","ingredient","search","track","media","stateScope","initialState","hovered","slice","createSlice","reducers","setHovered","action","push","payload","add","some","filter","timeoutEvent","clearAllTooltips","reducer","reduced","a","formatResult","body","undefined","fetch","process","method","mode","headers","URL","location","href","Validate","store","user","uuid","catch","e","console","log","status","json","response","success","charAt","result","formattedResult","mapMediaSrc","mediaSrc","mediaID","getSrc","mapMultipleMediaSrc","recipes","theme","getReferrer","getFromLocalStorage","hours","Date","getHours","getCurrentTheme","toggleTheme","setFromLocalStorage","getTheme","isNavigationOpen","openNavigation","closeNavigation","toggleNavigation","getNavigationState","useNavigationActions","pluginMap","pdf","qt","realp","wma","dir","fla","java","gears","ag","browserFeatures","plugins","RegExp","test","navigator","userAgent","mimeType","mimeTypes","pluginKey","prototype","hasOwnProperty","call","enabledPlugin","javaEnabled","GearsFactory","showModalDialog","cookieEnabled","cookie","getBrowserFeatures","document","referrer","parent","generateBrowserSpecificId","sha1","platform","str","A","B","C","D","E","argString","rotateLeft","n","s","cvtHex","val","strout","i","H0","H1","H2","H3","H4","wordArray","stringLength","unescape","encodeURIComponent","charCodeAt","W","blockstart","temp","toLowerCase","res","p","plugin","j","mime","ep","item","description","filename","vals","tmp","sort","rdls","getBrowserPlugins","element","containerRect","scrollPosition","getBoundingClientRect","boxTop","boxLeft","getScrollPosition","documentElement","scrollTop","pageYOffset","scrollLeft","pageXOffset","clientTop","clientLeft","getScrollPositionOfElement","getIntArray","array","formattedValue","handleOrdering","b","nullMultiplier","order","Number","isNaN","valueOf","aArray","bArray","index","handleOptions","sortBy","list","sortByKey","keys","reverse","counterSlice","increment","decrement","incrementByAmount","configureStore","counter","counterReducer","navigation","layout","tooltips","getContent","querySelector","Error","getContentRect","orderCoordinates","rect","x1","min","x2","y1","y2","isPartiallyWithin","box","container","allowedDistance","getDistanceBeforePartiallyWithin","abs","rectToRectPoints","isVisible","contentRect","isRectVisible","isVisibleWithDistance","visible","distance","isRectVisibleWithDistance","jsonTryParse","parse","getRandomNumber","ceil","floor","random","currentPath","paths","StateContext","createContext","DispatchContext","Provider","useReducer","routes","activeCondition","Categories","route","active","matchTestString","category","handleHoverCategory","categoryIcon","categoryName","Link","useContext","to","itemName","itemDescription","Content","activeRouteName","Container","setActiveRouteName","find","header","color","shape","categories","Navigation","NavigationButton","button","onClick","Logo","alt","src","logo","split","Boolean","controller","parameters","Array","isArray","innerValue","join","loading","failed","loadRecipe","failedRecipe","uri","addRecipe","formatStep","elements","match","ingredientIdentifiers","identifier","includes","measurementAmount","measurementType","inlineIngredient","Section","steps","getRecipe","get","recipeResponse","loadedState","loadingState","useCurrentRecipe","Sections","sections","section","Ingredients","flatMap","getIngredients","Recipe","itemProp","image","directions","Handler","recipeState","useLoadRecipe","strings","Checkbox","label","checked","CheckboxComponent","checkboxClassName","input","defaultChecked","background","wrapper","Button","forwardRef","center","buttonClassName","Spinner","spinnerClassName","spinner","Select","onChange","addEmptyOption","handleChange","nativeEventTarget","nativeEvent","selectedIndex","text","selectClassName","withLabel","select","InputWithHeader","placeholder","useSpinner","useButton","onClickButton","htmlRestProps","withSpinner","withButton","handleButtonClick","highlightDifference","markType","re","replace","separator","GenerateDisplayItem","handleId","display","generateDisplayList","valueTest","filteredList","isLoading","isInitiated","lastWrittenValue","isDropdownOpen","displayList","currentActiveItem","selectedItemId","selectedItem","clearOnSelect","inFocus","useAutocompleteState","initializer","setValue","setCurrentActiveItem","moveActiveItemUp","moveActiveItemDown","setFocus","setBlur","setList","updateDisplayList","Autocomplete","handleSearch","handleLoadedSearch","handleSetActiveItem","currentIndex","containerClassName","onFocus","onBlur","onKeyDown","preventDefault","stopPropagation","onMouseDown","numericRegexTyping","decimalRegexTyping","convertNumberFromLocale","number","parseFloat","NumberInput","maxLength","toLocaleString","maximumFractionDigits","convertDecimalToLocale","found","convertValueToType","TextInput","Input","hasOwn","classes","arg","argType","inner","testString","expressions","expression","capitalizeFirstLetter","string","toUpperCase","inDebounce","args","lastRan","lastFunc","now","scrollToElement","delayed","props","filterUnique","self","ms","Promise","resolve","searchParameters","all","picture","ingredientList","CheckedList","checkbox","NumberedList","listClassName","localStorage","setItem","webpackAsyncContext","req","__webpack_require__","o","then","code","ids","this","design","forms","overlays","formatName","getRooms","component","lazy","ToggleTheme","PreviewRecipe","controls","useAnimation","listenOnExit","usePreload","inView","setInView","preload","setPreload","blockListener","setCurrentState","visibility","handleScroll","useInView","start","motion","div","animate","initial","variants","opacity","y","hidden","transition","ease","duration","link","CategoryList","categoryKeys","getCurrentCategory","currentActiveKey","setCurrentActiveKey","currentKey","handleClick","findIndex","AlphabeticalList","categoryRefs","getKeys","components","getList","refs","el","categoryKey","Recipes","setRecipes","loadedRecipes","load","Topbar","wrapperClassName","topbar","topbarStyles","menuIcon","Wrapper","innerContent","Breadcrumb","base","breadcrumbs","Badge","badgeClassName","badge","setIngredients","loadedIngredients","recipeList","recipeCount","breadcrumb","conversionTypes","volume","mass","temperature","getUnitType","convertUnitType","amount","fromType","toType","unit","unitType","convertFromUnitType","convertToUnitType","getSelectionTypes","categoryType","categoryList","selectedType","firstSelectedType","secondSelectedType","convertAmount","firstSelectedValue","secondSelectedValue","selected","tempState","updateValues","categoryTypes","generateInitialState","Convert","setCategoryType","setFirstSelectionType","setSecondSelectionType","setFirstSelectionValue","setSecondSelectionValue","useConvertState","fromTo","convertionItem","equal","RemoveableBadge","asPartOfList","partOfList","buttonTooltip","includedIngredients","excludedIngredients","searchedIngredients","Fridge","dispatchedActions","startLoading","includeIngredient","excludeIngredient","toggleIngredient","removeIngredient","includeIngredients","useFridgeState","IngredientRoute","Bolder","bolder","Spacer","spacer","Cookies","Privacy","Component","reloaded","getComponent","Routes","exact","hostname","LayoutHelper","classList","navigationStyles","LoadingBar","bar","ComponentHelper","ErrorBoundary","hasError","errorInfo","require","ReactDOM","render","getElementById","serviceWorker","ready","registration","unregister","message"],"mappings":"0FAAA,6/B,uMCKaA,EAAU,WAA4B,IACvCC,EAAaC,cAAbD,SAER,OAAOE,mBAAQ,kBAAMC,YAAQH,KAAW,CAACA,K,eCLhCI,EAAa,SACtBC,GAEA,IAAMC,EAAWC,cAYjB,OAVeL,mBAAQ,WACnB,IAAMM,EAAgB,GAMtB,OAJAC,OAAOC,QAAQL,GAASM,SAAQ,YAAwC,IAAD,mBAArCC,EAAqC,KAAhCC,EAAgC,KACnEL,EAASI,GAAO,kBAAYN,EAASO,SAGlCL,IACR,CAACH,K,OCGKS,EAAwB,SAACC,EAAcC,GAChD,IAAMC,EAAUC,mBAD4C,EAElCC,mBAAkBJ,GAFgB,mBAErDK,EAFqD,KAE9CC,EAF8C,OAIAnB,mBACxD,+BACIoB,MAAO,KACJN,KAEP,CAACA,IALGM,EAJoD,EAIpDA,MAAOC,EAJ6C,EAI7CA,aAAcC,EAJ+B,EAI/BA,cAQvBC,EAAOC,uBAAY,WACrBC,OAAOC,aAAaX,EAAQY,SAC5BR,GAAS,GAEmB,oBAAjBE,GACPA,MAEL,CAACA,IAEEO,EAAQJ,uBAAY,WACtBL,GAAS,GAEoB,oBAAlBG,GACPA,MAEL,CAACA,IAEEO,EAASL,uBAAY,WACnBN,EAAOU,IACNL,MACN,CAACL,IAEEY,EAAeN,uBAAY,WAC7BT,EAAQY,QAAUF,OAAOM,WAAWH,EAAOR,KAC5C,CAACQ,EAAOR,IAEX,MAAO,CAAEF,QAAOK,OAAMK,QAAOC,SAAQC,eAAcX,a,OCtCjDa,EAAwB,GCTxBC,GDWcC,oBAAS,SAACC,GAAgB,IAAD,EAEnCC,EAAOD,EAAMC,KAEdJ,EAAUI,KAGf,UAAAJ,EAAUI,UAAV,SAAiB3B,SAAQ,YAA2B,IAAxB4B,EAAuB,EAAvBA,OAAQC,EAAe,EAAfA,SAC1BC,EACO,eAATH,EAAwBD,EAAMK,YAAcL,EAAME,QAGlDA,EAAOV,UAAYY,GACT,eAATH,GAA0BG,EAAYE,SAASJ,EAAOV,WAK3DW,EAASF,EAAMC,SAEpB,KC7BK,KAFFJ,EAGE,IAHFA,EAIE,IAJFA,EAKE,KALFA,EAMG,KAGHS,EAAgB,SAACC,GACnB,OAAIA,EAAQV,EAAuB,KAC1BU,EAAQV,EAAuB,KAC/BU,EAAQV,EAAuB,KAC/BU,EAAQV,EAAuB,KAC/BU,EAAQV,EAAwB,KAElC,OAGJ,SAASW,IAAiC,IAAD,EACR3B,mBAAyB,CACzD0B,MAAOlB,OAAOoB,WACdC,OAAQrB,OAAOsB,YACfC,WAAYN,EAAcjB,OAAOoB,cAJO,mBACrCI,EADqC,KACzBC,EADyB,KAOtCC,EAAejB,oBAAS,WAC1BgB,EAAc,CACVP,MAAOlB,OAAOoB,WACdC,OAAQrB,OAAOsB,YACfC,WAAYN,EAAcjB,OAAOoB,gBAEtC,KAQH,OANAO,qBAAU,WAGN,OAFA3B,OAAO4B,iBAAiB,SAAUF,GAE3B,kBAAY1B,OAAO6B,oBAAoB,SAAUH,MACzD,IAEIF,I,gBCjDXM,EAAOC,QAAU,CAAC,aAAe,iCAAiC,SAAW,6BAA6B,gBAAkB,oCAAoC,UAAY,8BAA8B,OAAS,2BAA2B,WAAa,+BAA+B,QAAU,4BAA4B,QAAU,4BAA4B,SAAW,6BAA6B,aAAe,iCAAiC,KAAO,yBAAyB,OAAS,2BAA2B,OAAS,2BAA2B,KAAO,2B,4HCShiBC,EAAO,SAAC,GAAgC,IAA9BC,EAA6B,EAA7BA,KAAMC,EAAuB,EAAvBA,UAAuB,EAClBC,IAAMF,GADY,mBACzCf,EADyC,KAClCG,EADkC,KAC1Be,EAD0B,KAE1CC,EAAgBC,qBAAWC,IAAMN,KAAMC,GAE7C,OACI,qBACIA,UAAWG,EACXG,cAAY,OACZC,UAAU,QACVC,KAAK,MACLC,MAAM,6BACNC,QAAO,cAAS1B,EAAT,YAAkBG,GAN7B,SAQI,sBAAMwB,KAAK,eAAeC,EAAGV,Q,gOCAzC,SAASW,EACLC,EACAC,EACAC,GAEgB,IADhBC,EACe,uDADsC,GAkBrD,OAdID,KAE8C,IAAvCC,EAAmBC,QAAQ,OACf,OAC6B,IAAzCD,EAAmBC,QAAQ,SACf,SAC4B,IAAxCD,EAAmBC,QAAQ,QACf,QAC8B,IAA1CD,EAAmBC,QAAQ,UACf,SAEA,QAInB,IAAK,MACL,QACI,IAAMC,EAA+B,CACjCC,IAAKL,EAASK,IAAMN,EAAW3B,OAlC/B,EAmCAkC,KAAMC,KAAKC,MACPR,EAASM,MAAQN,EAAS/B,MAAQ8B,EAAW9B,OAAS,GAE1DgC,UAAW,OAGf,OACIG,EAAYC,IAAM,IACqB,IAAvCH,EAAmBC,QAAQ,OAEpBL,EAAeC,EAAYC,EAAU,KAAvB,sBACdE,GADc,CAEjB,SAIDE,EAEX,IAAK,SACD,IAAMA,EAA+B,CACjCC,IAAKL,EAASK,IAAML,EAAS5B,OAvD7B,EAwDAkC,KAAMC,KAAKC,MACPR,EAASM,MAAQN,EAAS/B,MAAQ8B,EAAW9B,OAAS,GAE1DgC,UAAW,UAKf,OAAOG,EAEX,IAAK,QACD,IAAMA,EAA+B,CACjCC,IAAKE,KAAKE,IACN,EACAF,KAAKC,MACDR,EAASK,KAAOL,EAAS5B,OAAS2B,EAAW3B,QAAU,IAG/DkC,KAAMN,EAASM,KAAON,EAAS/B,MA1E/B,EA2EAgC,UAAW,SAGf,OACIG,EAAYE,KAAO,IACsB,IAAzCJ,EAAmBC,QAAQ,SAEpBL,EAAeC,EAAYC,EAAU,KAAvB,sBACdE,GADc,CAEjB,WAIDE,EAEX,IAAK,OACD,IAAMA,EAA+B,CACjCC,IAAKE,KAAKE,IACN,EACAF,KAAKC,MACDR,EAASK,KAAOL,EAAS5B,OAAS2B,EAAW3B,QAAU,IAG/DkC,KAAMN,EAASM,KAAOP,EAAW9B,MAlGjC,EAmGAgC,UAAW,QAGf,OACIG,EAAYE,KAAO,IACoB,IAAvCJ,EAAmBC,QAAQ,OAEpBL,EAAeC,EAAYC,EAAU,KAAvB,sBACdE,GADc,CAEjB,SAIDE,GAKZ,IAAMM,EAAiB,SAAC,GAIP,IAHpBC,EAGmB,EAHnBA,QACAX,EAEmB,EAFnBA,SACAC,EACmB,EADnBA,UAEMW,EAAatE,iBAAuB,MADvB,EAKfC,mBAAmC,IALpB,0BAGFsE,EAHE,EAGbZ,UAAgCa,EAHnB,6BAIfC,EAJe,KAenB,OARArC,qBAAU,WACN,GAAIkC,EAAW3D,QAAS,CACpB,IAAM8C,EAAaiB,+BAAqBJ,EAAW3D,SAEnD8D,EAAmBjB,EAAeC,EAAYC,EAAUC,OAE7D,CAACW,EAAYD,EAASX,EAAUC,IAG/B,qBACIgB,IAAKL,EACLtB,MAAOwB,EACP7B,UAAWI,qBACP6B,IAAOC,QACPN,GAAoBK,IAAOL,IALnC,SAQKF,KC3JAS,EAAmB,WAAO,IAC3BC,EAAmBC,YAAYC,KAA/BF,eAER,OAAI,OAACA,QAAD,IAACA,OAAD,EAACA,EAAgBG,QAGjB,mCACKH,EAAeI,KAAI,SAACC,GAAD,OAChB,cAAC,EAAD,eAAqCA,GAAhBA,EAAQC,SALL,MCY3BC,EAAuC,SAAC,GAMpC,IALbC,EAKY,EALZA,SACA5C,EAIY,EAJZA,UACA6C,EAGY,EAHZA,MAGY,IAFZ7B,iBAEY,MAFA,MAEA,MADZvD,aACY,MADJ,GACI,EACNiF,EAAKrF,iBAAe,IACpByF,EAAmBzF,iBAAuB,MAC1CZ,EAAWC,cACXqG,EAAmB3C,qBAAW6B,IAAOe,QAAShD,GAEpDP,qBAAU,WAGN,OAFAiD,EAAG1E,QAAUiF,uBAEN,WACHxG,EAASyG,YAAOR,EAAG1E,aAExB,IAEH,IAAMmF,EAActF,sBAChBuF,oBAAS,WACL,GAAIN,EAAiB9E,QAAS,CAC1B,IAAMqF,EAAO,CACTX,GAAIA,EAAG1E,QACP+C,SAAUuC,yBAAeR,EAAiB9E,SAC1C0D,QAASmB,EACT7B,aAGJvE,EAAS8G,YAAMF,EAAM5F,OAE1B,KACH,CAACiF,EAAG1E,QAAS8E,EAAiB9E,UAG5BwF,EAAc3F,sBAChBuF,oBAAS,kBAAM3G,EAASyG,YAAOR,EAAG1E,YAAW,KAC7C,CAAC0E,EAAG1E,UAGR,OACI,qBACIgC,UAAW+C,EACXf,IAAKc,EACLW,aAAcN,EACdO,aAAcF,EAJlB,SAMKZ,M,kNCjEN,SAASe,EAAYC,GACxB,OAAOC,YAAuB,CAC1BC,IAAK,qBACLT,KAAM,CAAEO,U,YCJT,SAASG,EAAMA,GAClB,OAAOC,YAAgB,CACnBF,IAAK,cACLT,KAAM,CACFY,aAAcF,EAAMG,WACpBC,MAAOC,KAAKC,UAAUN,EAAOnH,OAAO0H,oBAAoBP,O,ICDvDQ,EAAM,CACfC,SACAC,aACAC,SACAC,QACAC,M,qOCPSC,EAAa,WAwBpBC,EAA+B,CACjC1C,eAAgB,GAChB2C,QAAS,IAGAC,EAAQC,YAAY,CAC7BrB,KAAMiB,EACNC,eACAI,SAAU,CACNC,WAAY,SAAC5H,EAAO6H,GAChB7H,EAAMwH,QAAQM,KAAKD,EAAOE,UAE9BC,IAAK,SAAChI,EAAO6H,GAEL7H,EAAMwH,QAAQS,MACV,SAAC/C,GAAD,OAAaA,EAAQC,KAAO0C,EAAOE,QAAQ5C,QAG/CnF,EAAMwH,QAAUxH,EAAMwH,QAAQU,QAC1B,SAAChD,GAAD,OAAaA,EAAQC,KAAO0C,EAAOE,QAAQ5C,MAG/CnF,EAAM6E,eAAeiD,KAAKD,EAAOE,WAGzCpC,OAAQ,SAAC3F,EAAO6H,GAAiD,IACrDE,EAAYF,EAAZE,QAEFP,EAAUxH,EAAMwH,QAAQU,QAC1B,SAAChD,GAAD,OAAaA,EAAQC,KAAO4C,KAG5BP,IACAA,EAAQjI,SAAQ,SAACiI,GAAD,OACZhH,aAAagH,EAAQW,iBAEzBnI,EAAMwH,QAAUxH,EAAMwH,QAAQU,QAC1B,SAAChD,GAAD,OAAaA,EAAQC,KAAO4C,MAIpC/H,EAAM6E,eAAiB7E,EAAM6E,eAAeqD,QACxC,SAAChD,GAAD,OAAaA,EAAQC,KAAO4C,MAGpCK,iBAAkB,WACd,OAAOb,MAKJc,EAAqBZ,EAArBY,QAASpJ,EAAYwI,EAAZxI,QAET+I,EAAkC/I,EAAlC+I,IAAKrC,EAA6B1G,EAA7B0G,OAAQyC,EAAqBnJ,EAArBmJ,iBAEfrD,EAAW,SAAC/E,GAAD,OAAsCA,EAAK,UAEtDsI,EAAO,eAAMhB,EAAae,GAE1BrC,EAAQ,SAACF,EAAgB5F,GAAjB,OAA6C,SAC9DhB,GAEA,IAAMiJ,EAAe5H,OAAOM,YAAW,WACnC3B,EAAS8I,EAAIlC,MACd5F,GAEHhB,EAASD,EAAQ2I,WAAW,CAAEzC,GAAIW,EAAKX,GAAIgD,qB,wGCjFxC,SAAe1B,EAAtB,kC,4CAAO,+CAAA8B,EAAA,6DACHhC,EADG,EACHA,IACAT,EAFG,EAEHA,KACA0C,EAHG,EAGHA,aAOMC,EACO,OAAT3C,QAA0B4C,IAAT5C,EAAqBe,KAAKC,UAAUhB,QAAQ4C,EAX9D,SAaoBC,MAAM,GAAD,OAAIC,OAAJ,YAAqCrC,GAAO,CACpEsC,OAAQ,OACRC,KAAM,OAGNC,QAAS,CACL,eAAgB,mBAEhB,kBAAsB,OAAJN,QAAI,IAAJA,GAAA,UAAAA,EAAMzD,cAAN,eAAc2B,aAAc,IAG9CqC,IAAKzI,OAAO0I,SAASC,KACrBC,SAAUC,IAAMrE,WAAWsE,KAAKC,MAIpCb,SACDc,OAAM,SAACC,GAIN,OAHAC,QAAQC,IAAIF,GACZC,QAAQC,IAAI,qBAAkBnD,EAAM,kCAE7B,CACHoD,OAAQ,IACRC,KAAM,iBApCX,UAaGC,EAbH,OA8CGF,EAASE,EAASF,SAClBG,EAA0C,MAAhCH,EAAOhD,WAAWoD,OAAO,IA/CtC,yCAkDyBF,QAlDzB,IAkDyBA,OAlDzB,EAkDyBA,EAAUD,OAlDnC,eAkDOI,EAlDP,OAoDOC,EACsB,oBAAjBzB,EAA8BA,EAAawB,GAAUA,EArDjE,kBAuDQ,CACHL,OAAQA,EACRG,UACAE,OAAQC,IA1Db,iCA8DI,CACHN,OAAQA,EACRG,YAhED,6C,qICVA,SAASI,EAAsCjD,GAKlD,OAJKA,EAAOkD,UAAYlD,EAAOmD,UAC3BnD,EAAOkD,SAAWE,iBAAOpD,EAAOmD,UAG7BnD,EAGJ,SAASqD,EACZC,GAEA,OAAOA,EAAQtF,IAAIiF,K,iBCbvB7H,EAAOC,QAAU,CAAC,MAAQ,qBAAqB,UAAY,yBAAyB,YAAc,2BAA2B,WAAa,0BAA0B,UAAY,yBAAyB,MAAQ,qBAAqB,QAAU,uBAAuB,OAAS,wB,qKCQnQgF,EAAgC,SA0BvCC,EAAwB,CAC1BiD,MAXoB,WACpB,IAAMA,GAVNC,cAEOC,8BAAsCpD,EAAY,UAUzD,GAAc,SAAVkD,EAAkB,OAAOA,EAE7B,IAAMG,GAAQ,IAAIC,MAAOC,WAEzB,OAAOF,EAAQ,IAAMA,EAAQ,EAAI,OAAS,QAInCG,IAGErD,EAAQC,YAAY,CAC7BrB,KAAMiB,EACNC,eACAI,SAAU,CACNoD,YAAa,SAAC/K,GAtBU,IAACwK,EAuBrBxK,EAAMwK,MAAwB,UAAhBxK,EAAMwK,MAAoB,OAAS,QAvB5BA,EAwBGxK,EAAMwK,MAvBtCQ,8BAAoB1D,EAAYkD,OA4BrBnC,EAAqBZ,EAArBY,QAEA0C,EAFqBtD,EAAZxI,QAET8L,YAEFE,EAAW,SAACjL,GAAD,OACpBA,EAAK,OAAawK,OAETlC,EAAO,eAAMhB,EAAae,I,gKCrD1Bf,EAAa,aAUbG,EAAQC,YAAY,CAC7BrB,KAAMiB,EACNC,aAN8B,CAC9B2D,kBAAkB,GAMlBvD,SAAU,CACNwD,eAAgB,SAACnL,GACbA,EAAMkL,kBAAmB,GAE7BE,gBAAiB,SAACpL,GACdA,EAAMkL,kBAAmB,GAE7BG,iBAAkB,SAACrL,GACfA,EAAMkL,kBAAoBlL,EAAMkL,qBAK7B7C,EAAqBZ,EAArBY,QAASpJ,EAAYwI,EAAZxI,QAIXqM,GAFsCrM,EAApCkM,eAAoClM,EAApBmM,gBAEG,SAACpL,GAAD,OAC9BA,EAAK,aAEIsI,EAAO,eAAMhB,EAAae,GAE1BkD,EAAuB,kBAG/BvM,YAAiCC,K,8BC1CtC,kD,6BCAA,wEAAMuM,EAiBF,CAEAC,IAAK,kBAGLC,GAAI,kBACJC,MAAO,8BACPC,IAAK,yBAGLC,IAAK,yBACLC,IAAK,gCAGLC,KAAM,wBACNC,MAAO,4BACPC,GAAI,6BASFC,EA4FN,WACI,IAAMA,EAAgD,CAAEC,QAAS,IAGjE,IAAK,IAAIC,OAAO,QAAQC,KAAKC,UAAUC,WAAY,CAG3C,IAAIC,EADR,GAAIF,UAAUG,WAAaH,UAAUG,UAAUzH,OAG3C,IAAK,IAAM0H,KAAalB,EAEhBnM,OAAOsN,UAAUC,eAAeC,KAAKrB,EAAWkB,KAGhDF,EAAWF,UAAUG,UAAUjB,EAAUkB,IAEzCR,EAAgBQ,MACZF,IAAYA,EAASM,iBAShC,IAAIV,OAAO,2BAA2BC,KAAKC,UAAUC,YACZ,oBAAlCD,WAAkBS,aACO,qBAA1BT,UAAUS,aACjBT,UAAUS,gBAEVb,EAAgBH,MAAO,GAIiB,qBAAhCxL,QAAeyM,eACvBd,EAAgBF,OAAQ,GAImB,sBAAnCzL,QAAe0M,iBACY,qBAA5BX,UAAUY,cAEjBhB,EAAgBiB,OAASb,UAAUY,cAGnChB,EAAgBiB,QAAS,EAcjC,OAAOjB,EAxJakB,GAEjB,SAAS3C,IAAuB,IAAD,cAClC,OACU,QAAN,EAAAlK,cAAA,mBAAQsD,WAAR,mBAAawJ,gBAAb,eAAuBC,YAAvB,UACA/M,cADA,iBACA,EAAQgN,cADR,iBACA,EAAgBF,gBADhB,aACA,EAA0BC,YAD1B,UAEAD,gBAFA,aAEA,EAAUC,WACV,GAcD,SAASE,IACZ,OAAOC,GACFnB,UAAUC,WAAa,KACnBD,UAAUoB,UAAY,IACvB7G,KAAKC,UAAUoF,IACrBzE,MAAM,EAAG,GAiIf,SAASgG,EAAKE,GAOV,IAqBIC,EACAC,EACAC,EACAC,EACAC,EAuIaC,EAhKXC,EAAa,SAAUC,EAAWC,GACpC,OAAQD,GAAKC,EAAMD,IAAO,GAAKC,GAG7BC,EAAS,SAAUC,GAGrB,IAFA,IAAIC,EAAS,GAEJC,EAAI,EAAGA,GAAK,EAAGA,IAAK,CAGzBD,IAFWD,IAAa,EAAJE,EAAU,IAElB7H,SAAS,IAGzB,OAAO4H,GAGPE,EAAK,WACLC,EAAK,WACLC,EAAK,WACLC,EAAK,UACLC,EAAK,WAOHC,EAAY,GAqIDb,EAnICN,EAIlB,IAFA,IAAMoB,GAFNpB,EAoIOqB,SAASzO,OAAO0O,mBAAmBhB,KAlIjBjJ,OAEhBwJ,EAAI,EAAGA,EAAIO,EAAe,EAAGP,GAAK,EACvCM,EAAUhH,KACL6F,EAAIuB,WAAWV,IAAM,GACjBb,EAAIuB,WAAWV,EAAI,IAAM,GACzBb,EAAIuB,WAAWV,EAAI,IAAM,EAC1Bb,EAAIuB,WAAWV,EAAI,IAI/B,OAAuB,EAAfO,GACJ,KAAK,EACDD,EAAUhH,KAAK,YACf,MACJ,KAAK,EACDgH,EAAUhH,KACL6F,EAAIuB,WAAWH,EAAe,IAAM,GAAM,SAE/C,MACJ,KAAK,EACDD,EAAUhH,KACL6F,EAAIuB,WAAWH,EAAe,IAAM,GAChCpB,EAAIuB,WAAWH,EAAe,IAAM,GACrC,OAER,MACJ,KAAK,EACDD,EAAUhH,KACL6F,EAAIuB,WAAWH,EAAe,IAAM,GAChCpB,EAAIuB,WAAWH,EAAe,IAAM,GACpCpB,EAAIuB,WAAWH,EAAe,IAAM,EACrC,KAKhB,KAAmC,MAAR,GAAnBD,EAAU9J,SACd8J,EAAUhH,KAAK,GAGnBgH,EAAUhH,KAAKiH,IAAiB,IAChCD,EAAUhH,KAAMiH,GAAgB,EAAK,YAIrC,IAFA,IAAMI,EAAc,GAEXC,EAAa,EAAGA,EAAaN,EAAU9J,OAAQoK,GAAc,GAAI,CACtE,IAAK,IAAIZ,EAAI,EAAGA,EAAI,GAAIA,IACpBW,EAAEX,GAAKM,EAAUM,EAAaZ,GAGlC,IAAK,IAAIA,EAAI,GAAIA,GAAK,GAAIA,IACtBW,EAAEX,GAAKN,EAAWiB,EAAEX,EAAI,GAAKW,EAAEX,EAAI,GAAKW,EAAEX,EAAI,IAAMW,EAAEX,EAAI,IAAK,GAGnEZ,EAAIa,EACJZ,EAAIa,EACJZ,EAAIa,EACJZ,EAAIa,EACJZ,EAAIa,EAEJ,IAAK,IAAIL,EAAI,EAAGA,GAAK,GAAIA,IAAK,CAC1B,IAAMa,EACDnB,EAAWN,EAAG,IACTC,EAAIC,GAAOD,EAAIE,GACjBC,EACAmB,EAAEX,GACF,WACJ,WAEJR,EAAID,EACJA,EAAID,EACJA,EAAII,EAAWL,EAAG,IAClBA,EAAID,EACJA,EAAIyB,EAGR,IAAK,IAAIb,EAAI,GAAIA,GAAK,GAAIA,IAAK,CAC3B,IAAMa,EACDnB,EAAWN,EAAG,IAAMC,EAAIC,EAAIC,GAAKC,EAAImB,EAAEX,GAAK,WAC7C,WAEJR,EAAID,EACJA,EAAID,EACJA,EAAII,EAAWL,EAAG,IAClBA,EAAID,EACJA,EAAIyB,EAGR,IAAK,IAAIb,EAAI,GAAIA,GAAK,GAAIA,IAAK,CAC3B,IAAMa,EACDnB,EAAWN,EAAG,IACTC,EAAIC,EAAMD,EAAIE,EAAMD,EAAIC,GAC1BC,EACAmB,EAAEX,GACF,WACJ,WAEJR,EAAID,EACJA,EAAID,EACJA,EAAII,EAAWL,EAAG,IAClBA,EAAID,EACJA,EAAIyB,EAGR,IAAK,IAAIb,EAAI,GAAIA,GAAK,GAAIA,IAAK,CAC3B,IAAMa,EACDnB,EAAWN,EAAG,IAAMC,EAAIC,EAAIC,GAAKC,EAAImB,EAAEX,GAAK,WAC7C,WAEJR,EAAID,EACJA,EAAID,EACJA,EAAII,EAAWL,EAAG,IAClBA,EAAID,EACJA,EAAIyB,EAGRZ,EAAMA,EAAKb,EAAK,WAChBc,EAAMA,EAAKb,EAAK,WAChBc,EAAMA,EAAKb,EAAK,WAChBc,EAAMA,EAAKb,EAAK,WAChBc,EAAMA,EAAKb,EAAK,WAKpB,OAFaK,EAAOI,GAAMJ,EAAOK,GAAML,EAAOM,GAAMN,EAAOO,GAAMP,EAAOQ,IAE5DS,cArOhB7F,QAAQC,IAAI7C,KAAKC,UAlDS,WACtB,IAeMyI,EAAoB,GAE1B,IAAKjD,YAAcA,UAAUH,QACzB,OAAOoD,EAGX,IAAK,IAAMC,KAAKlD,UAAUH,QAGtB,IAFA,IAAMsD,EAASnD,UAAUH,QAAQqD,GAExBE,EAAI,EAAGA,EAAID,EAAOzK,OAAQ0K,IAAK,CACpC,IAAMC,EAAOF,EAAOC,GAEpB,GAAKC,EAAL,CAIA,IAAMC,EAAKD,EAAK7C,cAEhB,GAAI8C,EAAI,CACJ,IAAMC,EAAmB,CACrBF,KAAMA,EAAKzO,KACXmF,KAAMuJ,EAAGvJ,KACTyJ,YAAaF,EAAGE,YAChBC,SAAUH,EAAGG,UAGjBR,EAAIzH,KAAK+H,KAKrB,OA9Ca,SAAUG,GAInB,IAHA,IAAMT,EAAM,GACZU,EAAMD,EAAKE,OAEF1B,EAAI,EAAGA,EAAIyB,EAAIjL,OAAQwJ,IAG5B,IAFAe,EAAIzH,KAAKmI,EAAIzB,IAEN3H,KAAKC,UAAUmJ,EAAIzB,KAAO3H,KAAKC,UAAUmJ,EAAIzB,EAAI,KACpDA,IAIR,OAAOe,EAkCJY,CAAKZ,GAGWa,M,iBCnI3B/N,EAAOC,QAAU,CAAC,QAAU,wBAAwB,QAAU,wBAAwB,QAAU,wBAAwB,aAAe,6BAA6B,OAAS,uBAAuB,QAAU,0B,iBCA9MD,EAAOC,QAAU,CAAC,UAAY,4BAA4B,MAAQ,wBAAwB,KAAO,uBAAuB,QAAU,0BAA0B,WAAa,6BAA6B,QAAU,0BAA0B,MAAQ,0B,gBCAlPD,EAAOC,QAAU,CAAC,UAAY,2BAA2B,OAAS,wBAAwB,eAAiB,gCAAgC,MAAQ,uBAAuB,MAAQ,yB,6BCDlL,8CAGO,SAASyD,EACZsK,EACAC,GACM,IAQFC,EARC,EAMDF,EAAQG,wBAJHC,EAFJ,EAED5M,IACM6M,EAHL,EAGD5M,KACArC,EAJC,EAIDA,MACAG,EALC,EAKDA,OAiBJ,OAXI2O,EADAD,EACiB,CACbzM,KAAMyM,EAAczM,IACpBC,MAAOwM,EAAcxM,MAGR6M,cAMd,CAAE9M,IAHGE,KAAKC,MAAMyM,EAASF,EAAe1M,KAGjCC,KAFDC,KAAKC,MAAM0M,EAAUH,EAAezM,MAE7BrC,MAAOsC,KAAKC,MAAMvC,GAAQG,OAAQmC,KAAKC,MAAMpC,M,oBC3BrES,EAAOC,QAAU,CAAC,WAAa,sCAAsC,OAAS,kCAAkC,SAAW,oCAAoC,YAAc,uCAAuC,KAAO,kC,gBCA3ND,EAAOC,QAAU,CAAC,OAAS,2BAA2B,OAAS,2BAA2B,OAAS,6B,8BCE5F,SAASqO,IAAgC,IAAD,EACTtD,SAA1B5E,EADmC,EACnCA,KAAMmI,EAD6B,EAC7BA,gBAERC,EACFtQ,OAAOuQ,aAAeF,EAAgBC,WAAapI,EAAKoI,UACtDE,EACFxQ,OAAOyQ,aAAeJ,EAAgBG,YAActI,EAAKsI,WAEvDE,EAAYL,EAAgBK,WAAaxI,EAAKwI,WAAa,EAC3DC,EAAaN,EAAgBM,YAAczI,EAAKyI,YAAc,EAEpE,MAAO,CACHrN,IAAKE,KAAKC,MAAM6M,EAAYI,GAC5BnN,KAAMC,KAAKC,MAAM+M,EAAaG,IAI/B,SAASC,EAA2Bd,GAA8B,IAC7DQ,EAAyDR,EAAzDQ,UAAWE,EAA8CV,EAA9CU,WADiD,EACHV,EAAlCY,iBADqC,MACzB,EADyB,IACHZ,EAAnBa,kBADsB,MACT,EADS,EAGpE,MAAO,CACHrN,IAAKE,KAAKC,MAAM6M,EAAYI,GAC5BnN,KAAMC,KAAKC,MAAM+M,EAAaG,IAvBtC,qE,sHCFO,SAASE,EAAY3R,GAMxB,IALA,IAAM4R,EAAQ,GAERC,EAAiB7R,EAAM6P,cACvBtK,EAASsM,EAAetM,OAErBwJ,EAAI,EAAGA,EAAIxJ,EAAQwJ,IACxB,OAAQ8C,EAAepC,WAAWV,IAC9B,KAAK,IACD6C,EAAMvJ,KAAK,KACX,MACJ,KAAK,IACDuJ,EAAMvJ,KAAK,KACX,MACJ,KAAK,IACDuJ,EAAMvJ,KAAK,KACX,MACJ,QACIuJ,EAAMvJ,KAAKwJ,EAAepC,WAAWV,IAKjD,OAAO6C,ECpBJ,IAAME,EAAiB,SAC1BhJ,EACAiJ,EACA5R,GAEA,IAAM6R,EAAoC,wBAAZ,OAAP7R,QAAO,IAAPA,OAAA,EAAAA,EAAS8R,QAAkC,EAAI,EAEtE,GAAU,OAANnJ,GAAoB,OAANiJ,EACd,OAAU,OAANjJ,GAAoB,OAANiJ,EAAmB,GAClB,OAANjJ,EAAa,GAAK,GAAKkJ,EAGxC,GACkB,kBAANlJ,GAAkBoJ,OAAOC,MAAMrJ,IACzB,kBAANiJ,GAAkBG,OAAOC,MAAMJ,GAEvC,MACiB,kBAANjJ,GACPoJ,OAAOC,MAAMrJ,IACA,kBAANiJ,GACPG,OAAOC,MAAMJ,GAEN,GAGW,kBAANjJ,GAAkBoJ,OAAOC,MAAMrJ,GAAK,GAAK,GACjDkJ,EAIZ,GAAIlJ,aAAaqC,MAAQ4G,aAAa5G,KAClC,OAAOrC,EAAEsJ,UAAYL,EAAEK,UACpB,GAAiB,kBAANtJ,GAA+B,kBAANiJ,EACvC,OAAOjJ,EAAIiJ,EACR,IACW,kBAANjJ,GAA+B,kBAANA,KACnB,kBAANiJ,GAA+B,kBAANA,GAMjC,IAJA,IAAMM,EAASV,EAAY7I,EAAE5B,YACvBoL,EAASX,EAAYI,EAAE7K,YACvB3B,EAAS8M,EAAO9M,OAEbgN,EAAQ,EAAGA,EAAQhN,EAAQgN,IAChC,GAAIF,EAAOE,KAAWD,EAAOC,GACzB,OAAOF,EAAOE,GAASD,EAAOC,GAK1C,OAAO,GAGEC,EAAgB,SACzBjI,EACApK,GAEA,OAAc,OAAPA,QAAO,IAAPA,OAAA,EAAAA,EAAS8R,QAA2B,cAAlB9R,EAAQ8R,OACjB,EAAV1H,EACAA,GAGGkI,EAAS,SAAIC,EAAWvS,GACjC,OAAOuS,EAAKjC,MAAK,SAAC3H,EAAMiJ,GAAP,OACbS,EAAcV,EAAehJ,EAAGiJ,EAAG5R,GAAUA,OAIxCwS,EAAY,SACrBD,EACA3S,EACAI,GAEA,IADM,EACAyS,GAAuB,kBAAR7S,EAAmB,CAACA,GAA3B,YAAsCA,IAAM8S,UADpD,cAGYD,GAHZ,yBAGK7S,EAHL,QAIF2S,EAAKjC,MAAK,SAAC3H,EAAMiJ,GAAP,OACNS,EAAcV,EAAc,OAAChJ,QAAD,IAACA,OAAD,EAACA,EAAI/I,GAAL,OAAWgS,QAAX,IAAWA,OAAX,EAAWA,EAAIhS,GAAMI,GAAUA,OAFnE,2BAAyB,IAHnB,8BASN,OAAOuS,I,oFCxEEI,EAAe7K,YAAY,CACpCrB,KAAM,UACNkB,aANgC,CAChC9H,MAAO,GAMPkI,SAAU,CACN6K,UAAW,SAACxS,GAKRA,EAAMP,OAAS,GAEnBgT,UAAW,SAACzS,GACRA,EAAMP,OAAS,GAGnBiT,kBAAmB,SAAC1S,EAAO6H,GACvB7H,EAAMP,OAASoI,EAAOE,Y,EAIyBwK,EAAatT,QAiBzDsT,G,EAjBAC,U,EAAWC,U,EAAWC,kBAiBtBH,EAAf,S,uBC5CajL,EAAa,OAMpBC,EAAsB,CACxB+B,KAAMkE,eAGG/F,EAAQC,YAAY,CAC7BrB,KAAMiB,EACNC,eACAI,SAAU,KAGCU,EAAqBZ,EAArBY,QAIFC,GAJuBb,EAAZxI,QAIJ,eAAMqI,EAAae,I,wBChB1Be,EAAQuJ,YAAe,CAChCtK,QAAQ,6DACJuK,QAASC,GACNxJ,GACAyJ,KACAC,KACAxI,KACAyI,Q,8BCfX,gFAGO,SAASC,IACZ,IAAM9O,EAAUkJ,SAAS5E,KAAKyK,cAAc,YAE5C,IAAK/O,EACD,MAAMgP,MAAM,cAGhB,OAAOhP,EAGJ,SAASiP,IACZ,IAAMjP,EAAU8O,IAD0B,EAGL9O,EAAQqM,wBAArC3M,EAHkC,EAGlCA,IAAKC,EAH6B,EAG7BA,KAAMrC,EAHuB,EAGvBA,MAAOG,EAHgB,EAGhBA,OAHgB,EAKGuP,YACzChN,GADS0M,EAL6B,EAKlChN,IAAsBkN,EALY,EAKlBjN,KAIxB,MAAO,CACHD,IAAKE,KAAKC,MAAMH,GAChBC,KAAMC,KAAKC,MAAMF,GACjBrC,MAAOsC,KAAKC,MAAMvC,GAClBG,OAAQmC,KAAKC,MAAMpC,GACnBiP,UAAW9M,KAAKC,MAAM6M,GACtBE,WAAYhN,KAAKC,MAAM+M,M,mBC3B/B1O,EAAOC,QAAU,CAAC,UAAY,kCAAkC,QAAU,gCAAgC,KAAO,6BAA6B,QAAU,gCAAgC,MAAQ,8BAA8B,MAAQ,8BAA8B,UAAU,gCAAgC,WAAW,iCAAiC,KAAO,+B,gBCAjWD,EAAOC,QAAU,CAAC,MAAQ,sBAAsB,UAAY,0BAA0B,UAAY,0BAA0B,OAAS,uBAAuB,KAAO,uB,gBCAnKD,EAAOC,QAAU,CAAC,KAAO,+BAA+B,MAAQ,gCAAgC,WAAa,qCAAqC,OAAS,iCAAiC,cAAgB,0C,gBCA5MD,EAAOC,QAAU,CAAC,UAAY,qCAAqC,YAAc,uCAAuC,WAAa,sCAAsC,QAAU,mCAAmC,OAAS,oC,4HCU3N+Q,EAAmB,SAACC,GAAD,MAAmC,CACxDC,GAAIxP,KAAKyP,IAAIF,EAAKC,GAAID,EAAKG,IAC3BC,GAAI3P,KAAKyP,IAAIF,EAAKI,GAAIJ,EAAKK,IAC3BF,GAAI1P,KAAKE,IAAIqP,EAAKC,GAAID,EAAKG,IAC3BE,GAAI5P,KAAKE,IAAIqP,EAAKI,GAAIJ,EAAKK,MAGlBC,EAA6B,SACtCC,EACAC,GAEE,IADFC,EACC,uDADiB,EAKlB,OAHAF,EAAMR,EAAiBQ,GACvBC,EAAYT,EAAiBS,KAEzBD,EAAIF,GAAKG,EAAUJ,GAAKK,OACxBF,EAAIH,GAAKI,EAAUH,GAAKI,OACxBF,EAAIJ,GAAKK,EAAUP,GAAKQ,MACxBF,EAAIN,GAAKO,EAAUL,GAAKM,MAiBnBC,EAA8C,SACvDH,EACAC,GAEE,IADFC,EACC,uDADiB,EAKlB,OAHAF,EAAMR,EAAiBQ,GACvBC,EAAYT,EAAiBS,GAEzBD,EAAIF,GAAKG,EAAUJ,GAAKK,EACjBhQ,KAAKkQ,IAAIH,EAAUJ,GAAKK,EAAkBF,EAAIF,IACrDE,EAAIH,GAAKI,EAAUH,GAAKI,EACjBhQ,KAAKkQ,IAAIH,EAAUH,GAAKI,EAAkBF,EAAIH,IAIlD,GAGEQ,EAAmB,SAACZ,GAAD,MAA6B,CACzDC,GAAID,EAAKxP,KACT4P,GAAIJ,EAAKzP,IACT4P,GAAIH,EAAK7R,MAAQ6R,EAAKxP,KACtB6P,GAAIL,EAAK1R,OAAS0R,EAAKzP,MCjCdsQ,EAAY,SACrB9D,EACA1L,GACW,IAAD,IACJyP,EAAchB,cAGpB,OAjCyB,SACzBE,EACAc,GAEA,IAAMP,EAAMK,EAAiBZ,GACvBQ,EAAYI,EAAiBE,GAEnC,OAAOR,EAAkBC,EAAKC,GA0BvBO,CAFMtO,YAAesK,EAAS+D,GAEjB,YAAC,eACdA,GADa,IAEhBvQ,IAAG,iBAAEc,QAAF,IAAEA,OAAF,EAAEA,EAASd,WAAX,QAAkB,EACrBC,KAAI,iBAAEa,QAAF,IAAEA,OAAF,EAAEA,EAASb,YAAX,QAAmB,MAIlBwQ,EAAwB,SACjCjE,EACA1L,GAC0C,IAAD,IACnCyP,EAAchB,cAGpB,OArCqC,SACrCE,EACAc,GAEA,IAAMP,EAAMK,EAAiBZ,GACvBQ,EAAYI,EAAiBE,GAEnC,OAAIR,EAAkBC,EAAKC,GAChB,CAAES,SAAS,EAAMC,SAAU,GAE/B,CACHD,SAAS,EACTC,SAAUR,EAAiCH,EAAKC,IAyB7CW,CAFM1O,YAAesK,EAAS+D,GAEL,YAAC,eAC1BA,GADyB,IAE5BvQ,IAAG,iBAAEc,QAAF,IAAEA,OAAF,EAAEA,EAASd,WAAX,QAAkB,EACrBC,KAAI,iBAAEa,QAAF,IAAEA,OAAF,EAAEA,EAASb,YAAX,QAAmB,O,kBC1D/BzB,EAAOC,QAAU,CAAC,QAAU,yBAAyB,QAAU,yBAAyB,IAAM,qBAAqB,UAAU,yBAAyB,OAAS,wBAAwB,KAAO,sBAAsB,MAAQ,uBAAuB,WAAW,0BAA0B,KAAO,wB,mBCA/RD,EAAOC,QAAU,CAAC,QAAU,0BAA0B,OAAS,yBAAyB,QAAU,0BAA0B,QAAU,4B,iBCAtID,EAAOC,QAAU,CAAC,QAAU,wBAAwB,SAAW,yBAAyB,KAAO,qBAAqB,QAAU,wBAAwB,OAAS,uBAAuB,YAAc,8B,+BCDpM,kCAAO,IAAMoS,EAAe,SAAIjV,GAC5B,IAAKA,EACD,OAAO,KAGX,IACI,OAAOoH,KAAK8N,MAAMlV,GACpB,MAAO+J,GACL,OAAO,Q,6BCRR,SAASoL,EAAgBpB,EAAavP,GAIzC,OAHAuP,EAAMzP,KAAK8Q,KAAKrB,GAChBvP,EAAMF,KAAK+Q,MAAM7Q,GAEVF,KAAK+Q,MAAM/Q,KAAKgR,UAAY9Q,EAAMuP,EAAM,IAAMA,EAJzD,mC,0HCEajM,EAAuB,CAChCyN,YAAa,GACbrS,KAAM,CAAEsS,MAAO,GAAIrW,SAAU,KCFpByJ,EAAoB,SAACrI,EAAO6H,GACrC,OAAQA,EAAO3G,MACX,IAAK,YAGL,IAAK,aACD,OAAO,2BAAKlB,GAAZ,IAAmBgV,YAAanN,EAAOE,UAE3C,IAAK,UACD,OAAO,2BAAK/H,GAAZ,IAAmB2C,KAAMkF,EAAOE,UAEpC,QACI,MAAM,IAAIoL,MAAJ,iCAAoCtL,MCVzCqN,EAAeC,wBAAsB5N,GACrC6N,EAAkBD,yBAAyB,kBAAM,Q,uBCGvD,SAASE,EAAT,GAA4C,IAAxBhQ,EAAuB,EAAvBA,SACjB1C,EAAOhE,cADiC,EAGpB2W,qBAAWjN,EAAD,YAAC,eAC9Bd,GAD6B,IAEhC5E,KAAM5D,iBALoC,mBAGvCiB,EAHuC,KAGhCd,EAHgC,KAY9C,OAJAgD,qBAAU,WACNhD,EAAS,CAAEgC,KAAM,UAAW6G,QAASpF,MACtC,CAACA,IAGA,cAACuS,EAAaG,SAAd,CAAuB5V,MAAOO,EAA9B,SACI,cAACoV,EAAgBC,SAAjB,CAA0B5V,MAAOP,EAAjC,SACKmG,M,4DCrBJkQ,EAAuB,CAChC,CACIlP,KAAM,UACN1D,KAAM,GACNH,KAAM,OACNgT,gBAAiB,GACjBrD,KAAM,CACF,CACI9L,KAAM,UACN1D,KAAM,GACN6S,gBAAiB,CAAC,QAClB1F,YAAa,2CAIzB,CACIzJ,KAAM,aACN1D,KAAM,GACNH,KAAM,OACNgT,gBAAiB,CAAC,qBAClBrD,KAAM,CACF,CACI9L,KAAM,kBACN1D,KAAM,aACN6S,gBAAiB,CAAC,kBAClB1F,YAAa,4BAEjB,CACIzJ,KAAM,mBACN1D,KAAM,qBACN6S,gBAAiB,CAAC,2BAClB1F,YAAa,kCAEjB,CACIzJ,KAAM,aACN1D,KAAM,wBACN6S,gBAAiB,CAAC,mCAClB1F,YAAa,oCAIzB,CACIzJ,KAAM,eACN1D,KAAM,GACNH,KAAM,WACNgT,gBAAiB,CAAC,uBAClBrD,KAAM,CACF,CACI9L,KAAM,oBACN1D,KAAM,eACN6S,gBAAiB,CAAC,oBAClB1F,YAAa,4BAEjB,CACIzJ,KAAM,YACN1D,KAAM,yBACN6S,gBAAiB,CAAC,+BAClB1F,YAAa,4BAEjB,CACIzJ,KAAM,uBACN1D,KAAM,2BACN6S,gBAAiB,CACb,4BACA,+BAEJ1F,YAAa,+B,mBC7DhB2F,EAAa,SACtBC,GAGE,IACM9W,EAAaD,cAAbC,SAEF+W,EAASC,0BAAgBhX,EAAD,CAC1B8W,EAAMF,iBADoB,mBAEvBE,EAAMvD,KAAKlN,KAAI,SAAC4K,GAAD,OAAUA,EAAK2F,sBAG/B/S,EAAYI,qBAAW6B,IAAOmR,SAAR,eACvBnR,IAAOiR,OAASA,IAGrB,OACI,qBACIlT,UAAWA,EACXyD,aAAc,kBAAMwP,EAAMI,oBAAoBJ,EAAMrP,OAFxD,UAII,cAAC,IAAD,CAAM5D,UAAWiC,IAAOqR,aAAcvT,KAAMkT,EAAMlT,OAClD,qBAAKC,UAAWiC,IAAOsR,aAAvB,SAAsCN,EAAMrP,WCtB3C4P,EAAO,SAAC,GAKE,IAJnB5P,EAIkB,EAJlBA,KACAyJ,EAGkB,EAHlBA,YACA0F,EAEkB,EAFlBA,gBACA7S,EACkB,EADlBA,KAGY/D,EACRsX,qBAAWhB,GADXvS,KAAQ/D,SAGN+W,EAASC,0BAAgBhX,EAAU4W,GAEnC/S,EAAYI,qBAAW6B,IAAOmL,KAAR,eACvBnL,IAAOiR,OAASA,IAGrB,OACI,oBAAelT,UAAWA,EAA1B,SACI,eAAC,IAAD,CAAY0T,GAAE,WAAMxT,GAApB,UACI,qBAAKF,UAAWiC,IAAO0R,SAAvB,SAAkC/P,IAClC,qBAAK5D,UAAWiC,IAAO2R,gBAAvB,SAAyCvG,QAHxCzJ,IClBJiQ,EAAU,SAACZ,GACpB,IAAMnB,EAAUmB,EAAMa,kBAAoBb,EAAMrP,KAE1C5D,EAAYI,qBAAW6B,IAAOP,QAAR,eACvBO,IAAO6P,QAAUA,IAGtB,OACI,oBAAI9R,UAAWA,EAAf,SACKiT,EAAMvD,KAAKlN,KAAI,SAAC4K,GAAD,OACZ,cAAC,EAAD,CAEIxJ,KAAMwJ,EAAKxJ,KACXyJ,YAAaD,EAAKC,YAClB0F,gBAAiB3F,EAAK2F,gBACtB7S,KAAMkN,EAAKlN,MAJNkN,EAAKlN,YCNjB6T,EAA+B,WAAO,IACvC5X,EAAaD,cAAbC,SACAkD,EAAeJ,cAAfI,WAFsC,EAIFyJ,cAApCJ,EAJsC,EAItCA,eAAgBC,EAJsB,EAItBA,gBAJsB,EAMf1L,aAAU,EAAO,CAC5CQ,MAAO,IACPC,aAAcgL,EACd/K,cAAegL,IAHX/K,EANsC,EAMtCA,KAAMO,EANgC,EAMhCA,aANgC,EAWAb,mBAAiB,WAXjB,mBAWvCwW,EAXuC,KAWtBE,EAXsB,KAa9CvU,qBAAU,WAAO,IAAD,EACNyT,EAAM,UAAGJ,EAAOmB,MAAK,SAAChB,GAAD,OACvBE,0BAAgBhX,EAAD,CACX8W,EAAMF,iBADK,mBAERE,EAAMvD,KAAKlN,KAAI,SAAC4K,GAAD,OAAUA,EAAK2F,gCAH7B,aAAG,EAKZnP,KAEHoQ,EAAmBd,GAAU,WAC7BvK,MACD,CAACxM,IAEJ,IAAMkX,EAAsB,SAACzP,GACzBoQ,EAAmBpQ,IAGvB,OACI,sBACI5D,UAAWiC,IAAOoP,UAClB5N,aAAc7F,EACd8F,aACmB,OAAfrE,GAAsC,OAAfA,EACjBlB,OACA8H,EANd,UASI,qBAAKjG,UAAWiC,IAAOiS,OAAvB,SACI,cAAC,IAAD,CAAMR,GAAG,IAAT,SACI,cAAC,IAAD,CAAMS,MAAM,QAAQC,MAAM,mBAGlC,oBAAIpU,UAAWiC,IAAOoS,WAAtB,SACKvB,EAAOtQ,KAAI,SAACyQ,GAAD,OACR,cAAC,EAAD,2BAEQA,GAFR,IAGII,oBAAqBA,IAFhBJ,EAAMrP,WAMtBkP,EAAOtQ,KAAI,SAACyQ,GAAD,OACR,cAAC,EAAD,2BAEQA,GAFR,IAGIa,gBAAiBA,IAFZb,EAAMrP,aC9DlB0Q,EAAgC,WACzC,OACI,cAAC1B,EAAD,UACI,cAAC,EAAD,OCFC2B,EAAsC,WAAO,IAAD,EAKjDzL,cADAF,GAJiD,EAEjDF,eAFiD,EAGjDC,gBAHiD,EAIjDC,kBAGJ,OACI,wBAAQ5I,UAAWiC,IAAOuS,OAAQC,QAAS7L,EAA3C,SACI,cAAC,IAAD,CAAM7I,KAAK,a,0ECdR,G,KAAA,IAA0B,kC,OCU5B2U,EAAO,SAAC,GAAwC,IAAtCP,EAAqC,EAArCA,MAAOC,EAA8B,EAA9BA,MAAOpU,EAAuB,EAAvBA,UAC3Bc,EAAa,CACf9B,MAAiB,eAAVoV,EAAyB,IAAM,IACtCjV,OAAkB,eAAViV,EAAyB,GAAK,IAG1C,OACI,6CACIO,IAAI,OACJ3U,UAAWA,GACPc,GAHR,IAII8T,IAAG,UAAKC,EAAL,YAAaT,EAAM,IAAnB,OAAkC,UAAVD,EAAoB,IAAM,S,6BCnBjE,kCAAO,IAAM7X,EAAU,WAEI,IADvBH,EACsB,uDADH2B,OAAO0I,SAASrK,SAE7BqW,EAAK,OAAGrW,QAAH,IAAGA,OAAH,EAAGA,EAAU2Y,MAAM,KAAKrP,OAAOsP,SACpCC,EAAU,OAAGxC,QAAH,IAAGA,OAAH,EAAGA,EAAQ,GAErBtS,EAA4B,CAC9BsS,QACArW,WACA6Y,cAGJ,OAAO9U,I,6BCdX,8CAAO,IAAM0H,EAAS,SAACD,GACnB,MAAM,GAAN,OAAUxB,OAAV,kBAAiDwB,K,2GCY9C,SAAe9D,EAAtB,kC,4CAAO,6CAAAiC,EAAA,6DACHhC,EADG,EACHA,IACAT,EAFG,EAEHA,KACA0C,EAHG,EAGHA,aAMMkP,EACO,OAAT5R,QAA0B4C,IAAT5C,EAAjB,WACUzG,OAAOC,QAAQwG,GACdb,KAAI,YAAmB,IAAD,mBAAhBzF,EAAgB,KAAXC,EAAW,KACnB,QAAciJ,IAAVjJ,EAEJ,OAAIkY,MAAMC,QAAQnY,GACPA,EACFwF,KAAI,SAAC4S,GAAD,gBAAmBrY,EAAnB,YAA0BqY,MAC9BC,KAAK,KAGR,GAAN,OAAUtY,EAAV,YAAiBC,MAEpByI,OAAOsP,SACPM,KAAK,MACV,GAzBP,SA2BoBnP,MAAM,GAAD,OACrBC,OADqB,YACYrC,GADZ,OACkBmR,GAC1C,CACI7O,OAAQ,MACRC,KAAM,OAGNC,QAAS,CAMLC,IAAKzI,OAAO0I,SAASC,KACrBC,SAAUC,IAAMrE,WAAWsE,KAAKC,QAK1CC,OAAM,SAACC,GAML,OALAC,QAAQC,IAAIF,GACZC,QAAQC,IAAI,qBAAkBnD,EAAM,kCAI7B,CACHoD,OAAQ,IACRC,KAAM,iBAtDX,UA2BGC,EA3BH,OAgEGF,EAASE,EAASF,SAClBG,EAA0C,MAAhCH,EAAOhD,WAAWoD,OAAO,IAjEtC,yCAoEyBF,QApEzB,IAoEyBA,OApEzB,EAoEyBA,EAAUD,OApEnC,eAoEOI,EApEP,OAsEOC,EACsB,oBAAjBzB,EAA8BA,EAAawB,GAAUA,EAvEjE,kBAyEQ,CACHL,OAAQA,EACRG,UACAE,OAAQC,IA5Eb,iCAgFI,CACHN,OAAQA,EACRG,YAlFD,6C,iJCTMxC,EAAa,SAgBbG,EAAQC,YAAY,CAC7BrB,KAAMiB,EACNC,aAR+B,CAC/BwQ,QAAS,GACTC,OAAQ,GACRzN,QAAS,IAMT5C,SAAU,CACNsQ,WAAY,SAACjY,EAAO6H,GAChB7H,EAAM+X,QAAQjQ,KAAKD,EAAOE,UAE9BmQ,aAAc,SAAClY,EAAO6H,GAClB7H,EAAM+X,QAAU/X,EAAM+X,QAAQ7P,QAC1B,SAACiQ,GAAD,OAASA,IAAQtQ,EAAOE,WAE5B/H,EAAMgY,OAAOlQ,KAAKD,EAAOE,UAE7BqQ,UAAW,SAACpY,EAAO6H,GACf7H,EAAM+X,QAAU/X,EAAM+X,QAAQ7P,QAC1B,SAACiQ,GAAD,OAASA,IAAQtQ,EAAOE,QAAQoQ,OAEpCnY,EAAMuK,QAAQ1C,EAAOE,QAAQoQ,KAAOtQ,EAAOE,YAKxCM,EAAqBZ,EAArBY,QAASpJ,EAAYwI,EAAZxI,QAETmZ,EAAwCnZ,EAAxCmZ,UAAWH,EAA6BhZ,EAA7BgZ,WAAYC,EAAiBjZ,EAAjBiZ,aAEzBnT,EAAW,SAAC/E,GAAD,OAAoCA,EAAK,QAEpDsI,EAAO,eAAMhB,EAAae,G,yCC3CjCgQ,EAAa,SAAC,GAA0D,IAAxDvI,EAAuD,EAAvDA,YAAa1J,EAA0C,EAA1CA,YACzBkS,EAAWxI,EAAYyI,MAAM,uBAAyB,GACtDC,EAAwBpS,EAAYnB,KACtC,gBAAGwT,EAAH,EAAGA,WAAH,iBAAwBA,EAAxB,QAwBJ,OArBgBH,EAASrT,KAAI,SAACoL,GAC1B,IAAKmI,EAAsBE,SAASrI,GAChC,OAAOA,EAF2B,MAUlCjK,EAAYsQ,MACZ,gBAAG+B,EAAH,EAAGA,WAAH,MAAoB,WAAIA,EAAJ,OAAsBpI,KAL1CoI,EANkC,EAMlCA,WACApS,EAPkC,EAOlCA,KACAsS,EARkC,EAQlCA,kBACAC,EATkC,EASlCA,gBAKJ,OACI,uBAAuBnW,UAAWiC,IAAOmU,iBAAzC,UACKF,EADL,IACyBC,EADzB,IAC2CvS,IADhCoS,OAShB,SAASK,EAAT,GAAoD,IAAjCxT,EAAgC,EAAhCA,MAAOyT,EAAyB,EAAzBA,MACvB5G,EAAI,OAAG4G,QAAH,IAAGA,OAAH,EAAGA,EAAO9T,IAAIoT,GAExB,OACI,gCACI,6BAAK/S,IACL,cAAC,IAAD,CAAc6M,KAAMA,MAFd7M,G,mEClCZ0T,EAAS,uCAAG,WAAO9Z,EAAeiZ,GAAtB,eAAA5P,EAAA,6DACdrJ,EAAS+Y,EAAWE,IADN,SAGenR,IAAIC,OAAOgS,IAAId,GAH9B,QAGRe,EAHQ,QAKKpP,QACf5K,EAASkZ,EAAUc,EAAelP,SAElC9K,EAASgZ,EAAaC,IARZ,2CAAH,wDAYFgB,EAAc,SACdC,EAAe,UCbrB,SAASC,IAAmC,IAAD,EAG1C1a,cADUwZ,EAFgC,cAE1ClD,MAF0C,MAS9C,OAFInQ,YAAYC,GADZwF,QAAY4N,GCPb,SAASmB,IAAY,IAChBC,EAAaF,IAAbE,SAER,OACI,0CACKA,QADL,IACKA,OADL,EACKA,EAAUtU,KAAI,SAACuU,EAASxH,GAAV,OACX,cAAC8G,EAAD,eAAyBU,GAAXxH,Q,oBCJvB,SAASyH,IACZ,IAIMtH,ECToB,SAAClL,GAAD,OAC1BA,EAAOsS,SAASG,SAAQ,qBAAGX,MACjBW,SAAQ,qBAAGtT,kBDKDuT,CAFLN,KAIUpU,KACrB,gBAAGoB,EAAH,EAAGA,KAAMsS,EAAT,EAASA,kBAAmBC,EAA5B,EAA4BA,gBAAiBrS,EAA7C,EAA6CA,IAA7C,OACI,qCACKoS,EADL,IACyBC,EAAiB,IACtC,cAAC,OAAD,CACIzC,GAAE,wBAAmB5P,GACrBjB,MAAK,iCAA4Be,GAFrC,SAIKA,UAMjB,OAAO,cAAC,IAAD,CAAa8L,KAAMA,IEpBvB,SAASyH,IACZ,IAAM3S,EAASoS,IAEf,OACI,qCACI,oBAAIQ,SAAS,OAAOpX,UAAWiC,IAAO2B,KAAtC,SACKY,EAAO3B,QAEZ,oBAAIuU,SAAS,cAAcpX,UAAWiC,IAAOoL,YAA7C,SACK7I,EAAO6I,cAEX7I,EAAOkD,UACJ,qBAAK1H,UAAWiC,IAAOoV,MAAvB,SACI,qBAAK1C,IAAKnQ,EAAO3B,MAAO+R,IAAKpQ,EAAOkD,aAG5C,uBACA,sBAAK1H,UAAWiC,IAAOoP,UAAvB,UACI,sBAAKrR,UAAWiC,IAAOqV,WAAvB,UACI,iDACA,cAACT,EAAD,OAEJ,sBAAK7W,UAAWiC,IAAO0B,YAAvB,UACI,8CACA,cAACqT,EAAD,aCzBb,SAASO,IACZ,IAAMC,ENkBH,WACH,IAAM/a,EAAWC,cADuB,EAKpCR,cADUwZ,EAJ0B,cAIpClD,MAJoC,QAWpCnQ,YAAYC,GAHZgT,EARoC,EAQpCA,QACAC,EAToC,EASpCA,OAIJ,OAbwC,EAUpCzN,QAAY4N,GAGGgB,GAEdhB,GAAOH,EAAOU,SAASP,GAnBL,UAqBlBJ,EAAQW,SAASP,IAClBa,EAAU9Z,EAAUiZ,GAGjBiB,GMvCac,GAEpB,OAAID,IAAgBb,EAAqB,+CACrCa,IAAgBd,EAAoB,cAACS,EAAD,IAEjC,8C,iBCTXvX,EAAOC,QAAU,CAAC,OAAS,uBAAuB,OAAS,uBAAuB,QAAU,wBAAwB,QAAU,wBAAwB,KAAO,uB,gBCA7JD,EAAOC,QAAU,CAAC,MAAQ,qBAAqB,QAAU,uBAAuB,QAAU,uBAAuB,MAAQ,qBAAqB,KAAO,oBAAoB,OAAS,sBAAsB,KAAO,sB,6BCD/M,4CAEa6X,EAAU,CACnB,8RACA,wHACA,sIACA,2PACA,0MACA,2FACA,yMACA,sFACA,iDACA,2BACA,iEACA,wMACA,+MACA,8FACA,+FACA,0BACA,uBACA,2LACA,mGACA,2KACA,wC,qBCtBJ9X,EAAOC,QAAU,CAAC,KAAO,4BAA4B,KAAO,8B,qBCA5DD,EAAOC,QAAU,CAAC,UAAY,gCAAgC,OAAS,+B,iICS1D8X,EAAW,SAAC,GAAqC,IAAnCC,EAAkC,EAAlCA,MAAO5X,EAA2B,EAA3BA,UAA2B,EACtB/C,aAAU,GAA9B4a,EAD0C,EACjDta,MAAgBW,EADiC,EACjCA,OAElB4Z,EAAoB,SAAC,GAA2C,IAAzC9X,EAAwC,EAAxCA,UACnB+X,EAAoB3X,qBAAW6B,IAAOoP,UAAWrR,EAAnB,eAC/BiC,IAAO4V,QAAUA,IAGtB,OACI,sBAAK7X,UAAW+X,EAAmBtD,QAASvW,EAA5C,UACI,uBACIO,KAAK,WACLuB,UAAWiC,IAAO+V,MAClBC,eAAgBJ,IAEpB,qBAAK7X,UAAWiC,IAAOiW,aACvB,cAAC,IAAD,CAAMnY,KAAK,QAAQC,UAAWiC,IAAOlC,WAKjD,OAAK6X,EAKD,sBAAK5X,UAAWI,qBAAW6B,IAAOkW,QAASnY,GAA3C,UACI,cAAC8X,EAAD,IACA,qBAAK9X,UAAWiC,IAAO2V,MAAOnD,QAASvW,EAAvC,SACK0Z,OAPF,cAACE,EAAD,CAAmB9X,UAAWA,M,gHCpBhCoY,EAASC,sBAClB,WASIrW,GACE,IAREY,EAQH,EARGA,SACA5C,EAOH,EAPGA,UAOH,IANGvB,YAMH,MANU,UAMV,EALG6Z,EAKH,EALGA,OACA7D,EAIH,EAJGA,QACAzX,EAGH,EAHGA,MAMEub,EAAkBnY,qBACpB6B,IAAOuS,OACPvS,IAAOxD,GAFuB,eAIzBwD,IAAOqW,SAAWA,GAEvBtY,GAGJ,OACI,wBAAQgC,IAAKA,EAAKhC,UAAWuY,EAAiB9D,QAZ9B,yBAAMA,QAAN,IAAMA,OAAN,EAAMA,EAAUzX,IAYhC,SACK4F,Q,6BCrCjB,2EAKa4V,EAAU,SAAC,GAA+B,IAA7BxY,EAA4B,EAA5BA,UAChByY,EAAmBrY,qBAAW6B,IAAOyW,QAAS1Y,GAEpD,OAAO,qBAAKA,UAAWyY,M,wHCQdE,EAAqC,SAAC,GAMnC,IALZf,EAKW,EALXA,MACAgB,EAIW,EAJXA,SAIW,IAHXhV,YAGW,MAHJ,QAGI,EAFX8L,EAEW,EAFXA,KACAmJ,EACW,EADXA,eAEMC,EAAejb,uBACjB,SAACW,GAA2C,IAAD,EACjCua,EAAoBva,EAAMwa,YAC3Bta,OAGCkZ,EAASmB,EADDA,EAAkBE,eAC8BC,KACxDlc,EAAQwB,EAAME,OAAO1B,MAE3B,cAAO4b,QAAP,IAAOA,OAAP,EAAOA,GAAQ,mBAAMhV,EAAO5G,GAAb,wBAAwB4G,EAAxB,QAAqCgU,GAArC,GAA8CpZ,KAEjE,CAACoa,EAAUhV,IAGTuV,EAAkB/Y,qBAAW6B,IAAOoP,UAAR,eAC7BpP,IAAOmX,YAAcxB,IAG1B,OACI,sBAAK5X,UAAWmZ,EAAhB,YACOvB,GAAS,uBAAO5X,UAAWiC,IAAO2V,MAAzB,SAAiCA,IAC7C,yBAAQ5X,UAAWiC,IAAOoX,OAAQT,SAAUE,EAA5C,YACOD,GAAkB,wBAAQ7b,MAAM,KAClC0S,EAAKlN,KAAI,SAAC4K,GAAD,OACN,wBAAuBpQ,MAAOoQ,EAAKrQ,IAAnC,SACKqQ,EAAKxJ,MADGwJ,EAAKrQ,WAK1B,cAAC,IAAD,CAAMiD,UAAWiC,IAAOlC,KAAMA,KAAK,oB,+IClClCuZ,EAAkBjB,sBAC3B,WAWIrW,GACE,IAAD,EAVG4V,EAUH,EAVGA,MACA5a,EASH,EATGA,MACAuc,EAQH,EARGA,YACAC,EAOH,EAPGA,WACAC,EAMH,EANGA,UACAb,EAKH,EALGA,SACAc,EAIH,EAJGA,cACGC,EAGN,mGACK3Z,EAAYI,qBAAW6B,IAAOoP,WAAR,mBACvBpP,IAAO2X,cAAgBJ,GADA,cAEvBvX,IAAO4X,aAAeJ,GAFC,IAKtBX,EAAeF,EACf,SAACpa,GAAD,OACIoa,EAASpa,EAAME,OAAO1B,MAAOwB,SACjCyH,EAEA6T,EAAoBJ,EACpB,SAAClb,GAAD,OACIkb,EAAc1c,EAAOwB,SACzByH,EAEN,OACI,sBAAKjG,UAAWA,EAAhB,UACKwZ,GAAc,cAAC,IAAD,CAASxZ,UAAWiC,IAAOyW,UAC1C,gCAAQd,IACR,mCACI5V,IAAKA,EACLhF,MAAOA,EACPuc,YAAaA,EACbX,SAAUE,GACNa,IAEPF,GACG,wBACIzZ,UAAWiC,IAAOuS,OAClBC,QAASqF,EAFb,SAII,cAAC,IAAD,CAAM/Z,KAAK,2B,iIC5D7Bga,EAAsB,SACxBC,EACAhd,EACA0S,GAEA,IAAK1S,GAAsB,SAAbgd,EAAqB,OAAOtK,EAE1C,IAAMuK,EAAK,IAAItQ,OAAJ,WAAe3M,EAAMkd,QAAQ,MAAO,KAApC,KAA6C,MAClDC,EAAY,KAKZC,EAAsB,SAAChN,EAAc1K,GACvC,OAJa,SAACA,GAAD,OACbA,EAAK,KAAoB,UAAbsX,EAAuB,EAAI,GAGnCK,CAAS3X,GAAY,4BAAa0K,GAAL1K,GAE1B,cAAC,WAAD,UAAoB0K,GAAL1K,IAG1B,OAAOgN,EAAKlN,KAAI,gBAAG8X,EAAH,EAAGA,QAAH,MAAsB,CAClC5X,GADY,EAAYA,GACjBwB,WACPoW,QAASA,EACJJ,QAAQD,EADJ,UACWE,EADX,aACyBA,IAC7BrF,MAAMqF,GACN3X,IAAI4X,QAIJG,EAAsB,SAC/Bla,EACA2Z,EACAhd,EACA0S,GAEA,GAAc,WAAVrP,EAAoB,OAAO0Z,EAAoBC,EAAUhd,EAAO0S,GAEpE,IAAM8K,EAAY,IAAI7Q,OAAO3M,EAAO,MAC9Byd,EAAe/K,EAAKjK,QAAO,SAAC2H,GAAD,OAAUoN,EAAU5Q,KAAKwD,EAAKkN,YAE/D,OAAOP,EAAoBC,EAAUhd,EAAOyd,ICnCnC7U,EAAgC,SACzCrI,EACA6H,GAEA,OAAQA,EAAO3G,MACX,IAAK,WACD,IAAIic,EAAYnd,EAAMmd,UAQtB,MANoB,WAAhBnd,EAAM8C,MACNqa,GAAY,EACW,SAAhBnd,EAAM8C,QACbqa,GAAYnd,EAAMod,aAAcpd,EAAMmd,WAGnC,2BACAnd,GADP,IAEIP,MAAOoI,EAAOE,QACdsV,iBAAkBxV,EAAOE,QACzBuV,iBAAkBtd,EAAMud,YAAYvY,OACpCmY,YACAC,aAAa,IAGrB,IAAK,uBAAyB,IAAD,EACnBpL,EAAK,UAAGnK,EAAOE,eAAV,QAAqB/H,EAAMwd,kBAEtC,GAAc,OAAVxL,EAAgB,OAAOhS,EAE3B,IAAMyd,EAAiBzd,EAAMud,YAAYvL,GAAO7M,GAC1CuY,EAAe1d,EAAMmS,KAAKuE,MAC5B,SAAC7G,GAAD,OAAUA,EAAK1K,KAAOsY,KAG1B,OAAO,2BACAzd,GADP,IAEIwd,kBAAmB,KACnB/d,MAAOO,EAAM2d,cAAgB,GAAKD,EAAaX,QAC/CO,gBAAgBtd,EAAM2d,eAEhB3d,EAAMsd,iBAGpB,IAAK,mBAGD,IAFmBtd,EAAMmS,KAAjBnN,QAEmC,OAA5BhF,EAAMwd,kBAA4B,OAAOxd,EAExD,IAAMwd,EAAoBxd,EAAMwd,kBAAoB,EAEpD,GAAIA,EAAoB,EACpB,OAAO,2BACAxd,GADP,IAEIwd,kBAAmB,KACnB/d,MAAOO,EAAMqd,mBAIrB,IAAMI,EAAiBzd,EAAMud,YAAYC,GAAmBrY,GACtDuY,EAAe1d,EAAMmS,KAAKuE,MAC5B,SAAC7G,GAAD,OAAUA,EAAK1K,KAAOsY,KAG1B,OAAO,2BACAzd,GADP,IAEIwd,oBACA/d,MAAOie,EAAaX,UAG5B,IAAK,qBAAuB,IAChB/X,EAAWhF,EAAMmS,KAAjBnN,OAER,IAAKA,EAAQ,OAAOhF,EAEpB,IAAMwd,EAC0B,OAA5Bxd,EAAMwd,kBACA,EACAzZ,KAAKyP,IAAIxT,EAAMwd,kBAAoB,EAAGxY,EAAS,GAEnDyY,EAAiBzd,EAAMud,YAAYC,GAAmBrY,GACtDuY,EAAe1d,EAAMmS,KAAKuE,MAC5B,SAAC7G,GAAD,OAAUA,EAAK1K,KAAOsY,KAG1B,OAAO,2BACAzd,GADP,IAEIwd,oBACA/d,MAAOie,EAAaX,UAG5B,IAAK,WACD,OAAO,2BACA/c,GADP,IAEIsd,iBAAkBtd,EAAMP,SAAWO,EAAMmS,KAAKnN,OAC9C4Y,SAAS,IAGjB,IAAK,UACD,OAAO,2BACA5d,GADP,IAEIsd,gBAAgB,EAChBE,kBAAmB,KACnBI,SAAS,IAGjB,IAAK,UACD,IAAML,EAAcP,EAChBhd,EAAM8C,MACN9C,EAAMyc,SACNzc,EAAMP,MACNoI,EAAOE,SAGX,OAAO,2BACA/H,GADP,IAEImS,KAAMtK,EAAOE,QACbwV,cACAD,eAAgBtd,EAAM4d,WAAaL,EAAYvY,OAC/CmY,WAAW,IAGnB,IAAK,oBACD,IAAMI,EAAcP,EAChBhd,EAAM8C,MACN9C,EAAMyc,SACNzc,EAAMP,MACNO,EAAMmS,MAGV,OAAO,2BACAnS,GADP,IAEIud,cACAD,eAAgBtd,EAAM4d,WAAaL,EAAYvY,SAGvD,QACI,MAAM,IAAImO,MAAJ,iCAAoCtL,MC5IzCN,EAAmC,CAC5C9H,MAAO,GACP4d,iBAAkB,GAClBlL,KAAM,GACNoL,YAAa,GACbC,kBAAmB,KACnBF,gBAAgB,EAChBH,WAAW,EACXra,MAAO,SACP2Z,SAAU,OACVW,aAAa,EACbQ,SAAS,EACTD,eAAe,GCCNE,EAAuB,SAAC,GAM/B,IAAD,IALD/a,aAKC,MALO,SAKP,EAJDlD,EAIC,EAJDA,QAIC,EACyB0V,qBACtBjN,EADgC,YAAC,eAG1Bd,GAHyB,IAI5BzE,UCrBe,SAAClD,GAAD,OAAuC,SAC9DI,GAD8D,2BAAC,eAG5DA,GAH2D,IAI9Dmd,UAA2B,YAAhBnd,EAAM8C,MACjBsa,YAA6B,YAAhBpd,EAAM8C,MACnB2Z,SAAQ,iBAAE7c,QAAF,IAAEA,OAAF,EAAEA,EAAS6c,gBAAX,QAAuB,OAC/BkB,cAAa,iBAAE/d,QAAF,IAAEA,OAAF,EAAEA,EAAS+d,qBAAX,YDgBTG,CAAYle,IAPf,mBACMI,EADN,KACad,EADb,KAYD,MAAO,CACHc,QACAf,QAJsBH,mBAAQ,kBEzBf,SAACI,GAAD,MAAsC,CACzD6e,SAAU,SAAChW,GAAD,OACN7I,EAAS,CAAEgC,KAAM,WAAY6G,aACjCiW,qBAAsB,SAACjW,GAAD,OAClB7I,EAAS,CACLgC,KAAM,uBACN6G,aAERkW,iBAAkB,kBAAY/e,EAAS,CAAEgC,KAAM,sBAC/Cgd,mBAAoB,kBAAYhf,EAAS,CAAEgC,KAAM,wBACjDid,SAAU,kBAAYjf,EAAS,CAAEgC,KAAM,cACvCkd,QAAS,kBAAYlf,EAAS,CAAEgC,KAAM,aACtCmd,QAAS,SAACtW,GAAD,OACL7I,EAAS,CAAEgC,KAAM,UAAW6G,aAChCuW,kBAAmB,kBAAYpf,EAAS,CAAEgC,KAAM,wBFWRjC,CAAQC,KAAW,CAACA,MGHnDqf,EAAiD,SAAC,GAOzC,IANlBlE,EAMiB,EANjBA,MACA5X,EAKiB,EALjBA,UACA0E,EAIiB,EAJjBA,OAIiB,IAHjBrE,aAGiB,MAHT,SAGS,EAFjBlD,EAEiB,EAFjBA,QACAyb,EACiB,EADjBA,SACiB,EAqBbwC,EAAqB,CAAEje,UAASkD,UArBnB,IAEb9C,MACIP,EAHS,EAGTA,MACA0S,EAJS,EAITA,KACAoL,EALS,EAKTA,YACAC,EANS,EAMTA,kBACAF,EAPS,EAOTA,eACAH,EARS,EAQTA,UACAC,EATS,EASTA,YATS,IAWbne,QACI8e,EAZS,EAYTA,SACAC,EAbS,EAaTA,qBACAC,EAdS,EAcTA,iBACAC,EAfS,EAeTA,mBACAC,EAhBS,EAgBTA,SACAC,EAjBS,EAiBTA,QACAC,EAlBS,EAkBTA,QACAC,EAnBS,EAmBTA,kBAIRpc,qBAAU,WACQ,YAAVY,GACAqE,EAAOkX,EAAS5e,KAErB,IAEHyC,qBAAU,WACQ,SAAVY,GAAoBsa,GACpBjW,EAAOkX,EAAS5e,KAErB,CAAC2d,IAEJ,IAAMoB,EAAele,sBAAYuF,mBAASsB,GAAS,CAACA,IAC9CsX,EAAqBne,sBAAYuF,mBAASyY,EAAmB,IAAK,IAYlEI,EAAsB,SAAC1M,GAA0B,IAAD,IAC5C2M,EAAY,iBAAG3M,QAAH,IAAGA,IAASwL,SAAZ,QAAiC,EAC7CrY,EAAE,OAAGoY,QAAH,IAAGA,GAAH,UAAGA,EAAcoB,UAAjB,aAAG,EAA6BxZ,GAClC0K,EAAOsC,EAAKuE,MAAK,SAAC7G,GAAD,OAAUA,EAAK1K,KAAOA,KAEzC0K,IACQ,OAARwL,QAAQ,IAARA,KAAWxL,IAGfmO,EAAqBhM,IAwBnB4M,EAAqB,CAACla,IAAOoP,UAAWrR,GACzCyF,OAAOsP,SACPM,KAAK,KAEV,OACI,sBACIrV,UAAWmc,EACXC,QAASV,EACTW,OAAQV,EACRW,UA9Bc,SAAC9d,GAAgD,IAC3DzB,EAAQyB,EAARzB,IAER,GAAY,YAARA,GAA6B,cAARA,GAA+B,UAARA,EAAiB,CAC7D,OAAQA,GACJ,IAAK,UACDye,IACA,MACJ,IAAK,YACDC,IACA,MACJ,IAAK,QACDQ,EAAoB,MAI5Bzd,EAAM+d,iBACN/d,EAAMge,oBASV,UAMI,cAAC,IAAD,CACI5E,MAAOA,EACPgB,SAxDS,SAAC5b,GAClBse,EAASte,GAEK,WAAVqD,EACA0b,EAAaH,EAAS5e,GAEtBgf,KAmDIhf,MAAOA,EACPwc,WAAYkB,IAEfG,GACG,6BACKC,EAAYtY,KAAI,SAAC4K,EAAMmC,GAAP,OACb,oBAEIkN,YAAa,kBAAMR,EAAoB1M,IACvCvP,UACIuP,IAAUwL,EAAoB9Y,IAAOiR,OAAS,GAJtD,SAOK9F,EAAKkN,SANDlN,EAAK1K,c,gICvIhCga,EAAqB,kBAErBC,EAAqB,gC,OC4BrBC,EAA0B,SAACC,GAAD,OAC5BA,EAASC,WAAWD,EAAO3C,QAAQ,MAAO,IAAIA,QAAQ,KAAM,MAAQ,GAE3D6C,EAAc1E,sBACvB,WAUIrW,GACE,IATEhF,EASH,EATGA,MACAuc,EAQH,EARGA,YACAX,EAOH,EAPGA,SAOH,IANGhV,YAMH,MANU,QAMV,EALGnF,EAKH,EALGA,KACAue,EAIH,EAJGA,UACAhd,EAGH,EAHGA,UAGH,EACyB1C,oBAAsB,OAALN,QAAK,IAALA,OAAA,EAAAA,EAAOkH,aAAc,IAD/D,mBACM3G,EADN,KACaC,EADb,KAGDiC,qBAAU,WACe,kBAAVzC,IACQ4f,EAAwBrf,KAExBP,GACXQ,EA5BW,SAACqf,GAAD,OAC3BA,EACKI,eAAe,QAAS,CAAEC,sBAAuB,IACjDhD,QAAQ,MAAO,IAyBKiD,CAAuBngB,OAGzC,CAACA,EAAOyB,EAAMlB,IAEjB,IAAMub,EAAejb,uBACjB,SAACW,GACG,IAAMxB,EDvDY,SAC9BA,EACAyB,GAEA,OAAQA,GACJ,IAAK,UAGL,IAAK,eACD,OAAOzB,EAEX,IAAK,UACD,IAAMogB,EAAQpgB,EAAM8Y,MAAM4G,GAE1B,OACS,OAALU,QAAK,IAALA,OAAA,EAAAA,EAAO3X,QAAO,SAAC2H,GAAD,MAAmB,MAATA,KAAciI,KAAK,OAA3C,OACA+H,QADA,IACAA,OADA,EACAA,EAAQ,KACR,IAGR,IAAK,UACD,IAAMA,EAAQpgB,EAAM8Y,MAAM6G,GAS1B,OAPK,OAALS,QAAK,IAALA,KAAO3P,MAAK,SAAC3H,EAAGiJ,GACZ,MAAU,MAANjJ,EAAkB,EACZ,MAANiJ,GAAmB,EAEhB,MAGC,OAALqO,QAAK,IAALA,OAAA,EAAAA,EAAQ,KAAM,IAEzB,QACI,MAAM,IAAI1M,MAAJ,qCAAwCjS,KCsB5B4e,CAAmB7e,EAAME,OAAO1B,MAAOyB,GAErDjB,EAASR,GAET,IAAM6f,EAASD,EAAwB5f,GAEvC,cAAO4b,QAAP,IAAOA,OAAP,EAAOA,EAAQ,eAAMhV,EAAOiZ,GAAUre,KAE1C,CAACoa,EAAUhV,EAAMnF,IAGrB,OACI,uBACIuD,IAAKA,EACLhF,MAAOO,EACPgc,YAAaA,EACbX,SAAUE,EACV9Y,UAAWA,EACXgd,UAAWA,OClEdM,EAAYjF,sBACrB,WASIrW,GACE,IAREhF,EAQH,EARGA,MACAuc,EAOH,EAPGA,YACAX,EAMH,EANGA,SAMH,IALGhV,YAKH,MALU,QAKV,EAJGoZ,EAIH,EAJGA,UACAhd,EAGH,EAHGA,UAIE8Y,EAAejb,uBACjB,SAACW,GAAD,cACIoa,QADJ,IACIA,OADJ,EACIA,EAAQ,eAAMhV,EAAOpF,EAAME,OAAO1B,OAASwB,KAC/C,CAACoa,EAAUhV,IAGf,OACI,uBACI5B,IAAKA,EACLhF,OAAY,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOkH,aAAc,GAC5BqV,YAAaA,EACbX,SAAUE,EACV9Y,UAAWA,EACXgd,UAAWA,OCVdO,EAAQlF,sBACjB,WAcIrW,GACE,IAAD,EAbG4V,EAaH,EAbGA,MACA5a,EAYH,EAZGA,MACAuc,EAWH,EAXGA,YACAC,EAUH,EAVGA,WACAC,EASH,EATGA,UACAb,EAQH,EARGA,SACAc,EAOH,EAPGA,cACA1Z,EAMH,EANGA,UAMH,IALG4D,YAKH,MALU,QAKV,MAJGnF,YAIH,MAJU,UAIV,EAHGue,EAGH,EAHGA,UAIEb,EAAqB/b,qBACvB6B,IAAOoP,WAD0B,mBAG5BpP,IAAO2X,cAAgBJ,GAHK,cAI5BvX,IAAO4X,aAAeJ,GAJM,cAK5BxX,IAAOmX,YAAcxB,GALO,GAOjC5X,GAGE8Z,EAAoBJ,EACpB,SAAClb,GAAD,OACIkb,EAAc1c,EAAOwB,SACzByH,EAEN,OACI,sBAAKjG,UAAWmc,EAAhB,YACOvE,GAAS,uBAAO5X,UAAWiC,IAAO2V,MAAzB,SAAiCA,IAC5C4B,GAAc,cAAC,IAAD,CAASxZ,UAAWiC,IAAOyW,UAChC,YAATja,EACG,cAAC6e,EAAD,CACItb,IAAKA,EACL4B,KAAMA,EACN5G,OAAY,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOkH,aAAc,GAC5BqV,YAAaA,EACbX,SAAUA,EACV5Y,UAAWiC,IAAO+V,MAClBgF,UAAWA,IAGf,cAACD,EAAD,CACI/a,IAAKA,EACL4B,KAAMA,EACN5G,MAAwB,kBAAVA,EAAqBA,OAAQiJ,EAC3CsT,YAAaA,EACbX,SAAUA,EACV5Y,UAAWiC,IAAO+V,MAClBgF,UAAWA,EACXve,KAAMA,IAGbgb,GACG,wBACIzZ,UAAWiC,IAAOuS,OAClBC,QAASqF,EAFb,SAII,cAAC,IAAD,CAAM/Z,KAAK,2B,4EC5F7Byd,EAAS,GAAGrT,eAEX,SAAS/J,IAKZ,IAFA,IAAMqd,EAAU,GAEP1R,EAAI,EAAGA,EAAI,UAAKxJ,OAAQwJ,IAAK,CAClC,IAAM2R,EAAW3R,EAAR,qBAAQA,OAAR,YAAQA,GAEjB,GAAK2R,EAAL,CAEA,IAAMC,SAAiBD,EAEvB,GAAgB,WAAZC,GAAoC,WAAZA,EACxBF,EAAQpY,KAAKqY,QACV,GAAIxI,MAAMC,QAAQuI,IACrB,GAAIA,EAAInb,OAAQ,CACZ,IAAMqb,EAAQxd,EAAU,WAAV,cAAcsd,IAExBE,GACAH,EAAQpY,KAAKuY,SAGlB,GAAgB,WAAZD,EACP,GAAID,EAAIxZ,WAAatH,OAAOsN,UAAUhG,SAClCuZ,EAAQpY,KAAKqY,EAAIxZ,iBAGjB,IAAK,IAAMnH,KAAO2gB,EAEVF,EAAOpT,KAAKsT,EAAK3gB,IAAQ2gB,EAAI3gB,IAC7B0gB,EAAQpY,KAAKtI,IAOjC,OAAO0gB,EAAQpI,KAAK,O,6BC9BxB,kCAAO,IAAMwI,EAA0B,SAA1BA,EAA2B7gB,EAAO8gB,GAC3C,OAAI5I,MAAMC,QAAQ2I,GACPA,EAAYtY,MAAK,SAACuY,GAAD,OACpBF,EAAW7gB,EAAO+gB,MAIC,kBAAhBD,EACAA,EAAYjR,gBAAkB7P,EAAM6P,cAGxCiR,EAAYlU,KAAK5M,K,6BCpB5B,kCAAO,IAAMghB,EAAwB,SAACC,GAAD,OACjCA,EAASA,EAAO,GAAGC,cAAgBD,EAAOjZ,MAAM,GAAKiZ,I,6BCKzD,kCAAO,IAAM7a,EAAsB,SAACzE,GAA2B,IACvDwf,EADsC1gB,EAAgB,uDAAR,IAGlD,OAAO,WAA2B,IAAD,uBAAtB2gB,EAAsB,yBAAtBA,EAAsB,gBAC7BrgB,aAAaogB,GAEbA,EAAa/f,YAAW,kBAAMO,EAAQ,WAAR,EAAYyf,KAAO3gB,M,6BCNzD,kCAAO,IAAMc,EAAsB,SAACI,GAA2B,IACvD0f,EACAC,EAFsC7gB,EAAgB,uDAAR,IAIlD,OAAO,WAA2B,IAAD,uBAAtB2gB,EAAsB,yBAAtBA,EAAsB,gBACxBC,GAKDtgB,aAAaugB,GAEbA,EAAWlgB,YAAW,WACd+J,KAAKoW,MAAQF,GAAW5gB,IACxBkB,EAAQ,WAAR,EAAYyf,GACZC,EAAUlW,KAAKoW,SAEpB9gB,GAAS0K,KAAKoW,MAAQF,MAXzB1f,EAAQ,WAAR,EAAYyf,GAEZC,EAAUlW,KAAKoW,U,6BCZpB,SAASxc,EAAqB6L,GAAoC,IAAD,EAC1CA,EAAQG,wBAA1B/O,EAD4D,EAC5DA,MAAOG,EADqD,EACrDA,OAEf,MAAO,CAAEH,MAAOsC,KAAKC,MAAMvC,GAAQG,OAAQmC,KAAKC,MAAMpC,IAH1D,mC,6BCFA,sDAIO,SAASqf,EACZ5Q,EACA1L,GACK,IAAD,IACER,EAAU8O,cACVmB,EAAchB,cACdE,EAAOvN,YAAesK,EAAS+D,GAErCjQ,EAAQ0M,UAAYyC,EAAKzP,IAAMuQ,EAAYvD,WAAvB,iBAAoClM,QAApC,IAAoCA,OAApC,EAAoCA,EAASd,WAA7C,QAAoD,GACxEM,EAAQ4M,WACJuC,EAAKxP,KAAOsQ,EAAYrD,YAAxB,iBAAsCpM,QAAtC,IAAsCA,OAAtC,EAAsCA,EAASb,YAA/C,QAAuD,K,gHCPlDmS,EAAqC,SAAC,GAMjC,IALd5Q,EAKa,EALbA,SACAC,EAIa,EAJbA,MAIa,IAHb4b,eAGa,SAFbzd,EAEa,EAFbA,UACG0d,EACU,0DACb,OAAI7b,EAEI,cAAC,IAAD,CACIA,MAAOA,EACPpF,MAAOghB,EAAU,SAAOxY,EACxBjF,UAAWA,EAHf,SAKI,cAAC,IAAD,2BAAe0d,GAAf,IAAsB7b,MAAM,GAA5B,SACKD,OAMV,cAAC,IAAD,2BAAe8b,GAAf,aAAuB9b,O,6BC5BlC,iI,6CCAA,kCAAO,IAAM+b,EAAe,SACxB3hB,EACAuS,EACAqP,GAHwB,OAIdA,EAAK1d,QAAQlE,KAAWuS,I,6BCJ/B,SAAS9R,EAAMohB,GAClB,OAAO,IAAIC,SAAQ,SAAUC,GACzB3gB,WAAW2gB,EAASF,MAF5B,mC,6BCEA,kCAAO,IAAM5e,EAAqC,CAC9C,UAAa,CAAC,IAAK,IAAK,45CACxB,aAAc,CAAC,IAAK,IAAK,4LACzB,cAAe,CAAC,IAAK,IAAK,8LAC1B,KAAQ,CAAC,IAAK,IAAK,yOACnB,QAAW,CAAC,IAAK,IAAK,qmBACtB,KAAQ,CAAC,IAAK,IAAK,+gBACnB,MAAS,CAAC,IAAK,IAAK,2RACpB,gBAAiB,CAAC,IAAK,IAAK,6QAC5B,SAAY,CAAC,IAAK,IAAK,44BACvB,KAAQ,CAAC,IAAK,IAAK,keACnB,KAAQ,CAAC,IAAK,IAAK,yoBACnB,WAAY,CAAC,IAAK,IAAK,ksBACvB,IAAO,CAAC,IAAK,IAAK,0fAClB,KAAQ,CAAC,IAAK,IAAK,shBACnB,QAAW,CAAC,IAAK,IAAK,0YACtB,kBAAmB,CAAC,IAAK,IAAK,y2BAC9B,IAAO,CAAC,IAAK,IAAK,2jCAClB,MAAS,CAAC,IAAK,IAAK,6Z,gBCnBxBL,EAAOC,QAAU,CAAC,UAAY,0BAA0B,WAAa,2BAA2B,YAAc,4BAA4B,KAAO,qBAAqB,YAAc,4BAA4B,MAAQ,sBAAsB,QAAU,wBAAwB,iBAAmB,mC,6BCAnS,sDAGO,SAAS2W,EAAId,GAChB,OAAO1R,YAAwB,CAC3BF,IAAK,aACLT,KAAMqS,EACN3P,aAAc0B,Q,6BCPtB,sDAiBO,SAAS/C,EACZsa,GAEA,OAAOnb,YAA0B,CAC7BC,IAAK,gBACLT,KAAM2b,EACNjZ,aAAc8B,Q,6BCvBtB,sDAGO,SAASoX,IACZ,OAAOjb,YAA2B,CAC9BF,IAAK,aACLiC,aAAc8B,Q,6BCNtB,sDAGO,SAASqX,IACZ,OAAOlb,YAA2B,CAC9BF,IAAK,iBACLiC,aAAc8B,Q,6CCNtB,sDAGO,SAASC,EAAQ4N,GACpB,OAAO1R,YAA0B,CAC7BF,IAAK,qBACLT,KAAMqS,EACN3P,aAAc,SAACoZ,GAAoB,IAAD,EAO9B,OANA,UAAIA,EAAerX,eAAnB,aAAI,EAAwBvF,UACxB4c,EAAerX,QAAUqX,EAAerX,QAAQtF,IAC5CiF,MAID0X,O,0HCPNC,EAAc,SAAC,GAA4B,IAA1B1P,EAAyB,EAAzBA,KAC1B,OACI,mCACKA,EAAKlN,KAAI,SAAC4K,EAAMmC,GAAP,OACN,cAAC,IAAD,CAAsBvP,UAAWK,IAAMgf,SAAUzH,MAAOxK,GAAzCmC,U,wGCJlB+P,EAAe,SAAC,GAAwC,IAAtCtf,EAAqC,EAArCA,UAAW0P,EAA0B,EAA1BA,KAChC6P,EAAgBnf,qBAAWC,IAAMqP,KAAM1P,GAE7C,OACI,oBAAIA,UAAWuf,EAAf,SACK7P,EAAKlN,KAAI,SAAC4K,EAAMmC,GAAP,OACN,oBAAgBvP,UAAWK,IAAM+M,KAAjC,SACKA,GADImC,U,2GCNZtH,EAAsB,SAC/BpD,EACA3H,GAEA,OAEMA,GAGGqL,EAAsB,SAC/B1D,EACA7H,GAEAwiB,aAAaC,QAAQ5a,EAAYT,KAAKC,UAAUrH,M,kBCpBpD4C,EAAOC,QAAU,CAAC,KAAO,qB,6BCDzB,mW,6BCAA,kL,gBCCAD,EAAOC,QAAU,CAAC,SAAW,+B,gBCA7BD,EAAOC,QAAU,CAAC,UAAY,gC,gBCA9BD,EAAOC,QAAU,CAAC,QAAU,2B,gBCA5BD,EAAOC,QAAU,CAAC,eAAiB,iC,gBCAnCD,EAAOC,QAAU,CAAC,IAAM,2B,iDCDxB,IAAI2C,EAAM,CACT,gBAAiB,CAChB,IACA,IAGF,SAASkd,EAAoBC,GAC5B,IAAIC,EAAoBC,EAAErd,EAAKmd,GAC9B,OAAOb,QAAQC,UAAUe,MAAK,WAC7B,IAAI/Y,EAAI,IAAI2J,MAAM,uBAAyBiP,EAAM,KAEjD,MADA5Y,EAAEgZ,KAAO,mBACHhZ,KAIR,IAAIiZ,EAAMxd,EAAImd,GAAMjd,EAAKsd,EAAI,GAC7B,OAAOJ,EAAoB7Y,EAAEiZ,EAAI,IAAIF,MAAK,WACzC,OAAOF,EAAoBld,MAG7Bgd,EAAoB9P,KAAO,WAC1B,OAAOhT,OAAOgT,KAAKpN,IAEpBkd,EAAoBhd,GAAK,IACzB9C,EAAOC,QAAU6f,G,gBCxBjB,IAAIld,EAAM,CACT,8BAA+B,CAC9B,IACA,GAED,wBAAyB,CACxB,IACA,GAED,0BAA2B,CAC1B,IACA,GAED,uBAAwB,CACvB,IACA,GAED,qCAAsC,CACrC,IACA,GAED,iCAAkC,CACjC,IACA,IAED,qBAAsB,CACrB,IACA,IAED,sBAAuB,CACtB,IACA,IAED,2BAA4B,CAC3B,IACA,IAED,2BAA4B,CAC3B,IACA,IAED,sCAAuC,CACtC,IACA,GAED,iCAAkC,CACjC,IACA,IAED,oCAAqC,CACpC,IACA,IAED,4BAA6B,CAC5B,IACA,GAED,+BAAgC,CAC/B,IACA,IAED,0BAA2B,CAC1B,IACA,KAGF,SAASkd,EAAoBC,GAC5B,IAAIC,EAAoBC,EAAErd,EAAKmd,GAC9B,OAAOb,QAAQC,UAAUe,MAAK,WAC7B,IAAI/Y,EAAI,IAAI2J,MAAM,uBAAyBiP,EAAM,KAEjD,MADA5Y,EAAEgZ,KAAO,mBACHhZ,KAIR,IAAIiZ,EAAMxd,EAAImd,GAAMjd,EAAKsd,EAAI,GAC7B,OAAOJ,EAAoB7Y,EAAEiZ,EAAI,IAAIF,MAAK,WACzC,OAAOF,EAAoBld,MAG7Bgd,EAAoB9P,KAAO,WAC1B,OAAOhT,OAAOgT,KAAKpN,IAEpBkd,EAAoBhd,GAAK,IACzB9C,EAAOC,QAAU6f,G,8BCnFjB,mBAaKxK,MAAMhL,UAAUuF,SAEjByF,MAAMhL,UAAUuF,OAAS,SAAatS,GAClC,OAAOsS,YAAOwQ,KAAM9iB,KAIvB+X,MAAMhL,UAAUyF,YAEjBuF,MAAMhL,UAAUyF,UAAY,SACxB5S,EACAI,GAEA,OAAOwS,YAAUsQ,KAAMljB,EAAKI,M,iHC3BvBuS,G,MAAO,CAChBwQ,OAAQ,CAAC,UACTC,MAAO,CAAC,oBAAqB,QAAS,UACtC,eAAgB,CAAC,kBAAmB,OAAQ,QAC5CC,SAAU,CAAC,WACX/P,WAAY,CAAC,cACb,eAAgB,CAAC,QAAS,gBAAiB,cAC3C7T,QAAS,CAAC,eAAgB,WAAY,UACtC,sBAAuB,CAAC,a,OCDtB6jB,EAAa,SAACzc,GAAD,OACfoa,gCAAsBpa,EAAKkR,MAAM,KAAKO,KAAK,OAUzCiL,GARiC5Q,EAAI,OAAWlN,KAAI,SAAC4K,GAAD,MAAW,CACjExJ,KAAMyc,EAAWjT,GACjBmT,UAAWC,gBAAK,kBAAM,OAAO,YAAqBpT,EAA5B,iBAMT,SAACxJ,GAA4B,IAAD,EACnC7G,EAAqB6G,EAHlBsW,QAAQ,aAAc,KAAKrN,cAKpC,MAAO,CACHjJ,OACA8L,KAAI,UAAEA,EAAK3S,UAAP,aAAE,EAAWyF,KACb,SAAC4K,GAAD,MAA6B,CACzBxJ,KAAMyc,EAAWjT,GACjBmT,UAAWC,gBAAK,kBAAM,OAAO,YAAczjB,EAArB,YAA4BqQ,EAA5B,oB,GAOlCkT,EAAS,WACTA,EAAS,aACTA,EAAS,SACTA,EAAS,oBACTA,EAAS,uBACTA,EAAS,mBACTA,EAAS,YACTA,EAAS,oBACTA,EAAS,cACTA,EAAS,Y,sBCrCAG,EAAiC,WAC1C,IAAM1Y,EAAQ1F,YAAYmG,KACpB/L,EAAWC,cAIjB,OACI,qBAAK+X,QAHO,kBAAMhY,EAAS6L,gBAG3B,SACI,cAAC,IAAD,CAAMvI,KAAgB,UAAVgI,EAAoB,OAAS,W,oFCNxC2Y,EAAgB,SAAC,GAA8C,IAA5C7d,EAA2C,EAA3CA,MAAO6E,EAAoC,EAApCA,SAAUgO,EAA0B,EAA1BA,IACvCiL,EAAWC,cADsD,ECIlD,WAInB,IAAD,2DAJgE,GAAzCC,EAIvB,EAJuBA,aAAcC,EAIrC,EAJqCA,WAKhC9e,EAAM3E,iBAAuB,MADlC,EAE2BC,mBAAyB,MAFpD,mBAEMyjB,EAFN,KAEcC,EAFd,OAG6B1jB,oBAAkB,GAH/C,mBAGM2jB,EAHN,KAGeC,EAHf,KAIKC,GAAiBN,IAA2B,IAAXE,EAEjCK,EAAkB,WACpB,GAAIpf,EAAIhE,UAAYmjB,EAChB,GAAIL,EAAY,CACZ,IAAMO,EAAaxP,YAAsB7P,EAAIhE,SAE7CgjB,EAAUK,EAAWvP,UAGhBuP,EAAWvP,UACXmP,GACDI,EAAWtP,UA3BP,KA6BJmP,GAAW,QAGfF,EAAUtP,YAAU1P,EAAIhE,WAK9BsjB,EAAe/iB,mBAAS6iB,EAAiB,KAiB/C,OAfA3hB,oBAAU2hB,EAAiB,CAACpf,IAE5BvC,qBAAU,WACN,IAAK0hB,EAAe,CAChB,IAAMzf,EAAUkJ,SAAS5E,KAAKyK,cAAc,YAE5C,GAAI/O,EAGA,OAFAA,EAAQhC,iBAAiB,SAAU4hB,GAAc,GAE1C,kBACH5f,EAAQ/B,oBAAoB,SAAU2hB,GAAc,OAGjE,CAACtf,EAAK6e,EAAcE,EAAQD,IAExB,CACH9e,MACA+e,OAAM,OAAEA,QAAF,IAAEA,KACRE,QAAO,UAAGA,GAAWF,SAAd,UDpDsBQ,CAAU,CACvCV,cAAc,EACdC,aAAcpZ,IAFV1F,EAF+D,EAE/DA,IAAK+e,EAF0D,EAE1DA,OAAQE,EAFkD,EAElDA,QAWrB,OANAxhB,qBAAU,WACFshB,GACAJ,EAASa,MAAM,aAEpB,CAACb,EAAUI,IAGV,cAACU,EAAA,EAAOC,IAAR,CACI1f,IAAKA,EACL2f,QAAShB,EACTiB,QAAQ,SACRC,SAAU,CACN/P,QAAS,CAAEgQ,QAAS,EAAGC,EAAG,GAC1BC,OAAQ,CAAEF,QAAS,EAAGC,EAAG,KAE7BE,WAAY,CAAEC,KAAM,UAAWC,SAAU,IACzCniB,UAAWiC,IAAOoP,UATtB,SAWI,eAAC,OAAD,CAAgBqC,GAAE,oBAAegC,GAAO1V,UAAWiC,IAAOmgB,KAA1D,UACK1a,GAAYuZ,GACT,qBAAKtM,IAAK9R,EAAO7C,UAAWiC,IAAOoV,MAAOzC,IAAKlN,IAEnD,qBAAK1H,UAAWiC,IAAOC,UACvB,qBAAKlC,UAAWiC,IAAOY,MAAvB,SAA+BA,MALxB6S,M,kCEnBV2M,EAAe,SAAC,GAKP,IAJlBC,EAIiB,EAJjBA,aACAjO,EAGiB,EAHjBA,WACAkO,EAEiB,EAFjBA,mBACA9N,EACiB,EADjBA,QACiB,EAC+BnX,mBAC5CglB,EAAa,IAFA,mBACVE,EADU,KACQC,EADR,KAKXnB,EAAe/iB,oBAAS,WAC1B,IAAMmkB,EAAaH,IAEfG,GACAD,EAAoBC,KAEzB,KAEHjjB,qBAAU,WACN,IAAMiC,EAAUkJ,SAAS5E,KAAKyK,cAAc,YAE5C,GAAI/O,EAGA,OAFAA,EAAQhC,iBAAiB,SAAU4hB,GAAc,GAE1C,kBACH5f,EAAQ/B,oBAAoB,SAAU2hB,GAAc,MAE7D,CAACjN,IAEJ,IAAMsO,EAAc,SAAC3lB,GACjB,IAAMuS,EAAQ+S,EAAaM,WAAU,SAAC7lB,GAAD,OAASA,IAAQC,MAEvC,IAAXuS,GAEJkF,EAAQlF,IAGZ,OACI,qBAAKvP,UAAWiC,IAAOoS,WAAvB,SACKiO,EAAa9f,KAAI,SAAC4Q,GAAD,OACd,cAAC,IAAD,CAEI3U,KAAM2U,IAAaoP,EAAmB,UAAY,OAClDxiB,UAAWiC,IAAOuS,OAClBC,QAASkO,EACT3lB,MAAOoW,EALX,SAOKA,GANIA,SC3CnBlR,EAAU,CAAEd,IAAK,IAmBVyhB,EAAmB,SAAC,GAAiC,IAA/BnT,EAA8B,EAA9BA,KACzBoT,EAAezlB,iBAAqC,IAEpDilB,EAAejmB,mBAAQ,kBC9BV,SAACqT,GAAD,OACnBA,EACKlN,KAAI,qBAAGK,MAAkB,GAAGqb,iBAC5BzY,OAAOkZ,gBACPlP,SD0B8BsT,CAAQrT,KAAO,CAACA,IAC7C2E,EAAahY,mBAAQ,kBEhCR,SACnBuT,EACAF,GAFmB,OAInBE,EAAKpN,KAAI,SAAC4Q,GAAD,MAAe,CACpBA,WACA4P,WAAYtT,EACPjK,QAAO,qBAAG5C,MAAkB,GAAGqb,gBAAkB9K,KACjDzD,UAAU,SACVnN,KAAI,qBAAG+d,iBFuBiB0C,CAAQX,EAAc5S,KAAO,CAC1D4S,IAcJ,OACI,qCACI,cAAC,EAAD,CACIA,aAAcA,EACdjO,WAAYA,EACZI,QAbQ,SAAClF,GAAmB,IAAD,EAC7BvN,EAAG,UAAG8gB,EAAa9kB,eAAhB,aAAG,EAAuBuR,GAE9BvN,GAELwc,0BAAgBxc,EAAD,YAAC,eAAUE,GAAX,IAAoBd,IAAKc,EAAQd,IAAM,MAS9CmhB,mBAjBoB,kBAzBT,SACvBW,EACAtT,GAIA,IAHE,IAAD,IACKrN,EAAM,iBAAG2gB,QAAH,IAAGA,GAAH,UAAGA,EAAMllB,eAAT,aAAG,EAAeuE,cAAlB,QAA4B,EAE/BgN,EAAQ,EAAGA,EAAQhN,EAAQgN,IAAS,CACzC,IAAMvN,EAAG,OAAGkhB,QAAH,IAAGA,OAAH,EAAGA,EAAMllB,QAAQuR,GAE1B,GAAKvN,GAED0P,oBAAU1P,EAAKE,GAAU,cAAO0N,QAAP,IAAOA,OAAP,EAAOA,EAAOL,GAG/C,MAAO,GAYHgT,CAAmBO,EAAcR,MAkB5BjO,EAAW7R,KAAI,WAA2B+M,GAA3B,IAAG6D,EAAH,EAAGA,SAAU4P,EAAb,EAAaA,WAAb,OACZ,sBAEIhhB,IAAK,SAACmhB,GAAD,OACAL,EAAa9kB,QAAQuR,GAAS4T,GAEnCnjB,UAAWiC,IAAOmR,SALtB,UAOI,qBAAKpT,UAAWiC,IAAOmhB,YAAvB,SAAqChQ,IACrC,qBAAKpT,UAAWiC,IAAOyN,KAAvB,SAA8BsT,MAPzB5P,UGpDlB,SAASiQ,IAAW,IAAD,IAChBnjB,EAAOhE,cADS,EAGQoB,mBAA2B,IAHnC,mBAGfwK,EAHe,KAGNwb,EAHM,KAIhB7kB,GAAO,UAAAyB,EAAKsS,aAAL,eAAYjQ,SAAU,IAAtB,UAA2BrC,EAAKsS,aAAhC,aAA2B,EAAa,IAkBrD,OAhBA/S,qBAAU,WACFhB,GAAiB,YAATA,GAEF,uCAAG,4BAAAqH,EAAA,sEACoBrH,EACvB8F,IAAIC,OAAO0a,UACX3a,IAAIC,OAAOya,MAHR,QACHsE,EADG,QAKSlc,SACdic,EAAWC,EAAchc,QANpB,2CAAH,oDAUVic,KACD,CAAC/kB,KAEA,OAACqJ,QAAD,IAACA,OAAD,EAACA,EAASvF,QAKV,qCACI,oBAAIvC,UAAU,SAAd,SACc,YAATvB,EACK,8BACA,oBAEV,mBAAGuB,UAAU,SAAb,4DAGA,cAAC,EAAD,CACI0P,KAAM5H,EAAQtF,KAAI,SAACgC,GAAD,MAAa,CAC3B3B,MAAO2B,EAAO3B,MACd0d,UAAW,cAAC,EAAD,eAAoC/b,GAAhBA,EAAOkR,cAhB3C,+C,8DClBF+N,EAA4B,WACrC,IAAM1b,EAAQ1F,YAAYmG,KACpBkb,EAAmBtjB,qBAAW6B,IAAO0hB,OAAQC,IAAazL,SAEhE,OACI,sBAAKnY,UAAW0jB,EAAhB,UACI,qBAAK1jB,UAAW4jB,IAAaC,SAA7B,SACI,cAAC,IAAD,MAEJ,qBAAK7jB,UAAW4jB,IAAa/O,KAA7B,SACI,cAAC,OAAD,CAAMnB,GAAG,IAAI7Q,MAAM,qBAAkB7B,UAAU,SAA/C,SACI,cAAC,IAAD,CACIoT,MAAM,aACND,MAAiB,UAAVpM,EAAoB,QAAU,cAIjD,qBAAK/H,UAAW4jB,IAAatb,YAA7B,SACI,cAAC,IAAD,CAASzF,MAAM,aAAa7B,UAAU,OAAtC,SACI,cAAC,EAAD,YCrBP8iB,EAAU,SAAC,GAA4B,IAA1BlhB,EAAyB,EAAzBA,SACtB,OACI,sBAAK5C,UAAWiC,IAAOkW,QAAvB,UACI,qBAAKzV,GAAG,UAAU1C,UAAWiC,IAAOP,QAApC,SACI,qBAAK1B,UAAWiC,IAAO8hB,aAAvB,SAAsCnhB,MAE1C,cAAC,EAAD,IACA,cAAC,IAAD,Q,0BCFCohB,EAAa,SAAC,GAAiC,IAA/BC,EAA8B,EAA9BA,KAAMvU,EAAwB,EAAxBA,KACzBnN,EAASmN,EAAKnN,OAEpB,IAAKA,EAAQ,OAAO,KAEpB,IAAM2hB,EAAW,CAAID,GAAJ,mBAAavU,IAE9B,OACI,qBAAK1P,UAAWiC,IAAOoP,UAAvB,SACK6S,EAAY1hB,KAAI,WAAkB+M,GAAlB,IAAG6S,EAAH,EAAGA,KAAMvf,EAAT,EAASA,MAAT,OACb,cAAC,WAAD,UACK0M,EAAQhN,EACL,qCACI,cAAC,OAAD,CACImR,GAAc,IAAVnE,EAAc6S,EAAd,UAAwB6B,EAAK7B,MAA7B,OAAoCA,GACxCvf,MAAK,oBAAYA,GAFrB,SAIKA,IAEL,cAAC,IAAD,CAAM9C,KAAK,mBAGf8C,GAZO0M,S,iBCblB4U,EAAmC,SAAC,GAMlC,IALXvhB,EAKU,EALVA,SAKU,IAJVuR,aAIU,MAJF,UAIE,MAHV1V,YAGU,MAHH,QAGG,EAFVoE,EAEU,EAFVA,MACA7C,EACU,EADVA,UAEMokB,EAAiBhkB,qBACnB6B,IAAOoiB,MACPpiB,IAAOxD,GACPwD,IAAOkS,GACPnU,GAGEqkB,EAAQ,qBAAKrkB,UAAWokB,EAAhB,SAAiCxhB,IAE/C,OAAIC,EACO,cAAC,IAAD,CAASA,MAAOA,EAAhB,SAAwBwhB,IAG5BA,GCrBJ,SAASrN,KAAe,IAAD,IACpB9W,EAAOhE,cADa,EAGYoB,qBAHZ,mBAGnBqG,EAHmB,KAGN2gB,EAHM,KAIpB7lB,EAAOyB,EAAK/D,SAAS+d,QAAQ,wBAAyB,IAc5D,GAZAza,qBAAU,YACI,uCAAG,4BAAAqG,EAAA,sEACuBvB,IAAIE,WAAWqD,QAAQrJ,GAD9C,QACH8lB,EADG,QAGald,SAClBid,EAAeC,EAAkBhd,QAJ5B,2CAAH,qDAQVic,KACD,CAAC/kB,KAECkF,EACD,OAAO,+CAGX,IAAM6gB,EACF,cAAC,EAAD,CACI9U,KAAM/L,EAAYA,YAAYnB,KAAI,SAACiC,GAAD,MAAiB,CAC/C5B,MAAO4B,EAAW5B,MAClB0d,UACI,8BACI,eAAC,OAAD,CAAM7M,GAAE,wBAAmBjP,EAAWiR,KAAtC,UACKjR,EAAW5B,MACZ,cAAC,EAAD,CACIpE,KAAK,OACL0V,MAAM,UACNtR,MAAK,qBAAgB4B,EAAWggB,YAA3B,YAC0B,IAA3BhgB,EAAWggB,YACL,WACA,cANd,SASKhgB,EAAWggB,kBAZdhgB,EAAWiR,WAqBrC,OAAK/R,EAAYc,WAab,qCACI,cAAC,EAAD,CACIwf,KAAM,CAAEphB,MAAO,oBAAqBuf,KAAM,iBAC1C1S,KAAM/L,EAAYc,WAAWigB,aAEjC,qBAAItN,SAAS,OAAOpX,UAAU,SAA9B,UACK2D,EAAYc,WAAW5B,MACxB,cAAC,EAAD,CAAOpE,KAAK,OAAO0V,MAAM,UAAzB,SACKxQ,EAAYc,WAAWggB,iBAGhC,mBAAGzkB,UAAU,SAAb,sEAGA,oBAAGA,UAAU,SAAb,2DACmD,IAC9C2D,EAAYc,WAAW5B,MAAMgK,cAFlC,OAIC2X,EACD,iCACM,UAAC7gB,EAAYmE,eAAb,aAAC,EAAqBvF,SACpBoB,EAAYmE,QAAQtF,KAAI,SAACgC,GAAD,OACpB,cAAC,EAAD,eAAoCA,GAAhBA,EAAOkR,UAGN,KAAhC,UAAA/R,EAAYmE,eAAZ,eAAqBvF,SAClB,eAAC,IAAD,CAAQ+V,QAAM,EAAd,oCAC4B3U,EAAYc,WAAW5B,YAtCvD,qCACI,oBAAI7C,UAAU,SAAd,+BACA,mBAAGA,UAAU,SAAb,8DAGCwkB,K,4CChDJG,GAOT,CACAC,OAAQ,CACJhhB,KAAM,kBACN7G,IAAK,IACL2S,KAAM,CACF,CAAE3S,IAAK,IAAK6G,KAAM,QAASnF,KAAM,UACjC,CAAE1B,IAAK,KAAM6G,KAAM,YAAanF,KAAM,UACtC,CAAE1B,IAAK,KAAM6G,KAAM,aAAcnF,KAAM,UACvC,CAAE1B,IAAK,KAAM6G,KAAM,aAAcnF,KAAM,UACvC,CAAE1B,IAAK,OAAQ6G,KAAM,WAAYnF,KAAM,UACvC,CAAE1B,IAAK,MAAO6G,KAAM,QAASnF,KAAM,UACnC,CAAE1B,IAAK,OAAQ6G,KAAM,YAAanF,KAAM,UACxC,CAAE1B,IAAK,UAAW6G,KAAM,iBAAkBnF,KAAM,YAChD,CAAE1B,IAAK,MAAO6G,KAAM,MAAOnF,KAAM,YACjC,CAAE1B,IAAK,OAAQ6G,KAAM,OAAQnF,KAAM,YACnC,CAAE1B,IAAK,QAAS6G,KAAM,QAASnF,KAAM,YACrC,CAAE1B,IAAK,SAAU6G,KAAM,SAAUnF,KAAM,cAG/ComB,KAAM,CACFjhB,KAAM,kBACN7G,IAAK,KACL2S,KAAM,CACF,CAAE3S,IAAK,KAAM6G,KAAM,WAAYnF,KAAM,UACrC,CAAE1B,IAAK,IAAK6G,KAAM,OAAQnF,KAAM,UAChC,CAAE1B,IAAK,UAAW6G,KAAM,QAASnF,KAAM,YACvC,CAAE1B,IAAK,QAAS6G,KAAM,OAAQnF,KAAM,YACpC,CAAE1B,IAAK,QAAS6G,KAAM,OAAQnF,KAAM,cAG5C8D,OAAQ,CACJqB,KAAM,YACN7G,IAAK,KACL2S,KAAM,CACF,CAAE3S,IAAK,KAAM6G,KAAM,aAAcnF,KAAM,UACvC,CAAE1B,IAAK,KAAM6G,KAAM,aAAcnF,KAAM,UACvC,CAAE1B,IAAK,OAAQ6G,KAAM,SAAUnF,KAAM,YACrC,CAAE1B,IAAK,OAAQ6G,KAAM,MAAOnF,KAAM,cAG1CqmB,YAAa,CACTlhB,KAAM,aACN7G,IAAK,IACL2S,KAAM,CACF,CAAE3S,IAAK,IAAK6G,KAAM,WAClB,CAAE7G,IAAK,IAAK6G,KAAM,cAClB,CAAE7G,IAAK,IAAK6G,KAAM,aAiCvB,SAASmhB,GAAYtmB,GACxB,OAAQA,GACJ,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,OACL,IAAK,MACL,IAAK,OACL,IAAK,UACL,IAAK,MACL,IAAK,OACL,IAAK,QACL,IAAK,SACD,MAAO,IAEX,IAAK,KACL,IAAK,KACL,IAAK,OACL,IAAK,OACD,MAAO,KAEX,IAAK,KACL,IAAK,IACL,IAAK,UACL,IAAK,QACL,IAAK,QACD,MAAO,KAEX,IAAK,IACL,IAAK,IACL,IAAK,IACD,MAAO,IAEX,IAAK,MACL,QACI,MAAO,OAIZ,SAASumB,GACZC,EACAC,EACAC,GAIA,OAFiBJ,GAAYG,KAEZH,GAAYI,GAAgBF,EAsE1C,SAA6BA,EAAgBG,GAChD,IAAMC,EAAWN,GAAYK,GAE7B,GAAIC,IAAaD,EAAM,OAAOH,EAE9B,GAAiB,MAAbI,EACA,OAAQD,GACJ,IAAK,KACD,OAAgB,GAATH,EACX,IAAK,KACD,OAAgB,IAATA,EACX,IAAK,KACD,OAAgB,IAATA,EACX,IAAK,OACD,OAAOA,GAAU,IAAO,IAC5B,IAAK,MACD,OAAa,IAANA,EACX,IAAK,OACD,OAAa,IAANA,EAEX,IAAK,UACD,OAAOA,GAAU,IAAO,OAC5B,IAAK,MACD,OAAOA,GAAU,IAAO,OAC5B,IAAK,OACD,OAAOA,GAAU,IAAO,QAC5B,IAAK,QACD,OAAOA,GAAU,IAAO,SAC5B,IAAK,SACD,OAAOA,GAAU,IAAO,cAE7B,GAAiB,OAAbI,EACP,OAAQD,GACJ,IAAK,KACD,OAAgB,GAATH,EAEX,IAAK,OACD,OAAgB,GAATA,EAAc,KACzB,IAAK,OACD,OAAgB,GAATA,EAAc,WAE1B,GAAiB,OAAbI,EACP,OAAQD,GACJ,IAAK,IACD,OAAgB,IAATH,EAEX,IAAK,UACD,OAAgB,IAATA,EAAgB,aAC3B,IAAK,QACD,OAAOA,EAAS,UACpB,IAAK,QACD,OAAOA,EAAS,gBAErB,GAAiB,MAAbI,EACP,OAAQD,GACJ,IAAK,IACD,OAAa,IAANH,EAAmB,GAC9B,IAAK,IACD,OAAOA,EAAS,OAI5B,OAAOA,EAlIAK,CAGJ,SAA2BL,EAAgBG,GAC9C,IAAMC,EAAWN,GAAYK,GAE7B,GAAIC,IAAaD,EAAM,OAAOH,EAE9B,GAAiB,MAAbI,EACA,OAAQD,GACJ,IAAK,KACD,OAAOH,EAAS,GACpB,IAAK,KACD,OAAOA,EAAS,IACpB,IAAK,KACD,OAAOA,EAAS,IACpB,IAAK,OACD,OAAOA,GAAU,IAAO,IAC5B,IAAK,MACD,OAAOA,EAAM,IACjB,IAAK,OACD,OAAOA,EAAM,IAEjB,IAAK,UACD,OAAOA,GAAU,IAAO,OAC5B,IAAK,MACD,OAAOA,GAAU,IAAO,OAC5B,IAAK,OACD,OAAOA,GAAU,IAAO,QAC5B,IAAK,QACD,OAAOA,GAAU,IAAO,SAC5B,IAAK,SACD,OAAOA,GAAU,IAAO,cAE7B,GAAiB,OAAbI,EACP,OAAQD,GACJ,IAAK,KACD,OAAOH,EAAS,GAEpB,IAAK,OACD,OAAQA,EAAS,GAAM,KAC3B,IAAK,OACD,OAAQA,EAAS,GAAM,WAE5B,GAAiB,OAAbI,EACP,OAAQD,GACJ,IAAK,IACD,OAAOH,EAAS,IAEpB,IAAK,UACD,OAAQA,EAAS,IAAQ,aAC7B,IAAK,QACD,MAAgB,UAATA,EACX,IAAK,QACD,OAAgB,WAATA,OAEZ,GAAiB,MAAbI,EACP,OAAQD,GACJ,IAAK,IACD,OAAwB,EAAI,GAApBH,EAAS,IACrB,IAAK,IACD,OAAOA,EAAS,OAI5B,OAAOA,EAjEoBM,CAAkBN,EAAQC,GAAWC,GCtJ7D,IAAMK,GAAoB,SAC7BC,GAKA,IAAMC,EAAef,GAAgBc,GAAc/V,KAC7CiW,EAAeD,EAAa,GAAG3oB,IAErC,MAAO,CACH0oB,eACAC,eACAE,kBAAmBD,EACnBE,mBAAoBF,ICHfG,GAAgB,SAAC,EAAD,GAIL,IAHlBC,EAGiB,EAHjBA,mBAAoBC,EAGH,EAHGA,oBACpBJ,EAEiB,EAFjBA,kBAAmBC,EAEF,EAFEA,mBACrBI,EACmB,uDAD6B,KAEhD,YAC2BhgB,IAAvB8f,GACc,OAAbE,IAAqBA,EAASL,uBAWP3f,IAAxB+f,GACc,OAAbC,IAAqBA,EAASJ,mBAY5B,CACHE,mBAAoB,EACpBC,oBAAqB,GAZd,CACHD,mBAAoBf,GAChBgB,EACAH,EACAD,GAEJI,uBAlBG,CACHD,qBACAC,oBAAqBhB,GACjBe,EACAH,EACAC,KCxBHjgB,GAA2B,SAACrI,EAAO6H,GAC5C,OAAQA,EAAO3G,MACX,IAAK,kBAAoB,IAAD,EAMhB+mB,GAAkBpgB,EAAOE,QAAQmgB,cAJjCA,EAFgB,EAEhBA,aACAC,EAHgB,EAGhBA,aACAE,EAJgB,EAIhBA,kBACAC,EALgB,EAKhBA,mBAGJ,OAAO,2BACAtoB,GADP,IAEIkoB,eACAC,eACAE,oBACAC,qBACAE,mBAAoB,EACpBC,oBAAqB,IAG7B,IAAK,mBAAqB,IACd1gB,EAAYF,EAAZE,QACF4gB,EAAwB,2BAAQ3oB,GAAU+H,GAE1C6gB,EAAeL,GAAcvoB,EAAO2oB,EAAW5gB,GAErD,OAAO,2BAAK4gB,GAAcC,GAE9B,IAAK,oBACD,IAAMA,EAAeL,GAAc1gB,EAAOE,QAAS/H,GAEnD,OAAO,2BAAKA,GAAU4oB,GAE1B,QACI,MAAM,IAAIzV,MAAJ,iCAAoCtL,MCTzCN,GAxBgB,WACzB,IAAMshB,EAAgBxpB,OAAOgT,KAAK+U,IAAiBniB,KAAI,SAACzF,GAAD,MAAU,CAC7DA,MACA6G,KAAM+gB,GAAgB5nB,GAAK6G,SAHe,EAW1C4hB,GAAkBY,EAAc,GAAGrpB,KAEvC,MAAO,CACHqpB,gBACAX,aAf0C,EAO1CA,aASAC,aAhB0C,EAQ1CA,aASAE,kBAjB0C,EAS1CA,kBASAC,mBAlB0C,EAU1CA,mBASAE,mBAAoB,EACpBC,oBAAqB,GAIcK,GCtBpC,SAASC,KAAW,IAAD,ECAK,WAGzB,IAAD,EACyBzT,qBAAWjN,GAASd,IAD7C,mBACMvH,EADN,KACad,EADb,KAKD,MAAO,CACHc,QACAf,QAJsBH,mBAAQ,kBCTf,SAACI,GAAD,MAAiC,CACpD8pB,gBAAiB,SAACjhB,GAAD,OACb7I,EAAS,CACLgC,KAAM,kBACN6G,aAERkhB,sBAAuB,SACnBlhB,GADmB,OAGnB7I,EAAS,CACLgC,KAAM,mBACN6G,aAERmhB,uBAAwB,SACpBnhB,GADoB,OAGpB7I,EAAS,CACLgC,KAAM,mBACN6G,aAERohB,uBAAwB,SACpBphB,GADoB,OAGpB7I,EAAS,CACLgC,KAAM,oBACN6G,aAERqhB,wBAAyB,SACrBrhB,GADqB,OAGrB7I,EAAS,CACLgC,KAAM,oBACN6G,cDvBgC9I,CAAQC,KAAW,CAACA,KDYxDmqB,GAlBkB,IAElBrpB,MACI6oB,EAHc,EAGdA,cACAX,EAJc,EAIdA,aACAC,EALc,EAKdA,aACAE,EANc,EAMdA,kBACAC,EAPc,EAOdA,mBACAE,EARc,EAQdA,mBACAC,EATc,EASdA,oBATc,IAWlBxpB,QACI+pB,EAZc,EAYdA,gBACAC,EAbc,EAadA,sBACAC,EAdc,EAcdA,uBACAC,EAfc,EAedA,uBACAC,EAhBc,EAgBdA,wBAIR,OACI,qCACI,oBAAI3mB,UAAU,SAAd,sCACA,mBAAGA,UAAU,SAAb,0EAGA,sBAAKA,UAAWiC,KAAOoP,UAAvB,UACI,cAAC,KAAD,CAEIuH,SAAU2N,EACVvpB,MAAOyoB,EACP7hB,KAAK,eACL8L,KAAM0W,IAEV,sBAAKpmB,UAAWiC,KAAO4kB,OAAvB,UACI,sBAAK7mB,UAAWiC,KAAO6kB,eAAvB,UACI,cAAC,KAAD,CACI9mB,UAAWiC,KAAO+V,MAClBvZ,KAAK,UACLzB,MAAO+oB,EACPniB,KAAK,qBACLoZ,UAAW,GAEXpE,SAAU8N,IAEd,cAAC,KAAD,CAEI9N,SAAU4N,EACVxpB,MAAO4oB,EACPhiB,KAAK,oBACL8L,KAAMgW,OAGd,qBAAK1lB,UAAWiC,KAAO8kB,MAAvB,eACA,sBAAK/mB,UAAWiC,KAAO6kB,eAAvB,UACI,cAAC,KAAD,CACI9mB,UAAWiC,KAAO+V,MAClBvZ,KAAK,UACLzB,MAAOgpB,EACPpiB,KAAK,sBACLoZ,UAAW,GAEXpE,SAAU+N,IAEd,cAAC,KAAD,CAEI/N,SAAU6N,EACVzpB,MAAO6oB,EACPjiB,KAAK,qBACL8L,KAAMgW,gB,wBGhErBsB,GAAuD,SAAC,GAK5C,IAJrBpkB,EAIoB,EAJpBA,SACAC,EAGoB,EAHpBA,MACA4R,EAEoB,EAFpBA,QACAwS,EACoB,EADpBA,aAEMjnB,EAAY,CAACiC,KAAOoiB,MAAO4C,GAAgBhlB,KAAOilB,YACnDzhB,OAAOsP,SACPM,KAAK,KAEV,OACI,eAAC,EAAD,CAAO5W,KAAK,OAAOoE,MAAOA,EAAO7C,UAAWA,EAAWmU,MAAM,UAA7D,UACI,qBAAKnU,UAAWiC,KAAOiX,KAAvB,SAA8BtW,IAC9B,cAAC,IAAD,CAAS5C,UAAWiC,KAAOklB,cAAetkB,MAAM,QAAhD,SACI,wBAAQ7C,UAAWiC,KAAOuS,OAAQC,QAASA,EAA3C,SACI,cAAC,IAAD,CAAM1U,KAAK,kB,UCxBlB6F,GAA0B,SAACrI,EAAO6H,GAC3C,OAAQA,EAAO3G,MACX,IAAK,aACD,OAAO,2BACAlB,GADP,IAEIuK,QAAS1C,EAAOE,QAChBoV,WAAW,IAGnB,IAAK,eACD,OAAO,2BAAKnd,GAAZ,IAAmBmd,WAAW,IAElC,IAAK,oBACD,OAAInd,EAAM6pB,oBAAoBnR,SAAS7Q,EAAOE,SACnC/H,EAEJ,2BACAA,GADP,IAEI6pB,oBAAoB,GAAD,mBACZ7pB,EAAM6pB,qBADM,CAEfhiB,EAAOE,YAInB,IAAK,oBACD,OAAI/H,EAAM8pB,oBAAoBpR,SAAS7Q,EAAOE,SACnC/H,EAEJ,2BACAA,GADP,IAEI8pB,oBAAoB,GAAD,mBACZ9pB,EAAM8pB,qBADM,CAEfjiB,EAAOE,YAInB,IAAK,mBACD,OAAO/H,EAEX,IAAK,mBACD,OAAO,2BACAA,GADP,IAEI6pB,oBAAqB7pB,EAAM6pB,oBAAoB3hB,QAC3C,SAAChB,GAAD,OAAgBA,EAAW/B,KAAO0C,EAAOE,WAE7C+hB,oBAAqB9pB,EAAM8pB,oBAAoB5hB,QAC3C,SAAChB,GAAD,OAAgBA,EAAW/B,KAAO0C,EAAOE,aAIrD,QACI,MAAM,IAAIoL,MAAJ,iCAAoCtL,MCnDzCN,GAA6B,CACtCsiB,oBAAqB,GACrBC,oBAAqB,GACrBvf,QAAS,GACT4S,WAAW,GCHFhW,GAAkB,uCAAG,WAAOkX,GAAP,iBAAA9V,EAAA,sEACIvB,IAAIG,OAAOf,cADf,QACxB2jB,EADwB,QAGNjgB,UACdqI,EAAO4X,EAAoB/f,OAAO/E,KAAI,SAACiC,GAAD,MAAiB,CACzDA,aACA/B,GAAI+B,EAAW/B,GACf4X,QAAS7V,EAAWigB,WACfliB,KAAI,SAAC4K,GAAD,OAAUA,EAAKvK,SACnBwS,KAAK,gBAGduG,EAAQlM,IAZkB,2CAAH,sD,8BCQlB6X,GAA4B,WAAO,IAAD,ECJjB,WAGxB,IAAD,EACyB1U,qBAAWjN,GAASd,IAD7C,mBACMvH,EADN,KACad,EADb,KAEK+qB,EAAoBnrB,mBAAQ,kBCTf,SAACI,GAAD,MAAgC,CACnD6mB,WAAY,SAAChe,GAAD,OACR7I,EAAS,CAAEgC,KAAM,aAAc6G,aACnCmiB,aAAc,kBAAYhrB,EAAS,CAAEgC,KAAM,kBAC3CipB,kBAAmB,SACfpiB,GADe,OAER7I,EAAS,CAAEgC,KAAM,oBAAqB6G,aACjDqiB,kBAAmB,SACfriB,GADe,OAER7I,EAAS,CAAEgC,KAAM,oBAAqB6G,aACjDsiB,iBAAkB,SACdtiB,GADc,OAEP7I,EAAS,CAAEgC,KAAM,mBAAoB6G,aAChDuiB,iBAAkB,SACdviB,GADc,OAEP7I,EAAS,CAAEgC,KAAM,mBAAoB6G,cDNR9I,CAAQC,KAAW,CAACA,IA6B5D,OA3BAgD,qBAAU,WAEDlC,EAAM6pB,oBAAoB7kB,QAC1BhF,EAAM8pB,oBAAoB9kB,OAO/BgC,IAAIC,OACCE,OAAO,CACJojB,mBACIvqB,EAAM6pB,oBAAoB5kB,KACtB,SAACiC,GAAD,OAAgBA,EAAW/B,OAC1B,KAKZod,MAAK,SAAC1Y,GACCA,EAASC,SACTmgB,EAAkBlE,WAAWlc,EAASG,WAjB9CigB,EAAkBlE,WAAW,MAoBlC,CAAC/lB,EAAM6pB,oBAAqB7pB,EAAM8pB,sBAE9B,CAAE9pB,QAAOf,QAASgrB,GD1BrBO,GAJuC,IAEvCxqB,MAAS6pB,EAF8B,EAE9BA,oBAAqBtf,EAFS,EAETA,QAAS4S,EAFA,EAEAA,UAFA,IAGvCle,QAAWkrB,EAH4B,EAG5BA,kBAAmBG,EAHS,EAGTA,iBASlC,OACI,qCACI,oBAAI7nB,UAAU,SAAd,kCACA,mBAAGA,UAAU,SAAb,4GAIA,cAAC,KAAD,CACI4X,MAAM,0BAENlT,OAAQA,GACRrE,MAAM,OACNlD,QAAS,CAAE+d,eAAe,EAAMlB,SAAU,SAC1CpB,SAnBoD,SAACxL,IAC7D,OAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAM3I,aACNijB,EAAkBta,EAAK3I,eAmBvB,qBAAKzE,UAAWiC,KAAOkd,eAAvB,SACKiI,EAAoB5kB,KAAI,SAACiC,GAAD,OACrB,cAAC,GAAD,CAEIgQ,QAAS,kBAAMoT,EAAiBpjB,EAAW/B,KAC3CukB,cAAY,EAHhB,SAKI,cAAC,IAAD,CACIpkB,MAAO4B,EAAWigB,WACbliB,KAAI,SAACkiB,GAAD,OAAgBA,EAAW7hB,SAC/BwS,KAAK,eACV5X,MAAO,IAJX,SAMKgH,EAAW5B,SAVX4B,EAAW/B,SAe5B,gCACKgY,GAAa,cAAC,KAAD,IACb5S,EAAQtF,KAAI,SAACgC,GAAD,OACT,cAAC,EAAD,eAEQA,GADCA,EAAOkR,eGtD7B,SAASsS,KAAmB,IACvBxV,EAAUtW,cAAVsW,MAER,cAAQA,QAAR,IAAQA,OAAR,EAAQA,EAAQ,IACZ,IAAK,YACD,OAAwB,IAAjBA,EAAMjQ,OAAe,6CAAa,cAAC+jB,GAAD,IAE7C,IAAK,cACD,OAAwB,IAAjB9T,EAAMjQ,OAAe,6CAAa,cAAC,GAAD,IAE7C,QACI,OAAO,cAACyU,GAAD,K,yCCZNiR,GAAS,SAAC,GAAD,IAAGrlB,EAAH,EAAGA,SAAH,OAClB,sBAAM5C,UAAWiC,KAAOimB,OAAxB,SAAiCtlB,KAGxBulB,GAAS,kBAAM,oBAAInoB,UAAWiC,KAAOmmB,UAErCnc,GAAK,SAAC,GAAD,IAAGrJ,EAAH,EAAGA,SAAU0V,EAAb,EAAaA,OAAb,OACd,oBAAItY,UAAWI,qBAAW,gBAAG6B,KAAOqW,SAAWA,IAA/C,SAA2D1V,KAGlDsJ,GAAK,SAAC,GAAD,IAAGtJ,EAAH,EAAGA,SAAU0V,EAAb,EAAaA,OAAb,OACd,oBAAItY,UAAWI,qBAAW,gBAAG6B,KAAOqW,SAAWA,IAA/C,SAA2D1V,KAGlDuJ,GAAK,SAAC,GAAD,IAAGvJ,EAAH,EAAGA,SAAU0V,EAAb,EAAaA,OAAb,OACd,oBAAItY,UAAWI,qBAAW,gBAAG6B,KAAOqW,SAAWA,IAA/C,SAA2D1V,KAGlDwJ,GAAK,SAAC,GAAD,IAAGxJ,EAAH,EAAGA,SAAU0V,EAAb,EAAaA,OAAb,OACd,oBAAItY,UAAWI,qBAAW,gBAAG6B,KAAOqW,SAAWA,IAA/C,SAA2D1V,KCrBlDylB,GAAU,WACnB,OACI,qCACI,cAAC,GAAD,CAAI/P,QAAM,EAAV,2BACA,eAAC,GAAD,CAAIA,QAAM,EAAV,qCAC4B,cAAC,GAAD,qCAAwC,IADpE,YAEa,cAAC,GAAD,uCAFb,yBAIA,cAAC,GAAD,IACA,cAAC,GAAD,sBACA,uNAKA,iHAIA,+BACI,+BACI,cAAC,GAAD,sCADJ,iDAIA,+BACI,cAAC,GAAD,gCADJ,yGAKA,+BACI,cAAC,GAAD,0BADJ,oEA3BR,6CAiCI,cAAC,GAAD,IACA,cAAC,GAAD,+BACA,2jBAWA,4BACI,cAAC,GAAD,oEAIJ,cAAC,GAAD,IACA,cAAC,GAAD,mCACA,sRAMA,8BACI,kCACI,gCACI,+BACI,sCACA,yCACA,2CACA,0CACA,2CAGR,kCACI,+BACI,6BACI,6CAEJ,6BACI,iDAEJ,6BACI,iGAKJ,6BACI,0CAEJ,6BACI,qCAEI,uBAFJ,iBAOR,+BACI,6BACI,6CAEJ,6BACI,iDAEJ,6BACI,qJAMJ,6BACI,mBAAGtY,UAAU,SAAb,uBAEJ,6BACI,qCAEI,uBAFJ,iBAOR,+BACI,6BACI,0CAEJ,6BACI,iDAEJ,6BACI,0JAMJ,6BACI,mBAAGA,UAAU,SAAb,uBAEJ,6BACI,qCAEI,uBAFJ,iBAOR,+BACI,6BACI,8CAEJ,6BACI,iDAEJ,6BACI,gFAKJ,6BACI,0CAEJ,6BACI,qCAEI,uBAFJ,yBAUpB,cAAC,GAAD,IACA,cAAC,GAAD,8BACA,kMAKA,8BACI,kCACI,gCACI,+BACI,sCACA,yCACA,2CACA,0CACA,2CAGR,gCACI,+BACI,6BACI,6CAEJ,6BACI,iDAEJ,6BACI,iJAMJ,6BACI,0CAEJ,6BACI,qCAEI,uBAFJ,wBAUpB,cAAC,GAAD,IACA,4BACI,wEChOHsoB,GAAU,WACnB,OAAO,iD,SCsCLC,GAAY,SAAC,GAA8B,IAA5B/hB,EAA2B,EAA3BA,SACXqE,EAAWxN,mBACXlB,GAAmB,OAARqK,QAAQ,IAARA,OAAA,EAAAA,EAAUrK,WAAY,GACjCqW,EAAQrW,EAAS2Y,MAAM,KAAKrP,OAAOsP,SACnCC,EAAU,OAAGxC,QAAH,IAAGA,OAAH,EAAGA,EAAQ,GAErBtS,EAA4B,CAC9BsS,QACArW,WACA6Y,cAGEvY,EAAWC,cAIjBsK,QAAQC,IAAI8D,gBAEZtL,qBAAU,WAWN,OAVAhD,EAASkJ,gBACTqB,QAAQC,IACJ/G,EAAK/D,SACL6L,eACA6C,EAAS7M,QACT6M,EAAS7M,SAAWgK,eAEpB,CAAEwgB,SAAU1qB,OAAO0I,SAASC,OAASoE,EAAS7M,UAG3C,WACH6M,EAAS7M,QAAUF,OAAO0I,SAASC,QAExC,CAAChK,EAAUyD,IAMd,IAAMqgB,EAhEW,SAACvL,GAClB,OAAQA,GACJ,UAAK/O,EACD,OAAO,8BAAK,oBAAIjG,UAAU,SAAd,2CAEhB,IAAK,WACD,OAAO,cAAC,IAAD,IAEX,IAAK,aACD,OAAO,cAACqjB,EAAD,IAEX,IAAK,eACD,OAAO,cAAC2E,GAAD,IAEX,IAAK,gBACD,OAAO,cAAC,GAAD,IAEX,IAAK,oBACD,OAAO,cAAC,GAAD,IAEX,QACI,OAAO,0DA2CGS,CAAazT,GAE/B,OAAO,cAAC,EAAD,CAAQ9U,KAAMA,EAAd,SAAqBqgB,KAqCzB,IAAMmI,GAAS,kBAClB,cAAC,IAAD,UACI,cAAC,IAAD,CACIxoB,KAAK,IACLyoB,OAAK,EACLpI,UAAW,SAAC7B,GAAD,OAAgB,cAAC,GAAD,eAAeA,U,SC/GlC3J,QACa,cAA7BjX,OAAO0I,SAASoiB,UAEiB,UAA7B9qB,OAAO0I,SAASoiB,UAEhB9qB,OAAO0I,SAASoiB,SAAS9S,MACrB,2D,iCCXC+S,GAAkC,WAC3C,IAAM9gB,EAAQ1F,YAAYmG,KAClBC,EAAqBpG,YAAYwG,MAAjCJ,iBAkBR,OAhBAhJ,qBAAU,WAKN,MAJc,SAAVsI,GACA6C,SAAS5E,KAAK8iB,UAAUvjB,IAAI,QAGzB,kBAAMqF,SAAS5E,KAAK8iB,UAAU5lB,OAAO,WAC7C,CAAC6E,IAEJtI,qBAAU,WAKN,OAJIgJ,GACAmC,SAAS5E,KAAK8iB,UAAUvjB,IAAIwjB,KAAiBnrB,MAG1C,kBAAMgN,SAAS5E,KAAK8iB,UAAU5lB,OAAO6lB,KAAiBnrB,SAC9D,CAAC6K,IAEG,8B,qBCxBEugB,GAAa,WACtB,OAAO,qBAAKhpB,UAAWiC,KAAOgnB,OCGrBC,GAAkB,WAC3B,OACI,qCACI,cAAC,KAAD,CAASlpB,UAAWiC,IAAOyW,UAC3B,cAAC,GAAD,IACA,cAAC,IAAD,IACA,cAAC,GAAD,Q,wCCHCyQ,GAAb,oDACI,WAAYzK,GAAwB,IAAD,+BAC/B,cAAMA,IACDnhB,MAAQ,CAAE6rB,UAAU,GAFM,EADvC,sDAgBI,SAAkBrlB,EAAcslB,GAI5BriB,QAAQC,IAAI,oBAAqBlD,EAAOslB,KApBhD,oBAuBI,WAMI,OAAOpJ,KAAKvB,MAAM9b,YA7B1B,uCAMI,SAAgCmB,GAO5B,OAJAiD,QAAQC,IAAI,2BAA4BlD,GAExCQ,IAAII,MAAMZ,MAAMA,GAET,CAAEqlB,UAAU,OAb3B,GAAmCb,aCCnCe,EAAQ,KAERA,EAAQ,KACRA,EAAQ,KAERC,IAASC,OACL,cAAC,aAAD,UACI,cAAC,IAAD,CAAU7iB,MAAOA,KAAjB,SACI,eAAC,GAAD,WACI,cAAC,IAAD,UACI,cAAC,GAAD,MAEJ,cAAC,GAAD,WAIZiE,SAAS6e,eAAe,SLiHpB,kBAAmB5f,WACnBA,UAAU6f,cAAcC,MACnB7J,MAAK,SAAC8J,GACHA,EAAaC,gBAEhB/iB,OAAM,SAAC/C,GACJiD,QAAQjD,MAAMA,EAAM+lB,c","file":"static/js/main.d5df6b8b.chunk.js","sourcesContent":["export { v4 as generateId } from 'uuid';\n\nexport { classNames } from './classNames';\nexport { testString as matchTestString } from './match/testString';\nexport { capitalizeFirstLetter } from './string/capitalize-first-letter';\n\nexport { debounce } from './events/debounce';\nexport { throttle } from './events/throttle';\n\nexport { getElementRect } from './element/get-element-rect';\nexport { getElementDimensions } from './element/get-element-dimensions';\nexport { getScrollPosition } from './element/get-scroll-position';\nexport { isVisible } from './element/is-visible';\nexport { scrollToElement } from './element/scroll-to-element';\n\nexport { Link } from './link/link';\n\nexport * from './json';\nexport * from './local-storage';\n\nexport { filterUnique } from './array/filter/filerUnique';\n\nexport { sortBy, sortByKey } from './array/sort/sort-by';\n\nexport { delay } from './promise/delay';\n\nexport { getRandomNumber } from './random/number';\nexport { getRandomString, getRandomKey } from './random/string';\n","import { useMemo } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { IRouteProps } from 'typings';\nimport { getPath } from './get-path';\n\nexport const usePath = (): IRouteProps['path'] => {\n const { pathname } = useLocation();\n\n return useMemo(() => getPath(pathname), [pathname]);\n};\n","import { useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\n\nexport const useActions = (\n actions: Record void>\n): Record void> => {\n const dispatch = useDispatch();\n\n const result = useMemo(() => {\n const remapped: any = {};\n\n Object.entries(actions).forEach(([key, value]: [string, any]): void => {\n remapped[key] = (): void => dispatch(value());\n });\n\n return remapped as Record void>;\n }, [actions]);\n\n return result;\n};\n","import { useState, useCallback, useRef, useMemo } from 'react';\n\ntype OptionsType = {\n delay?: number;\n openCallback?: () => void;\n closeCallback?: () => void;\n};\n\nexport interface IUseToggle {\n (defaultValue: boolean, options?: OptionsType): {\n state: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n delayedClose: () => void;\n setState: (value: boolean) => void;\n };\n}\n\nexport const useToggle: IUseToggle = (defaultValue, options) => {\n const timeout = useRef();\n const [state, setState] = useState(defaultValue);\n\n const { delay, openCallback, closeCallback }: OptionsType = useMemo(\n () => ({\n delay: 200,\n ...options,\n }),\n [options]\n );\n\n const open = useCallback(() => {\n window.clearTimeout(timeout.current);\n setState(true);\n\n if (typeof openCallback === 'function') {\n openCallback();\n }\n }, [openCallback]);\n\n const close = useCallback(() => {\n setState(false);\n\n if (typeof closeCallback === 'function') {\n closeCallback();\n }\n }, [closeCallback]);\n\n const toggle = useCallback(() => {\n if (state) close();\n else open();\n }, [state]);\n\n const delayedClose = useCallback(() => {\n timeout.current = window.setTimeout(close, delay);\n }, [close, delay]);\n\n return { state, open, close, toggle, delayedClose, setState };\n};\n","import { RefObject, useEffect } from 'react';\nimport { throttle } from 'utils';\n\n// NEEDS WORK! mouseleave does not work\n\nexport type IEvent = 'mouseenter' | 'mouseleave';\nexport type Target = RefObject;\nexport type Callback = (event?: IEvent, target?: Target) => void;\n\nexport interface IUseEventListener {\n (target: Target, callback: Callback, events: IEvent[]): void;\n}\n\ntype IListeners = {\n [event in IEvent]?: {\n target: Target;\n callback: Callback;\n }[];\n};\nconst listeners: IListeners = {};\n\nconst handleEvent = throttle((event: any) => {\n //console.log(event);\n const type = event.type as IEvent;\n\n if (!listeners[type]) return;\n\n // TODO: Throttle this instead. So it throttles for each specific type, not all events – might override some otherwise\n listeners[type]?.forEach(({ target, callback }) => {\n const eventTarget =\n type === 'mouseleave' ? event.fromElement : event.target;\n\n if (\n target.current !== eventTarget &&\n (type !== 'mouseleave' || !eventTarget.contains(target.current))\n )\n return;\n //console.log(target.current, eventTarget);\n\n callback(type, target);\n });\n}, 100);\n\nconst addListener = (event: IEvent, target: Target, callback: Callback) => {\n //console.log('adding', listeners);\n\n if (!listeners[event]?.length) {\n listeners[event] = [];\n console.log(`Adding ${event} listener`);\n document.addEventListener(event, handleEvent, true);\n }\n\n listeners[event]?.push({\n target,\n callback,\n });\n};\n\nconst removeListener = (event: IEvent, target: Target, callback: Callback) => {\n //console.log('removing', listeners, listeners[event]);\n\n if (!listeners[event]) return;\n\n const listenerIndex = listeners[event]!.findIndex(\n (listener) =>\n listener.target === target && listener.callback === callback\n );\n\n if (listenerIndex !== -1) {\n listeners[event]!.splice(listenerIndex, 1);\n } else {\n console.log('error removing!!');\n }\n\n if (!listeners[event]!.length) {\n console.log(`Removeing ${event} listener`);\n document.removeEventListener(event, handleEvent, true);\n }\n};\n\nconst addListeners = (events: IEvent[], target: Target, callback: Callback) =>\n events.forEach((event) => addListener(event, target, callback));\n\nconst removeListeners = (\n events: IEvent[],\n target: Target,\n callback: Callback\n) => events.forEach((event) => removeListener(event, target, callback));\n\nexport const useEventListener: IUseEventListener = (\n target,\n callback,\n events\n) => {\n //console.log(listeners);\n\n useEffect(() => {\n if (target.current !== null) {\n addListeners(events, target, callback);\n\n return () => removeListeners(events, target, callback);\n }\n }, [target, callback, events]);\n};\n","import { useState, useEffect } from 'react';\nimport { throttle } from 'utils';\n\ntype Breakpoints = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\ntype WindowSizeType = {\n width: number;\n height: number;\n breakpoint: Breakpoints;\n};\n\nconst breakpoints: Record = {\n xs: 0,\n sm: 480,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1800,\n};\n\nconst getBreakpoint = (width: number): Breakpoints => {\n if (width < breakpoints.sm) return 'xs';\n else if (width < breakpoints.md) return 'sm';\n else if (width < breakpoints.lg) return 'md';\n else if (width < breakpoints.xl) return 'lg';\n else if (width < breakpoints.xxl) return 'xl';\n\n return 'xxl';\n};\n\nexport function useWindowSize(): WindowSizeType {\n const [windowSize, setWindowSize] = useState({\n width: window.innerWidth,\n height: window.innerHeight,\n breakpoint: getBreakpoint(window.innerWidth),\n });\n\n const handleResize = throttle(() => {\n setWindowSize({\n width: window.innerWidth,\n height: window.innerHeight,\n breakpoint: getBreakpoint(window.innerWidth),\n });\n }, 400);\n\n useEffect(() => {\n window.addEventListener('resize', handleResize);\n\n return (): void => window.removeEventListener('resize', handleResize);\n }, []);\n\n return windowSize;\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"categoryName\":\"navigation_categoryName__2pqgb\",\"itemName\":\"navigation_itemName__264U8\",\"itemDescription\":\"navigation_itemDescription__vWPO2\",\"container\":\"navigation_container__2ZrZn\",\"header\":\"navigation_header__2Bv6T\",\"categories\":\"navigation_categories__FxXPR\",\"content\":\"navigation_content__1ekMl\",\"visible\":\"navigation_visible__1G9iB\",\"category\":\"navigation_category__1MsiQ\",\"categoryIcon\":\"navigation_categoryIcon__1Y3S1\",\"item\":\"navigation_item__3pbqW\",\"active\":\"navigation_active__2GGUU\",\"button\":\"navigation_button__2b0BG\",\"open\":\"navigation_open__ZMO4A\"};","import React from 'react';\nimport { IconKey } from './types';\nimport { icons } from './icons';\nimport style from './icon.module.scss';\nimport { classNames } from 'utils';\n\ninterface IIcon extends Partial {\n icon: IconKey;\n}\n\nexport const Icon = ({ icon, className }: IIcon) => {\n const [width, height, path] = icons[icon] as [number, number, string];\n const iconClassName = classNames(style.icon, className);\n\n return (\n \n \n \n );\n};\n","import React, { useEffect, useRef, ReactNode, useState } from 'react';\nimport styles from './tooltip.module.scss';\nimport { classNames, getElementDimensions } from 'utils';\n\ninterface ITooltipOverlay {\n content: ReactNode;\n position: {\n top: number;\n left: number;\n width: number;\n height: number;\n };\n placement: 'left' | 'right' | 'top' | 'bottom';\n}\n\nconst spacing = 4;\n\ntype CoordinatesType = {\n top: number;\n left: number;\n placement: ITooltipOverlay['placement'];\n};\n\nfunction getCoordinates(\n dimensions: { width: number; height: number },\n position: ITooltipOverlay['position'],\n placement: ITooltipOverlay['placement'] | null,\n previousPlacements: ITooltipOverlay['placement'][] = []\n): CoordinatesType {\n let calcForPlacement: ITooltipOverlay['placement'];\n\n if (placement) {\n calcForPlacement = placement;\n } else if (previousPlacements.indexOf('top') === -1) {\n calcForPlacement = 'top';\n } else if (previousPlacements.indexOf('right') === -1) {\n calcForPlacement = 'right';\n } else if (previousPlacements.indexOf('left') === -1) {\n calcForPlacement = 'left';\n } else if (previousPlacements.indexOf('bottom') === -1) {\n calcForPlacement = 'bottom';\n } else {\n calcForPlacement = 'top';\n }\n\n switch (calcForPlacement) {\n case 'top':\n default: {\n const newPosition: CoordinatesType = {\n top: position.top - dimensions.height - spacing,\n left: Math.round(\n position.left + (position.width - dimensions.width) / 2\n ),\n placement: 'top',\n };\n\n if (\n newPosition.top < 0 &&\n previousPlacements.indexOf('top') === -1\n ) {\n return getCoordinates(dimensions, position, null, [\n ...previousPlacements,\n 'top',\n ]);\n }\n\n return newPosition;\n }\n case 'bottom': {\n const newPosition: CoordinatesType = {\n top: position.top + position.height + spacing,\n left: Math.round(\n position.left + (position.width - dimensions.width) / 2\n ),\n placement: 'bottom',\n };\n\n // Check for screen height\n\n return newPosition;\n }\n case 'right': {\n const newPosition: CoordinatesType = {\n top: Math.max(\n 0,\n Math.round(\n position.top + (position.height - dimensions.height) / 2\n )\n ),\n left: position.left + position.width + spacing,\n placement: 'right',\n };\n\n if (\n newPosition.left < 0 &&\n previousPlacements.indexOf('right') === -1\n ) {\n return getCoordinates(dimensions, position, null, [\n ...previousPlacements,\n 'right',\n ]);\n }\n\n return newPosition;\n }\n case 'left': {\n const newPosition: CoordinatesType = {\n top: Math.max(\n 0,\n Math.round(\n position.top + (position.height - dimensions.height) / 2\n )\n ),\n left: position.left - dimensions.width - spacing,\n placement: 'left',\n };\n\n if (\n newPosition.left < 0 &&\n previousPlacements.indexOf('top') === -1\n ) {\n return getCoordinates(dimensions, position, null, [\n ...previousPlacements,\n 'top',\n ]);\n }\n\n return newPosition;\n }\n }\n}\n\nexport const TooltipOverlay = ({\n content,\n position,\n placement,\n}: ITooltipOverlay) => {\n const tooltipRef = useRef(null);\n const [\n { placement: tooltipPlacement, ...tooltipPosition },\n setTooltipPosition,\n ] = useState>({});\n\n useEffect(() => {\n if (tooltipRef.current) {\n const dimensions = getElementDimensions(tooltipRef.current);\n\n setTooltipPosition(getCoordinates(dimensions, position, placement));\n }\n }, [tooltipRef, content, position, placement]);\n\n return (\n \n {content}\n \n );\n};\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { getState } from './slice';\nimport { TooltipOverlay } from './tooltip-overlay';\n\nexport const TooltipContainer = () => {\n const { activeTooltips } = useSelector(getState);\n\n if (!activeTooltips?.length) return null;\n\n return (\n <>\n {activeTooltips.map((tooltip) => (\n \n ))}\n \n );\n};\n","import React, {\n FunctionComponent,\n ReactNode,\n useRef,\n useEffect,\n useCallback,\n} from 'react';\nimport { useDispatch } from 'react-redux';\nimport styles from './tooltip.module.scss';\nimport { classNames, debounce, generateId, getElementRect } from 'utils';\nimport { IChildren, IClassName } from 'typings';\nimport { hover, remove } from './slice';\n\nexport interface ITooltip extends IChildren, IClassName {\n title: ReactNode;\n placement?: 'left' | 'right' | 'top' | 'bottom';\n //trigger?: ('click' | 'hover' | Function)[];\n delay?: number;\n}\n\nexport const Tooltip: FunctionComponent = ({\n children,\n className,\n title,\n placement = 'top',\n delay = 50,\n}: ITooltip) => {\n const id = useRef('');\n const tooltipInitiater = useRef(null);\n const dispatch = useDispatch();\n const triggerClassName = classNames(styles.trigger, className);\n\n useEffect(() => {\n id.current = generateId();\n\n return () => {\n dispatch(remove(id.current));\n };\n }, []);\n\n const handleEnter = useCallback(\n debounce(() => {\n if (tooltipInitiater.current) {\n const data = {\n id: id.current,\n position: getElementRect(tooltipInitiater.current),\n content: title,\n placement,\n };\n\n dispatch(hover(data, delay));\n }\n }, 200),\n [id.current, tooltipInitiater.current]\n );\n\n const handleLeave = useCallback(\n debounce(() => dispatch(remove(id.current)), 200),\n [id.current]\n );\n\n return (\n \n {children}\n \n );\n};\n","import { IIngredient } from '../ingredient/typings';\nimport { getData, Response } from '../get';\n\nexport function ingredients(name?: string): Promise> {\n return getData({\n url: 'search/ingredients',\n data: { name },\n });\n}\n","import { postData, Response } from '../post';\n\nexport function error(error: Error): Promise> {\n return postData({\n url: 'track/error',\n data: {\n errorMessage: error.toString(),\n stack: JSON.stringify(error, Object.getOwnPropertyNames(error)),\n },\n });\n}\n","import * as recipe from './recipe';\nimport * as ingredient from './ingredient';\nimport * as search from './search';\nimport * as track from './track';\nimport * as media from './media';\n\nexport const api = {\n recipe,\n ingredient,\n search,\n track,\n media,\n};\n","import { ReactNode } from 'react';\nimport { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { AppThunk, RootState } from 'store';\n\nexport const stateScope = 'tooltips';\n\ninterface ITooltip {\n id: string;\n position: {\n top: number;\n left: number;\n width: number;\n height: number;\n };\n content: ReactNode;\n placement: 'left' | 'right' | 'top' | 'bottom';\n}\n\ninterface IHoveredTooltip {\n id: string;\n timeoutEvent: number;\n}\n\ntype ITooltipsState = {\n activeTooltips: ITooltip[];\n hovered: IHoveredTooltip[];\n};\n\nconst initialState: ITooltipsState = {\n activeTooltips: [],\n hovered: [],\n};\n\nexport const slice = createSlice({\n name: stateScope,\n initialState,\n reducers: {\n setHovered: (state, action: PayloadAction): void => {\n state.hovered.push(action.payload);\n },\n add: (state, action: PayloadAction): void => {\n if (\n state.hovered.some(\n (tooltip) => tooltip.id === action.payload.id\n )\n ) {\n state.hovered = state.hovered.filter(\n (tooltip) => tooltip.id !== action.payload.id\n );\n\n state.activeTooltips.push(action.payload);\n }\n },\n remove: (state, action: PayloadAction): void => {\n const { payload } = action;\n\n const hovered = state.hovered.filter(\n (tooltip) => tooltip.id === payload\n );\n\n if (hovered) {\n hovered.forEach((hovered) =>\n clearTimeout(hovered.timeoutEvent)\n );\n state.hovered = state.hovered.filter(\n (tooltip) => tooltip.id !== payload\n );\n }\n\n state.activeTooltips = state.activeTooltips.filter(\n (tooltip) => tooltip.id !== payload\n );\n },\n clearAllTooltips: (): ITooltipsState => {\n return initialState;\n },\n },\n});\n\nexport const { reducer, actions } = slice;\n\nexport const { add, remove, clearAllTooltips } = actions;\n\nexport const getState = (state: RootState): ITooltipsState => state[stateScope];\n\nexport const reduced = { [stateScope]: reducer };\n\nexport const hover = (data: ITooltip, delay: number): AppThunk => (\n dispatch\n): void => {\n const timeoutEvent = window.setTimeout(() => {\n dispatch(add(data));\n }, delay);\n\n dispatch(actions.setHovered({ id: data.id, timeoutEvent }));\n};\n","import { store } from \"store\";\n\nexport type Response =\n | {\n status: 200;\n success: true;\n result: T;\n }\n | {\n status: 404;\n success: false;\n };\n\nexport async function postData({\n url,\n data,\n formatResult,\n}: {\n url: string;\n data?: string | Record;\n formatResult?: (result: T) => T;\n}): Promise> {\n // Default options are marked with *\n const body =\n data !== null && data !== undefined ? JSON.stringify(data) : undefined;\n\n const response = await fetch(`${process.env.REACT_APP_API_URL}/${url}`, {\n method: 'POST', // *GET, POST, PUT, DELETE, etc.\n mode: 'cors', // no-cors, *cors, same-origin\n //cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached\n //credentials: 'same-origin', // include, *same-origin, omit\n headers: {\n 'Content-Type': 'application/json',\n // 'Content-Type': 'application/x-www-form-urlencoded',\n 'Content-Length': body?.length?.toString() || '0',\n //'Access-Control-Allow-Origin': '*',\n //'Access-Control-Allow-Credentials': 'true',\n URL: window.location.href,\n Validate: store.getState().user.uuid,\n },\n //redirect: 'follow', // manual, *follow, error\n //referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url\n body, // body data type must match \"Content-Type\" header\n }).catch((e) => {\n console.log(e);\n console.log('Can’t access ' + url + ' response. Blocked by browser?');\n\n return {\n status: 500,\n json: (): void => {\n return;\n },\n };\n });\n\n if (process.env.NODE_ENV === 'development') {\n console.log(response);\n }\n\n const status = response.status as Response['status'];\n const success = status.toString().charAt(0) === '2';\n\n if (success) {\n const result: T = await response?.json(); // parses JSON response into native JavaScript objects\n\n const formattedResult =\n typeof formatResult === 'function' ? formatResult(result) : result;\n\n return {\n status: status as 200,\n success,\n result: formattedResult,\n };\n }\n\n return {\n status: status as 404,\n success,\n };\n}\n","import { IPreviewRecipe } from '../typings';\nimport { getSrc } from 'api/media';\n\nexport function mapMediaSrc(recipe: T): T {\n if (!recipe.mediaSrc && recipe.mediaID) {\n recipe.mediaSrc = getSrc(recipe.mediaID);\n }\n\n return recipe;\n}\n\nexport function mapMultipleMediaSrc(\n recipes: T[]\n): T[] {\n return recipes.map(mapMediaSrc);\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"label\":\"input_label__2WrzO\",\"container\":\"input_container__1MvsY\",\"withSpinner\":\"input_withSpinner__1EZXi\",\"withButton\":\"input_withButton__2qvDz\",\"withLabel\":\"input_withLabel__2R1mY\",\"input\":\"input_input__39ODT\",\"spinner\":\"input_spinner__1pnbk\",\"button\":\"input_button__1gAab\"};","import { createSlice } from '@reduxjs/toolkit';\nimport { RootState } from 'store';\nimport {\n LocalStorageTypes,\n getFromLocalStorage,\n setFromLocalStorage,\n} from 'utils';\nimport { getReferrer } from 'utils/track/index';\n\nexport const stateScope: LocalStorageTypes = 'layout';\n\ninterface ILayout {\n theme: 'light' | 'dark';\n}\n\nconst getThemeFromLocalStorage = (): ILayout['theme'] => {\n getReferrer();\n \n return getFromLocalStorage(stateScope, 'light');\n};\n\nconst saveThemeToLocalStorage = (theme: ILayout['theme']): void => {\n setFromLocalStorage(stateScope, theme);\n};\n\nconst getCurrentTheme = (): ILayout['theme'] => {\n const theme = getThemeFromLocalStorage();\n\n if (theme === 'dark') return theme;\n\n const hours = new Date().getHours();\n\n return hours > 20 || hours < 8 ? 'dark' : 'light';\n};\n\nconst initialState: ILayout = {\n theme: getCurrentTheme(),\n};\n\nexport const slice = createSlice({\n name: stateScope,\n initialState,\n reducers: {\n toggleTheme: (state): void => {\n state.theme = state.theme === 'light' ? 'dark' : 'light';\n saveThemeToLocalStorage(state.theme);\n },\n },\n});\n\nexport const { reducer, actions } = slice;\n\nexport const { toggleTheme } = actions;\n\nexport const getTheme = (state: RootState): ILayout['theme'] =>\n state[stateScope].theme;\n\nexport const reduced = { [stateScope]: reducer };\n","import { createSlice } from '@reduxjs/toolkit';\nimport { RootState } from 'store';\nimport { useActions } from 'hooks';\n\nexport const stateScope = 'navigation';\n\ninterface INavigation {\n isNavigationOpen: boolean;\n}\n\nconst initialState: INavigation = {\n isNavigationOpen: false,\n};\n\nexport const slice = createSlice({\n name: stateScope,\n initialState,\n reducers: {\n openNavigation: (state): void => {\n state.isNavigationOpen = true;\n },\n closeNavigation: (state): void => {\n state.isNavigationOpen = false;\n },\n toggleNavigation: (state): void => {\n state.isNavigationOpen = !state.isNavigationOpen;\n },\n },\n});\n\nexport const { reducer, actions } = slice;\n\nexport const { openNavigation, closeNavigation } = actions;\n\nexport const getNavigationState = (state: RootState): INavigation =>\n state[stateScope];\n\nexport const reduced = { [stateScope]: reducer };\n\nexport const useNavigationActions = (): Record<\n keyof typeof actions,\n () => void\n> => useActions(actions);\n","export { Spinner } from './spinner';\n","const pluginMap: {\n // document types\n pdf: 'application/pdf';\n\n // media players\n qt: 'video/quicktime';\n realp: 'audio/x-pn-realaudio-plugin';\n wma: 'application/x-mplayer2';\n\n // interactive multimedia\n dir: 'application/x-director';\n fla: 'application/x-shockwave-flash';\n\n // RIA\n java: 'application/x-java-vm';\n gears: 'application/x-googlegears';\n ag: 'application/x-silverlight';\n} = {\n // document types\n pdf: 'application/pdf',\n\n // media players\n qt: 'video/quicktime',\n realp: 'audio/x-pn-realaudio-plugin',\n wma: 'application/x-mplayer2',\n\n // interactive multimedia\n dir: 'application/x-director',\n fla: 'application/x-shockwave-flash',\n\n // RIA\n java: 'application/x-java-vm',\n gears: 'application/x-googlegears',\n ag: 'application/x-silverlight',\n};\n\ntype BrowserFeaturesType = {\n res: string | null;\n cookie: boolean;\n plugins: string[];\n} & Record;\n\nconst browserFeatures = getBrowserFeatures();\n\nexport function getReferrer(): string {\n return (\n window?.top?.document?.referrer ||\n window?.parent?.document?.referrer ||\n document?.referrer ||\n ''\n );\n}\n\nexport function generateRandomUuid(): string {\n return sha1(\n (navigator.userAgent || '') +\n (navigator.platform || '') +\n JSON.stringify(browserFeatures) +\n new Date().getTime() +\n Math.random()\n ).slice(0, 16);\n}\n\nexport function generateBrowserSpecificId(): string {\n return sha1(\n (navigator.userAgent || '') +\n (navigator.platform || '') +\n JSON.stringify(browserFeatures)\n ).slice(0, 6);\n}\n\nexport function getCurrentTimestampInSeconds(): number {\n return Math.floor(new Date().getTime() / 1000);\n}\n\ntype PluginType = {\n name: string;\n mime: string;\n filename: string;\n description: string;\n};\n\nconst getBrowserPlugins = function (): PluginType[] {\n const rdls = function (vals: PluginType[]): PluginType[] {\n const res = [];\n\t\tconst tmp = vals.sort();\n\t\t\n for (let i = 0; i < tmp.length; i++) {\n res.push(tmp[i]);\n\n while (JSON.stringify(tmp[i]) == JSON.stringify(tmp[i + 1])) {\n i++;\n }\n }\n\n return res;\n };\n\n const res: PluginType[] = [];\n\n if (!navigator || !navigator.plugins) {\n return res;\n }\n\n for (const p in navigator.plugins) {\n const plugin = navigator.plugins[p];\n\n for (let j = 0; j < plugin.length; j++) {\n const mime = plugin[j];\n\n if (!mime) {\n continue;\n }\n\n const ep = mime.enabledPlugin;\n\n if (ep) {\n const item: PluginType = {\n mime: mime.type,\n name: ep.name,\n description: ep.description,\n filename: ep.filename,\n };\n\n res.push(item);\n }\n }\n }\n\n return rdls(res);\n};\n\nconsole.log(JSON.stringify(getBrowserPlugins()));\n\nfunction getBrowserFeatures(): BrowserFeaturesType {\n const browserFeatures: Partial = { plugins: [] };\n\n // detect browser features except IE < 11 (IE 11 user agent is no longer MSIE)\n if (!new RegExp('MSIE').test(navigator.userAgent)) {\n // general plugin detection\n if (navigator.mimeTypes && navigator.mimeTypes.length) {\n let mimeType;\n\n for (const pluginKey in pluginMap) {\n if (\n Object.prototype.hasOwnProperty.call(pluginMap, pluginKey)\n ) {\n // @ts-ignore\n mimeType = navigator.mimeTypes[pluginMap[pluginKey]];\n // @ts-ignore\n browserFeatures[pluginKey] =\n mimeType && mimeType.enabledPlugin ? true : false;\n }\n }\n }\n\n // Safari and Opera\n // IE6/IE7 navigator.javaEnabled can't be aliased, so test directly\n // on Edge navigator.javaEnabled() always returns `true`, so ignore it\n if (\n !new RegExp('Edge[ /](\\\\d+[\\\\.\\\\d]+)').test(navigator.userAgent) &&\n (typeof navigator as any).javaEnabled !== 'unknown' &&\n typeof navigator.javaEnabled !== 'undefined' &&\n navigator.javaEnabled()\n ) {\n browserFeatures.java = true;\n }\n\n // Firefox\n if ((typeof window as any).GearsFactory === 'function') {\n browserFeatures.gears = true;\n }\n\n if (\n (typeof window as any).showModalDialog === 'undefined' &&\n typeof navigator.cookieEnabled !== 'undefined'\n ) {\n browserFeatures.cookie = navigator.cookieEnabled;\n } else {\n // Eg IE11 ... prevent error when cookieEnabled is requested within modal dialog. see #11507\n browserFeatures.cookie = true; //hasCookies(); // 🤷‍♀️\n }\n }\n\n //browserFeatures.res = `${screen.width}x${screen.height}`;\n\n // @ts-ignore\n /*for (plugin of navigator.plugins) {\n\t\t// @ts-ignore\n\t\tconsole.log(plugin.name);\n\t\t// @ts-ignore\n browserFeatures.plugins.push(plugin.name);\n }*/\n\n return browserFeatures as BrowserFeaturesType;\n}\n\nfunction sha1(str: string): string {\n // + original by: Webtoolkit.info (http://www.webtoolkit.info/)\n // + namespaced by: Michael White (http://getsprink.com)\n // + input by: Brett Zamir (http://brett-zamir.me)\n // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)\n // + jslinted by: Anthon Pang (http://piwik.org)\n\n const rotateLeft = function (n: number, s: number): number {\n return (n << s) | (n >>> (32 - s));\n };\n\n const cvtHex = function (val: number): string {\n let strout = '';\n\n for (let i = 7; i >= 0; i--) {\n const v = (val >>> (i * 4)) & 0x0f;\n\n strout += v.toString(16);\n }\n\n return strout;\n };\n\n let H0 = 0x67452301,\n H1 = 0xefcdab89,\n H2 = 0x98badcfe,\n H3 = 0x10325476,\n H4 = 0xc3d2e1f0,\n A,\n B,\n C,\n D,\n E;\n\n const wordArray = [];\n\n str = utf8_encode(str);\n\n const stringLength = str.length;\n\n for (let i = 0; i < stringLength - 3; i += 4) {\n wordArray.push(\n (str.charCodeAt(i) << 24) |\n (str.charCodeAt(i + 1) << 16) |\n (str.charCodeAt(i + 2) << 8) |\n str.charCodeAt(i + 3)\n );\n }\n\n switch (stringLength & 3) {\n case 0:\n wordArray.push(0x080000000);\n break;\n case 1:\n wordArray.push(\n (str.charCodeAt(stringLength - 1) << 24) | 0x0800000\n );\n break;\n case 2:\n wordArray.push(\n (str.charCodeAt(stringLength - 2) << 24) |\n (str.charCodeAt(stringLength - 1) << 16) |\n 0x08000\n );\n break;\n case 3:\n wordArray.push(\n (str.charCodeAt(stringLength - 3) << 24) |\n (str.charCodeAt(stringLength - 2) << 16) |\n (str.charCodeAt(stringLength - 1) << 8) |\n 0x80\n );\n break;\n }\n\n while ((wordArray.length & 15) !== 14) {\n wordArray.push(0);\n }\n\n wordArray.push(stringLength >>> 29);\n wordArray.push((stringLength << 3) & 0x0ffffffff);\n\n const W: number[] = [];\n\n for (let blockstart = 0; blockstart < wordArray.length; blockstart += 16) {\n for (let i = 0; i < 16; i++) {\n W[i] = wordArray[blockstart + i];\n }\n\n for (let i = 16; i <= 79; i++) {\n W[i] = rotateLeft(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);\n }\n\n A = H0;\n B = H1;\n C = H2;\n D = H3;\n E = H4;\n\n for (let i = 0; i <= 19; i++) {\n const temp: number =\n (rotateLeft(A, 5) +\n ((B & C) | (~B & D)) +\n E +\n W[i] +\n 0x5a827999) &\n 0x0ffffffff;\n\n E = D;\n D = C;\n C = rotateLeft(B, 30);\n B = A;\n A = temp;\n }\n\n for (let i = 20; i <= 39; i++) {\n const temp: number =\n (rotateLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ed9eba1) &\n 0x0ffffffff;\n\n E = D;\n D = C;\n C = rotateLeft(B, 30);\n B = A;\n A = temp;\n }\n\n for (let i = 40; i <= 59; i++) {\n const temp: number =\n (rotateLeft(A, 5) +\n ((B & C) | (B & D) | (C & D)) +\n E +\n W[i] +\n 0x8f1bbcdc) &\n 0x0ffffffff;\n\n E = D;\n D = C;\n C = rotateLeft(B, 30);\n B = A;\n A = temp;\n }\n\n for (let i = 60; i <= 79; i++) {\n const temp: number =\n (rotateLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0xca62c1d6) &\n 0x0ffffffff;\n\n E = D;\n D = C;\n C = rotateLeft(B, 30);\n B = A;\n A = temp;\n }\n\n H0 = (H0 + A) & 0x0ffffffff;\n H1 = (H1 + B) & 0x0ffffffff;\n H2 = (H2 + C) & 0x0ffffffff;\n H3 = (H3 + D) & 0x0ffffffff;\n H4 = (H4 + E) & 0x0ffffffff;\n }\n\n const temp = cvtHex(H0) + cvtHex(H1) + cvtHex(H2) + cvtHex(H3) + cvtHex(H4);\n\n return temp.toLowerCase();\n}\n\nfunction utf8_encode(argString: string): string {\n return unescape(window.encodeURIComponent(argString));\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"layout_wrapper__5IYOc\",\"sidebar\":\"layout_sidebar__2pCA3\",\"content\":\"layout_content__WSTSp\",\"innerContent\":\"layout_innerContent__1ICcI\",\"topbar\":\"layout_topbar__3O2cx\",\"spinner\":\"layout_spinner__28ZnZ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"checkbox_container__1Mk0U\",\"input\":\"checkbox_input__3gXtx\",\"icon\":\"checkbox_icon__3dAU1\",\"checked\":\"checkbox_checked__2kWyA\",\"background\":\"checkbox_background__1SWDU\",\"wrapper\":\"checkbox_wrapper__2BP8T\",\"label\":\"checkbox_label__1sHo6\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"convert_container__3-uaL\",\"fromTo\":\"convert_fromTo__1g_hb\",\"convertionItem\":\"convert_convertionItem__1QikR\",\"equal\":\"convert_equal__1LERn\",\"input\":\"convert_input__2RlLm\"};","import { getScrollPosition } from './get-scroll-position';\nimport { IRect, IScrollRect, IPosition } from './typings';\n\nexport function getElementRect(\n element: HTMLElement,\n containerRect?: IScrollRect\n): IRect {\n const {\n top: boxTop,\n left: boxLeft,\n width,\n height,\n } = element.getBoundingClientRect();\n\n let scrollPosition: IPosition;\n\n if (containerRect) {\n scrollPosition = {\n top: -containerRect.top,\n left: -containerRect.left,\n };\n } else {\n scrollPosition = getScrollPosition();\n }\n\n const top = Math.round(boxTop + scrollPosition.top);\n const left = Math.round(boxLeft + scrollPosition.left);\n\n return { top, left, width: Math.round(width), height: Math.round(height) };\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"categories\":\"alphabetical-list_categories__2xDUv\",\"button\":\"alphabetical-list_button__1Xzx1\",\"category\":\"alphabetical-list_category__11nih\",\"categoryKey\":\"alphabetical-list_categoryKey__atxbs\",\"list\":\"alphabetical-list_list__RXoG0\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"center\":\"formatting_center__2wC1q\",\"bolder\":\"formatting_bolder__1z4Kr\",\"spacer\":\"formatting_spacer__1jyjZ\"};","import { IPosition } from './typings';\n\n// https://stackoverflow.com/a/26230989/1059368\nexport function getScrollPosition(): IPosition {\n const { body, documentElement } = document;\n\n const scrollTop =\n window.pageYOffset || documentElement.scrollTop || body.scrollTop;\n const scrollLeft =\n window.pageXOffset || documentElement.scrollLeft || body.scrollLeft;\n\n const clientTop = documentElement.clientTop || body.clientTop || 0;\n const clientLeft = documentElement.clientLeft || body.clientLeft || 0;\n\n return {\n top: Math.round(scrollTop - clientTop),\n left: Math.round(scrollLeft - clientLeft),\n };\n}\n\nexport function getScrollPositionOfElement(element: Element): IPosition {\n const { scrollTop, scrollLeft, clientTop = 0, clientLeft = 0 } = element;\n\n return {\n top: Math.round(scrollTop - clientTop),\n left: Math.round(scrollLeft - clientLeft),\n };\n}\n","export function getIntArray(value: string): number[] {\n const array = [];\n\n const formattedValue = value.toLowerCase();\n const length = formattedValue.length;\n\n for (let i = 0; i < length; i++) {\n switch (formattedValue.charCodeAt(i)) {\n case 229: // å\n array.push(299);\n break;\n case 248: // ø\n array.push(298);\n break;\n case 230: // æ\n array.push(297);\n break;\n default:\n array.push(formattedValue.charCodeAt(i));\n break;\n }\n }\n\n return array;\n}\n","import { getIntArray } from './get-int-array';\nimport { ISortByOptions } from './typings';\n\nexport const handleOrdering = (\n a: T,\n b: T,\n options?: ISortByOptions\n): number => {\n const nullMultiplier = options?.order === 'descendingNullLast' ? -1 : 1;\n\n if (a === null || b === null) {\n if (a === null && b === null) return 0;\n else return (a === null ? 1 : -1) * nullMultiplier;\n }\n\n if (\n (typeof a === 'number' && Number.isNaN(a)) ||\n (typeof b === 'number' && Number.isNaN(b))\n ) {\n if (\n typeof a === 'number' &&\n Number.isNaN(a) &&\n typeof b === 'number' &&\n Number.isNaN(b)\n )\n return 0;\n else\n return (\n (typeof a === 'number' && Number.isNaN(a) ? 1 : -1) *\n nullMultiplier\n );\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.valueOf() - b.valueOf();\n } else if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n } else if (\n (typeof a === 'string' || typeof a === 'number') &&\n (typeof b === 'string' || typeof b === 'number')\n ) {\n const aArray = getIntArray(a.toString());\n const bArray = getIntArray(b.toString());\n const length = aArray.length;\n\n for (let index = 0; index < length; index++) {\n if (aArray[index] !== bArray[index]) {\n return aArray[index] - bArray[index];\n }\n }\n }\n\n return 0;\n};\n\nexport const handleOptions = (\n result: number,\n options?: ISortByOptions\n): number => {\n return options?.order && options.order !== 'ascending'\n ? result * -1\n : result;\n};\n\nexport const sortBy = (list: T[], options?: ISortByOptions): T[] => {\n return list.sort((a: T, b: T): number =>\n handleOptions(handleOrdering(a, b, options), options)\n );\n};\n\nexport const sortByKey = >(\n list: T[],\n key: T[keyof T] | T[keyof T][],\n options?: ISortByOptions\n): T[] => {\n const keys = (typeof key === 'string' ? [key] : [...key]).reverse();\n\n for (const key of keys) {\n list.sort((a: T, b: T): number =>\n handleOptions(handleOrdering(a?.[key], b?.[key], options), options)\n );\n }\n\n return list;\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { AppThunk, RootState } from 'store';\n\ninterface ICounterState {\n value: number;\n}\n\nconst initialState: ICounterState = {\n value: 0,\n};\n\nexport const counterSlice = createSlice({\n name: 'counter',\n initialState,\n reducers: {\n increment: (state): void => {\n // Redux Toolkit allows us to write \"mutating\" logic in reducers. It\n // doesn't actually mutate the state because it uses the Immer library,\n // which detects changes to a \"draft state\" and produces a brand new\n // immutable state based off those changes\n state.value += 1;\n },\n decrement: (state): void => {\n state.value -= 1;\n },\n // Use the PayloadAction type to declare the contents of `action.payload`\n incrementByAmount: (state, action: PayloadAction): void => {\n state.value += action.payload;\n },\n },\n});\nexport const { increment, decrement, incrementByAmount } = counterSlice.actions;\n// The function below is called a thunk and allows us to perform async logic. It\n// can be dispatched like a regular action: `dispatch(incrementAsync(10))`. This\n// will call the thunk with the `dispatch` function as the first argument. Async\n// code can then be executed and other actions can be dispatched\nexport const incrementAsync = (amount: number): AppThunk => (\n dispatch\n): void => {\n setTimeout(() => {\n dispatch(incrementByAmount(amount));\n }, 1000);\n};\n// The function below is called a selector and allows us to select a value from\n// the state. Selectors can also be defined inline where they're used instead of\n// in the slice file. For example: `useSelector((state: RootState) => state.counter.value)`\nexport const selectCount = (state: RootState): ICounterState['value'] =>\n state.counter.value;\nexport default counterSlice.reducer;\n","import { createSlice } from '@reduxjs/toolkit';\nimport { RootState } from 'store';\nimport { generateBrowserSpecificId } from 'utils/track';\n\nexport const stateScope = 'user';\n\ninterface IUser {\n uuid: string;\n}\n\nconst initialState: IUser = {\n uuid: generateBrowserSpecificId(),\n};\n\nexport const slice = createSlice({\n name: stateScope,\n initialState,\n reducers: {},\n});\n\nexport const { reducer, actions } = slice;\n\nexport const getUserState = (state: RootState): IUser => state[stateScope];\n\nexport const reduced = { [stateScope]: reducer };\n","import { configureStore, ThunkAction, Action } from '@reduxjs/toolkit';\nimport counterReducer from '../features/counter/counterSlice';\nimport { reduced as navigation } from './navigation';\nimport { reduced as user } from './user';\nimport { reduced as layout } from './layout';\nimport { reduced as recipes } from '../features/recipe';\nimport { reduced as tooltips } from '../components/overlays/tooltip';\n\nexport const store = configureStore({\n reducer: {\n counter: counterReducer,\n ...user,\n ...navigation,\n ...layout,\n ...recipes,\n ...tooltips,\n },\n});\n\nexport type RootState = ReturnType;\n\nexport type AppThunk = ThunkAction<\n ReturnType,\n RootState,\n unknown,\n Action\n>;\n","import { getScrollPositionOfElement } from './get-scroll-position';\nimport { IScrollRect } from './typings';\n\nexport function getContent(): HTMLElement {\n const content = document.body.querySelector('#content');\n\n if (!content) {\n throw Error('No content');\n }\n\n return content as HTMLElement;\n}\n\nexport function getContentRect(): IScrollRect {\n const content = getContent();\n\n const { top, left, width, height } = content.getBoundingClientRect();\n\n const { top: scrollTop, left: scrollLeft } = getScrollPositionOfElement(\n content\n );\n\n return {\n top: Math.round(top),\n left: Math.round(left),\n width: Math.round(width),\n height: Math.round(height),\n scrollTop: Math.round(scrollTop),\n scrollLeft: Math.round(scrollLeft),\n };\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"preview-recipe_container__1kmBa\",\"content\":\"preview-recipe_content__318Ly\",\"link\":\"preview-recipe_link__vtHeM\",\"overlay\":\"preview-recipe_overlay__OzQrA\",\"image\":\"preview-recipe_image__3D_R6\",\"title\":\"preview-recipe_title__1EfOt\",\"fade-in\":\"preview-recipe_fade-in__hVtZo\",\"fade-out\":\"preview-recipe_fade-out__nA6OJ\",\"spin\":\"preview-recipe_spin__2RyhS\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"label\":\"select_label__39Pvg\",\"container\":\"select_container__1cL-C\",\"withLabel\":\"select_withLabel__2H95R\",\"select\":\"select_select__3JhcG\",\"icon\":\"select_icon__3biRs\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"text\":\"removeable-badge_text__X2yHo\",\"badge\":\"removeable-badge_badge__UyNgO\",\"partOfList\":\"removeable-badge_partOfList__zOF7p\",\"button\":\"removeable-badge_button__3Omec\",\"buttonTooltip\":\"removeable-badge_buttonTooltip__11-6N\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"input-with-header_container__1OO-b\",\"withSpinner\":\"input-with-header_withSpinner__dbEs_\",\"withButton\":\"input-with-header_withButton__3s2J_\",\"spinner\":\"input-with-header_spinner__XQScl\",\"button\":\"input-with-header_button__anfJz\"};","type Rect = { top: number; left: number; width: number; height: number };\ntype RectPoints = { x1: number; y1: number; x2: number; y2: number };\n\ninterface IWithin {\n (box: RectPoints, container: RectPoints, allowedDistance?: number): boolean;\n}\n\ninterface IDistance {\n (box: RectPoints, container: RectPoints, allowedDistance?: number): number;\n}\n\nconst orderCoordinates = (rect: RectPoints): RectPoints => ({\n x1: Math.min(rect.x1, rect.x2),\n y1: Math.min(rect.y1, rect.y2),\n x2: Math.max(rect.x1, rect.x2),\n y2: Math.max(rect.y1, rect.y2),\n});\n\nexport const isPartiallyWithin: IWithin = (\n box,\n container,\n allowedDistance = 0\n) => {\n box = orderCoordinates(box);\n container = orderCoordinates(container);\n\n if (box.y2 < container.y1 - allowedDistance) return false; // 1 is above 2\n if (box.y1 > container.y2 + allowedDistance) return false; // 1 is below 2\n if (box.x2 < container.x1 - allowedDistance) return false; // 1 is left of 2\n if (box.x1 > container.x2 + allowedDistance) return false; // 1 is right of 2\n\n return true;\n};\n\nexport const isFullyWithin: IWithin = (box, container, allowedDistance = 0) => {\n box = orderCoordinates(box);\n container = orderCoordinates(container);\n\n if (box.y1 < container.y1 - allowedDistance) return false;\n if (box.y2 > container.y2 + allowedDistance) return false;\n if (box.x1 < container.x1 - allowedDistance) return false;\n if (box.x2 > container.x2 + allowedDistance) return false;\n\n return true;\n};\n\nexport const getDistanceBeforePartiallyWithin: IDistance = (\n box,\n container,\n allowedDistance = 0\n) => {\n box = orderCoordinates(box);\n container = orderCoordinates(container);\n\n if (box.y2 < container.y1 - allowedDistance)\n return Math.abs(container.y1 - allowedDistance - box.y2);\n if (box.y1 > container.y2 + allowedDistance)\n return Math.abs(container.y2 + allowedDistance - box.y1);\n //if (box.x2 < container.x1 - allowedDistance) return false;\n //if (box.x1 > container.x2 + allowedDistance) return false;\n\n return 0;\n};\n\nexport const rectToRectPoints = (rect: Rect): RectPoints => ({\n x1: rect.left,\n y1: rect.top,\n x2: rect.width + rect.left,\n y2: rect.height + rect.top,\n});\n","import { getElementRect } from './get-element-rect';\nimport { getContentRect } from './get-content-rect';\nimport { IRect, IScrollRect } from './typings';\nimport {\n isPartiallyWithin,\n rectToRectPoints,\n getDistanceBeforePartiallyWithin,\n} from 'utils/math/is-within';\n\nexport const isRectVisible = (\n rect: IRect,\n contentRect: IScrollRect\n): boolean => {\n const box = rectToRectPoints(rect);\n const container = rectToRectPoints(contentRect);\n\n return isPartiallyWithin(box, container);\n};\n\nexport const isRectVisibleWithDistance = (\n rect: IRect,\n contentRect: IScrollRect\n): { visible: boolean; distance: number } => {\n const box = rectToRectPoints(rect);\n const container = rectToRectPoints(contentRect);\n\n if (isPartiallyWithin(box, container))\n return { visible: true, distance: 0 };\n\n return {\n visible: false,\n distance: getDistanceBeforePartiallyWithin(box, container),\n };\n};\n\nexport const isVisible = (\n element: HTMLElement,\n overlay?: Partial\n): boolean => {\n const contentRect = getContentRect();\n const rect = getElementRect(element, contentRect);\n\n return isRectVisible(rect, {\n ...contentRect,\n top: overlay?.top ?? 0,\n left: overlay?.left ?? 0,\n });\n};\n\nexport const isVisibleWithDistance = (\n element: HTMLElement,\n overlay?: Partial\n): { visible: boolean; distance: number } => {\n const contentRect = getContentRect();\n const rect = getElementRect(element, contentRect);\n\n return isRectVisibleWithDistance(rect, {\n ...contentRect,\n top: overlay?.top ?? 0,\n left: overlay?.left ?? 0,\n });\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"overlay\":\"tooltip_overlay__31Wr0\",\"trigger\":\"tooltip_trigger__3C8jt\",\"top\":\"tooltip_top___HUuW\",\"fade-in\":\"tooltip_fade-in__2zFbB\",\"bottom\":\"tooltip_bottom__3nON7\",\"left\":\"tooltip_left__3BuyT\",\"right\":\"tooltip_right__Did4I\",\"fade-out\":\"tooltip_fade-out__1JEDF\",\"spin\":\"tooltip_spin__33xbd\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"showroom_wrapper__1kDjZ\",\"topbar\":\"showroom_topbar__2fZ8d\",\"sidebar\":\"showroom_sidebar__2oD99\",\"content\":\"showroom_content__2imyA\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"topbar_wrapper__du1TQ\",\"menuIcon\":\"topbar_menuIcon__XMlHT\",\"logo\":\"topbar_logo__t513r\",\"profile\":\"topbar_profile__1cY8E\",\"search\":\"topbar_search__3VA-L\",\"toggleTheme\":\"topbar_toggleTheme__exYXb\"};","export const jsonTryParse = (value: string | null): T | null => {\n if (!value) {\n return null;\n }\n\n try {\n return JSON.parse(value) as T;\n } catch (e) {\n return null;\n }\n};\n","export function getRandomNumber(min: number, max: number): number {\n min = Math.ceil(min);\n max = Math.floor(max);\n\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n","import { IState } from './types';\n\nexport const initialState: IState = {\n currentPath: '',\n path: { paths: [], pathname: '' },\n};\n","import { IState, IReducer } from './types';\n\nexport const reducer: IReducer = (state, action): IState => {\n switch (action.type) {\n case 'setActive': {\n return { ...state, currentPath: action.payload };\n }\n case 'setVisible': {\n return { ...state, currentPath: action.payload };\n }\n case 'setPath': {\n return { ...state, path: action.payload };\n }\n default: {\n throw new Error(`Unhandled action type: ${action}`);\n }\n }\n};\n","import { createContext } from 'react';\nimport { IState, IDispatch } from './types';\nimport { initialState } from 'components/navigation/navigation/context/initial-state';\n\nexport const StateContext = createContext(initialState);\nexport const DispatchContext = createContext(() => null);\n","import React, { useReducer, useEffect } from 'react';\nimport { IChildren } from 'typings';\nimport { initialState } from './initial-state';\nimport { reducer } from './reducer';\nimport { StateContext, DispatchContext } from './contexts';\nimport { getPath } from 'utils/path/get-path';\nimport { usePath } from 'hooks';\n\nexport function Provider({ children }: IChildren) {\n const path = usePath();\n\n const [state, dispatch] = useReducer(reducer, {\n ...initialState,\n path: getPath(),\n });\n\n useEffect(() => {\n dispatch({ type: 'setPath', payload: path });\n }, [path]);\n\n return (\n \n \n {children}\n \n \n );\n}\n","import { IRouteType } from './types';\n\nexport const routes: IRouteType[] = [\n {\n name: 'Forside',\n path: '',\n icon: 'home',\n activeCondition: [],\n list: [\n {\n name: 'Forside',\n path: '',\n activeCondition: [/^\\/$/],\n description: 'Gå til forsiden og bliv inspireret',\n },\n ],\n },\n {\n name: 'Opskrifter',\n path: '',\n icon: 'book',\n activeCondition: [/^\\/opskrift($|\\/)/],\n list: [\n {\n name: 'Alle opskrifter',\n path: 'opskrifter',\n activeCondition: [/^\\/opskrifter$/],\n description: 'Se alle vores opskrifter',\n },\n {\n name: 'Billedopskrifter',\n path: 'opskrifter/billede',\n activeCondition: [/^\\/opskrifter\\/billede$/],\n description: 'Se alle vores billedopskrifter',\n },\n {\n name: 'Kategorier',\n path: 'opskrifter/kategorier',\n activeCondition: [/^\\/opskrifter\\/kategorier($|\\/)/],\n description: 'Se alle vores billedopskrifter',\n },\n ],\n },\n {\n name: 'Ingredienser',\n path: '',\n icon: 'list-alt',\n activeCondition: [/^\\/ingrediens($|\\/)/],\n list: [\n {\n name: 'Alle ingredienser',\n path: 'ingredienser',\n activeCondition: [/^\\/ingredienser$/],\n description: 'Se alle vores opskrifter',\n },\n {\n name: 'Konverter',\n path: 'ingredienser/konverter',\n activeCondition: [/^\\/ingredienser\\/konverter$/],\n description: 'Se alle vores opskrifter',\n },\n {\n name: 'Tøm køleskabet',\n path: 'ingredienser/køleskab',\n activeCondition: [\n '/ingredienser/køleskab',\n '/ingredienser/k%C3%B8leskab',\n ],\n description: 'Se alle vores opskrifter',\n },\n ],\n },\n];\n\nif (process.env.NODE_ENV === 'development') {\n routes.push({\n name: 'Showroom',\n path: 'showroom',\n icon: 'moon',\n activeCondition: [/^\\/showroom($|\\/)/],\n list: [\n {\n name: 'Showroom',\n path: 'showroom',\n activeCondition: [/^\\/showroom($|\\/)/],\n description: 'Gå til showroom',\n },\n ],\n });\n}\n","import React from 'react';\nimport { classNames, matchTestString } from 'utils';\nimport styles from '../navigation.module.scss';\nimport { Icon } from 'components/images-icons/icon';\nimport { IRouteType } from '../types';\nimport { usePath } from 'hooks';\n\nexport const Categories = (\n route: IRouteType & {\n handleHoverCategory: (name: string) => void;\n }\n) => {\n const { pathname } = usePath();\n\n const active = matchTestString(pathname, [\n route.activeCondition,\n ...route.list.map((item) => item.activeCondition),\n ]);\n\n const className = classNames(styles.category, {\n [styles.active]: active,\n });\n\n return (\n route.handleHoverCategory(route.name)}\n >\n \n
{route.name}
\n \n );\n};\n","import React, { useContext } from 'react';\nimport { classNames, matchTestString } from 'utils';\nimport styles from '../navigation.module.scss';\nimport { IRouteItemType } from '../types';\nimport { StateContext } from '../context';\nimport { Link as RouterLink } from 'react-router-dom';\n\nexport const Link = ({\n name,\n description,\n activeCondition,\n path,\n}: IRouteItemType) => {\n const {\n path: { pathname },\n } = useContext(StateContext);\n\n const active = matchTestString(pathname, activeCondition);\n\n const className = classNames(styles.item, {\n [styles.active]: active,\n });\n\n return (\n
  • \n \n
    {name}
    \n
    {description}
    \n
    \n
  • \n );\n};\n","import React from 'react';\nimport { classNames } from 'utils';\nimport styles from '../navigation.module.scss';\nimport { IRouteType } from '../types';\nimport { Link } from './link';\n\nexport const Content = (route: IRouteType & { activeRouteName: string }) => {\n const visible = route.activeRouteName === route.name;\n\n const className = classNames(styles.content, {\n [styles.visible]: visible,\n });\n\n return (\n
      \n {route.list.map((item) => (\n \n ))}\n
    \n );\n};\n","import React, { FunctionComponent, useEffect, useState } from 'react';\nimport { Logo } from 'components/images-icons/logo';\nimport { usePath, useToggle, useWindowSize } from 'hooks';\nimport { Link } from 'react-router-dom';\nimport { useNavigationActions } from 'store/navigation';\nimport { matchTestString } from 'utils';\nimport styles from '../navigation.module.scss';\nimport { routes } from '../routes';\nimport { Categories } from './categories';\nimport { Content } from './content';\n\nexport const Container: FunctionComponent = () => {\n const { pathname } = usePath();\n const { breakpoint } = useWindowSize();\n\n const { openNavigation, closeNavigation } = useNavigationActions();\n\n const { open, delayedClose } = useToggle(false, {\n delay: 400,\n openCallback: openNavigation,\n closeCallback: closeNavigation,\n });\n const [activeRouteName, setActiveRouteName] = useState('Forside');\n\n useEffect(() => {\n const active = routes.find((route) =>\n matchTestString(pathname, [\n route.activeCondition,\n ...route.list.map((item) => item.activeCondition),\n ])\n )?.name;\n\n setActiveRouteName(active || 'Forside');\n closeNavigation();\n }, [pathname]);\n\n const handleHoverCategory = (name: string) => {\n setActiveRouteName(name);\n };\n\n return (\n \n
    \n \n \n \n
    \n
      \n {routes.map((route) => (\n \n ))}\n
    \n {routes.map((route) => (\n \n ))}\n \n );\n};\n","import React, { FunctionComponent } from 'react';\nimport { Provider } from './context';\nimport { Container } from './components';\n\nexport const Navigation: FunctionComponent = () => {\n return (\n \n \n \n );\n};\n","import React, { FunctionComponent, useEffect, useState } from 'react';\nimport { useNavigationActions } from 'store/navigation';\nimport { Icon } from 'components/images-icons/icon';\nimport styles from './navigation.module.scss';\n\nexport const NavigationButton: FunctionComponent = () => {\n const {\n openNavigation,\n closeNavigation,\n toggleNavigation,\n } = useNavigationActions();\n\n return (\n \n );\n};\n","export default __webpack_public_path__ + \"static/media/logo.79ffea36.svg\";","import React from 'react';\nimport { LogoColor, LogoShape } from './types';\nimport logo from './logo.svg';\nimport { IClassName } from 'typings';\n\ninterface ILogo extends IClassName {\n color: LogoColor;\n shape: LogoShape;\n}\n\nexport const Logo = ({ color, shape, className }: ILogo) => {\n const dimensions = {\n width: shape === 'horizontal' ? 125 : 100,\n height: shape === 'horizontal' ? 50 : 70,\n };\n\n return (\n \n );\n};\n","import { IRouteProps } from 'typings';\n\nexport const getPath = (\n pathname: string = window.location.pathname\n): IRouteProps['path'] => {\n const paths = pathname?.split('/').filter(Boolean);\n const controller = paths?.[0];\n\n const path: IRouteProps['path'] = {\n paths,\n pathname,\n controller,\n };\n\n return path;\n};\n","export const getSrc = (mediaID: string): string => {\n return `${process.env.REACT_APP_API_URL}/media/${mediaID}`;\n};\n","import { store } from \"store\";\n\nexport type Response =\n | {\n status: 200;\n success: true;\n result: T;\n }\n | {\n status: 404;\n success: false;\n };\n\nexport async function getData({\n url,\n data,\n formatResult,\n}: {\n url: string;\n data?: Record;\n formatResult?: (result: T) => T;\n}): Promise> {\n const parameters =\n data !== null && data !== undefined\n ? `?${Object.entries(data)\n .map(([key, value]) => {\n if (value === undefined) return undefined;\n\n if (Array.isArray(value)) {\n return value\n .map((innerValue) => `${key}=${innerValue}`)\n .join('&');\n }\n\n return `${key}=${value}`;\n })\n .filter(Boolean)\n .join('&')}`\n : '';\n\n const response = await fetch(\n `${process.env.REACT_APP_API_URL}/${url}${parameters}`,\n {\n method: 'GET', // *GET, POST, PUT, DELETE, etc.\n mode: 'cors', // no-cors, *cors, same-origin\n //cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached\n //credentials: 'same-origin', // include, *same-origin, omit\n headers: {\n //'Content-Type': 'application/json',\n // 'Content-Type': 'application/x-www-form-urlencoded',\n //'Content-Length': parameters?.length?.toString() || '0',\n //'Access-Control-Allow-Origin': '*',\n //'Access-Control-Allow-Credentials': 'true',\n URL: window.location.href,\n Validate: store.getState().user.uuid,\n },\n //redirect: 'follow', // manual, *follow, error\n //referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url\n }\n ).catch((e) => {\n console.log(e);\n console.log('Can’t access ' + url + ' response. Blocked by browser?');\n\n // TODO: Report error\n\n return {\n status: 500,\n json: (): void => {\n return;\n },\n };\n });\n\n if (process.env.NODE_ENV === 'development') {\n console.log(response);\n }\n\n const status = response.status as Response['status'];\n const success = status.toString().charAt(0) === '2';\n\n if (success) {\n const result: T = await response?.json(); // parses JSON response into native JavaScript objects\n\n const formattedResult =\n typeof formatResult === 'function' ? formatResult(result) : result;\n\n return {\n status: status as 200,\n success,\n result: formattedResult,\n };\n }\n\n return {\n status: status as 404,\n success,\n };\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { RootState } from 'store';\nimport { IPublicRecipe } from 'api/recipe';\n\nexport const stateScope = 'recipe';\n\ninterface IRecipeState {\n loading: string[];\n failed: string[];\n recipes: {\n [recipeUri: string]: IPublicRecipe;\n };\n}\n\nconst initialState: IRecipeState = {\n loading: [],\n failed: [],\n recipes: {},\n};\n\nexport const slice = createSlice({\n name: stateScope,\n initialState,\n reducers: {\n loadRecipe: (state, action: PayloadAction): void => {\n state.loading.push(action.payload);\n },\n failedRecipe: (state, action: PayloadAction): void => {\n state.loading = state.loading.filter(\n (uri) => uri !== action.payload\n );\n state.failed.push(action.payload);\n },\n addRecipe: (state, action: PayloadAction): void => {\n state.loading = state.loading.filter(\n (uri) => uri !== action.payload.uri\n );\n state.recipes[action.payload.uri] = action.payload;\n },\n },\n});\n\nexport const { reducer, actions } = slice;\n\nexport const { addRecipe, loadRecipe, failedRecipe } = actions;\n\nexport const getState = (state: RootState): IRecipeState => state[stateScope];\n\nexport const reduced = { [stateScope]: reducer };\n","import React, { ReactNode } from 'react';\nimport { IRecipeSection, IRecipeStep, IRecipeIngredient } from 'api/recipe';\nimport { styles } from '../styles';\nimport { NumberedList } from 'components/lists-tables/numbered-list';\n\nconst formatStep = ({ description, ingredients }: IRecipeStep): ReactNode => {\n const elements = description.match(/{[\\w\\d]{5}}|[^{]+/g) || [];\n const ingredientIdentifiers = ingredients.map(\n ({ identifier }) => `{${identifier}}`\n );\n\n const results = elements.map((element) => {\n if (!ingredientIdentifiers.includes(element)) {\n return element;\n }\n\n const {\n identifier,\n name,\n measurementAmount,\n measurementType,\n } = ingredients.find(\n ({ identifier }) => `{${identifier}}` === element\n ) as IRecipeIngredient;\n\n return (\n \n {measurementAmount} {measurementType} {name}\n \n );\n });\n\n return results;\n};\n\nexport function Section({ title, steps }: IRecipeSection) {\n const list = steps?.map(formatStep);\n\n return (\n
    \n

    {title}

    \n \n
    \n );\n}\n","import { api } from 'api';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { getState, addRecipe, loadRecipe, failedRecipe } from '../slice';\nimport { usePath } from 'hooks';\n\nconst getRecipe = async (dispatch: any, uri: string): Promise => {\n dispatch(loadRecipe(uri));\n\n const recipeResponse = await api.recipe.get(uri);\n\n if (recipeResponse.success) {\n dispatch(addRecipe(recipeResponse.result));\n } else {\n dispatch(failedRecipe(uri));\n }\n};\n\nexport const loadedState = 'loaded';\nexport const loadingState = 'loading';\nexport const failedState = 'failed';\n\ntype ReturnType = typeof loadedState | typeof loadingState | typeof failedState;\n\nexport function useLoadRecipe(): ReturnType {\n const dispatch = useDispatch();\n\n const {\n paths: [, uri],\n } = usePath();\n\n const {\n loading,\n failed,\n recipes: { [uri]: recipe },\n } = useSelector(getState);\n\n if (recipe) return loadedState;\n\n if (!uri || failed.includes(uri)) return failedState;\n\n if (!loading.includes(uri)) {\n getRecipe(dispatch, uri);\n }\n\n return loadingState;\n}\n","import { useSelector } from 'react-redux';\nimport { getState } from '../slice';\nimport { usePath } from 'hooks';\nimport { IPublicRecipe } from 'api/recipe';\n\nexport function useCurrentRecipe(): IPublicRecipe {\n const {\n paths: [, uri],\n } = usePath();\n\n const {\n recipes: { [uri]: recipe },\n } = useSelector(getState);\n\n return recipe;\n}\n","import React from 'react';\nimport { useCurrentRecipe } from '../hooks';\nimport { Section } from './section';\n\nexport function Sections() {\n const { sections } = useCurrentRecipe();\n\n return (\n <>\n {sections?.map((section, index) => (\n
    \n ))}\n \n );\n}\n","import React from 'react';\nimport { CheckedList } from 'components/lists-tables/check-list';\nimport { Link } from 'utils';\nimport { getIngredients } from '../utils';\nimport { useCurrentRecipe } from '../hooks';\n\nexport function Ingredients() {\n const recipe = useCurrentRecipe();\n\n const ingredients = getIngredients(recipe);\n\n const list = ingredients.map(\n ({ name, measurementAmount, measurementType, url }) => (\n <>\n {measurementAmount} {measurementType}{' '}\n \n {name}\n \n \n )\n );\n\n return ;\n}\n","import { IPublicRecipe, IRecipeIngredient } from 'api/recipe';\n\nexport const getIngredients = (recipe: IPublicRecipe): IRecipeIngredient[] =>\n recipe.sections.flatMap(({ steps }) =>\n steps.flatMap(({ ingredients }) => ingredients)\n );\n","import React from 'react';\nimport { styles } from './styles';\nimport { Ingredients, Sections } from './components';\nimport { useCurrentRecipe } from './hooks';\n\nexport function Recipe() {\n const recipe = useCurrentRecipe();\n\n return (\n <>\n

    \n {recipe.title}\n

    \n

    \n {recipe.description}\n

    \n {recipe.mediaSrc && (\n
    \n {recipe.title}\n
    \n )}\n
    \n
    \n
    \n

    Fremgangmåde

    \n \n
    \n
    \n

    Ingredienser

    \n \n
    \n
    \n \n );\n}\n","import React from 'react';\nimport { Recipe } from './recipe';\nimport { useLoadRecipe, loadedState, loadingState } from './hooks';\n\nexport function Handler() {\n const recipeState = useLoadRecipe();\n\n if (recipeState === loadingState) return <>Loading;\n if (recipeState === loadedState) return ;\n\n return <>Nope;\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"button\":\"button_button__24YmQ\",\"center\":\"button_center__1vgkE\",\"default\":\"button_default__-7OvY\",\"primary\":\"button_primary__2_EBe\",\"dark\":\"button_dark__3nP4a\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"badge\":\"badge_badge__IjwpT\",\"primary\":\"badge_primary__3zHAj\",\"default\":\"badge_default__3UkiU\",\"round\":\"badge_round__2vT3i\",\"pill\":\"badge_pill__3ILC2\",\"square\":\"badge_square__qRfkh\",\"rect\":\"badge_rect__1y_I4\"};","import { getRandomNumber } from './number';\n\nexport const strings = [\n 'Run at 3am bite nose of your human you are a captive audience while sitting on the toilet, pet me a nice warm laptop for me to sit on or bird bird bird bird bird bird human why take bird out i could have eaten that yet i bet my nine lives on you-oooo-ooo-hooo, or meow to be let out.',\n \"Hide at bottom of staircase to trip human cat snacks, or put butt in owner's face and i shredded your linens for you.\",\n 'Stare out cat door then go back inside scratch my tummy actually i hate you now fight me soft kitty warm kitty little ball of furr.',\n \"Pee in the shoe i want to go outside let me go outside nevermind inside is better stare at ceiling light, stretch out on bed, kitty run to human with blood on mouth from frenzied attack on poor innocent mouse, don't i look cute? if it fits, i sits.\",\n 'Have secret plans slap the dog because cats rule so cry louder at reflection knock dish off table head butt cant eat out of my own dish ptracy, yet i rule on my back you rub my tummy i bite you hard.',\n 'Found somthing move i bite it tail jump five feet high and sideways when a shadow moves.',\n \"Please stop looking at your phone and pet me sit in a box for hours so hack hiss at vacuum cleaner, or bite the neighbor's bratty kid but kitten is playing with dead mouse commence midnight zoomies.\",\n 'I like big cats and i can not lie i will be pet i will be pet and then i will hiss.',\n 'The fat cat sat on the mat bat away with paws.',\n 'Chase dog then run away.',\n 'Run outside as soon as door open making bread on the bathrobe.',\n \"If it smells like fish eat as much as you wish bite off human's toes and always hungry yet good morning sunshine or cuddle no cuddle cuddle love scratch scratch yet scratch me there, elevator butt.\",\n \"Let me in let me out let me in let me out let me in let me out who broke this door anyway sleep on my human's head attack feet ears back wide eyed for chew foot chase ball of string drink from the toilet.\",\n 'Meow loudly just to annoy owners throw down all the stuff in the kitchen, walk on keyboard.',\n \"Swat turds around the house meowwww i'm going to lap some water out of my master's cup meow.\",\n 'Rub face on everything.',\n \"Eat from dog's food.\",\n 'Oooo! dangly balls! jump swat swing flies so sweetly to the floor crash move on wash belly nap toilet paper attack claws fluff everywhere meow miao french ciao litterbox for thug cat .',\n 'Purr when being pet please stop looking at your phone and pet me hey! you there, with the hands.',\n 'Purrr purr littel cat, little cat purr purr ooooh feather moving feather!, yet burrow under covers, so sit in a box for hours reward the chosen human with a slow blink.',\n 'Purr then cats take over the world.',\n];\n\nexport const getRandomString = (maxLength?: number): string => {\n const length = getRandomNumber(0, strings.length - 1);\n const chosenString = strings[length];\n\n if (!maxLength || chosenString.length <= maxLength) return chosenString;\n\n const wordArray = chosenString.substr(0, maxLength + 1).split(' ');\n\n wordArray.pop();\n\n return wordArray.join(' ');\n};\n\nexport const getRandomKey = (length: number): string => {\n const characters =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n const charactersLength = characters.length;\n\n let result = '';\n\n for (let index = 0; index < length; index++) {\n result += characters.charAt(\n Math.floor(Math.random() * charactersLength)\n );\n }\n\n return result;\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"item\":\"numbered-list_item__24t2p\",\"list\":\"numbered-list_list__26aqe\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"autocomplete_container__1ozlR\",\"active\":\"autocomplete_active__3nEe2\"};","import React, { ReactNode } from 'react';\nimport styles from './checkbox.module.scss';\nimport { classNames } from 'utils';\nimport { Icon } from 'components/images-icons/icon';\nimport { useToggle } from 'hooks';\n\ninterface ICheckbox extends Partial {\n label?: ReactNode;\n}\n\nexport const Checkbox = ({ label, className }: ICheckbox) => {\n const { state: checked, toggle } = useToggle(false);\n\n const CheckboxComponent = ({ className }: { className?: string }) => {\n const checkboxClassName = classNames(styles.container, className, {\n [styles.checked]: checked,\n });\n\n return (\n
    \n \n
    \n \n
    \n );\n };\n\n if (!label) {\n return ;\n }\n\n return (\n
    \n \n
    \n {label}\n
    \n
    \n );\n};\n","import React, { forwardRef } from 'react';\nimport styles from './button.module.scss';\nimport { IChildren, IClassName } from 'typings';\nimport { classNames } from 'utils';\n\ninterface IButton extends IChildren, IClassName {\n type?: 'default' | 'primary' | 'dark';\n center?: boolean;\n onClick?: (value: any) => void;\n value?: any;\n}\n\nexport const Button = forwardRef(\n (\n {\n children,\n className,\n type = 'default',\n center,\n onClick,\n value,\n }: IButton,\n ref\n ) => {\n const handleClick = () => onClick?.(value);\n\n const buttonClassName = classNames(\n styles.button,\n styles[type],\n {\n [styles.center]: !!center,\n },\n className\n );\n\n return (\n \n );\n }\n);\n","import React from 'react';\nimport styles from './spinner.module.scss';\nimport { classNames } from 'utils';\nimport { IClassName } from 'typings';\n\nexport const Spinner = ({ className }: IClassName) => {\n const spinnerClassName = classNames(styles.spinner, className);\n\n return
    ;\n};\n","import React, { FunctionComponent, useCallback, ChangeEvent } from 'react';\nimport styles from './select.module.scss';\nimport { Icon } from 'components/images-icons/icon';\nimport { classNames } from 'utils';\n\ninterface ISelect {\n label?: string;\n onChange?: (\n value: Record,\n event: ChangeEvent\n ) => void;\n name?: string;\n list: { key: string | number; name: string }[];\n addEmptyOption?: boolean;\n}\n\nexport const Select: FunctionComponent = ({\n label,\n onChange,\n name = 'value',\n list,\n addEmptyOption,\n}: ISelect) => {\n const handleChange = useCallback(\n (event: ChangeEvent) => {\n const nativeEventTarget = event.nativeEvent\n .target as HTMLSelectElement;\n\n const index = nativeEventTarget.selectedIndex;\n const label = (nativeEventTarget[index] as HTMLOptionElement).text;\n const value = event.target.value;\n\n return onChange?.({ [name]: value, [`${name}Name`]: label }, event);\n },\n [onChange, name]\n );\n\n const selectClassName = classNames(styles.container, {\n [styles.withLabel]: !!label,\n });\n\n return (\n
    \n {!!label && }\n \n \n
    \n );\n};\n","import React, { forwardRef, ChangeEvent, InputHTMLAttributes } from 'react';\nimport styles from './input-with-header.module.scss';\nimport { Spinner } from 'components/feedback-indicators/spinner';\nimport { classNames } from 'utils';\nimport { Icon } from 'components/images-icons/icon';\n\ninterface IInputWithHeader\n extends Omit, 'onChange'> {\n label: string;\n useSpinner?: boolean;\n useButton?: boolean;\n onChange?: (value: string, event: ChangeEvent) => void;\n onClickButton?: (\n value: IInputWithHeader['value'],\n event: React.MouseEvent\n ) => void;\n}\n\nexport const InputWithHeader = forwardRef(\n (\n {\n label,\n value,\n placeholder,\n useSpinner,\n useButton,\n onChange,\n onClickButton,\n ...htmlRestProps\n }: IInputWithHeader,\n ref\n ) => {\n const className = classNames(styles.container, {\n [styles.withSpinner]: !!useSpinner,\n [styles.withButton]: !!useButton,\n });\n\n const handleChange = onChange\n ? (event: ChangeEvent) =>\n onChange(event.target.value, event)\n : undefined;\n\n const handleButtonClick = onClickButton\n ? (event: React.MouseEvent) =>\n onClickButton(value, event)\n : undefined;\n\n return (\n
    \n {useSpinner && }\n \n \n {useButton && (\n \n \n \n )}\n
    \n );\n }\n);\n","import React, { Fragment, ReactNode } from 'react';\nimport { IAutocompleteState } from '../typings.autocomplete';\n\nconst highlightDifference = (\n markType: IAutocompleteState['markType'],\n value: string,\n list: IAutocompleteState['list']\n): IAutocompleteState['displayList'] => {\n if (!value || markType === 'none') return list;\n\n const re = new RegExp(`(${value.replace(/ +/g, '|')})`, 'ig');\n const separator = '[]';\n\n const handleId = (id: number): boolean =>\n id % 2 === (markType === 'match' ? 1 : 0);\n\n const GenerateDisplayItem = (item: string, id: number): ReactNode => {\n if (handleId(id)) return {item};\n\n return {item};\n };\n\n return list.map(({ display, id }) => ({\n id: id.toString(),\n display: display\n .replace(re, `${separator}$1${separator}`)\n .split(separator)\n .map(GenerateDisplayItem),\n }));\n};\n\nexport const generateDisplayList = (\n style: IAutocompleteState['style'],\n markType: IAutocompleteState['markType'],\n value: string,\n list: IAutocompleteState['list']\n): IAutocompleteState['displayList'] => {\n if (style === 'search') return highlightDifference(markType, value, list);\n\n const valueTest = new RegExp(value, 'gi');\n const filteredList = list.filter((item) => valueTest.test(item.display));\n\n return highlightDifference(markType, value, filteredList);\n};\n","import {\n IAutocompleteState,\n IAutocompleteReducer,\n IAutocompleteItem,\n} from './typings.autocomplete';\nimport { generateDisplayList } from './actions/generate-display-list';\n\nexport const reducer: IAutocompleteReducer = (\n state,\n action\n): IAutocompleteState => {\n switch (action.type) {\n case 'setValue': {\n let isLoading = state.isLoading;\n\n if (state.style === 'search') {\n isLoading = true;\n } else if (state.style === 'load') {\n isLoading = state.isInitiated ? state.isLoading : true;\n }\n\n return {\n ...state,\n value: action.payload,\n lastWrittenValue: action.payload,\n isDropdownOpen: !!state.displayList.length,\n isLoading,\n isInitiated: true,\n };\n }\n case 'setCurrentActiveItem': {\n const index = action.payload ?? state.currentActiveItem;\n\n if (index === null) return state;\n\n const selectedItemId = state.displayList[index].id;\n const selectedItem = state.list.find(\n (item) => item.id === selectedItemId\n ) as IAutocompleteItem;\n\n return {\n ...state,\n currentActiveItem: null,\n value: state.clearOnSelect ? '' : selectedItem.display,\n isDropdownOpen: state.clearOnSelect\n ? false\n : state.isDropdownOpen,\n };\n }\n case 'moveActiveItemUp': {\n const { length } = state.list;\n\n if (!length || state.currentActiveItem === null) return state;\n\n const currentActiveItem = state.currentActiveItem - 1;\n\n if (currentActiveItem < 0) {\n return {\n ...state,\n currentActiveItem: null,\n value: state.lastWrittenValue,\n };\n }\n\n const selectedItemId = state.displayList[currentActiveItem].id;\n const selectedItem = state.list.find(\n (item) => item.id === selectedItemId\n ) as IAutocompleteItem;\n\n return {\n ...state,\n currentActiveItem,\n value: selectedItem.display,\n };\n }\n case 'moveActiveItemDown': {\n const { length } = state.list;\n\n if (!length) return state;\n\n const currentActiveItem =\n state.currentActiveItem === null\n ? 0\n : Math.min(state.currentActiveItem + 1, length - 1);\n\n const selectedItemId = state.displayList[currentActiveItem].id;\n const selectedItem = state.list.find(\n (item) => item.id === selectedItemId\n ) as IAutocompleteItem;\n\n return {\n ...state,\n currentActiveItem,\n value: selectedItem.display,\n };\n }\n case 'setFocus': {\n return {\n ...state,\n isDropdownOpen: !!state.value && !!state.list.length,\n inFocus: true,\n };\n }\n case 'setBlur': {\n return {\n ...state,\n isDropdownOpen: false,\n currentActiveItem: null,\n inFocus: false,\n };\n }\n case 'setList': {\n const displayList = generateDisplayList(\n state.style,\n state.markType,\n state.value,\n action.payload\n );\n\n return {\n ...state,\n list: action.payload,\n displayList,\n isDropdownOpen: state.inFocus && !!displayList.length,\n isLoading: false,\n };\n }\n case 'updateDisplayList': {\n const displayList = generateDisplayList(\n state.style,\n state.markType,\n state.value,\n state.list\n );\n\n return {\n ...state,\n displayList,\n isDropdownOpen: state.inFocus && !!displayList.length,\n };\n }\n default: {\n throw new Error(`Unhandled action type: ${action}`);\n }\n }\n};\n","import { IAutocompleteState } from './typings.autocomplete';\n\nexport const initialState: IAutocompleteState = {\n value: '',\n lastWrittenValue: '',\n list: [],\n displayList: [],\n currentActiveItem: null,\n isDropdownOpen: false,\n isLoading: false,\n style: 'search',\n markType: 'none',\n isInitiated: false,\n inFocus: false,\n clearOnSelect: false,\n};\n","import { useReducer, useMemo } from 'react';\nimport { reducer } from './reducer.autocomplete';\nimport { initialState } from './initial-state.autocomplete';\nimport { actions } from './actions.autocomplete';\nimport {\n IAutocompleteState,\n AutocompleteOptionsType,\n} from './typings.autocomplete';\nimport { initializer } from './initializer.autocomplete';\n\ninterface IUseAutocompleteState\n extends Partial> {\n options?: AutocompleteOptionsType;\n}\n\nexport const useAutocompleteState = ({\n style = 'search',\n options,\n}: IUseAutocompleteState): {\n state: IAutocompleteState;\n actions: ReturnType;\n} => {\n const [state, dispatch] = useReducer(\n reducer,\n {\n ...initialState,\n style,\n },\n initializer(options)\n );\n\n const dispatchedActions = useMemo(() => actions(dispatch), [dispatch]);\n\n return {\n state,\n actions: dispatchedActions,\n };\n};\n","import {\n IAutocompleteState,\n AutocompleteOptionsType,\n} from './typings.autocomplete';\n\nexport const initializer = (options?: AutocompleteOptionsType) => (\n state: IAutocompleteState\n): IAutocompleteState => ({\n ...state,\n isLoading: state.style === 'preload',\n isInitiated: state.style === 'preload',\n markType: options?.markType ?? 'none',\n clearOnSelect: options?.clearOnSelect ?? false,\n});\n","import {\n IAutocompleteItem,\n IAutocompleteDispatch,\n} from './typings.autocomplete';\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type, @typescript-eslint/explicit-module-boundary-types\nexport const actions = (dispatch: IAutocompleteDispatch) => ({\n setValue: (payload: string): void =>\n dispatch({ type: 'setValue', payload }),\n setCurrentActiveItem: (payload: number | null): void =>\n dispatch({\n type: 'setCurrentActiveItem',\n payload,\n }),\n moveActiveItemUp: (): void => dispatch({ type: 'moveActiveItemUp' }),\n moveActiveItemDown: (): void => dispatch({ type: 'moveActiveItemDown' }),\n setFocus: (): void => dispatch({ type: 'setFocus' }),\n setBlur: (): void => dispatch({ type: 'setBlur' }),\n setList: (payload: IAutocompleteItem[]): void =>\n dispatch({ type: 'setList', payload }),\n updateDisplayList: (): void => dispatch({ type: 'updateDisplayList' }),\n});\n","import React, {\n useEffect,\n FunctionComponent,\n KeyboardEvent,\n useCallback,\n} from 'react';\nimport styles from './autocomplete.module.scss';\nimport { IClassName } from 'typings';\nimport { InputWithHeader } from 'components/forms/input-with-header';\nimport { debounce } from 'utils';\nimport {\n IAutocompleteState,\n SearchType,\n OnChangeType,\n AutocompleteOptionsType,\n} from './typings.autocomplete';\nimport { useAutocompleteState } from './use-autocomplete-state';\n\ninterface IAutocomplete\n extends IClassName,\n Partial> {\n search: SearchType;\n label: string;\n options?: AutocompleteOptionsType;\n onChange?: OnChangeType;\n clearOnSelect?: boolean;\n}\n\nexport const Autocomplete: FunctionComponent = ({\n label,\n className,\n search,\n style = 'search',\n options,\n onChange,\n}: IAutocomplete) => {\n const {\n state: {\n value,\n list,\n displayList,\n currentActiveItem,\n isDropdownOpen,\n isLoading,\n isInitiated,\n },\n actions: {\n setValue,\n setCurrentActiveItem,\n moveActiveItemUp,\n moveActiveItemDown,\n setFocus,\n setBlur,\n setList,\n updateDisplayList,\n },\n } = useAutocompleteState({ options, style });\n\n useEffect(() => {\n if (style === 'preload') {\n search(setList, value);\n }\n }, []);\n\n useEffect(() => {\n if (style === 'load' && isInitiated) {\n search(setList, value);\n }\n }, [isInitiated]);\n\n const handleSearch = useCallback(debounce(search), [search]);\n const handleLoadedSearch = useCallback(debounce(updateDisplayList, 50), []);\n\n const handleChange = (value: string) => {\n setValue(value);\n\n if (style === 'search') {\n handleSearch(setList, value);\n } else {\n handleLoadedSearch();\n }\n };\n\n const handleSetActiveItem = (index: number | null) => {\n const currentIndex = index ?? currentActiveItem ?? 0;\n const id = displayList?.[currentIndex]?.id;\n const item = list.find((item) => item.id === id);\n\n if (item) {\n onChange?.(item);\n }\n\n setCurrentActiveItem(index);\n };\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n const { key } = event;\n\n if (key === 'ArrowUp' || key === 'ArrowDown' || key === 'Enter') {\n switch (key) {\n case 'ArrowUp':\n moveActiveItemUp();\n break;\n case 'ArrowDown':\n moveActiveItemDown();\n break;\n case 'Enter':\n handleSetActiveItem(null);\n break;\n }\n\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n const containerClassName = [styles.container, className]\n .filter(Boolean)\n .join(' ');\n\n return (\n \n \n {isDropdownOpen && (\n
      \n {displayList.map((item, index) => (\n handleSetActiveItem(index)}\n className={\n index === currentActiveItem ? styles.active : ''\n }\n >\n {item.display}\n \n ))}\n
    \n )}\n
    \n );\n};\n","export type ValidationType = 'default' | 'alphanumeric' | 'numeric' | 'decimal';\n\nconst numericRegexTyping = /(0|[1-9][\\d]*)/g;\nconst numericRegexValidate = /^(0|[1-9][\\d]*)$/;\nconst decimalRegexTyping = /(0|[1-9][\\d]*)((,|\\.)[\\d]*)?/g;\nconst decimalRegexValidate = /^(0|[1-9][\\d]*)((,|\\.)[\\d]+)?$/;\n\nexport const convertValueToType = (\n value: string,\n type: ValidationType\n): string => {\n switch (type) {\n case 'default': {\n return value;\n }\n case 'alphanumeric': {\n return value;\n }\n case 'numeric': {\n const found = value.match(numericRegexTyping);\n\n return (\n found?.filter((item) => item !== '0').join('') ||\n found?.[0] ||\n '0'\n );\n }\n case 'decimal': {\n const found = value.match(decimalRegexTyping);\n\n found?.sort((a, b) => {\n if (a === '0') return 1;\n if (b === '0') return -1;\n\n return 0;\n });\n\n return found?.[0] || '0';\n }\n default: {\n throw new Error(`Unhandled validation type: ${type}`);\n }\n }\n};\n\nexport const validateType = (value: string, type: ValidationType): boolean => {\n switch (type) {\n case 'default': {\n return true;\n }\n case 'alphanumeric': {\n return true;\n }\n case 'numeric': {\n return numericRegexValidate.test(value);\n }\n case 'decimal': {\n return decimalRegexValidate.test(value);\n }\n default: {\n throw new Error(`Unhandled validation type: ${type}`);\n }\n }\n};\n","import React, {\n useState,\n useEffect,\n useCallback,\n forwardRef,\n ChangeEvent,\n} from 'react';\nimport { convertValueToType, ValidationType } from 'utils/validate';\n\ninterface INumberInput {\n value?: number;\n placeholder?: string;\n className?: string;\n name?: string;\n type: ValidationType;\n maxLength?: number;\n onChange?: (\n value: Record,\n event: ChangeEvent\n ) => void;\n}\n\nconst convertIntegerToLocale = (number: number): string =>\n number\n .toLocaleString('da-DK', { maximumFractionDigits: 0 })\n .replace(/\\./g, '');\n\nconst convertDecimalToLocale = (number: number): string =>\n number\n .toLocaleString('da-DK', { maximumFractionDigits: 2 })\n .replace(/\\./g, '');\n\nconst convertNumberFromLocale = (number: string): number =>\n number ? parseFloat(number.replace(/\\./g, '').replace(/,/g, '.')) : 0;\n\nexport const NumberInput = forwardRef(\n (\n {\n value,\n placeholder,\n onChange,\n name = 'value',\n type,\n maxLength,\n className,\n }: INumberInput,\n ref\n ) => {\n const [state, setState] = useState(value?.toString() || '');\n\n useEffect(() => {\n if (typeof value === 'number') {\n const number = convertNumberFromLocale(state);\n\n if (number !== value) {\n setState(convertDecimalToLocale(value));\n }\n }\n }, [value, type, state]);\n\n const handleChange = useCallback(\n (event: ChangeEvent) => {\n const value = convertValueToType(event.target.value, type);\n\n setState(value);\n\n const number = convertNumberFromLocale(value);\n\n return onChange?.({ [name]: number }, event);\n },\n [onChange, name, type]\n );\n\n return (\n \n );\n }\n);\n","import React, { useCallback, forwardRef, ChangeEvent } from 'react';\n\ninterface ITextInput {\n value?: string;\n placeholder?: string;\n className?: string;\n name?: string;\n maxLength?: number;\n onChange?: (\n value: Record,\n event: ChangeEvent\n ) => void;\n}\n\nexport const TextInput = forwardRef(\n (\n {\n value,\n placeholder,\n onChange,\n name = 'value',\n maxLength,\n className,\n }: ITextInput,\n ref\n ) => {\n const handleChange = useCallback(\n (event: ChangeEvent) =>\n onChange?.({ [name]: event.target.value }, event),\n [onChange, name]\n );\n\n return (\n \n );\n }\n);\n","import React, { forwardRef, ChangeEvent, InputHTMLAttributes } from 'react';\nimport styles from './input.module.scss';\nimport { Spinner } from 'components/feedback-indicators/spinner';\nimport { classNames } from 'utils';\nimport { Icon } from 'components/images-icons/icon';\nimport { ValidationType } from 'utils/validate';\nimport { NumberInput } from './number-input';\nimport { TextInput } from './text-input';\n\ninterface IInput {\n value?: string | number;\n placeholder?: string;\n label?: string;\n useSpinner?: boolean;\n useButton?: boolean;\n className?: string;\n name?: string;\n type?: ValidationType;\n maxLength?: number;\n onChange?: (\n value: Record,\n event: ChangeEvent\n ) => void;\n onClickButton?: (\n value: InputHTMLAttributes['value'],\n event: React.MouseEvent\n ) => void;\n}\n\nexport const Input = forwardRef(\n (\n {\n label,\n value,\n placeholder,\n useSpinner,\n useButton,\n onChange,\n onClickButton,\n className,\n name = 'value',\n type = 'default',\n maxLength,\n }: IInput,\n ref\n ) => {\n const containerClassName = classNames(\n styles.container,\n {\n [styles.withSpinner]: !!useSpinner,\n [styles.withButton]: !!useButton,\n [styles.withLabel]: !!label,\n },\n className\n );\n\n const handleButtonClick = onClickButton\n ? (event: React.MouseEvent) =>\n onClickButton(value, event)\n : undefined;\n\n return (\n
    \n {!!label && }\n {useSpinner && }\n {type === 'default' ? (\n \n ) : (\n \n )}\n {useButton && (\n \n \n \n )}\n
    \n );\n }\n);\n","const hasOwn = {}.hasOwnProperty;\n\nexport function classNames(\n ...args: (string | Record | null | undefined)[]\n): string {\n const classes = [];\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (!arg) continue;\n\n const argType = typeof arg;\n\n if (argType === 'string' || argType === 'number') {\n classes.push(arg);\n } else if (Array.isArray(arg)) {\n if (arg.length) {\n const inner = classNames(...arg);\n\n if (inner) {\n classes.push(inner);\n }\n }\n } else if (argType === 'object') {\n if (arg.toString !== Object.prototype.toString) {\n classes.push(arg.toString());\n } else {\n // @ts-ignore\n for (const key in arg) {\n // @ts-ignore\n if (hasOwn.call(arg, key) && arg[key]) {\n classes.push(key);\n }\n }\n }\n }\n }\n\n return classes.join(' ');\n}\n","type ExpressionType = string | RegExp;\n\ninterface ITestString {\n (\n value: string,\n expressions: ExpressionType | ExpressionType[] | ExpressionType[][]\n ): boolean;\n}\n\nexport const testString: ITestString = (value, expressions) => {\n if (Array.isArray(expressions)) {\n return expressions.some((expression: Parameters[1]) =>\n testString(value, expression)\n );\n }\n\n if (typeof expressions === 'string') {\n return expressions.toLowerCase() === value.toLowerCase();\n }\n\n return expressions.test(value);\n};\n","export const capitalizeFirstLetter = (string: string): string =>\n string ? string[0].toUpperCase() + string.slice(1) : string;\n","interface IDebounce {\n (callback: (...args: any[]) => void, delay?: number): (\n ...args: any[]\n ) => void;\n}\n\nexport const debounce: IDebounce = (callback, delay = 400) => {\n let inDebounce: NodeJS.Timeout;\n\n return (...args: any[]): void => {\n clearTimeout(inDebounce);\n\n inDebounce = setTimeout(() => callback(...args), delay);\n };\n};\n","interface IThrottle {\n (callback: (...args: any[]) => void, delay?: number): (\n ...args: any[]\n ) => void;\n}\n\nexport const throttle: IThrottle = (callback, delay = 400) => {\n let lastRan: number;\n let lastFunc: NodeJS.Timeout;\n\n return (...args: any[]): void => {\n if (!lastRan) {\n callback(...args);\n\n lastRan = Date.now();\n } else {\n clearTimeout(lastFunc);\n\n lastFunc = setTimeout(() => {\n if (Date.now() - lastRan >= delay) {\n callback(...args);\n lastRan = Date.now();\n }\n }, delay - (Date.now() - lastRan));\n }\n };\n};\n","import { IDimensions } from './typings';\n\nexport function getElementDimensions(element: HTMLElement): IDimensions {\n const { width, height } = element.getBoundingClientRect();\n\n return { width: Math.round(width), height: Math.round(height) };\n}\n","import { getElementRect } from './get-element-rect';\nimport { getContent, getContentRect } from './get-content-rect';\nimport { IRect } from './typings';\n\nexport function scrollToElement(\n element: HTMLElement,\n overlay?: Partial\n): void {\n const content = getContent();\n const contentRect = getContentRect();\n const rect = getElementRect(element, contentRect);\n\n content.scrollTop = rect.top + contentRect.scrollTop - (overlay?.top ?? 0);\n content.scrollLeft =\n rect.left + contentRect.scrollLeft - (overlay?.left ?? 0);\n}\n","import React, { FunctionComponent } from 'react';\nimport { Link as ReactLink } from 'react-router-dom';\nimport { Tooltip, ITooltip } from 'components/overlays/tooltip';\n\ntype LinkProps = Parameters[0] &\n Partial & { delayed?: boolean };\n\nexport const Link: FunctionComponent = ({\n children,\n title,\n delayed = true,\n placement,\n ...props\n}: LinkProps) => {\n if (title) {\n return (\n \n \n {children}\n \n \n );\n }\n\n return {children};\n};\n","export * from './local-storage';\nexport * from './typings';\n","export const filterUnique = (\n value: T,\n index: number,\n self: T[]\n): boolean => self.indexOf(value) === index;\n","export function delay(ms: number): Promise {\n return new Promise(function (resolve) {\n setTimeout(resolve, ms);\n });\n}\n","import { IconType } from './types';\n\nexport const icons: { [key: string]: IconType } = {\n \"analytics\": [576, 512, \"M80 352H16c-8.84 0-16 7.16-16 16v128c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16V368c0-8.84-7.16-16-16-16zM64 480H32v-96h32v96zm496-288h-64c-8.84 0-16 7.16-16 16v288c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16V208c0-8.84-7.16-16-16-16zm-16 288h-32V224h32v256zM502.77 88.68C510.12 93.24 518.71 96 528 96c26.51 0 48-21.49 48-48S554.51 0 528 0s-48 21.49-48 48c0 5.51 1.12 10.71 2.83 15.64l-89.6 71.68c-7.35-4.57-15.94-7.33-25.23-7.33s-17.88 2.76-25.23 7.33l-89.6-71.68C254.88 58.72 256 53.51 256 48c0-26.51-21.49-48-48-48s-48 21.49-48 48c0 7.4 1.81 14.32 4.8 20.58L68.58 164.8C62.32 161.81 55.4 160 48 160c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48c0-7.4-1.81-14.32-4.8-20.58l96.22-96.22C193.68 94.19 200.6 96 208 96c9.29 0 17.88-2.76 25.23-7.33l89.6 71.68c-1.71 4.93-2.83 10.14-2.83 15.65 0 26.51 21.49 48 48 48s48-21.49 48-48c0-5.51-1.12-10.72-2.83-15.65l89.6-71.67zM528 32c8.82 0 16 7.18 16 16s-7.18 16-16 16-16-7.18-16-16 7.18-16 16-16zM48 224c-8.82 0-16-7.18-16-16s7.18-16 16-16 16 7.18 16 16-7.18 16-16 16zM208 64c-8.82 0-16-7.18-16-16s7.18-16 16-16 16 7.18 16 16-7.18 16-16 16zm160 128c-8.82 0-16-7.18-16-16s7.18-16 16-16 16 7.18 16 16-7.18 16-16 16zm-128 0h-64c-8.84 0-16 7.16-16 16v288c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16V208c0-8.84-7.16-16-16-16zm-16 288h-32V224h32v256zm176-160h-64c-8.84 0-16 7.16-16 16v160c0 8.84 7.16 16 16 16h64c8.84 0 16-7.16 16-16V336c0-8.84-7.16-16-16-16zm-16 160h-32V352h32v128z\"],\n \"angle-down\": [256, 512, \"M119.5 326.9L3.5 209.1c-4.7-4.7-4.7-12.3 0-17l7.1-7.1c4.7-4.7 12.3-4.7 17 0L128 287.3l100.4-102.2c4.7-4.7 12.3-4.7 17 0l7.1 7.1c4.7 4.7 4.7 12.3 0 17L136.5 327c-4.7 4.6-12.3 4.6-17-.1z\"],\n \"angle-right\": [192, 512, \"M166.9 264.5l-117.8 116c-4.7 4.7-12.3 4.7-17 0l-7.1-7.1c-4.7-4.7-4.7-12.3 0-17L127.3 256 25.1 155.6c-4.7-4.7-4.7-12.3 0-17l7.1-7.1c4.7-4.7 12.3-4.7 17 0l117.8 116c4.6 4.7 4.6 12.3-.1 17z\"],\n \"bars\": [448, 512, \"M442 114H6a6 6 0 0 1-6-6V84a6 6 0 0 1 6-6h436a6 6 0 0 1 6 6v24a6 6 0 0 1-6 6zm0 160H6a6 6 0 0 1-6-6v-24a6 6 0 0 1 6-6h436a6 6 0 0 1 6 6v24a6 6 0 0 1-6 6zm0 160H6a6 6 0 0 1-6-6v-24a6 6 0 0 1 6-6h436a6 6 0 0 1 6 6v24a6 6 0 0 1-6 6z\"],\n \"blender\": [512, 512, \"M288 400c-13.26 0-24 10.74-24 24 0 13.25 10.74 24 24 24s24-10.75 24-24c0-13.26-10.74-24-24-24zm134.25-55.97L512 0H48C21.53 0 0 21.53 0 48v160c0 26.47 21.53 48 48 48h102.26l7.53 86.56C121.72 356.38 96 391.07 96 432v48c0 17.67 14.33 32 32 32h320c17.67 0 32-14.33 32-32v-48c0-39.4-23.79-73.18-57.75-87.97zM48 224c-8.81 0-16-7.17-16-16V48c0-8.83 7.19-16 16-16h82.78l16.7 192H48zM470.58 32l-16.7 64H296c-4.42 0-8 3.58-8 8v16c0 4.42 3.58 8 8 8h149.54l-16.7 64H296c-4.42 0-8 3.58-8 8v16c0 4.42 3.58 8 8 8h124.49l-29.22 112H189.34L162.9 32h307.68zM448 480H128v-48c0-35.29 28.71-64 64-64h192c35.29 0 64 28.71 64 64v48z\"],\n \"book\": [448, 512, \"M356 160H188c-6.6 0-12-5.4-12-12v-8c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12v8c0 6.6-5.4 12-12 12zm12 52v-8c0-6.6-5.4-12-12-12H188c-6.6 0-12 5.4-12 12v8c0 6.6 5.4 12 12 12h168c6.6 0 12-5.4 12-12zm64.7 268h3.3c6.6 0 12 5.4 12 12v8c0 6.6-5.4 12-12 12H80c-44.2 0-80-35.8-80-80V80C0 35.8 35.8 0 80 0h344c13.3 0 24 10.7 24 24v368c0 10-6.2 18.6-14.9 22.2-3.6 16.1-4.4 45.6-.4 65.8zM128 384h288V32H128v352zm-96 16c13.4-10 30-16 48-16h16V32H80c-26.5 0-48 21.5-48 48v320zm372.3 80c-3.1-20.4-2.9-45.2 0-64H80c-64 0-64 64 0 64h324.3z\"],\n \"check\": [448, 512, \"M413.505 91.951L133.49 371.966l-98.995-98.995c-4.686-4.686-12.284-4.686-16.971 0L6.211 284.284c-4.686 4.686-4.686 12.284 0 16.971l118.794 118.794c4.686 4.686 12.284 4.686 16.971 0l299.813-299.813c4.686-4.686 4.686-12.284 0-16.971l-11.314-11.314c-4.686-4.686-12.284-4.686-16.97 0z\"],\n \"chevron-right\": [256, 512, \"M17.525 36.465l-7.071 7.07c-4.686 4.686-4.686 12.284 0 16.971L205.947 256 10.454 451.494c-4.686 4.686-4.686 12.284 0 16.971l7.071 7.07c4.686 4.686 12.284 4.686 16.97 0l211.051-211.05c4.686-4.686 4.686-12.284 0-16.971L34.495 36.465c-4.686-4.687-12.284-4.687-16.97 0z\"],\n \"comments\": [576, 512, \"M569.9 441.1c-.5-.4-22.6-24.2-37.9-54.9 27.5-27.1 44-61.1 44-98.2 0-80-76.5-146.1-176.2-157.9C368.4 72.5 294.3 32 208 32 93.1 32 0 103.6 0 192c0 37 16.5 71 44 98.2-15.3 30.7-37.3 54.5-37.7 54.9-6.3 6.7-8.1 16.5-4.4 25 3.6 8.5 12 14 21.2 14 53.5 0 96.7-20.2 125.2-38.8 9.1 2.1 18.4 3.7 28 4.8 31.5 57.5 105.5 98 191.8 98 20.8 0 40.8-2.4 59.8-6.8 28.5 18.5 71.6 38.8 125.2 38.8 9.2 0 17.5-5.5 21.2-14 3.6-8.5 1.9-18.3-4.4-25zM155.4 314l-13.2-3-11.4 7.4c-20.1 13.1-50.5 28.2-87.7 32.5 8.8-11.3 20.2-27.6 29.5-46.4L83 283.7l-16.5-16.3C50.7 251.9 32 226.2 32 192c0-70.6 79-128 176-128s176 57.4 176 128-79 128-176 128c-17.7 0-35.4-2-52.6-6zm289.8 100.4l-11.4-7.4-13.2 3.1c-17.2 4-34.9 6-52.6 6-65.1 0-122-25.9-152.4-64.3C326.9 348.6 416 278.4 416 192c0-9.5-1.3-18.7-3.3-27.7C488.1 178.8 544 228.7 544 288c0 34.2-18.7 59.9-34.5 75.4L493 379.7l10.3 20.7c9.4 18.9 20.8 35.2 29.5 46.4-37.1-4.2-67.5-19.4-87.6-32.4z\"],\n \"home\": [576, 512, \"M541 229.16l-61-49.83v-77.4a6 6 0 0 0-6-6h-20a6 6 0 0 0-6 6v51.33L308.19 39.14a32.16 32.16 0 0 0-40.38 0L35 229.16a8 8 0 0 0-1.16 11.24l10.1 12.41a8 8 0 0 0 11.2 1.19L96 220.62v243a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-128l64 .3V464a16 16 0 0 0 16 16l128-.33a16 16 0 0 0 16-16V220.62L520.86 254a8 8 0 0 0 11.25-1.16l10.1-12.41a8 8 0 0 0-1.21-11.27zm-93.11 218.59h.1l-96 .3V319.88a16.05 16.05 0 0 0-15.95-16l-96-.27a16 16 0 0 0-16.05 16v128.14H128V194.51L288 63.94l160 130.57z\"],\n \"info\": [256, 512, \"M208 368.667V208c0-15.495-7.38-29.299-18.811-38.081C210.442 152.296 224 125.701 224 96c0-52.935-43.065-96-96-96S32 43.065 32 96c0 24.564 9.274 47.004 24.504 64H56c-26.467 0-48 21.533-48 48v48c0 23.742 17.327 43.514 40 47.333v65.333C25.327 372.486 8 392.258 8 416v48c0 26.467 21.533 48 48 48h144c26.467 0 48-21.533 48-48v-48c0-23.742-17.327-43.514-40-47.333zM128 32c35.346 0 64 28.654 64 64s-28.654 64-64 64-64-28.654-64-64 28.654-64 64-64zm88 432c0 8.837-7.163 16-16 16H56c-8.837 0-16-7.163-16-16v-48c0-8.837 7.163-16 16-16h24V272H56c-8.837 0-16-7.163-16-16v-48c0-8.837 7.163-16 16-16h104c8.837 0 16 7.163 16 16v192h24c8.837 0 16 7.163 16 16v48z\"],\n \"list-alt\": [512, 512, \"M464 64c8.823 0 16 7.178 16 16v352c0 8.822-7.177 16-16 16H48c-8.823 0-16-7.178-16-16V80c0-8.822 7.177-16 16-16h416m0-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-48zm-336 96c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0 96c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm0 96c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm288-148v-24a6 6 0 0 0-6-6H198a6 6 0 0 0-6 6v24a6 6 0 0 0 6 6h212a6 6 0 0 0 6-6zm0 96v-24a6 6 0 0 0-6-6H198a6 6 0 0 0-6 6v24a6 6 0 0 0 6 6h212a6 6 0 0 0 6-6zm0 96v-24a6 6 0 0 0-6-6H198a6 6 0 0 0-6 6v24a6 6 0 0 0 6 6h212a6 6 0 0 0 6-6z\"],\n \"map\": [576, 512, \"M560.02 32c-1.96 0-3.98.37-5.96 1.16L384.01 96H384L212 35.28A64.252 64.252 0 0 0 191.76 32c-6.69 0-13.37 1.05-19.81 3.14L20.12 87.95A32.006 32.006 0 0 0 0 117.66v346.32C0 473.17 7.53 480 15.99 480c1.96 0 3.97-.37 5.96-1.16L192 416l172 60.71a63.98 63.98 0 0 0 40.05.15l151.83-52.81A31.996 31.996 0 0 0 576 394.34V48.02c0-9.19-7.53-16.02-15.98-16.02zM30.63 118.18L176 67.61V387.8L31.91 441.05l-1.28-322.87zM208 387.71V67.8l160 56.48v319.91l-160-56.48zm192 56.68V124.2l144.09-53.26 1.28 322.87L400 444.39z\"],\n \"moon\": [512, 512, \"M448.964 365.617C348.188 384.809 255.14 307.765 255.14 205.419c0-58.893 31.561-112.832 82.574-141.862 25.83-14.7 19.333-53.859-10.015-59.28A258.114 258.114 0 0 0 280.947 0c-141.334 0-256 114.546-256 256 0 141.334 114.547 256 256 256 78.931 0 151.079-35.924 198.85-94.783 18.846-23.22-1.706-57.149-30.833-51.6zM280.947 480c-123.712 0-224-100.288-224-224s100.288-224 224-224c13.984 0 27.665 1.294 40.94 3.745-58.972 33.56-98.747 96.969-98.747 169.674 0 122.606 111.613 214.523 231.81 191.632C413.881 447.653 351.196 480 280.947 480z\"],\n \"percent\": [384, 512, \"M96 224c53 0 96-43 96-96s-43-96-96-96S0 75 0 128s43 96 96 96zm0-156c33.1 0 60 26.9 60 60s-26.9 60-60 60-60-26.9-60-60 26.9-60 60-60zm192 220c-53 0-96 43-96 96s43 96 96 96 96-43 96-96-43-96-96-96zm0 156c-33.1 0-60-26.9-60-60s26.9-60 60-60 60 26.9 60 60-26.9 60-60 60zm59.8-412H378c5 0 7.8 5.7 4.8 9.6L41 477.6c-1.1 1.5-2.9 2.4-4.8 2.4H6c-5 0-7.8-5.7-4.8-9.6L343 34.4c1.1-1.5 2.9-2.4 4.8-2.4z\"],\n \"shopping-basket\": [576, 512, \"M564 192h-76.875L347.893 37.297c-5.91-6.568-16.027-7.101-22.596-1.189s-7.101 16.028-1.189 22.596L444.075 192h-312.15L251.893 58.703c5.912-6.567 5.379-16.685-1.189-22.596-6.569-5.912-16.686-5.38-22.596 1.189L88.875 192H12c-6.627 0-12 5.373-12 12v8c0 6.627 5.373 12 12 12h16.444L58.25 438.603C61.546 462.334 81.836 480 105.794 480h364.412c23.958 0 44.248-17.666 47.544-41.397L547.556 224H564c6.627 0 12-5.373 12-12v-8c0-6.627-5.373-12-12-12zm-77.946 242.201c-1.093 7.867-7.906 13.799-15.848 13.799H105.794c-7.942 0-14.755-5.932-15.848-13.799L60.752 224h454.497l-29.195 210.201zM304 280v112c0 8.837-7.163 16-16 16-8.836 0-16-7.163-16-16V280c0-8.837 7.164-16 16-16 8.837 0 16 7.163 16 16zm112 0v112c0 8.837-7.163 16-16 16s-16-7.163-16-16V280c0-8.837 7.163-16 16-16s16 7.163 16 16zm-224 0v112c0 8.837-7.164 16-16 16s-16-7.163-16-16V280c0-8.837 7.164-16 16-16s16 7.163 16 16z\"],\n \"sun\": [512, 512, \"M256 143.7c-61.8 0-112 50.3-112 112.1s50.2 112.1 112 112.1 112-50.3 112-112.1-50.2-112.1-112-112.1zm0 192.2c-44.1 0-80-35.9-80-80.1s35.9-80.1 80-80.1 80 35.9 80 80.1-35.9 80.1-80 80.1zm256-80.1c0-5.3-2.7-10.3-7.1-13.3L422 187l19.4-97.9c1-5.2-.6-10.7-4.4-14.4-3.8-3.8-9.1-5.5-14.4-4.4l-97.8 19.4-55.5-83c-6-8.9-20.6-8.9-26.6 0l-55.5 83-97.8-19.5c-5.3-1.1-10.6.6-14.4 4.4-3.8 3.8-5.4 9.2-4.4 14.4L90 187 7.1 242.5c-4.4 3-7.1 8-7.1 13.3 0 5.3 2.7 10.3 7.1 13.3L90 324.6l-19.4 97.9c-1 5.2.6 10.7 4.4 14.4 3.8 3.8 9.1 5.5 14.4 4.4l97.8-19.4 55.5 83c3 4.5 8 7.1 13.3 7.1s10.3-2.7 13.3-7.1l55.5-83 97.8 19.4c5.4 1.2 10.7-.6 14.4-4.4 3.8-3.8 5.4-9.2 4.4-14.4L422 324.6l82.9-55.5c4.4-3 7.1-8 7.1-13.3zm-116.7 48.1c-5.4 3.6-8 10.1-6.8 16.4l16.8 84.9-84.8-16.8c-6.6-1.4-12.8 1.4-16.4 6.8l-48.1 72-48.1-71.9c-3-4.5-8-7.1-13.3-7.1-1 0-2.1.1-3.1.3l-84.8 16.8 16.8-84.9c1.2-6.3-1.4-12.8-6.8-16.4l-71.9-48.1 71.9-48.2c5.4-3.6 8-10.1 6.8-16.4l-16.8-84.9 84.8 16.8c6.5 1.3 12.8-1.4 16.4-6.8l48.1-72 48.1 72c3.6 5.4 9.9 8.1 16.4 6.8l84.8-16.8-16.8 84.9c-1.2 6.3 1.4 12.8 6.8 16.4l71.9 48.2-71.9 48z\"],\n \"times\": [320, 512, \"M193.94 256L296.5 153.44l21.15-21.15c3.12-3.12 3.12-8.19 0-11.31l-22.63-22.63c-3.12-3.12-8.19-3.12-11.31 0L160 222.06 36.29 98.34c-3.12-3.12-8.19-3.12-11.31 0L2.34 120.97c-3.12 3.12-3.12 8.19 0 11.31L126.06 256 2.34 379.71c-3.12 3.12-3.12 8.19 0 11.31l22.63 22.63c3.12 3.12 8.19 3.12 11.31 0L160 289.94 262.56 392.5l21.15 21.15c3.12 3.12 8.19 3.12 11.31 0l22.63-22.63c3.12-3.12 3.12-8.19 0-11.31L193.94 256z\"],\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"recipe_container__nWxLC\",\"directions\":\"recipe_directions__1Qf8R\",\"ingredients\":\"recipe_ingredients__1_hSV\",\"name\":\"recipe_name__2ZDzP\",\"description\":\"recipe_description__17fKl\",\"image\":\"recipe_image__HNzQ4\",\"content\":\"recipe_content__3xQiN\",\"inlineIngredient\":\"recipe_inlineIngredient__2b2yq\"};","import { IPublicRecipe } from './typings';\nimport { postData, Response } from '../post';\nimport { mapMediaSrc } from './utils';\n\nexport function get(uri: string): Promise> {\n return postData({\n url: 'recipe/get',\n data: uri,\n formatResult: mapMediaSrc,\n });\n}\n","import { IPreviewRecipe } from './typings';\nimport { getData, Response } from '../get';\nimport { mapMultipleMediaSrc } from './utils';\n\ntype SearchParameters = {\n published?: boolean;\n //personal?: boolean; // TODO: Missing backend\n categoryID?: number;\n onlyWithPicture?: boolean;\n page?: number;\n pageSize?: number;\n limit?: number;\n random?: boolean;\n excludeIDs?: number[];\n includeIngredients?: string[];\n excludeIngredients?: string[];\n};\n\nexport function search(\n searchParameters: SearchParameters\n): Promise> {\n return getData({\n url: 'recipe/search',\n data: searchParameters,\n formatResult: mapMultipleMediaSrc,\n });\n}\n","import { IPreviewRecipe } from './typings';\nimport { postData, Response } from '../post';\nimport { mapMultipleMediaSrc } from './utils';\n\nexport function all(): Promise> {\n return postData({\n url: 'recipe/all',\n formatResult: mapMultipleMediaSrc,\n });\n}\n","import { IPreviewRecipe } from './typings';\nimport { postData, Response } from '../post';\nimport { mapMultipleMediaSrc } from './utils';\n\nexport function picture(): Promise> {\n return postData({\n url: 'recipe/picture',\n formatResult: mapMultipleMediaSrc,\n });\n}\n","import { IIngredientList } from './typings';\nimport { postData, Response } from '../post';\nimport { mapMediaSrc } from 'api/recipe/utils';\n\nexport function recipes(uri?: string): Promise> {\n return postData({\n url: 'ingredient/recipes',\n data: uri,\n formatResult: (ingredientList) => {\n if (ingredientList.recipes?.length) {\n ingredientList.recipes = ingredientList.recipes.map(\n mapMediaSrc\n );\n }\n\n return ingredientList;\n },\n });\n}\n","import React, { ReactNode } from 'react';\nimport style from './check-list.module.scss';\nimport { Checkbox } from 'components/actions/checkbox';\n\ninterface ICheckedList {\n list: ReactNode[];\n}\n\nexport const CheckedList = ({ list }: ICheckedList) => {\n return (\n <>\n {list.map((item, index) => (\n \n ))}\n \n );\n};\n","import React, { ReactNode } from 'react';\nimport style from './numbered-list.module.scss';\nimport { classNames } from 'utils';\n\ninterface INumberedList extends Partial {\n list: ReactNode[];\n}\n\nexport const NumberedList = ({ className, list }: INumberedList) => {\n const listClassName = classNames(style.list, className);\n\n return (\n
      \n {list.map((item, index) => (\n
    1. \n {item}\n
    2. \n ))}\n
    \n );\n};\n","import { cookieExists } from 'utils/cookie';\nimport { LocalStorageTypes } from './typings';\nimport { jsonTryParse } from 'utils/json';\n\nexport const canUseLocalStorage = (): boolean => {\n return false && cookieExists('useLocalStorage');\n};\n\nexport const getFromLocalStorage = (\n stateScope: LocalStorageTypes,\n defaultValue: T\n): T => {\n return (canUseLocalStorage()\n ? jsonTryParse(localStorage.getItem(stateScope)) ?? defaultValue\n : defaultValue) as T;\n};\n\nexport const setFromLocalStorage = (\n stateScope: LocalStorageTypes,\n value: T\n): void => {\n localStorage.setItem(stateScope, JSON.stringify(value));\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"icon\":\"icon_icon__mecwm\"};","export { get } from './get';\nexport { search } from './search';\nexport { all } from './all';\nexport { picture } from './picture';\nexport * from './typings';\n","export { recipes } from './recipes';\nexport * from './typings';\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"checkbox\":\"check-list_checkbox__28HTs\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"breadcrumb_container__1cN8b\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"spinner\":\"spinner_spinner__upa3i\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"ingredientList\":\"fridge_ingredientList__1I7Nf\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"bar\":\"loading-bar_bar__1X7yg\"};","var map = {\n\t\"./colors/show\": [\n\t\t159,\n\t\t0\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 171;\nmodule.exports = webpackAsyncContext;","var map = {\n\t\"./actions/autocomplete/show\": [\n\t\t180,\n\t\t6\n\t],\n\t\"./actions/button/show\": [\n\t\t181,\n\t\t7\n\t],\n\t\"./actions/checkbox/show\": [\n\t\t182,\n\t\t8\n\t],\n\t\"./design/colors/show\": [\n\t\t159,\n\t\t0\n\t],\n\t\"./feedback-indicators/spinner/show\": [\n\t\t183,\n\t\t9\n\t],\n\t\"./forms/input-with-header/show\": [\n\t\t185,\n\t\t10\n\t],\n\t\"./forms/input/show\": [\n\t\t184,\n\t\t11\n\t],\n\t\"./forms/select/show\": [\n\t\t186,\n\t\t12\n\t],\n\t\"./images-icons/icon/show\": [\n\t\t187,\n\t\t13\n\t],\n\t\"./images-icons/logo/show\": [\n\t\t188,\n\t\t14\n\t],\n\t\"./images-icons/profile-picture/show\": [\n\t\t194,\n\t\t4\n\t],\n\t\"./lists-tables/check-list/show\": [\n\t\t189,\n\t\t15\n\t],\n\t\"./lists-tables/numbered-list/show\": [\n\t\t190,\n\t\t16\n\t],\n\t\"./lists-tables/table/show\": [\n\t\t193,\n\t\t5\n\t],\n\t\"./navigation/navigation/show\": [\n\t\t191,\n\t\t17\n\t],\n\t\"./overlays/tooltip/show\": [\n\t\t192,\n\t\t18\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 172;\nmodule.exports = webpackAsyncContext;","import { ISortByOptions } from './sort/typings';\nimport { sortBy, sortByKey } from './sort/sort-by';\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n interface Array {\n sortBy(options?: ISortByOptions): Array;\n sortByKey(\n key: T[keyof T] | T[keyof T][],\n options?: ISortByOptions\n ): Array;\n }\n}\n\nif (!Array.prototype.sortBy) {\n // eslint-disable-next-line no-extend-native\n Array.prototype.sortBy = function (options?: ISortByOptions): T[] {\n return sortBy(this, options);\n };\n}\n\nif (!Array.prototype.sortByKey) {\n // eslint-disable-next-line no-extend-native\n Array.prototype.sortByKey = function (\n key: T[keyof T] | T[keyof T][],\n options?: ISortByOptions\n ): T[] {\n return sortByKey(this, key, options);\n };\n}\n","export const list = {\n design: ['colors'],\n forms: ['input-with-header', 'input', 'select'],\n 'images-icons': ['profile-picture', 'logo', 'icon'],\n overlays: ['tooltip'],\n navigation: ['navigation'],\n 'lists-tables': ['table', 'numbered-list', 'check-list'],\n actions: ['autocomplete', 'checkbox', 'button'],\n 'feedback-indicators': ['spinner'],\n};\n","import { lazy } from 'react';\nimport { RoomType, ShowType } from './types';\nimport { list } from './list';\nimport { capitalizeFirstLetter } from 'utils';\n\ntype Keys = keyof typeof list;\n\nconst formatName = (name: string): string =>\n capitalizeFirstLetter(name.split('-').join(' '));\n\nexport const designRooms: ShowType[] = list['design'].map((item) => ({\n name: formatName(item),\n component: lazy(() => import(`components/design/${item}/show`)),\n}));\n\nconst formatRoomName = (roomName: string): Keys =>\n roomName.replace(/( and )| /g, '-').toLowerCase() as Keys;\n\nconst getRooms = (name: string): RoomType => {\n const key = formatRoomName(name);\n\n return {\n name,\n list: list[key]?.map(\n (item: string): ShowType => ({\n name: formatName(item),\n component: lazy(() => import(`components/${key}/${item}/show`)),\n })\n ),\n };\n};\n\nexport const rooms: RoomType[] = [\n getRooms('Actions'),\n getRooms('Structure'),\n getRooms('Forms'),\n getRooms('Images and icons'),\n getRooms('Feedback indicators'),\n getRooms('Titles and text'),\n getRooms('Behavior'),\n getRooms('Lists and tables'),\n getRooms('Navigation'),\n getRooms('Overlays'),\n];\n","import React, { FunctionComponent } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { getTheme, toggleTheme } from 'store/layout';\nimport { Icon } from 'components/images-icons/icon';\n\nexport const ToggleTheme: FunctionComponent = () => {\n const theme = useSelector(getTheme);\n const dispatch = useDispatch();\n\n const onClick = () => dispatch(toggleTheme());\n\n return (\n
    \n \n
    \n );\n};\n","import React, { useEffect } from 'react';\nimport { IPreviewRecipe } from 'api/recipe';\nimport styles from './preview-recipe.module.scss';\nimport { Link } from 'utils';\nimport { motion, useAnimation } from 'framer-motion';\nimport { useInView } from 'hooks/use-in-view';\n\nexport const PreviewRecipe = ({ title, mediaSrc, uri }: IPreviewRecipe) => {\n const controls = useAnimation();\n const { ref, inView, preload } = useInView({\n listenOnExit: false,\n usePreload: !!mediaSrc,\n });\n\n useEffect(() => {\n if (inView) {\n controls.start('visible');\n }\n }, [controls, inView]);\n\n return (\n \n \n {mediaSrc && preload && (\n {title}\n )}\n
    \n
    {title}
    \n \n \n );\n};\n","import { RefObject, useState, useEffect, useRef } from 'react';\nimport { throttle } from 'utils';\nimport { isVisible, isVisibleWithDistance } from 'utils/element/is-visible';\n\nconst preloadDistance = 500;\n\ninterface IUseInView {\n listenOnExit?: boolean;\n usePreload?: boolean;\n}\n\nexport const useInView = ({ listenOnExit, usePreload }: IUseInView = {}): {\n ref: RefObject;\n inView: boolean;\n preload: boolean;\n} => {\n const ref = useRef(null);\n const [inView, setInView] = useState(null);\n const [preload, setPreload] = useState(false);\n const blockListener = !listenOnExit && inView === true;\n\n const setCurrentState = (): void => {\n if (ref.current && !blockListener) {\n if (usePreload) {\n const visibility = isVisibleWithDistance(ref.current);\n\n setInView(visibility.visible);\n\n if (\n !visibility.visible &&\n !preload &&\n visibility.distance <= preloadDistance\n ) {\n setPreload(true);\n }\n } else {\n setInView(isVisible(ref.current));\n }\n }\n };\n\n const handleScroll = throttle(setCurrentState, 500);\n\n useEffect(setCurrentState, [ref]);\n\n useEffect(() => {\n if (!blockListener) {\n const content = document.body.querySelector('#content');\n\n if (content) {\n content.addEventListener('scroll', handleScroll, false);\n\n return (): void =>\n content.removeEventListener('scroll', handleScroll, false);\n }\n }\n }, [ref, listenOnExit, inView, usePreload]);\n\n return {\n ref,\n inView: inView ?? false,\n preload: (preload || inView) ?? false,\n };\n};\n","import React, { useState, useEffect } from 'react';\nimport { throttle } from 'utils';\nimport { Button } from 'components/actions/button';\nimport styles from './alphabetical-list.module.scss';\nimport { CategorizedListItem } from './typings';\n\ninterface ICategoryList {\n categoryKeys: string[];\n categories: CategorizedListItem[];\n onClick: (index: number) => void;\n getCurrentCategory: () => string;\n}\n\nexport const CategoryList = ({\n categoryKeys,\n categories,\n getCurrentCategory,\n onClick,\n}: ICategoryList) => {\n const [currentActiveKey, setCurrentActiveKey] = useState(\n categoryKeys[0]\n );\n\n const handleScroll = throttle(() => {\n const currentKey = getCurrentCategory();\n\n if (currentKey) {\n setCurrentActiveKey(currentKey);\n }\n }, 100);\n\n useEffect(() => {\n const content = document.body.querySelector('#content');\n\n if (content) {\n content.addEventListener('scroll', handleScroll, false);\n\n return () =>\n content.removeEventListener('scroll', handleScroll, false);\n }\n }, [categories]);\n\n const handleClick = (value: string) => {\n const index = categoryKeys.findIndex((key) => key === value);\n\n if (index === -1) return;\n\n onClick(index);\n };\n\n return (\n
    \n {categoryKeys.map((category) => (\n \n {category}\n \n ))}\n
    \n );\n};\n","import React, { useRef, useMemo, MutableRefObject } from 'react';\nimport { isVisible, scrollToElement } from 'utils';\nimport styles from './alphabetical-list.module.scss';\nimport { ListItem } from './typings';\nimport { getList, getKeys } from './helpers';\nimport { CategoryList } from './category-list';\n\ninterface IAlphabeticalList {\n list: ListItem[];\n}\n\nconst overlay = { top: 57 };\n\nconst getCurrentCategory = (\n refs: MutableRefObject>,\n keys: string[]\n) => {\n const length = refs?.current?.length ?? 0;\n\n for (let index = 0; index < length; index++) {\n const ref = refs?.current[index];\n\n if (!ref) continue;\n\n if (isVisible(ref, overlay)) return keys?.[index];\n }\n\n return '';\n};\n\nexport const AlphabeticalList = ({ list }: IAlphabeticalList) => {\n const categoryRefs = useRef>([]);\n\n const categoryKeys = useMemo(() => getKeys(list), [list]);\n const categories = useMemo(() => getList(categoryKeys, list), [\n categoryKeys,\n ]);\n\n const handleGetCurrenCategory = () =>\n getCurrentCategory(categoryRefs, categoryKeys);\n\n const handleClick = (index: number) => {\n const ref = categoryRefs.current?.[index];\n\n if (!ref) return;\n\n scrollToElement(ref, { ...overlay, top: overlay.top - 2 });\n };\n\n return (\n <>\n \n {categories.map(({ category, components }, index) => (\n \n (categoryRefs.current[index] = el)\n }\n className={styles.category}\n >\n
    {category}
    \n
    {components}
    \n
    \n ))}\n \n );\n};\n","import { ListItem } from '../typings';\nimport { filterUnique } from 'utils';\n\nexport const getKeys = (list: ListItem[]): string[] =>\n list\n .map(({ title }) => title[0].toUpperCase())\n .filter(filterUnique)\n .sortBy();\n","import { ListItem, CategorizedListItem } from '../typings';\n\nexport const getList = (\n keys: string[],\n list: ListItem[]\n): CategorizedListItem[] =>\n keys.map((category) => ({\n category,\n components: list\n .filter(({ title }) => title[0].toUpperCase() === category)\n .sortByKey('title')\n .map(({ component }) => component),\n }));\n","import React, { useEffect, useState } from 'react';\nimport { api } from 'api';\nimport { IPreviewRecipe } from 'api/recipe';\nimport { PreviewRecipe } from 'components/structure/preview-recipe';\nimport { usePath } from 'hooks';\nimport { AlphabeticalList } from 'components/lists-tables/alphabetical-list';\n\nexport function Recipes() {\n const path = usePath();\n\n const [recipes, setRecipes] = useState([]);\n const type = path.paths?.length <= 2 && path.paths?.[1];\n\n useEffect(() => {\n if (type && type !== 'billede') return;\n\n const load = async () => {\n const loadedRecipes = await (type\n ? api.recipe.picture()\n : api.recipe.all());\n\n if (loadedRecipes.success) {\n setRecipes(loadedRecipes.result);\n }\n };\n\n load();\n }, [type]);\n\n if (!recipes?.length) {\n return <>Loader?;\n }\n\n return (\n <>\n

    \n {type === 'billede'\n ? 'Alle opskrifter med billede'\n : 'Alle opskrifter'}\n

    \n

    \n Her finder du en oversigt over alle opskrifter\n

    \n ({\n title: recipe.title,\n component: ,\n }))}\n />\n \n );\n}\n","import React, { FunctionComponent } from 'react';\nimport { classNames, Link } from 'utils';\nimport { useSelector } from 'react-redux';\nimport styles from './layout.module.scss';\nimport topbarStyles from './topbar.module.scss';\nimport { Logo } from 'components/images-icons/logo';\n//import { ProfilePicture } from 'components/images-icons/profile-picture';\nimport { getTheme } from 'store/layout';\nimport { ToggleTheme } from 'components/behavior/toggle-theme';\nimport { NavigationButton } from 'components/navigation/navigation';\nimport { Tooltip } from 'components/overlays/tooltip';\n\nexport const Topbar: FunctionComponent = () => {\n const theme = useSelector(getTheme);\n const wrapperClassName = classNames(styles.topbar, topbarStyles.wrapper);\n\n return (\n
    \n
    \n \n
    \n
    \n \n \n \n
    \n
    \n \n \n \n
    \n {/*
    \n \n \n \n
    */}\n
    \n );\n};\n","import React from 'react';\nimport { IChildren, IRouteProps } from 'typings';\nimport { Topbar } from './topbar';\nimport styles from './layout.module.scss';\nimport { Navigation } from 'components/navigation/navigation';\n\ninterface IWrapper extends IChildren, IRouteProps {\n fullPage?: boolean;\n}\n\nexport const Wrapper = ({ children }: IWrapper) => {\n return (\n
    \n
    \n
    {children}
    \n
    \n \n \n
    \n );\n};\n","import React, { Fragment } from 'react';\nimport { Link } from 'utils';\nimport { Icon } from 'components/images-icons/icon';\nimport styles from './breadcrumb.module.scss';\n\ntype IBreadcrumbItem = {\n title: string;\n link: string;\n};\n\ninterface IBreadcrumb {\n base: IBreadcrumbItem;\n list: IBreadcrumbItem[];\n}\n\nexport const Breadcrumb = ({ base, list }: IBreadcrumb) => {\n const length = list.length;\n\n if (!length) return null;\n\n const breadcrumbs = [base, ...list];\n\n return (\n
    \n {breadcrumbs.map(({ link, title }, index) => (\n \n {index < length ? (\n <>\n \n {title}\n \n \n \n ) : (\n title\n )}\n \n ))}\n
    \n );\n};\n","import React, { FunctionComponent } from 'react';\nimport { IChildren, IClassName } from 'typings';\nimport { classNames } from 'utils';\nimport styles from './badge.module.scss';\nimport { Tooltip } from 'components/overlays/tooltip';\n\nexport interface IBadge extends IChildren, IClassName {\n color?: 'primary' | 'default';\n type?: 'round' | 'pill' | 'rect' | 'square';\n title?: string;\n}\n\nexport const Badge: FunctionComponent = ({\n children,\n color = 'default',\n type = 'round',\n title,\n className,\n}: IBadge) => {\n const badgeClassName = classNames(\n styles.badge,\n styles[type],\n styles[color],\n className\n );\n\n const badge =
    {children}
    ;\n\n if (title) {\n return {badge};\n }\n\n return badge;\n};\n","import React, { useEffect, useState } from 'react';\nimport { api } from 'api';\nimport { IIngredientList } from 'api/ingredient';\nimport { PreviewRecipe } from 'components/structure/preview-recipe';\nimport { Button } from 'components/actions/button';\nimport { Link } from 'utils';\nimport { usePath } from 'hooks';\nimport { Breadcrumb } from 'components/navigation/breadcrumb';\nimport { Badge } from 'components/titles-text/badge';\nimport { AlphabeticalList } from 'components/lists-tables/alphabetical-list';\n\nexport function Ingredients() {\n const path = usePath();\n\n const [ingredients, setIngredients] = useState();\n const type = path.pathname.replace(/^\\/ingredienser(\\/|$)/, '');\n\n useEffect(() => {\n const load = async () => {\n const loadedIngredients = await api.ingredient.recipes(type);\n\n if (loadedIngredients.success) {\n setIngredients(loadedIngredients.result);\n }\n };\n\n load();\n }, [type]);\n\n if (!ingredients) {\n return <>Loader?;\n }\n\n const recipeList = (\n ({\n title: ingredient.title,\n component: (\n
    \n \n {ingredient.title}\n \n {ingredient.recipeCount}\n \n \n
    \n ),\n }))}\n />\n );\n\n if (!ingredients.ingredient) {\n return (\n <>\n

    Alle ingredienser

    \n

    \n Her finder du en oversigt over alle ingredienser\n

    \n {recipeList}\n \n );\n }\n\n return (\n <>\n \n

    \n {ingredients.ingredient.title}\n \n {ingredients.ingredient.recipeCount}\n \n

    \n

    \n Alle ingredienser under denne kategori kan ses herunder.\n

    \n

    \n I bunden findes alle opskrifter der indeholder{' '}\n {ingredients.ingredient.title.toLowerCase()}.\n

    \n {recipeList}\n
    \n {!!ingredients.recipes?.length &&\n ingredients.recipes.map((recipe) => (\n \n ))}\n
    \n {ingredients.recipes?.length === 3 && (\n \n )}\n \n );\n}\n","export const types = [\n '',\n 'l',\n 'dl',\n 'cl',\n 'ml',\n 'spsk',\n 'tsk',\n 'knsp',\n 'cm',\n 'mm',\n 'kg',\n 'g',\n 'stk',\n 'glas',\n 'pk',\n];\n\nexport const conversionTypes: Record<\n string,\n {\n name: string;\n key: string;\n list: { key: string; name: string; type?: 'metric' | 'imperial' }[];\n }\n> = {\n volume: {\n name: 'Volumen / Liter',\n key: 'l',\n list: [\n { key: 'l', name: 'Liter', type: 'metric' },\n { key: 'dl', name: 'Deciliter', type: 'metric' },\n { key: 'cl', name: 'Centiliter', type: 'metric' },\n { key: 'ml', name: 'Milliliter', type: 'metric' },\n { key: 'spsk', name: 'Spiseske', type: 'metric' },\n { key: 'tsk', name: 'Teske', type: 'metric' },\n { key: 'knsp', name: 'Knivspids', type: 'metric' },\n { key: 'ounce_l', name: 'Flydende ounce', type: 'imperial' },\n { key: 'cup', name: 'Kop', type: 'imperial' },\n { key: 'pint', name: 'Pint', type: 'imperial' },\n { key: 'quart', name: 'Kvart', type: 'imperial' },\n { key: 'gallon', name: 'Gallon', type: 'imperial' },\n ],\n },\n mass: {\n name: 'Masse / Vægt',\n key: 'kg',\n list: [\n { key: 'kg', name: 'Kilogram', type: 'metric' },\n { key: 'g', name: 'Gram', type: 'metric' },\n { key: 'ounce_g', name: 'Ounce', type: 'imperial' },\n { key: 'stone', name: 'Sten', type: 'imperial' },\n { key: 'pound', name: 'Pund', type: 'imperial' },\n ],\n },\n length: {\n name: 'Længde',\n key: 'cm',\n list: [\n { key: 'cm', name: 'Centimeter', type: 'metric' },\n { key: 'mm', name: 'Millimeter', type: 'metric' },\n { key: 'inch', name: 'Tommer', type: 'imperial' },\n { key: 'foot', name: 'Fod', type: 'imperial' },\n ],\n },\n temperature: {\n name: 'Temperatur',\n key: 'c',\n list: [\n { key: 'c', name: 'Celsius' },\n { key: 'f', name: 'Fahrenheit' },\n { key: 'k', name: 'Kelvin' },\n ],\n },\n};\n\nexport const converTypes = {\n volume: [\n 'l',\n 'dl',\n 'cl',\n 'ml',\n 'spsk',\n 'tsk',\n 'knsp',\n 'ounce_l',\n 'cup',\n 'pint',\n 'quart',\n 'gallon',\n ],\n mass: ['kg', 'g', 'ounce_g', 'stone', 'pound'],\n length: ['cm', 'mm', 'inch', 'foot'],\n temperature: ['c', 'f', 'k'],\n};\n\nexport const isApprovedConvertedType = (type: string): boolean => {\n return (\n converTypes.volume.includes(type) ||\n converTypes.mass.includes(type) ||\n converTypes.length.includes(type)\n );\n};\n\nexport function getUnitType(type: string): string {\n switch (type) {\n case 'l':\n case 'dl':\n case 'cl':\n case 'ml':\n case 'spsk':\n case 'tsk':\n case 'knsp':\n case 'ounce_l':\n case 'cup':\n case 'pint':\n case 'quart':\n case 'gallon':\n return 'l';\n\n case 'cm':\n case 'mm':\n case 'inch':\n case 'foot':\n return 'cm';\n\n case 'kg':\n case 'g':\n case 'ounce_g':\n case 'stone':\n case 'pound':\n return 'kg';\n\n case 'c':\n case 'f':\n case 'k':\n return 'c';\n\n case 'stk':\n default:\n return 'stk';\n }\n}\n\nexport function convertUnitType(\n amount: number,\n fromType: string,\n toType: string\n): number {\n const unitType = getUnitType(fromType);\n\n if (unitType !== getUnitType(toType)) return amount;\n\n return convertFromUnitType(convertToUnitType(amount, fromType), toType);\n}\n\nexport function convertToUnitType(amount: number, unit: string): number {\n const unitType = getUnitType(unit);\n\n if (unitType === unit) return amount;\n\n if (unitType === 'l') {\n switch (unit) {\n case 'dl':\n return amount / 10;\n case 'cl':\n return amount / 100;\n case 'ml':\n return amount / 1000;\n case 'spsk':\n return amount / (1000 / 15);\n case 'tsk':\n return amount / (1000 / 5);\n case 'knsp':\n return amount / (1000 / 2.5);\n\n case 'ounce_l':\n return amount / (1000 / 28.41);\n case 'cup':\n return amount / (1000 / 284.1);\n case 'pint':\n return amount / (1000 / 568.26);\n case 'quart':\n return amount / (1000 / 1136.52);\n case 'gallon':\n return amount / (1000 / 4546.09);\n }\n } else if (unitType === 'cm') {\n switch (unit) {\n case 'mm':\n return amount / 10;\n\n case 'inch':\n return (amount / 10) * 25.4;\n case 'foot':\n return (amount / 10) * 304.8;\n }\n } else if (unitType === 'kg') {\n switch (unit) {\n case 'g':\n return amount / 1000;\n\n case 'ounce_g':\n return (amount / 1000) * 28.349523125;\n case 'stone':\n return amount * 0.45359237;\n case 'pound':\n return amount * 6.35029318;\n }\n } else if (unitType === 'c') {\n switch (unit) {\n case 'f':\n return (amount - 32) * (5 / 9);\n case 'k':\n return amount - 273.15;\n }\n }\n\n return amount;\n}\n\nexport function convertFromUnitType(amount: number, unit: string): number {\n const unitType = getUnitType(unit);\n\n if (unitType === unit) return amount;\n\n if (unitType === 'l') {\n switch (unit) {\n case 'dl':\n return amount * 10;\n case 'cl':\n return amount * 100;\n case 'ml':\n return amount * 1000;\n case 'spsk':\n return amount * (1000 / 15);\n case 'tsk':\n return amount * (1000 / 5);\n case 'knsp':\n return amount * (1000 / 2.5);\n\n case 'ounce_l':\n return amount * (1000 / 28.41);\n case 'cup':\n return amount * (1000 / 284.1);\n case 'pint':\n return amount * (1000 / 568.26);\n case 'quart':\n return amount * (1000 / 1136.52);\n case 'gallon':\n return amount * (1000 / 4546.09);\n }\n } else if (unitType === 'cm') {\n switch (unit) {\n case 'mm':\n return amount * 10;\n\n case 'inch':\n return amount * 10 * 25.4;\n case 'foot':\n return amount * 10 * 304.8;\n }\n } else if (unitType === 'kg') {\n switch (unit) {\n case 'g':\n return amount * 1000;\n\n case 'ounce_g':\n return amount * 1000 * 28.349523125;\n case 'stone':\n return amount / 0.45359237;\n case 'pound':\n return amount / 6.35029318;\n }\n } else if (unitType === 'c') {\n switch (unit) {\n case 'f':\n return amount * (9 / 5) + 32;\n case 'k':\n return amount + 273.15;\n }\n }\n\n return amount;\n}\n\nexport function convertToEven(\n amount: string,\n type: string\n): { amount: number; type: string } | false {\n if (validate_numeric(amount)) return { amount: parseInt(amount), type };\n if (!validate_numeric_decimal(amount)) return false;\n\n const index = types.findIndex((t) => t === type) + 1;\n\n if (types.length <= index || getUnitType(type) != getUnitType(types[index]))\n return { amount: parseInt(amount), type };\n\n return {\n amount: convertUnitType(parseInt(amount), type, types[index]),\n type: types[index],\n };\n}\n\nfunction validate_numeric(text: string, performZeroCheck = true): boolean {\n if (performZeroCheck) return /^(0|[1-9][\\d]*)$/.test(text);\n\n return /^[\\d]+$/.test(text);\n}\n\nfunction validate_numeric_decimal(text: string): boolean {\n return /^(0|[1-9][\\d]*)((,|\\.)[\\d]+)?$/.test(text);\n}\n","import { IConvertState } from '../typings.convert';\nimport { conversionTypes } from 'utils/ingredient/convert';\n\nexport const getSelectionTypes = (\n categoryType: string\n): Pick<\n IConvertState,\n 'categoryType' | 'categoryList' | 'firstSelectedType' | 'secondSelectedType'\n> => {\n const categoryList = conversionTypes[categoryType].list;\n const selectedType = categoryList[0].key;\n\n return {\n categoryType,\n categoryList,\n firstSelectedType: selectedType,\n secondSelectedType: selectedType,\n };\n};\n","import { IConvertState } from '../typings.convert';\nimport { convertUnitType } from 'utils/ingredient/convert';\n\ntype ConvertValueType = Pick<\n IConvertState,\n 'firstSelectedValue' | 'secondSelectedValue'\n>;\n\ntype ConvertSelectedType = Pick<\n IConvertState,\n 'firstSelectedType' | 'secondSelectedType'\n>;\n\nexport const convertAmount = (\n { firstSelectedValue, secondSelectedValue }: Partial,\n { firstSelectedType, secondSelectedType }: ConvertSelectedType,\n selected: Partial | null = null\n): ConvertValueType => {\n if (\n firstSelectedValue !== undefined &&\n (selected === null || selected.firstSelectedType)\n ) {\n return {\n firstSelectedValue,\n secondSelectedValue: convertUnitType(\n firstSelectedValue,\n firstSelectedType,\n secondSelectedType\n ),\n };\n } else if (\n secondSelectedValue !== undefined &&\n (selected === null || selected.secondSelectedType)\n ) {\n return {\n firstSelectedValue: convertUnitType(\n secondSelectedValue,\n secondSelectedType,\n firstSelectedType\n ),\n secondSelectedValue,\n };\n }\n\n return {\n firstSelectedValue: 0,\n secondSelectedValue: 0,\n };\n};\n","import { IConvertState, IConvertReducer } from './typings.convert';\nimport { getSelectionTypes, convertAmount } from './actions';\n\nexport const reducer: IConvertReducer = (state, action): IConvertState => {\n switch (action.type) {\n case 'setCategoryType': {\n const {\n categoryType,\n categoryList,\n firstSelectedType,\n secondSelectedType,\n } = getSelectionTypes(action.payload.categoryType);\n\n return {\n ...state,\n categoryType,\n categoryList,\n firstSelectedType,\n secondSelectedType,\n firstSelectedValue: 1,\n secondSelectedValue: 1,\n };\n }\n case 'setSelectionType': {\n const { payload } = action;\n const tempState: IConvertState = { ...state, ...payload };\n\n const updateValues = convertAmount(state, tempState, payload);\n\n return { ...tempState, ...updateValues };\n }\n case 'setSelectionValue': {\n const updateValues = convertAmount(action.payload, state);\n\n return { ...state, ...updateValues };\n }\n default: {\n throw new Error(`Unhandled action type: ${action}`);\n }\n }\n};\n","import { IConvertState } from './typings.convert';\nimport { conversionTypes } from 'utils/ingredient/convert';\nimport { getSelectionTypes } from './actions';\n\nconst generateInitialState = (): IConvertState => {\n const categoryTypes = Object.keys(conversionTypes).map((key) => ({\n key,\n name: conversionTypes[key].name,\n }));\n\n const {\n categoryType,\n categoryList,\n firstSelectedType,\n secondSelectedType,\n } = getSelectionTypes(categoryTypes[0].key);\n\n return {\n categoryTypes,\n categoryType,\n categoryList,\n firstSelectedType,\n secondSelectedType,\n firstSelectedValue: 1,\n secondSelectedValue: 1,\n };\n};\n\nexport const initialState: IConvertState = generateInitialState();\n","import { Input } from 'components/forms/input';\nimport { Select } from 'components/forms/select';\nimport React from 'react';\nimport styles from './convert.module.scss';\nimport { useConvertState } from './use-convert-state';\n\nexport function Convert() {\n const {\n state: {\n categoryTypes,\n categoryType,\n categoryList,\n firstSelectedType,\n secondSelectedType,\n firstSelectedValue,\n secondSelectedValue,\n },\n actions: {\n setCategoryType,\n setFirstSelectionType,\n setSecondSelectionType,\n setFirstSelectionValue,\n setSecondSelectionValue,\n },\n } = useConvertState();\n\n return (\n <>\n

    Konverter måleenheder

    \n

    \n Den lette måde at oversætte de udenlandske opskrifter.\n

    \n
    \n \n
    \n
    \n \n \n
    \n
    =
    \n
    \n \n \n
    \n
    \n
    \n \n );\n}\n","import { useReducer, useMemo } from 'react';\nimport { reducer } from './reducer.convert';\nimport { initialState } from './initial-state.convert';\nimport { actions } from './actions.convert';\nimport { IConvertState } from './typings.convert';\n\nexport const useConvertState = (): {\n state: IConvertState;\n actions: ReturnType;\n} => {\n const [state, dispatch] = useReducer(reducer, initialState);\n\n const dispatchedActions = useMemo(() => actions(dispatch), [dispatch]);\n\n return {\n state,\n actions: dispatchedActions,\n };\n};\n","import { IConvertDispatch } from './typings.convert';\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type, @typescript-eslint/explicit-module-boundary-types\nexport const actions = (dispatch: IConvertDispatch) => ({\n setCategoryType: (payload: Record<'categoryType', string>): void =>\n dispatch({\n type: 'setCategoryType',\n payload,\n }),\n setFirstSelectionType: (\n payload: Record<'firstSelectedType', string>\n ): void =>\n dispatch({\n type: 'setSelectionType',\n payload,\n }),\n setSecondSelectionType: (\n payload: Record<'secondSelectedType', string>\n ): void =>\n dispatch({\n type: 'setSelectionType',\n payload,\n }),\n setFirstSelectionValue: (\n payload: Record<'firstSelectedValue', number>\n ): void =>\n dispatch({\n type: 'setSelectionValue',\n payload,\n }),\n setSecondSelectionValue: (\n payload: Record<'secondSelectedValue', number>\n ): void =>\n dispatch({\n type: 'setSelectionValue',\n payload,\n }),\n});\n","import React, { FunctionComponent } from 'react';\nimport styles from './removeable-badge.module.scss';\nimport { Tooltip } from 'components/overlays/tooltip';\nimport { Icon } from 'components/images-icons/icon';\nimport { Badge, IBadge } from 'components/titles-text/badge';\n\ninterface IRemoveableBadge extends Omit {\n onClick: () => void;\n asPartOfList?: boolean;\n}\n\nexport const RemoveableBadge: FunctionComponent = ({\n children,\n title,\n onClick,\n asPartOfList,\n}: IRemoveableBadge) => {\n const className = [styles.badge, asPartOfList && styles.partOfList]\n .filter(Boolean)\n .join(' ');\n\n return (\n \n
    {children}
    \n \n \n \n
    \n );\n};\n","import { IFridgeReducer, IFridgeState } from './typings.fridge';\n\nexport const reducer: IFridgeReducer = (state, action): IFridgeState => {\n switch (action.type) {\n case 'setRecipes': {\n return {\n ...state,\n recipes: action.payload,\n isLoading: false,\n };\n }\n case 'startLoading': {\n return { ...state, isLoading: true };\n }\n case 'includeIngredient': {\n if (state.includedIngredients.includes(action.payload))\n return state;\n\n return {\n ...state,\n includedIngredients: [\n ...state.includedIngredients,\n action.payload,\n ],\n };\n }\n case 'excludeIngredient': {\n if (state.excludedIngredients.includes(action.payload))\n return state;\n\n return {\n ...state,\n excludedIngredients: [\n ...state.excludedIngredients,\n action.payload,\n ],\n };\n }\n case 'toggleIngredient': {\n return state; // TODO\n }\n case 'removeIngredient': {\n return {\n ...state,\n includedIngredients: state.includedIngredients.filter(\n (ingredient) => ingredient.id !== action.payload\n ),\n excludedIngredients: state.excludedIngredients.filter(\n (ingredient) => ingredient.id !== action.payload\n ),\n };\n }\n default: {\n throw new Error(`Unhandled action type: ${action}`);\n }\n }\n};\n","import { IFridgeState } from './typings.fridge';\n\nexport const initialState: IFridgeState = {\n includedIngredients: [],\n excludedIngredients: [],\n recipes: [],\n isLoading: false,\n};\n","import { api } from 'api';\nimport { SearchType } from 'components/actions/autocomplete';\n\nexport const search: SearchType = async (setList) => {\n const searchedIngredients = await api.search.ingredients();\n\n if (searchedIngredients.success) {\n const list = searchedIngredients.result.map((ingredient) => ({\n ingredient,\n id: ingredient.id,\n display: ingredient.breadcrumb\n .map((item) => item.title)\n .join(' – '),\n }));\n\n setList(list);\n }\n};\n","import React, { FunctionComponent } from 'react';\nimport { IIngredient } from 'api/ingredient/typings';\nimport { RemoveableBadge } from 'components/titles-text/removeable-badge';\nimport { Autocomplete, OnChangeType } from 'components/actions/autocomplete';\nimport { useFridgeState } from './use-fridge-state';\nimport { PreviewRecipe } from 'components/structure/preview-recipe';\nimport { search } from './actions';\nimport { Spinner } from 'components/feedback-indicators/spinner';\nimport styles from './fridge.module.scss';\nimport { Tooltip } from 'components/overlays/tooltip';\n\nexport const Fridge: FunctionComponent = () => {\n const {\n state: { includedIngredients, recipes, isLoading },\n actions: { includeIngredient, removeIngredient },\n } = useFridgeState();\n\n const handleChange: OnChangeType<{ ingredient: IIngredient }> = (item) => {\n if (item?.ingredient) {\n includeIngredient(item.ingredient);\n }\n };\n\n return (\n <>\n

    Tøm køleskabet

    \n

    \n Tilføj let ingredienser du til din søgning og bliv inspireret\n til at få varene brugt.\n

    \n \n
    \n {includedIngredients.map((ingredient) => (\n removeIngredient(ingredient.id)}\n asPartOfList\n >\n breadcrumb.title)\n .join(' – ')}\n delay={1000}\n >\n {ingredient.title}\n \n \n ))}\n
    \n
    \n {isLoading && }\n {recipes.map((recipe) => (\n \n ))}\n
    \n \n );\n};\n","import { useEffect, useReducer, useMemo } from 'react';\nimport { api } from 'api';\nimport { actions } from './actions.fridge';\nimport { IFridgeState } from './typings.fridge';\nimport { reducer } from './reducer.fridge';\nimport { initialState } from './initial-state.fridge';\n\nexport const useFridgeState = (): {\n state: IFridgeState;\n actions: ReturnType;\n} => {\n const [state, dispatch] = useReducer(reducer, initialState);\n const dispatchedActions = useMemo(() => actions(dispatch), [dispatch]);\n\n useEffect(() => {\n if (\n !state.includedIngredients.length &&\n !state.excludedIngredients.length\n ) {\n dispatchedActions.setRecipes([]);\n\n return;\n }\n\n api.recipe\n .search({\n includeIngredients:\n state.includedIngredients.map(\n (ingredient) => ingredient.id\n ) || [],\n /*excludeIngredients: state.excludedIngredients.map(\n (ingredient) => ingredient.id\n ) || [],*/\n })\n .then((response) => {\n if (response.success) {\n dispatchedActions.setRecipes(response.result);\n }\n });\n }, [state.includedIngredients, state.excludedIngredients]);\n\n return { state, actions: dispatchedActions };\n};\n","import { IFridgeDispatch, IFridgeState } from './typings.fridge';\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type, @typescript-eslint/explicit-module-boundary-types\nexport const actions = (dispatch: IFridgeDispatch) => ({\n setRecipes: (payload: IFridgeState['recipes']): void =>\n dispatch({ type: 'setRecipes', payload }),\n startLoading: (): void => dispatch({ type: 'startLoading' }),\n includeIngredient: (\n payload: IFridgeState['includedIngredients'][0]\n ): void => dispatch({ type: 'includeIngredient', payload }),\n excludeIngredient: (\n payload: IFridgeState['includedIngredients'][0]\n ): void => dispatch({ type: 'excludeIngredient', payload }),\n toggleIngredient: (\n payload: IFridgeState['includedIngredients'][0]['id']\n ): void => dispatch({ type: 'toggleIngredient', payload }),\n removeIngredient: (\n payload: IFridgeState['includedIngredients'][0]['id']\n ): void => dispatch({ type: 'removeIngredient', payload }),\n});\n","import React from 'react';\nimport { usePath } from 'hooks';\nimport { Ingredients } from './ingredients';\nimport { Convert } from './convert';\nimport { Fridge } from './fridge';\n\nexport function IngredientRoute() {\n const { paths } = usePath();\n\n switch (paths?.[1]) {\n case 'konverter': {\n return paths.length !== 2 ? <>Fejl! : ;\n }\n case 'køleskab': {\n return paths.length !== 2 ? <>Fejl! : ;\n }\n default: {\n return ;\n }\n }\n}\n","import React from 'react';\nimport { IChildren } from 'typings';\nimport styles from './formatting.module.scss';\nimport { classNames } from 'utils';\n\nexport const Bolder = ({ children }: IChildren) => (\n {children}\n);\n\nexport const Spacer = () =>
    ;\n\nexport const H1 = ({ children, center }: IChildren & { center?: boolean }) => (\n

    {children}

    \n);\n\nexport const H2 = ({ children, center }: IChildren & { center?: boolean }) => (\n

    {children}

    \n);\n\nexport const H3 = ({ children, center }: IChildren & { center?: boolean }) => (\n

    {children}

    \n);\n\nexport const H4 = ({ children, center }: IChildren & { center?: boolean }) => (\n

    {children}

    \n);\n","import React from 'react';\nimport { H1, H2, H3, H4, Bolder, Spacer } from 'utils/formatting';\n\nexport const Cookies = () => {\n return (\n <>\n

    Cookiepolitik

    \n

    \n Cookies anvendes til at analysere webtrafikken{' '}\n samt til nødvendige funktioner på hjemmesiden.\n

    \n \n

    Cookies

    \n

    \n Cookies er små tekstfiler, som kan bruges af hjemmesider til at\n forbedre brugeroplevelsen. Der er ikke gemt personlige\n oplysninger i vores cookies, og de kan ikke indeholde virus.\n

    \n

    \n Herunder ses en liste over formålene Spis Billigt har til at\n anvende cookies:\n

    \n
      \n
    • \n Teknisk funktionalitet: Til at huske om du\n er logget ind eller ej.\n
    • \n
    • \n Trafikmåling*: Til at vide hvor mange der\n besøger hjemmesiden og for at se hvilket indhold der er\n populært.\n
    • \n
    • \n Optimering: Til at forbedre hjemmesidens\n funktionaliteter og udseende.\n
    • \n
    \n * Deles med tredjepart (Google Analytics).\n \n

    Google Analytics

    \n

    \n Hjemmesiden anvender nogle cookies til at kunne gemme dine\n sidevisninger fra Spis Billigt og sende dem til Google Analytics\n så de kan medgå i analysen over besøg på hjemmesiden. Dette\n gøres for at holde øje med hvilke sider der er de mest populære\n og bruge den viden når der skal udvikles nye sider. Det eneste\n cookien gemmer er et unikt genereret ID så Google Analytics kan\n genkende dig over alle de besøgende sider på Spis Billigt. Dette\n ID deles kun med Google Analytics og indeholder ingen\n persondata.\n

    \n

    \n \n Alt data delt med Google Analytics er anonymiseret.\n \n

    \n \n

    Nødvendig cookies

    \n

    \n Nødvendige cookies hjælper med at gøre en hjemmeside brugbar ved\n at aktivere grundlæggende funktioner såsom side-navigation og\n adgang til sikre områder af hjemmesiden. Hjemmesiden kan ikke\n fungere ordentligt uden disse cookies.\n

    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NavnUdbyderFormålUdløbType
    \n

    ci_session

    \n
    \n

    spisbilligt.dk

    \n
    \n

    \n Bevarer brugertilstand på tværs af\n sideforespørgsler.\n

    \n
    \n

    Session

    \n
    \n

    \n HTTP\n
    \n Cookie\n

    \n
    \n

    sb_session

    \n
    \n

    spisbilligt.dk

    \n
    \n

    \n Bevarer brugertilstand på tværs af\n sideforespørgsler når "husk mig"\n funktionen er tilvalgt ved logind.\n

    \n
    \n

    30 dage

    \n
    \n

    \n HTTP\n
    \n Cookie\n

    \n
    \n

    sb_auth

    \n
    \n

    spisbilligt.dk

    \n
    \n

    \n Bevarer brugerautentificering på tværs af\n sideforespørgsler når en bruger har tilvalgt\n to-trin godkendelse.\n

    \n
    \n

    30 dage

    \n
    \n

    \n HTTP\n
    \n Cookie\n

    \n
    \n

    sb_settings

    \n
    \n

    spisbilligt.dk

    \n
    \n

    \n Gemmer brugerens cookie- og\n analyse-samtykke.\n

    \n
    \n

    1 år

    \n
    \n

    \n HTTP\n
    \n Cookie\n

    \n
    \n
    \n \n

    Analyse cookies

    \n

    \n Analyse cookies hjælper webstedsejere med at forstå, hvordan de\n besøgende interagerer med hjemmesider ved at indsamle og\n rapportere oplysninger anonymt.\n

    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NavnUdbyderFormålUdløbType
    \n

    ga_session

    \n
    \n

    spisbilligt.dk

    \n
    \n

    \n Registrerer et unikt ID, der anvendes til at\n føre analyse over hvordan den besøgende\n bruger hjemmesiden.\n

    \n
    \n

    1 år

    \n
    \n

    \n HTTP\n
    \n Cookie\n

    \n
    \n
    \n \n

    \n Sidst opdateret den 6. juni 2020.\n

    \n \n );\n};\n","import React from 'react';\n\nexport const Privacy = () => {\n return <>Privacy!;\n};\n","import React, { useEffect, useRef } from 'react';\nimport { Route, Switch, RouteProps, useHistory } from 'react-router-dom';\nimport { useDispatch } from 'react-redux';\nimport { IRouteProps } from 'typings';\nimport { Showroom } from './features/showroom';\nimport { Handler as RecipeHandler } from './features/recipe';\nimport { Recipes } from 'features/recipes';\nimport { Layout } from 'features/layout';\nimport { IngredientRoute } from 'features/ingredients';\nimport { clearAllTooltips } from 'components/overlays/tooltip/slice';\nimport { authenticate } from 'utils/authenticate';\nimport { Cookies } from 'features/misc/cookies';\nimport { Privacy } from 'features/misc/privacy';\nimport { getReferrer, generateBrowserSpecificId } from 'utils/track';\n\nconst getComponent = (controller: string) => {\n switch (controller) {\n case undefined: {\n return

    Velkommen til Spis Billigt!

    ;\n }\n case 'opskrift': {\n return ;\n }\n case 'opskrifter': {\n return ;\n }\n case 'ingredienser': {\n return ;\n }\n case 'cookiepolitik': {\n return ;\n }\n case 'privatlivspolitik': {\n return ;\n }\n default: {\n return <>Indhold kommer...;\n }\n }\n};\n\nconst Component = ({ location }: RouteProps) => {\n const referrer = useRef();\n const pathname = location?.pathname || '';\n const paths = pathname.split('/').filter(Boolean);\n const controller = paths?.[0];\n\n const path: IRouteProps['path'] = {\n paths,\n pathname,\n controller,\n };\n\n const dispatch = useDispatch();\n\n //console.log(authenticate());\n //printNavTimingData();\n console.log(generateBrowserSpecificId());\n\n useEffect(() => {\n dispatch(clearAllTooltips());\n console.log(\n path.pathname,\n getReferrer(),\n referrer.current,\n referrer.current || getReferrer(),\n //printNavTimingData()\n { reloaded: window.location.href === referrer.current }\n );\n\n return () => {\n referrer.current = window.location.href;\n };\n }, [dispatch, path]);\n\n if (process.env.NODE_ENV === 'development' && controller === 'showroom') {\n return ;\n }\n\n const component = getComponent(controller);\n\n return {component};\n};\n\nfunction printNavTimingData() {\n // Use getEntriesByType() to just get the \"navigation\" events\n const perfEntries = performance.getEntriesByType(\"navigation\");\n \n for (let i = 0; i < perfEntries.length; i++) {\n console.log(\"= Navigation entry[\" + i + \"]\");\n const p = perfEntries[i];\n\n console.log(p);\n // @ts-ignore\n console.log(p.type, p.entryType, p.initiatorType);\n\n // dom Properties\n // @ts-ignore\n console.log(\"DOM content loaded = \" + (p.domContentLoadedEventEnd - p.domContentLoadedEventStart));\n // @ts-ignore\n console.log(\"DOM complete = \" + p.domComplete);\n // @ts-ignore\n console.log(\"DOM interactive = \" + p.interactive);\n \n // document load and unload time\n // @ts-ignore\n console.log(\"document load = \" + (p.loadEventEnd - p.loadEventStart));\n // @ts-ignore\n console.log(\"document unload = \" + (p.unloadEventEnd - p.unloadEventStart));\n \n // other properties\n // @ts-ignore\n console.log(\"type = \" + p.type);\n // @ts-ignore\n console.log(\"redirectCount = \" + p.redirectCount);\n }\n }\n\nexport const Routes = () => (\n \n }\n />\n \n);\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nfunction registerValidSW(swUrl: string, config?: Config): void {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = (): void => {\n const installingWorker = registration.installing;\n\n if (installingWorker == null) {\n return;\n }\n\n installingWorker.onstatechange = (): void => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config): void {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n\n if (\n response.status === 404 ||\n (contentType != null &&\n contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function register(config?: Config): void {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\nexport function unregister(): void {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n}\n","import React, { FunctionComponent, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { getTheme } from 'store/layout';\nimport { getNavigationState } from 'store/navigation';\nimport navigationStyles from 'components/navigation/navigation/navigation.module.scss';\n//import styles from 'styles/index.scss';\n\nexport const LayoutHelper: FunctionComponent = () => {\n const theme = useSelector(getTheme);\n const { isNavigationOpen } = useSelector(getNavigationState);\n\n useEffect(() => {\n if (theme === 'dark') {\n document.body.classList.add('dark');\n }\n\n return () => document.body.classList.remove('dark');\n }, [theme]);\n\n useEffect(() => {\n if (isNavigationOpen) {\n document.body.classList.add(navigationStyles.open);\n }\n\n return () => document.body.classList.remove(navigationStyles.open);\n }, [isNavigationOpen]);\n\n return <>;\n};\n","import React from 'react';\nimport styles from './loading-bar.module.scss';\n\nexport const LoadingBar = () => {\n return
    ;\n};\n","import React from 'react';\nimport { TooltipContainer } from './overlays/tooltip';\nimport { LayoutHelper } from 'features/layout/helper';\nimport { LoadingBar } from './feedback-indicators/loading-bar';\nimport { Spinner } from './feedback-indicators/spinner';\nimport styles from 'features/layout/layout.module.scss';\n\nexport const ComponentHelper = () => {\n return (\n <>\n \n \n \n \n \n );\n};\n","import { api } from 'api';\nimport { Component } from 'react';\nimport { IChildren } from 'typings';\n\ninterface IErrorBoundary extends IChildren {}\n\ninterface IErrorBoundaryState {\n hasError: boolean;\n}\n\nexport class ErrorBoundary extends Component {\n constructor(props: IErrorBoundary) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error): IErrorBoundaryState {\n // Update state so the next render will show the fallback UI.\n\n console.log('getDerivedStateFromError', error);\n\n api.track.error(error);\n\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, errorInfo: any): void {\n // You can also log the error to an error reporting service\n //logErrorToMyService(error, errorInfo);\n\n console.log('componentDidCatch', error, errorInfo);\n }\n\n render(): IChildren['children'] {\n /*if (this.state.hasError) {\n // You can render any custom fallback UI\n return

    Something went wrong.

    ;\n }*/\n\n return this.props.children;\n }\n}\n","import React, { StrictMode } from 'react';\nimport ReactDOM from 'react-dom';\nimport './styles/index.scss';\nimport { Routes } from './routes';\nimport { store } from 'store';\nimport { Provider } from 'react-redux';\nimport * as serviceWorker from './serviceWorker';\nimport { BrowserRouter } from 'react-router-dom';\nimport { ComponentHelper } from 'components';\nimport { ErrorBoundary } from 'components/feedback-indicators/error-boundary';\n\nrequire('utils/array/extensions');\n\nrequire('typeface-open-sans');\nrequire('typeface-montserrat');\n\nReactDOM.render(\n \n \n \n \n \n \n \n \n \n ,\n document.getElementById('root')\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}