UNPKG

@applaudem/icon-selector-dialog

Version:

A searchable icon selector dialog component for React with Material-UI and Iconify

1 lines 22.2 kB
{"version":3,"file":"IconSelector.cjs","sources":["../../src/IconSelector.tsx"],"sourcesContent":["import React, { useState, useEffect, useMemo, useCallback, useRef } from 'react';\nimport { Icon } from '@iconify/react';\nimport { \n Dialog, \n DialogTitle, \n DialogContent, \n TextField, \n IconButton,\n Typography,\n Box,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n CircularProgress,\n debounce\n} from '@mui/material';\nimport * as MuiIcons from '@mui/icons-material';\nimport iconListJson from './iconList.json';\n\n// Types and interfaces\ninterface IconList {\n [setName: string]: IconSet;\n}\n\ninterface IconCategory {\n [categoryName: string]: string[];\n}\n\ninterface IconSet {\n prefix: string;\n categories: IconCategory;\n}\n\n// Props interface for the IconSelector component\nexport interface IconSelectorProps {\n open: boolean;\n onClose: () => void;\n onSelect: (iconName: string) => void;\n currentIcon?: string;\n}\n\n// Type assertion for the imported icon list\nconst iconList = iconListJson as IconList;\n\n// Simple Dutch translations\nconst translations = {\n title: \"Kies een icoon\",\n iconSet: \"Icon Set\",\n category: \"Categorie\",\n searchPlaceholder: \"Zoek in alle icon sets en categorieën...\",\n searching: \"Zoeken...\",\n noResults: \"Geen iconen gevonden voor\",\n clearSearch: \"zoekopdracht wissen\"\n};\n\n// Replace individual icon imports with references from MuiIcons\nconst SearchIcon = MuiIcons.Search;\nconst ClearIcon = MuiIcons.Clear;\n\nfunction IconSelector({ \n open, \n onClose, \n onSelect, \n currentIcon,\n}: IconSelectorProps) {\n const [searchTerm, setSearchTerm] = useState('');\n const [selectedIconSet, setSelectedIconSet] = useState('');\n const [selectedCategory, setSelectedCategory] = useState('');\n const [loading, setLoading] = useState(true);\n const [isSearching, setIsSearching] = useState(false);\n const [debouncedSearchResults, setDebouncedSearchResults] = useState<string[]>([]);\n const [displaySearchTerm, setDisplaySearchTerm] = useState('');\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n // Initialize selected icon set\n useEffect(() => {\n if (open && !selectedIconSet && Object.keys(iconList).length > 0) {\n setSelectedIconSet(Object.keys(iconList)[0]);\n setLoading(false);\n }\n }, [open, selectedIconSet]);\n\n // Get sorted categories for current icon set (with \"Other\" at the bottom)\n const categories = useMemo(() => {\n if (!selectedIconSet) return [];\n \n const allCategories = Object.keys(iconList[selectedIconSet].categories);\n return allCategories\n .filter(cat => cat !== 'Other')\n .sort()\n .concat(['Other']);\n }, [selectedIconSet]);\n\n // Initialize selected category when icon set changes\n useEffect(() => {\n if (selectedIconSet && categories.length > 0) {\n setSelectedCategory(categories[0]);\n }\n }, [selectedIconSet, categories]);\n\n // Debounced search function with async processing\n const debouncedSearch = useCallback(\n debounce((searchTerm: string) => {\n if (!searchTerm) {\n setDebouncedSearchResults([]);\n setIsSearching(false);\n return;\n }\n\n // Use requestAnimationFrame to prevent UI blocking\n requestAnimationFrame(() => {\n // Break up the search into chunks using setTimeout\n const searchTermLower = searchTerm.toLowerCase();\n const results: string[] = [];\n const iconSets = Object.entries(iconList);\n let currentSetIndex = 0;\n\n function processNextIconSet() {\n if (currentSetIndex >= iconSets.length) {\n // All sets processed\n setDebouncedSearchResults(results);\n setIsSearching(false);\n return;\n }\n\n const [, setData] = iconSets[currentSetIndex];\n Object.entries(setData.categories).forEach(([, icons]) => {\n const matchingIcons = icons.filter(icon => \n icon.toLowerCase().includes(searchTermLower)\n );\n results.push(...matchingIcons);\n });\n\n currentSetIndex++;\n setTimeout(processNextIconSet, 0);\n }\n\n processNextIconSet();\n });\n }, 500),\n []\n );\n\n // Handle search input\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setDisplaySearchTerm(value);\n if (value) {\n setIsSearching(true);\n setSearchTerm(value);\n debouncedSearch(value);\n } else {\n setIsSearching(false);\n setSearchTerm('');\n setDebouncedSearchResults([]);\n }\n };\n\n // Get filtered icons based on search term or current selection\n const filteredIcons = useMemo(() => {\n if (searchTerm) {\n return debouncedSearchResults;\n } else if (selectedIconSet && selectedCategory) {\n return iconList[selectedIconSet].categories[selectedCategory] || [];\n }\n return [];\n }, [searchTerm, selectedIconSet, selectedCategory, debouncedSearchResults]);\n\n const handleIconSelect = (iconName: string) => {\n onSelect(iconName);\n onClose();\n };\n\n // Get icon set and category for an icon (for displaying in search results)\n const getIconMetadata = (iconName: string) => {\n for (const [setName, setData] of Object.entries(iconList)) {\n for (const [categoryName, icons] of Object.entries(setData.categories)) {\n if (icons.includes(iconName)) {\n return { setName, categoryName };\n }\n }\n }\n return { setName: '', categoryName: '' };\n };\n\n // Add event listener for keypress\n useEffect(() => {\n if (!open) return;\n\n const handleKeyPress = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') {\n return;\n }\n \n // Ignore special keys like Control, Alt, etc.\n if (e.ctrlKey || e.altKey || e.metaKey) {\n return;\n }\n\n // Focus the search input and start typing\n if (searchInputRef.current) {\n searchInputRef.current.focus();\n }\n };\n\n window.addEventListener('keydown', handleKeyPress);\n return () => window.removeEventListener('keydown', handleKeyPress);\n }, [open]);\n\n if (loading) {\n return (\n <Dialog open={open} onClose={onClose}>\n <DialogContent>\n <Box display=\"flex\" justifyContent=\"center\" alignItems=\"center\" p={4}>\n <CircularProgress />\n </Box>\n </DialogContent>\n </Dialog>\n );\n }\n\n return (\n <Dialog \n open={open} \n onClose={onClose}\n maxWidth=\"md\"\n fullWidth\n >\n <DialogTitle>\n {translations.title}\n </DialogTitle>\n <DialogContent>\n <Box sx={{ mb: 2 }}>\n <Box display=\"grid\" gridTemplateColumns={{ xs: '1fr', md: '1fr 1fr' }} gap={2}>\n <Box>\n <FormControl fullWidth margin=\"normal\">\n <InputLabel>{translations.iconSet}</InputLabel>\n <Select\n value={selectedIconSet}\n onChange={(e) => {\n setSelectedIconSet(e.target.value);\n setSelectedCategory('');\n }}\n label={translations.iconSet}\n disabled={!!searchTerm}\n >\n {Object.keys(iconList).map((set) => (\n <MenuItem key={set} value={set}>{set}</MenuItem>\n ))}\n </Select>\n </FormControl>\n </Box>\n <Box>\n <FormControl fullWidth margin=\"normal\">\n <InputLabel>{translations.category}</InputLabel>\n <Select\n value={selectedCategory}\n onChange={(e) => setSelectedCategory(e.target.value)}\n label={translations.category}\n disabled={!!searchTerm}\n >\n {categories.map((category) => (\n <MenuItem \n key={category} \n value={category}\n sx={category === 'Other' ? {\n borderTop: '1px solid',\n borderColor: 'divider',\n marginTop: 1,\n paddingTop: 1\n } : {}}\n >\n {category}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </Box>\n </Box>\n <TextField\n inputRef={searchInputRef}\n fullWidth\n placeholder={translations.searchPlaceholder}\n value={displaySearchTerm}\n onChange={handleSearchChange}\n margin=\"normal\"\n InputProps={{\n startAdornment: (\n <SearchIcon />\n ),\n endAdornment: isSearching ? (\n <CircularProgress size={20} />\n ) : displaySearchTerm && (\n <IconButton\n size=\"small\"\n onClick={() => {\n setDisplaySearchTerm('');\n setSearchTerm('');\n setDebouncedSearchResults([]);\n setIsSearching(false);\n }}\n edge=\"end\"\n aria-label={translations.clearSearch}\n >\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n )\n }}\n />\n </Box>\n\n {isSearching ? (\n <Box sx={{ display: 'flex', justifyContent: 'center', p: 4 }}>\n <Typography color=\"text.secondary\">\n {translations.searching}\n </Typography>\n </Box>\n ) : (\n <>\n <Box \n display=\"grid\" \n gridTemplateColumns={{\n xs: 'repeat(2, 1fr)',\n sm: 'repeat(3, 1fr)',\n md: 'repeat(6, 1fr)'\n }}\n gap={1}\n >\n {filteredIcons.map((iconName) => (\n <IconButton \n key={iconName}\n onClick={() => handleIconSelect(iconName)}\n sx={{\n flexDirection: 'column',\n width: '100%',\n height: '80px',\n '&:hover': {\n backgroundColor: 'action.hover',\n },\n ...(currentIcon === iconName && {\n backgroundColor: 'action.selected',\n }),\n }}\n >\n <Icon \n icon={iconName} \n width=\"24\" \n height=\"24\" \n style={{ \n color: 'primary.main',\n }}\n />\n <Typography \n variant=\"caption\" \n sx={{ \n mt: 1, \n textAlign: 'center',\n maxWidth: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap'\n }}\n >\n {iconName.split(':')[1]}\n </Typography>\n {searchTerm && (\n <Box sx={{ mt: 0.5, display: 'flex', gap: 0.5, flexWrap: 'wrap', justifyContent: 'center' }}>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ fontSize: '0.7rem' }}>\n {getIconMetadata(iconName).setName}\n </Typography>\n </Box>\n )}\n </IconButton>\n ))}\n </Box>\n\n {searchTerm && filteredIcons.length === 0 && (\n <Box sx={{ mt: 4, textAlign: 'center' }}>\n <Typography color=\"text.secondary\">\n {translations.noResults} \"{searchTerm}\"\n </Typography>\n </Box>\n )}\n </>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default IconSelector;"],"names":["iconListJson","MuiIcons","useState","useRef","useEffect","useMemo","useCallback","debounce","_jsx","Dialog","DialogContent","Box","CircularProgress","_jsxs","DialogTitle","FormControl","InputLabel","Select","MenuItem","TextField","IconButton","Typography","_Fragment","Icon"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA;AACA,MAAM,QAAQ,GAAGA,qBAAwB,CAAC;AAE1C;AACA,MAAM,YAAY,GAAG;AACnB,IAAA,KAAK,EAAE,gBAAgB;AACvB,IAAA,OAAO,EAAE,UAAU;AACnB,IAAA,QAAQ,EAAE,WAAW;AACrB,IAAA,iBAAiB,EAAE,0CAA0C;AAC7D,IAAA,SAAS,EAAE,WAAW;AACtB,IAAA,SAAS,EAAE,2BAA2B;AACtC,IAAA,WAAW,EAAE,qBAAqB;CACnC,CAAC;AAEF;AACA,MAAM,UAAU,GAAGC,mBAAQ,CAAC,MAAM,CAAC;AACnC,MAAM,SAAS,GAAGA,mBAAQ,CAAC,KAAK,CAAC;AAEjC,SAAS,YAAY,CAAC,EACpB,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,WAAW,GACO,EAAA;IAClB,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGC,cAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAGA,cAAQ,CAAC,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAGA,cAAQ,CAAC,EAAE,CAAC,CAAC;IAC7D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAGA,cAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,GAAGA,cAAQ,CAAW,EAAE,CAAC,CAAC;IACnF,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAGA,cAAQ,CAAC,EAAE,CAAC,CAAC;AAC/D,IAAA,MAAM,cAAc,GAAGC,YAAM,CAAmB,IAAI,CAAC,CAAC;;IAGtDC,eAAS,CAAC,MAAK;AACb,QAAA,IAAI,IAAI,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YAChE,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,UAAU,CAAC,KAAK,CAAC,CAAC;SACnB;AACH,KAAC,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;;AAG5B,IAAA,MAAM,UAAU,GAAGC,aAAO,CAAC,MAAK;AAC9B,QAAA,IAAI,CAAC,eAAe;AAAE,YAAA,OAAO,EAAE,CAAC;AAEhC,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,UAAU,CAAC,CAAC;AACxE,QAAA,OAAO,aAAa;aACjB,MAAM,CAAC,GAAG,IAAI,GAAG,KAAK,OAAO,CAAC;AAC9B,aAAA,IAAI,EAAE;AACN,aAAA,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACvB,KAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;;IAGtBD,eAAS,CAAC,MAAK;QACb,IAAI,eAAe,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5C,YAAA,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;SACpC;AACH,KAAC,EAAE,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC;;IAGlC,MAAM,eAAe,GAAGE,iBAAW,CACjCC,iBAAQ,CAAC,CAAC,UAAkB,KAAI;QAC9B,IAAI,CAAC,UAAU,EAAE;YACf,yBAAyB,CAAC,EAAE,CAAC,CAAC;YAC9B,cAAc,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO;SACR;;QAGD,qBAAqB,CAAC,MAAK;;AAEzB,YAAA,MAAM,eAAe,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;YACjD,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,eAAe,GAAG,CAAC,CAAC;AAExB,YAAA,SAAS,kBAAkB,GAAA;AACzB,gBAAA,IAAI,eAAe,IAAI,QAAQ,CAAC,MAAM,EAAE;;oBAEtC,yBAAyB,CAAC,OAAO,CAAC,CAAC;oBACnC,cAAc,CAAC,KAAK,CAAC,CAAC;oBACtB,OAAO;iBACR;gBAED,MAAM,GAAG,OAAO,CAAC,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAC9C,gBAAA,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,KAAI;oBACvD,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,IACrC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAC7C,CAAC;AACF,oBAAA,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;AACjC,iBAAC,CAAC,CAAC;AAEH,gBAAA,eAAe,EAAE,CAAC;AAClB,gBAAA,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;aACnC;AAED,YAAA,kBAAkB,EAAE,CAAC;AACvB,SAAC,CAAC,CAAC;AACL,KAAC,EAAE,GAAG,CAAC,EACP,EAAE,CACH,CAAC;;AAGF,IAAA,MAAM,kBAAkB,GAAG,CAAC,CAAsC,KAAI;AACpE,QAAA,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC7B,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,KAAK,EAAE;YACT,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,eAAe,CAAC,KAAK,CAAC,CAAC;SACxB;aAAM;YACL,cAAc,CAAC,KAAK,CAAC,CAAC;YACtB,aAAa,CAAC,EAAE,CAAC,CAAC;YAClB,yBAAyB,CAAC,EAAE,CAAC,CAAC;SAC/B;AACH,KAAC,CAAC;;AAGF,IAAA,MAAM,aAAa,GAAGF,aAAO,CAAC,MAAK;QACjC,IAAI,UAAU,EAAE;AACd,YAAA,OAAO,sBAAsB,CAAC;SAC/B;AAAM,aAAA,IAAI,eAAe,IAAI,gBAAgB,EAAE;YAC9C,OAAO,QAAQ,CAAC,eAAe,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;SACrE;AACD,QAAA,OAAO,EAAE,CAAC;KACX,EAAE,CAAC,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,CAAC,CAAC,CAAC;AAE5E,IAAA,MAAM,gBAAgB,GAAG,CAAC,QAAgB,KAAI;QAC5C,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACnB,QAAA,OAAO,EAAE,CAAC;AACZ,KAAC,CAAC;;AAGF,IAAA,MAAM,eAAe,GAAG,CAAC,QAAgB,KAAI;AAC3C,QAAA,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AACzD,YAAA,KAAK,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;AACtE,gBAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AAC5B,oBAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;iBAClC;aACF;SACF;QACD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;AAC3C,KAAC,CAAC;;IAGFD,eAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,IAAI;YAAE,OAAO;AAElB,QAAA,MAAM,cAAc,GAAG,CAAC,CAAgB,KAAI;AAC1C,YAAA,MAAM,MAAM,GAAG,CAAC,CAAC,MAAqB,CAAC;AACvC,YAAA,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE;gBAC/D,OAAO;aACR;;AAGD,YAAA,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE;gBACtC,OAAO;aACR;;AAGD,YAAA,IAAI,cAAc,CAAC,OAAO,EAAE;AAC1B,gBAAA,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;aAChC;AACH,SAAC,CAAC;AAEF,QAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACnD,OAAO,MAAM,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;AACrE,KAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,IAAI,OAAO,EAAE;AACX,QAAA,QACEI,cAAC,CAAAC,eAAM,IAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,YAClCD,cAAC,CAAAE,sBAAa,cACZF,cAAC,CAAAG,YAAG,IAAC,OAAO,EAAC,MAAM,EAAC,cAAc,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,CAAC,EAAE,CAAC,EAAA,QAAA,EAClEH,eAACI,yBAAgB,EAAA,EAAA,CAAG,GAChB,EACQ,CAAA,EAAA,CACT,EACT;KACH;IAED,QACEC,gBAACJ,eAAM,EAAA,EACL,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAC,IAAI,EACb,SAAS,EAET,IAAA,EAAA,QAAA,EAAA,CAAAD,cAAA,CAACM,oBAAW,EACT,EAAA,QAAA,EAAA,YAAY,CAAC,KAAK,EAAA,CACP,EACdD,eAAC,CAAAH,sBAAa,eACZG,eAAC,CAAAF,YAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAA,QAAA,EAAA,CAChBE,gBAACF,YAAG,EAAA,EAAC,OAAO,EAAC,MAAM,EAAC,mBAAmB,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,aAC3EH,cAAC,CAAAG,YAAG,cACFE,eAAC,CAAAE,oBAAW,EAAC,EAAA,SAAS,EAAC,IAAA,EAAA,MAAM,EAAC,QAAQ,EAAA,QAAA,EAAA,CACpCP,eAACQ,mBAAU,EAAA,EAAA,QAAA,EAAE,YAAY,CAAC,OAAO,GAAc,EAC/CR,cAAA,CAACS,eAAM,EACL,EAAA,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,CAAC,CAAC,KAAI;AACd,wDAAA,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wDACnC,mBAAmB,CAAC,EAAE,CAAC,CAAC;AAC1B,qDAAC,EACD,KAAK,EAAE,YAAY,CAAC,OAAO,EAC3B,QAAQ,EAAE,CAAC,CAAC,UAAU,EAErB,QAAA,EAAA,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAC7BT,cAAC,CAAAU,iBAAQ,EAAW,EAAA,KAAK,EAAE,GAAG,EAAG,QAAA,EAAA,GAAG,EAArB,EAAA,GAAG,CAA8B,CACjD,CAAC,EAAA,CACK,CACG,EAAA,CAAA,EAAA,CACV,EACNV,cAAA,CAACG,YAAG,EAAA,EAAA,QAAA,EACFE,eAAC,CAAAE,oBAAW,EAAC,EAAA,SAAS,EAAC,IAAA,EAAA,MAAM,EAAC,QAAQ,EACpC,QAAA,EAAA,CAAAP,cAAA,CAACQ,mBAAU,EAAA,EAAA,QAAA,EAAE,YAAY,CAAC,QAAQ,EAAA,CAAc,EAChDR,cAAA,CAACS,eAAM,EAAA,EACL,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,CAAC,CAAC,KAAK,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACpD,KAAK,EAAE,YAAY,CAAC,QAAQ,EAC5B,QAAQ,EAAE,CAAC,CAAC,UAAU,EAAA,QAAA,EAErB,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,MACvBT,cAAC,CAAAU,iBAAQ,EAEP,EAAA,KAAK,EAAE,QAAQ,EACf,EAAE,EAAE,QAAQ,KAAK,OAAO,GAAG;AACzB,4DAAA,SAAS,EAAE,WAAW;AACtB,4DAAA,WAAW,EAAE,SAAS;AACtB,4DAAA,SAAS,EAAE,CAAC;AACZ,4DAAA,UAAU,EAAE,CAAC;AACd,yDAAA,GAAG,EAAE,YAEL,QAAQ,EAAA,EATJ,QAAQ,CAUJ,CACZ,CAAC,EACK,CAAA,CAAA,EAAA,CACG,GACV,CACF,EAAA,CAAA,EACNV,eAACW,kBAAS,EAAA,EACR,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAA,IAAA,EACT,WAAW,EAAE,YAAY,CAAC,iBAAiB,EAC3C,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAC,QAAQ,EACf,UAAU,EAAE;AACV,oCAAA,cAAc,GACZX,cAAC,CAAA,UAAU,KAAG,CACf;AACD,oCAAA,YAAY,EAAE,WAAW,IACvBA,cAAC,CAAAI,yBAAgB,EAAC,EAAA,IAAI,EAAE,EAAE,GAAI,IAC5B,iBAAiB,KACnBJ,cAAA,CAACY,mBAAU,EAAA,EACT,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,MAAK;4CACZ,oBAAoB,CAAC,EAAE,CAAC,CAAC;4CACzB,aAAa,CAAC,EAAE,CAAC,CAAC;4CAClB,yBAAyB,CAAC,EAAE,CAAC,CAAC;4CAC9B,cAAc,CAAC,KAAK,CAAC,CAAC;AACxB,yCAAC,EACD,IAAI,EAAC,KAAK,EAAA,YAAA,EACE,YAAY,CAAC,WAAW,EAEpC,QAAA,EAAAZ,cAAA,CAAC,SAAS,EAAC,EAAA,QAAQ,EAAC,OAAO,EAAA,CAAG,GACnB,CACd;iCACF,EACD,CAAA,CAAA,EAAA,CACE,EAEL,WAAW,IACVA,cAAA,CAACG,YAAG,EAAA,EAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,EAAA,QAAA,EAC1DH,eAACa,mBAAU,EAAA,EAAC,KAAK,EAAC,gBAAgB,EAAA,QAAA,EAC/B,YAAY,CAAC,SAAS,EACZ,CAAA,EAAA,CACT,KAENR,eACE,CAAAS,mBAAA,EAAA,EAAA,QAAA,EAAA,CAAAd,cAAA,CAACG,YAAG,EAAA,EACF,OAAO,EAAC,MAAM,EACd,mBAAmB,EAAE;AACnB,oCAAA,EAAE,EAAE,gBAAgB;AACpB,oCAAA,EAAE,EAAE,gBAAgB;AACpB,oCAAA,EAAE,EAAE,gBAAgB;AACrB,iCAAA,EACD,GAAG,EAAE,CAAC,YAEL,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,MAC1BE,eAAA,CAACO,mBAAU,EAET,EAAA,OAAO,EAAE,MAAM,gBAAgB,CAAC,QAAQ,CAAC,EACzC,EAAE,EAAA,MAAA,CAAA,MAAA,CAAA,EACA,aAAa,EAAE,QAAQ,EACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE;AACT,4CAAA,eAAe,EAAE,cAAc;AAChC,yCAAA,EAAA,GACG,WAAW,KAAK,QAAQ,IAAI;AAC9B,wCAAA,eAAe,EAAE,iBAAiB;AACnC,qCAAA,eAGHZ,cAAC,CAAAe,YAAI,EACH,EAAA,IAAI,EAAE,QAAQ,EACd,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,KAAK,EAAE;AACL,gDAAA,KAAK,EAAE,cAAc;6CACtB,EACD,CAAA,EACFf,eAACa,mBAAU,EAAA,EACT,OAAO,EAAC,SAAS,EACjB,EAAE,EAAE;AACF,gDAAA,EAAE,EAAE,CAAC;AACL,gDAAA,SAAS,EAAE,QAAQ;AACnB,gDAAA,QAAQ,EAAE,MAAM;AAChB,gDAAA,QAAQ,EAAE,QAAQ;AAClB,gDAAA,YAAY,EAAE,UAAU;AACxB,gDAAA,UAAU,EAAE,QAAQ;6CACrB,EAEA,QAAA,EAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EACZ,CAAA,EACZ,UAAU,KACTb,cAAA,CAACG,YAAG,EAAA,EAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,EACzF,QAAA,EAAAH,cAAA,CAACa,mBAAU,EAAA,EAAC,OAAO,EAAC,SAAS,EAAC,KAAK,EAAC,gBAAgB,EAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAA,QAAA,EAC5E,eAAe,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAA,CACvB,EACT,CAAA,CACP,CAzCI,EAAA,EAAA,QAAQ,CA0CF,CACd,CAAC,EAAA,CACE,EAEL,UAAU,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,KACvCb,cAAC,CAAAG,YAAG,EAAC,EAAA,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAA,QAAA,EACrCE,eAAC,CAAAQ,mBAAU,EAAC,EAAA,KAAK,EAAC,gBAAgB,EAC/B,QAAA,EAAA,CAAA,YAAY,CAAC,SAAS,EAAI,KAAA,EAAA,UAAU,EAC1B,IAAA,CAAA,EAAA,CAAA,EAAA,CACT,CACP,CAAA,EAAA,CACA,CACJ,CAAA,EAAA,CACa,CACT,EAAA,CAAA,EACT;AACJ;;;;"}